CodeSampleX

サンプル

@jest/console 30.4.1: CustomConsole

検証済みサンプル — npm @jest/console 30.4.1: CustomConsole. node 22 · linux debian/x64 · docker で contract を実行し、成功しました: CustomConsole writes standard log, info, and…

sha256:3172bd37cacf2b327f4cd87fb85de18e7b8b262979fa1e428491fe4488d3b45f

このネットワークが提供するのは一つだけです。ビルドされるサンプル。サンドボックスで実行し、署名済みの受領証を保管します。等級はつけず、何も保証しません — 同じコードがあなたの環境でビルドされるかは測定していません。 合格した契約受領証を提出した異なる署名鍵の数です。1 なら作者だけ、2 以上なら他の誰かもビルドしています。鍵は自己生成で背後に登録された身元がないため、数えているのは人ではなく鍵です。 MIT-0

実行証拠

宣言された環境と署名済みの実行を分けてあります。このサンプルが何をどこで実行したかをそのまま確認できます。

証拠の基準
署名済みコントラクト合格
検証レシート
1
ビルドした署名鍵
1
宣言された環境 node 22.23 linux 24 · ubuntu · glibc 2.39 x64 node 22.23 javascript npm 10

検証実行環境

環境 コントラクト ステージ 実行日
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-06

ケース

HOW
ゴール
verify @jest/console.CustomConsole in pkg:npm/%40jest/console@30.4.1
パッケージ
シンボル
  • @jest/console.CustomConsole
環境
node 22.23.2
作成日
2026-09-06T01:21:47Z

コントラクト

  1. CustomConsole writes standard log, info, and debug messages to the provided stdout Writable stream
  2. CustomConsole writes warn and error messages to the provided stderr Writable stream
  3. CustomConsole applies custom formatBuffer transformer function to log and error output before writing
  4. CustomConsole manages group indentation levels with group and resets indentation with groupEnd
  5. CustomConsole tracks labeled invocation counts with count and resets them with countReset
  6. CustomConsole tracks labeled elapsed durations with time, timeEnd, and timeLog
  7. CustomConsole assert writes formatted AssertionError to stderr on falsy condition and produces no output on truthy condition
  8. CustomConsole getBuffer returns undefined
  9. captureCustomConsole intercepts and collects stdout and stderr output during function execution

ファイル

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

ソースアーティファクトをダウンロード (tar.gz)

ソース

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 @jest/console.CustomConsole in pkg:npm/%40jest/console@30.4.1
Kind: HOW

Use EXACTLY these public packages and versions:
  - pkg:npm/%40jest/console@30.4.1
Demonstrate these symbols/APIs:
  - @jest/console.CustomConsole
Constraints:
  - executionContext: node
Required runtime conditions:
  - ecosystem: npm
  - language: javascript
  - moduleSystem: cjs
  - packageManager: npm@10.9.8
  - runtime: node@22.23.2

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:fb000c57fb55fede6657f9805b47b76ea683f951095c384f135afb45f02224ec","constraints":{"executionContext":"node"},"contract":["CustomConsole writes standard log, info, and debug messages to the provided stdout Writable stream","CustomConsole writes warn and error messages to the provided stderr Writable stream","CustomConsole applies custom formatBuffer transformer function to log and error output before writing","CustomConsole manages group indentation levels with group and resets indentation with groupEnd","CustomConsole tracks labeled invocation counts with count and resets them with countReset","CustomConsole tracks labeled elapsed durations with time, timeEnd, and timeLog","CustomConsole assert writes formatted AssertionError to stderr on falsy condition and produces no output on truthy condition","CustomConsole getBuffer returns undefined","captureCustomConsole intercepts and collects stdout and stderr output during function execution"],"goal":"verify @jest/console.CustomConsole in pkg:npm/%40jest/console@30.4.1","kind":"HOW","packages":["pkg:npm/%40jest/console@30.4.1"],"schemaVersion":1,"symbols":["@jest/console.CustomConsole"]},"contractCommand":["node","test/contract.js"],"environment":{"arch":"x64","distro":"ubuntu","ecosystem":"npm","executionContext":"node","language":"javascript","libc":"glibc","libcVersion":"2.39","moduleSystem":"cjs","os":"linux","osVersionBucket":"24","packageManager":"npm","packageManagerVersion":"10.9.8","runtime":"node","runtimeVersion":"22.23.2","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/%40jest/console@30.4.1"],"schemaVersion":1,"subject":"pkg:npm/%40jest/console@30.4.1","symbols":["@jest/console.CustomConsole"],"verifierAdapter":"node-typescript@1"}
index.js
'use strict';

