{"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'node:fs';\nimport { get } from 'node:https';\nimport { join } from 'node:path';\nimport * as chalk from 'chalk';\n\nimport { RELEASE_LINE } from './version';\n\nconst SILENCE_ENV_VAR = 'JSII_SILENCE_SUPPORT_WARNING';\nconst THIRTY_DAYS_IN_MILLIS = 2_592_000_000;\n\n/** @internal */\nexport interface ReleasesDocument {\n  /**\n   * The release line that occupies the 'Current' stage.\n   */\n  readonly current: ReleaseLine;\n  /**\n   * Release lines currently in 'Maintenance' with the date at which they are\n   * planned to go into the 'End-of-Support' stage. This date should always be\n   * set a minimum of 6 months in the future when a release line is added to the\n   * list.\n   */\n  readonly maintenance: { readonly [release: ReleaseLine]: Date };\n  /**\n   * Release lines that are currently out-of-support. This is semantically\n   * equivalent to being in the `maintenance` list with a past date, but offers\n   * slightly faster look-up.\n   */\n  readonly endOfSupport?: readonly ReleaseLine[];\n}\n\n/**\n * Checks whether the current release line is close to End-of-Support (within\n * 30 days), or already in End-of-Support, and if that is the case, emits a\n * warning to call the user to action.\n *\n * It is possible for users to opt out of these notifications by setting the\n * `JSII_SILENCE_SUPPORT_WARNING` environment variable to any truthy value (that\n * is, any non-empty value).\n */\nexport async function emitSupportPolicyInformation() {\n  if (process.env[SILENCE_ENV_VAR]) {\n    return;\n  }\n\n  const data = await getReleasesDocument();\n\n  if (data.current == RELEASE_LINE) {\n    // Current release is not close to deprecation\n    return;\n  }\n\n  const endOfSupportDate = data.endOfSupport?.includes(RELEASE_LINE) ? new Date(0) : data.maintenance[RELEASE_LINE];\n  if (endOfSupportDate == null) {\n    // Don't know the status, so don't say anything...\n    return;\n  }\n\n  const now = new Date();\n  const inThirtyDays = new Date(now.getTime() + THIRTY_DAYS_IN_MILLIS);\n  const alternatives = Object.entries(data.maintenance)\n    .flatMap(([release, dateStr]) => {\n      const date = new Date(dateStr);\n      if (date <= inThirtyDays) {\n        return [];\n      }\n      return [{ release, date }];\n    })\n    .reduce((acc, { release, date }) => {\n      if (acc.length === 0) {\n        acc.push('', 'Other actively supported release lines include:');\n      }\n      acc.push(`- ${release} (planned End-of-Support date: ${date.toISOString().split('T')[0]})`);\n      return acc;\n    }, new Array<string>());\n  if (endOfSupportDate <= now) {\n    // End-of-Support already!\n    veryVisibleMessage(\n      chalk.bgRed.white.bold,\n      `The ${RELEASE_LINE} release line of jsii has reached End-of-Support.`,\n      `We strongly recommend you upgrade to the current release line (${data.current}) at your earliest convenience.`,\n      ...alternatives,\n    );\n  } else if (endOfSupportDate <= inThirtyDays) {\n    // End-of-Support within 30 days!\n    veryVisibleMessage(\n      chalk.bgYellow.black,\n      `The ${RELEASE_LINE} release line of jsii will reach End-of-Support soon, on ${\n        endOfSupportDate.toISOString().split('T')[0]\n      }.`,\n      `We strongly recommend you upgrade to the current release line (${data.current}) at your earliest convenience.`,\n      ...alternatives,\n    );\n  }\n}\n\n/**\n * Downloads the latest `releases.json` document from 'https://raw.githubusercontent.com/aws/jsii-compiler/main/releases.json'\n * if possible, or falls back to the built-in version of that file if that fails in any way.\n */\nasync function getReleasesDocument(): Promise<ReleasesDocument> {\n  const downloaded = await new Promise<string | undefined>((ok, ko) => {\n    const request = get(\n      new URL('https://raw.githubusercontent.com/aws/jsii-compiler/main/releases.json'),\n      (response) => {\n        if (response.statusCode === 404) {\n          return ok(undefined);\n        }\n        if (response.statusCode !== 200) {\n          return ko(`received error response: HTTP ${response.statusCode} - ${response.statusMessage}`);\n        }\n        response.once('error', ko);\n        const chunks = new Array<Buffer>();\n        response.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n        response.once('end', () => ok(Buffer.concat(chunks).toString('utf-8')));\n      },\n    );\n    request.once('abort', () => ko('request aborted'));\n    request.once('timeout', () => ko('request timed out'));\n    request.once('error', ko);\n    request.end();\n  }).catch((cause) => {\n    if (process.env.JSII_DEBUG) {\n      console.error(`Could not download releases.json from GitHub: ${cause}`);\n    }\n    undefined;\n  });\n\n  return JSON.parse(downloaded ?? readFileSync(join(__dirname, '..', 'releases.json'), 'utf-8'), (key, value) => {\n    if (key !== 'maintenance') {\n      return value;\n    }\n    return Object.fromEntries(Object.entries(value).map(([release, date]) => [release, new Date(date as string)]));\n  }) as ReleasesDocument;\n}\n\nfunction veryVisibleMessage(formatter: chalk.Chalk, ...lines: readonly string[]): void {\n  if (lines.length === 0) {\n    throw new Error(`At least one line of message must be provided!`);\n  }\n\n  const len = Math.max(...lines.map((line) => line.length));\n  const border = formatter('!'.repeat(len + 8));\n  const spacer = formatter(`!!  ${' '.repeat(len)}  !!`);\n\n  console.error(border);\n  console.error(spacer);\n  for (const line of lines) {\n    console.error(formatter(`!!  ${line.padEnd(len, ' ')}  !!`));\n  }\n  console.error(spacer);\n  console.error(border);\n}\n\ntype ReleaseLine = `${number}.${number}`;\n"]}