{"version":3,"sources":["../../../src/build/type-check.ts"],"sourcesContent":["import type { NextConfigComplete } from '../server/config-shared'\nimport type { Telemetry } from '../telemetry/storage'\nimport type { Span } from '../trace'\n\nimport * as Log from './output/log'\nimport { Worker } from '../lib/worker'\nimport createSpinner from './spinner'\nimport { eventTypeCheckCompleted } from '../telemetry/events'\nimport isError from '../lib/is-error'\nimport { hrtimeDurationToString } from './duration-to-string'\n\n/**\n * typescript will be loaded in \"next/lib/verify-typescript-setup\" and\n * then passed to \"next/lib/typescript/runTypeCheck\" as a parameter.\n *\n * Since it is impossible to pass a function from main thread to a worker,\n * instead of running \"next/lib/typescript/runTypeCheck\" in a worker,\n * we will run entire \"next/lib/verify-typescript-setup\" in a worker instead.\n */\nfunction verifyAndRunTypeScript(\n  dir: string,\n  distDir: string,\n  strictRouteTypes: boolean,\n  shouldRunTypeCheck: boolean,\n  tsconfigPath: string | undefined,\n  typedRoutes: boolean,\n  disableStaticImages: boolean,\n  cacheDir: string | undefined,\n  enableWorkerThreads: boolean | undefined,\n  hasAppDir: boolean,\n  hasPagesDir: boolean,\n  appDir: string | undefined,\n  pagesDir: string | undefined,\n  debugBuildPaths: { app: string[]; pages: string[] } | undefined\n) {\n  let impl: typeof import('../lib/verify-typescript-setup').verifyAndRunTypeScript\n  let typeCheckWorker:\n    | (Worker & {\n        verifyAndRunTypeScript: typeof impl\n      })\n    | undefined\n  if (shouldRunTypeCheck) {\n    typeCheckWorker = new Worker(\n      require.resolve('../lib/verify-typescript-setup'),\n      {\n        exposedMethods: ['verifyAndRunTypeScript'],\n        debuggerPortOffset: -1,\n        isolatedMemory: false,\n        numWorkers: 1,\n        enableWorkerThreads,\n        maxRetries: 0,\n      }\n    ) as typeof typeCheckWorker\n    impl = typeCheckWorker!.verifyAndRunTypeScript\n  } else {\n    // When not running typecheck, just run the implementation in-process without spawning a worker,\n    // to avoid the overhead of the worker.\n    impl = (\n      require('../lib/verify-typescript-setup') as typeof import('../lib/verify-typescript-setup')\n    ).verifyAndRunTypeScript\n  }\n\n  return impl({\n    dir,\n    distDir,\n    strictRouteTypes,\n    shouldRunTypeCheck,\n    tsconfigPath,\n    typedRoutes,\n    disableStaticImages,\n    cacheDir,\n    hasAppDir,\n    hasPagesDir,\n    appDir,\n    pagesDir,\n    debugBuildPaths,\n  })\n    .then((result) => {\n      typeCheckWorker?.end()\n      return result\n    })\n    .catch(() => {\n      // The error is already logged in the worker, we simply exit the main thread to prevent the\n      // `Jest worker encountered 1 child process exceptions, exceeding retry limit` from showing up\n      process.exit(1)\n    })\n}\n\nexport async function startTypeChecking({\n  cacheDir,\n  config,\n  dir,\n  nextBuildSpan,\n  pagesDir,\n  telemetry,\n  appDir,\n  debugBuildPaths,\n}: {\n  cacheDir: string\n  config: NextConfigComplete\n  dir: string\n  nextBuildSpan: Span\n  pagesDir?: string\n  telemetry: Telemetry\n  appDir?: string\n  debugBuildPaths: { app: string[]; pages: string[] } | undefined\n}) {\n  const ignoreTypeScriptErrors = Boolean(config.typescript.ignoreBuildErrors)\n\n  if (ignoreTypeScriptErrors) {\n    Log.info('Skipping validation of types')\n  }\n\n  let typeCheckingSpinnerPrefixText: string | undefined\n  let typeCheckingSpinner: ReturnType<typeof createSpinner> | undefined\n\n  if (!ignoreTypeScriptErrors) {\n    typeCheckingSpinnerPrefixText = 'Running TypeScript'\n  }\n\n  if (typeCheckingSpinnerPrefixText) {\n    typeCheckingSpinner = createSpinner(typeCheckingSpinnerPrefixText)\n  }\n\n  const typeCheckAndLintStart = process.hrtime()\n\n  try {\n    const [verifyResult, typeCheckEnd] = await nextBuildSpan\n      .traceChild('run-typescript')\n      .traceAsyncFn(() =>\n        verifyAndRunTypeScript(\n          dir,\n          config.distDir,\n          Boolean(config.experimental.strictRouteTypes),\n          !ignoreTypeScriptErrors,\n          config.typescript.tsconfigPath,\n          Boolean(config.typedRoutes),\n          config.images.disableStaticImages,\n          cacheDir,\n          config.experimental.workerThreads,\n          !!appDir,\n          !!pagesDir,\n          appDir,\n          pagesDir,\n          debugBuildPaths\n        ).then((resolved) => {\n          const checkEnd = process.hrtime(typeCheckAndLintStart)\n          return [resolved, checkEnd] as const\n        })\n      )\n\n    if (typeCheckingSpinner) {\n      typeCheckingSpinner.stop()\n    }\n\n    createSpinner(\n      `Finished TypeScript${ignoreTypeScriptErrors ? ' config validation' : ''} in ${hrtimeDurationToString(typeCheckEnd)}`\n    )?.stopAndPersist()\n\n    if (!ignoreTypeScriptErrors && verifyResult) {\n      telemetry.record(\n        eventTypeCheckCompleted({\n          durationInSeconds: typeCheckEnd[0],\n          typescriptVersion: verifyResult.version,\n          inputFilesCount: verifyResult.result?.inputFilesCount,\n          totalFilesCount: verifyResult.result?.totalFilesCount,\n          incremental: verifyResult.result?.incremental,\n        })\n      )\n    }\n  } catch (err) {\n    // prevent showing jest-worker internal error as it\n    // isn't helpful for users and clutters output\n    if (isError(err) && err.message === 'Call retries were exceeded') {\n      await telemetry.flush()\n      process.exit(1)\n    }\n    throw err\n  }\n}\n"],"names":["Log","Worker","createSpinner","eventTypeCheckCompleted","isError","hrtimeDurationToString","verifyAndRunTypeScript","dir","distDir","strictRouteTypes","shouldRunTypeCheck","tsconfigPath","typedRoutes","disableStaticImages","cacheDir","enableWorkerThreads","hasAppDir","hasPagesDir","appDir","pagesDir","debugBuildPaths","impl","typeCheckWorker","require","resolve","exposedMethods","debuggerPortOffset","isolatedMemory","numWorkers","maxRetries","then","result","end","catch","process","exit","startTypeChecking","config","nextBuildSpan","telemetry","ignoreTypeScriptErrors","Boolean","typescript","ignoreBuildErrors","info","typeCheckingSpinnerPrefixText","typeCheckingSpinner","typeCheckAndLintStart","hrtime","verifyResult","typeCheckEnd","traceChild","traceAsyncFn","experimental","images","workerThreads","resolved","checkEnd","stop","stopAndPersist","record","durationInSeconds","typescriptVersion","version","inputFilesCount","totalFilesCount","incremental","err","message","flush"],"mappings":"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","ignoreList":[0]}