const { CustomConsole } = require('@jest/console');
const { Writable } = require('stream');

/**
 * Creates an in-memory Writable stream to capture console output.
 * @returns {Writable & { getContent: () => string, clear: () => void }}
 */
function createMemoryStream() {
  const chunks = [];
  const stream = new Writable({
    write(chunk, encoding, callback) {
      chunks.push(chunk.toString());
      callback();
    }
  });
  stream.getContent = () => chunks.join('');
  stream.clear = () => {
    chunks.length = 0;
  };
  return stream;
}

/**
 * Creates a CustomConsole instance with specified stdout, stderr, and optional formatter.
 * @param {Writable} stdout - Standard output stream.
 * @param {Writable} stderr - Standard error stream.
 * @param {Function} [formatBuffer] - Optional formatting function (type, message) => string.
 * @returns {CustomConsole} A new CustomConsole instance.
 */
function createCustomConsole(stdout, stderr, formatBuffer) {
  return new CustomConsole(stdout, stderr, formatBuffer);
}

/**
 * Executes a function with captured stdout and stderr via CustomConsole.
 * @param {Function} fn - Function receiving (customConsole, stdoutStream, stderrStream).
 * @param {Function} [formatBuffer] - Optional log formatter.
 * @returns {{ result: any, stdout: string, stderr: string }}
 */
function captureCustomConsole(fn, formatBuffer) {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const customConsole = createCustomConsole(stdout, stderr, formatBuffer);
  const result = fn(customConsole, stdout, stderr);
  return {
    result,
    stdout: stdout.getContent(),
    stderr: stderr.getContent()
  };
}

