export function checkNode()

in packages/@jsii/check-node/src/index.ts [17:114]


export function checkNode(envPrefix = 'JSII'): void {
  const { nodeRelease, knownBroken } = NodeRelease.forThisRuntime();

  const defaultCallToAction =
    'Should you encounter odd runtime issues, please try using one of the supported release before filing a bug report.';

  if (nodeRelease?.endOfLife) {
    const silenceVariable = `${envPrefix}_SILENCE_WARNING_END_OF_LIFE_NODE_VERSION`;
    const silencedVersions = (process.env[silenceVariable] ?? '')
      .split(',')
      .map((v) => v.trim());
    const qualifier = nodeRelease.endOfLifeDate
      ? ` on ${nodeRelease.endOfLifeDate.toISOString().slice(0, 10)}`
      : '';
    if (!silencedVersions.includes(nodeRelease.majorVersion.toString()))
      veryVisibleMessage(
        bgRed.white.bold,
        `Node ${nodeRelease.majorVersion} has reached end-of-life${qualifier} and is not supported.`,
        `Please upgrade to a supported node version as soon as possible.`,
      );
  } else if (knownBroken) {
    const silenceVariable = `${envPrefix}_SILENCE_WARNING_KNOWN_BROKEN_NODE_VERSION`;
    if (!process.env[silenceVariable])
      veryVisibleMessage(
        bgRed.white.bold,
        `Node ${version} is unsupported and has known compatibility issues with this software.`,
        defaultCallToAction,
        silenceVariable,
      );
  } else if (!nodeRelease || nodeRelease.untested) {
    const silenceVariable = `${envPrefix}_SILENCE_WARNING_UNTESTED_NODE_VERSION`;
    if (!process.env[silenceVariable]) {
      veryVisibleMessage(
        bgYellow.black,
        `This software has not been tested with node ${version}.`,
        defaultCallToAction,
        silenceVariable,
      );
    }
  } else if (nodeRelease?.deprecated) {
    const silenceVariable = `${envPrefix}_SILENCE_WARNING_DEPRECATED_NODE_VERSION`;
    if (!process.env[silenceVariable]) {
      const deadline = nodeRelease.endOfLifeDate!.toISOString().slice(0, 10);
      veryVisibleMessage(
        bgYellowBright.black,
        `Node ${nodeRelease.majorVersion} is approaching end-of-life and will no longer be supported in new releases after ${deadline}.`,
        `Please upgrade to a supported node version as soon as possible.`,
        silenceVariable,
      );
    }
  }

  function veryVisibleMessage(
    chalk: Chalk,
    message: string,
    callToAction: string,
    silenceVariable?: string,
  ): void {
    const lines = [
      message,
      callToAction,
      '',
      `This software is currently running on node ${version}.`,
      'As of the current release of this software, supported node releases are:',
      ...NodeRelease.ALL_RELEASES.filter((release) => release.supported)
        // We display those from longest remaining support to shortest (to incitate people to be ahead of future derepcations).
        .sort(
          (l, r) =>
            (r.endOfLifeDate?.getTime() ?? 0) -
            (l.endOfLifeDate?.getTime() ?? 0),
        )
        .map(
          (release) =>
            `- ${release.toString()}${
              release.deprecated ? ' [DEPRECATED]' : ''
            }`,
        ),
      // Add blurb on how this message can be silenced (if it can be silenced).
      ...(silenceVariable
        ? [
            '',
            `This warning can be silenced by setting the ${silenceVariable} environment variable.`,
          ]
        : []),
    ];
    const len = Math.max(...lines.map((l) => l.length));
    const border = chalk('!'.repeat(len + 8));
    const spacer = chalk(`!!  ${' '.repeat(len)}  !!`);

    error(border);
    error(spacer);
    for (const line of lines) {
      error(chalk(`!!  ${line.padEnd(len, ' ')}  !!`));
    }
    error(spacer);
    error(border);
  }
}