{"version":3,"file":"index.mjs","sources":["../../../src/utils/update-notifier/index.ts"],"sourcesContent":["import path from 'path';\nimport packageJson from 'package-json';\nimport Configstore from 'configstore';\nimport semver from 'semver';\nimport boxen from 'boxen';\nimport chalk from 'chalk';\nimport { env } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport pkg from '../../../package.json';\n\nconst CHECK_INTERVAL = 1000 * 60 * 60 * 24 * 1; // 1 day\nconst NOTIF_INTERVAL = 1000 * 60 * 60 * 24 * 7; // 1 week\nconst boxenOptions: boxen.Options = {\n  padding: 1,\n  margin: 1,\n  align: 'center',\n  borderColor: 'yellow',\n  borderStyle: 'round',\n};\n\nconst getUpdateMessage = (newVersion: string, currentVersion: string) => {\n  const currentVersionLog = chalk.dim(currentVersion);\n  const newVersionLog = chalk.green(newVersion);\n  const releaseLink = chalk.bold('https://github.com/strapi/strapi/releases');\n\n  return `\nA new version of Strapi is available ${currentVersionLog} → ${newVersionLog}\nCheck out the new releases at: ${releaseLink}\n`.trim();\n};\n\nexport const createUpdateNotifier = (strapi: Core.Strapi) => {\n  let config: InstanceType<typeof Configstore>;\n\n  try {\n    config = new Configstore(\n      pkg.name,\n      {},\n      { configPath: path.join(strapi.dirs.app.root, '.strapi-updater.json') }\n    );\n  } catch {\n    // we don't have write access to the file system\n    // we silence the error\n    return;\n  }\n\n  const checkUpdate = async (checkInterval: number) => {\n    const now = Date.now();\n    const lastUpdateCheck = config.get('lastUpdateCheck') || 0;\n    if (lastUpdateCheck + checkInterval > now) {\n      return;\n    }\n\n    try {\n      const res = await packageJson(pkg.name);\n      if (res.version) {\n        config.set('latest', res.version);\n        config.set('lastUpdateCheck', now);\n      }\n    } catch {\n      // silence error if offline\n    }\n  };\n\n  const display = (notifInterval: number) => {\n    const now = Date.now();\n    const latestVersion = config.get('latest');\n    const lastNotification = config.get('lastNotification') || 0;\n\n    if (\n      !process.stdout.isTTY ||\n      lastNotification + notifInterval > now ||\n      !semver.valid(latestVersion) ||\n      !semver.valid(pkg.version) ||\n      semver.lte(latestVersion, pkg.version)\n    ) {\n      return;\n    }\n\n    const message = boxen(getUpdateMessage(latestVersion, pkg.version), boxenOptions);\n    config.set('lastNotification', now);\n    console.log(message);\n  };\n\n  // TODO v6: Remove this warning\n  if (env.bool('STRAPI_DISABLE_UPDATE_NOTIFICATION', false)) {\n    strapi.log.warn(\n      'STRAPI_DISABLE_UPDATE_NOTIFICATION is no longer supported. Instead, set logger.updates.enabled to false in your server configuration.'\n    );\n  }\n\n  if (!strapi.config.get('server.logger.updates.enabled') || !config) {\n    return;\n  }\n\n  display(NOTIF_INTERVAL);\n  checkUpdate(CHECK_INTERVAL); // doesn't need to await\n};\n"],"names":["CHECK_INTERVAL","NOTIF_INTERVAL","boxenOptions","padding","margin","align","borderColor","borderStyle","getUpdateMessage","newVersion","currentVersion","currentVersionLog","chalk","dim","newVersionLog","green","releaseLink","bold","trim","createUpdateNotifier","strapi","config","Configstore","pkg","name","configPath","path","join","dirs","app","root","checkUpdate","checkInterval","now","Date","lastUpdateCheck","get","res","packageJson","version","set","display","notifInterval","latestVersion","lastNotification","process","stdout","isTTY","semver","valid","lte","message","boxen","console","log","env","bool","warn"],"mappings":"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"}