module.exports = {
  CustomConsole,
  createMemoryStream,
  createCustomConsole,
  captureCustomConsole
};
package-lock.json
{
  "name": "sample-jest-console-custom",
  "version": "1.0.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "sample-jest-console-custom",
      "version": "1.0.0",
      "license": "MIT-0",
      "dependencies": {
        "@jest/console": "30.4.1"
      }
    },
    "node_modules/@babel/code-frame": {
      "version": "7.29.7",
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
      "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
      "license": "MIT",
      "dependencies": {
        "@babel/helper-validator-identifier": "^7.29.7",
        "js-tokens": "^4.0.0",
        "picocolors": "^1.1.1"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-validator-identifier": {
      "version": "7.29.7",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
      "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
      "license": "MIT",
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@jest/console": {
      "version": "30.4.1",
      "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz",
      "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==",
      "license": "MIT",
      "dependencies": {
        "@jest/types": "30.4.1",
        "@types/node": "*",
        "chalk": "^4.1.2",
        "jest-message-util": "30.4.1",
        "jest-util": "30.4.1",
        "slash": "^3.0.0"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/@jest/pattern": {
      "version": "30.4.0",
      "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz",
      "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==",
      "license": "MIT",
      "dependencies": {
        "@types/node": "*",
        "jest-regex-util": "30.4.0"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/@jest/schemas": {
      "version": "30.4.1",
      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz",
      "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==",
      "license": "MIT",
      "dependencies": {
        "@sinclair/typebox": "^0.34.0"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/@jest/types": {
      "version": "30.4.1",
      "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz",
      "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==",
      "license": "MIT",
      "dependencies": {
        "@jest/pattern": "30.4.0",
        "@jest/schemas": "30.4.1",
        "@types/istanbul-lib-coverage": "^2.0.6",
        "@types/istanbul-reports": "^3.0.4",
        "@types/node": "*",
        "@types/yargs": "^17.0.33",
        "chalk": "^4.1.2"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/@sinclair/typebox": {
      "version": "0.34.52",
      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz",
      "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==",
      "license": "MIT"
    },
    "node_modules/@types/istanbul-lib-coverage": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
      "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
      "license": "MIT"
    },
    "node_modules/@types/istanbul-lib-report": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
      "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
      "license": "MIT",
      "dependencies": {
        "@types/istanbul-lib-coverage": "*"
      }
    },
    "node_modules/@types/istanbul-reports": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
      "license": "MIT",
      "dependencies": {
        "@types/istanbul-lib-report": "*"
      }
    },
    "node_modules/@types/node": {
      "version": "26.4.1",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz",
      "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==",
      "license": "MIT",
      "dependencies": {
        "undici-types": "~8.3.0"
      }
    },
    "node_modules/@types/stack-utils": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
      "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
      "license": "MIT"
    },
    "node_modules/@types/yargs": {
      "version": "17.0.35",
      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
      "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
      "license": "MIT",
      "dependencies": {
        "@types/yargs-parser": "*"
      }
    },
    "node_modules/@types/yargs-parser": {
      "version": "21.0.3",
      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
      "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
      "license": "MIT"
    },
    "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/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "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/ci-info": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
      "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/sibiraj-s"
        }
      ],
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "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/escape-string-regexp": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/graceful-fs": {
      "version": "4.2.11",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
      "license": "ISC"
    },
    "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==",
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-message-util": {
      "version": "30.4.1",
      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz",
      "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==",
      "license": "MIT",
      "dependencies": {
        "@babel/code-frame": "^7.27.1",
        "@jest/types": "30.4.1",
        "@types/stack-utils": "^2.0.3",
        "chalk": "^4.1.2",
        "graceful-fs": "^4.2.11",
        "jest-util": "30.4.1",
        "picomatch": "^4.0.3",
        "pretty-format": "30.4.1",
        "slash": "^3.0.0",
        "stack-utils": "^2.0.6"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/jest-regex-util": {
      "version": "30.4.0",
      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz",
      "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==",
      "license": "MIT",
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/jest-util": {
      "version": "30.4.1",
      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz",
      "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==",
      "license": "MIT",
      "dependencies": {
        "@jest/types": "30.4.1",
        "@types/node": "*",
        "chalk": "^4.1.2",
        "ci-info": "^4.2.0",
        "graceful-fs": "^4.2.11",
        "picomatch": "^4.0.3"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "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==",
      "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==",
      "license": "ISC"
    },
    "node_modules/picomatch": {
      "version": "4.0.7",
      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
      "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
      "license": "MIT",
      "engines": {
        "node": ">=12"
      },
      "funding": {
        "url": "https://github.com/sponsors/jonschlinkert"
      }
    },
    "node_modules/pretty-format": {
      "version": "30.4.1",
      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz",
      "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==",
      "license": "MIT",
      "dependencies": {
        "@jest/schemas": "30.4.1",
        "ansi-styles": "^5.2.0",
        "react-is-18": "npm:react-is@^18.3.1",
        "react-is-19": "npm:react-is@^19.2.5"
      },
      "engines": {
        "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
      }
    },
    "node_modules/pretty-format/node_modules/ansi-styles": {
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
      "license": "MIT",
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/react-is-18": {
      "name": "react-is",
      "version": "18.3.1",
      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
      "license": "MIT"
    },
    "node_modules/react-is-19": {
      "name": "react-is",
      "version": "19.2.8",
      "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz",
      "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==",
      "license": "MIT"
    },
    "node_modules/slash": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/stack-utils": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
      "license": "MIT",
      "dependencies": {
        "escape-string-regexp": "^2.0.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "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==",
      "license": "MIT",
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/undici-types": {
      "version": "8.3.0",
      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
      "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
      "license": "MIT"
    }
  }
}
package.json
{
  "name": "sample-jest-console-custom",
  "version": "1.0.0",
  "private": true,
  "description": "verify @jest/console.CustomConsole in pkg:npm/%40jest/console@30.4.1",
  "main": "index.js",
  "scripts": {
    "test": "node test/contract.js"
  },
  "dependencies": {
    "@jest/console": "30.4.1"
  },
  "license": "MIT-0"
}
spec.json
{
  "schemaVersion": 1,
  "goal": "verify @jest/console.CustomConsole in pkg:npm/%40jest/console@30.4.1",
  "kind": "HOW",
  "packages": [
    "pkg:npm/%40jest/console@30.4.1"
  ],
  "symbols": [
    "@jest/console.CustomConsole"
  ],
  "constraints": {
    "executionContext": "node"
  },
  "runtimeConditions": {
    "ecosystem": "npm",
    "language": "javascript",
    "moduleSystem": "cjs",
    "packageManager": "npm@10.9.8",
    "runtime": "node@22.23.2"
  }
}
test/contract.js
'use strict';

const assert = require('assert');
const {
  CustomConsole,
  createMemoryStream,
  createCustomConsole,
  captureCustomConsole
} = require('../index.js');

function testStandardLoggingToStdout() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const c = createCustomConsole(stdout, stderr);

  c.log('sample log %s', 'message');
  c.info('sample info message');
  c.debug('sample debug message');

  const out = stdout.getContent();
  const err = stderr.getContent();

  assert.ok(out.includes('sample log message\n'), 'stdout should contain formatted log message');
  assert.ok(out.includes('sample info message\n'), 'stdout should contain info message');
  assert.ok(out.includes('sample debug message\n'), 'stdout should contain debug message');
  assert.strictEqual(err, '', 'stderr should be empty for standard log calls');
}

function testErrorLoggingToStderr() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const c = createCustomConsole(stdout, stderr);

  c.warn('sample warn %s', 'warning');
  c.error('sample error message');

  const out = stdout.getContent();
  const err = stderr.getContent();

  assert.strictEqual(out, '', 'stdout should be empty for warn/error calls');
  assert.ok(err.includes('sample warn warning\n'), 'stderr should contain warn message');
  assert.ok(err.includes('sample error message\n'), 'stderr should contain error message');
}

function testCustomFormatBuffer() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const customFormatter = (type, message) => `[${type.toUpperCase()}] ${message}`;
  const c = createCustomConsole(stdout, stderr, customFormatter);

  c.log('formatted log line');
  c.error('formatted error line');

  assert.strictEqual(stdout.getContent(), '[LOG] formatted log line\n');
  assert.strictEqual(stderr.getContent(), '[ERROR] formatted error line\n');
}

function testGroupIndentation() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const c = createCustomConsole(stdout, stderr);

  c.group('Suite A');
  c.log('nested item 1');
  c.groupCollapsed('SubSuite B');
  c.log('deep item');
  c.groupEnd();
  c.log('nested item 2');
  c.groupEnd();
  c.log('root item');

  const out = stdout.getContent();
  assert.ok(out.includes('Suite A'));
  assert.ok(out.includes('  nested item 1'));
  assert.ok(out.includes('SubSuite B'));
  assert.ok(out.includes('    deep item'));
  assert.ok(out.includes('  nested item 2'));
  assert.ok(out.includes('root item'));
}

function testCountersAndTimers() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const c = createCustomConsole(stdout, stderr);

  c.count('hits');
  c.count('hits');
  c.countReset('hits');
  c.count('hits');

  const out = stdout.getContent();
  assert.ok(out.includes('hits: 1\n'));
  assert.ok(out.includes('hits: 2\n'));

  stdout.clear();
  c.time('perf-test');
  c.timeLog('perf-test', 'interim');
  c.timeEnd('perf-test');

  const timerOut = stdout.getContent();
  assert.match(timerOut, /perf-test: \d+(\.\d+)?\s*(ms|s) interim/);
  assert.match(timerOut, /perf-test: \d+(\.\d+)?\s*(ms|s)/);
}

function testAssertionHandling() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const c = createCustomConsole(stdout, stderr);

  // Truthy condition must not output anything
  c.assert(true, 'truthy condition must not write to stderr');
  assert.strictEqual(stderr.getContent(), '');

  // Falsy condition logs AssertionError to stderr without unhandled throw
  c.assert(false, 'contract assertion failed check');
  const err = stderr.getContent();
  assert.ok(err.includes('AssertionError'), 'stderr should log AssertionError');
  assert.ok(err.includes('contract assertion failed check'), 'stderr should include message');
  assert.strictEqual(stdout.getContent(), '', 'stdout should remain empty');
}

function testGetBufferReturnsUndefined() {
  const stdout = createMemoryStream();
  const stderr = createMemoryStream();
  const c = createCustomConsole(stdout, stderr);
  c.log('something');
  assert.strictEqual(c.getBuffer(), undefined, 'CustomConsole.getBuffer must return undefined');
}

function testCaptureCustomConsoleHelper() {
  const { result, stdout, stderr } = captureCustomConsole((c) => {
    c.log('captured log');
    c.warn('captured warning');
    return 123;
  });

  assert.strictEqual(result, 123);
  assert.strictEqual(stdout, 'captured log\n');
  assert.strictEqual(stderr, 'captured warning\n');
}

function main() {
  testStandardLoggingToStdout();
  testErrorLoggingToStderr();
  testCustomFormatBuffer();
  testGroupIndentation();
  testCountersAndTimers();
  testAssertionHandling();
  testGetBufferReturnsUndefined();
  testCaptureCustomConsoleHelper();
  console.log('All CustomConsole contract tests passed successfully.');
}

main();

オリジンシーダー

匿名