{"version":3,"sources":["../../../src/telemetry/events/build.ts"],"sourcesContent":["import type { TelemetryPlugin } from '../../build/webpack/plugins/telemetry-plugin/telemetry-plugin'\nimport type { SWC_TARGET_TRIPLE } from '../../build/webpack/plugins/telemetry-plugin/telemetry-plugin'\nimport type { UseCacheTrackerKey } from '../../build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils'\nimport { extractNextErrorCode } from '../../lib/error-telemetry-utils'\n\nconst REGEXP_DIRECTORY_DUNDER =\n  /[\\\\/]__[^\\\\/]+(?<![\\\\/]__(?:tests|mocks))__[\\\\/]/i\nconst REGEXP_DIRECTORY_TESTS = /[\\\\/]__(tests|mocks)__[\\\\/]/i\nconst REGEXP_FILE_TEST = /\\.(?:spec|test)\\.[^.]+$/i\n\nconst EVENT_TYPE_CHECK_COMPLETED = 'NEXT_TYPE_CHECK_COMPLETED'\ntype EventTypeCheckCompleted = {\n  durationInSeconds: number\n  typescriptVersion: string | null\n  inputFilesCount?: number\n  totalFilesCount?: number\n  incremental?: boolean\n}\n\nexport function eventTypeCheckCompleted(event: EventTypeCheckCompleted): {\n  eventName: string\n  payload: EventTypeCheckCompleted\n} {\n  return {\n    eventName: EVENT_TYPE_CHECK_COMPLETED,\n    payload: event,\n  }\n}\n\nconst EVENT_LINT_CHECK_COMPLETED = 'NEXT_LINT_CHECK_COMPLETED'\nexport type EventLintCheckCompleted = {\n  durationInSeconds: number\n  eslintVersion: string | null\n  lintedFilesCount?: number\n  lintFix?: boolean\n  buildLint?: boolean\n  nextEslintPluginVersion?: string | null\n  nextEslintPluginErrorsCount?: number\n  nextEslintPluginWarningsCount?: number\n  nextRulesEnabled: {\n    [ruleName: `@next/next/${string}`]: 'off' | 'warn' | 'error'\n  }\n}\n\nexport function eventLintCheckCompleted(event: EventLintCheckCompleted): {\n  eventName: string\n  payload: EventLintCheckCompleted\n} {\n  return {\n    eventName: EVENT_LINT_CHECK_COMPLETED,\n    payload: event,\n  }\n}\n\nconst EVENT_ANALYZE_COMPLETED = 'NEXT_ANALYZE_COMPLETED'\ntype AnalyzeEventCompleted =\n  | {\n      durationInSeconds: number\n      success: true\n      totalPageCount: number\n    }\n  | {\n      success: false\n    }\n\nexport function eventAnalyzeCompleted(event: AnalyzeEventCompleted): {\n  eventName: string\n  payload: AnalyzeEventCompleted\n} {\n  return {\n    eventName: EVENT_ANALYZE_COMPLETED,\n    payload: event,\n  }\n}\n\nconst EVENT_BUILD_COMPLETED = 'NEXT_BUILD_COMPLETED'\ntype EventBuildCompleted = {\n  bundler: 'webpack' | 'rspack' | 'turbopack'\n  durationInSeconds: number\n  totalPageCount: number\n  hasDunderPages: boolean\n  hasTestPages: boolean\n  totalAppPagesCount?: number\n}\n\nexport function eventBuildCompleted(\n  pagePaths: string[],\n  event: Omit<\n    EventBuildCompleted,\n    'totalPageCount' | 'hasDunderPages' | 'hasTestPages'\n  >\n): { eventName: string; payload: EventBuildCompleted } {\n  return {\n    eventName: EVENT_BUILD_COMPLETED,\n    payload: {\n      ...event,\n      totalPageCount: pagePaths.length,\n      hasDunderPages: pagePaths.some((path) =>\n        REGEXP_DIRECTORY_DUNDER.test(path)\n      ),\n      hasTestPages: pagePaths.some(\n        (path) =>\n          REGEXP_DIRECTORY_TESTS.test(path) || REGEXP_FILE_TEST.test(path)\n      ),\n      totalAppPagesCount: event.totalAppPagesCount,\n    },\n  }\n}\n\nconst EVENT_BUILD_FAILED = 'NEXT_BUILD_FAILED'\ntype EventBuildFailed = {\n  bundler: 'webpack' | 'rspack' | 'turbopack'\n  errorCode: string\n  durationInSeconds: number\n}\n\nexport function eventBuildFailed(event: EventBuildFailed) {\n  return {\n    eventName: EVENT_BUILD_FAILED,\n    payload: event,\n  }\n}\n\nconst EVENT_BUILD_OPTIMIZED = 'NEXT_BUILD_OPTIMIZED'\ntype EventBuildOptimized = {\n  durationInSeconds: number\n  totalPageCount: number\n  staticPageCount: number\n  staticPropsPageCount: number\n  serverPropsPageCount: number\n  ssrPageCount: number\n  hasDunderPages: boolean\n  hasTestPages: boolean\n  hasStatic404: boolean\n  hasReportWebVitals: boolean\n  headersCount: number\n  rewritesCount: number\n  redirectsCount: number\n  headersWithHasCount: number\n  rewritesWithHasCount: number\n  redirectsWithHasCount: number\n  middlewareCount: number\n  isRspack: boolean\n  totalAppPagesCount?: number\n  staticAppPagesCount?: number\n  serverAppPagesCount?: number\n  edgeRuntimeAppCount?: number\n  edgeRuntimePagesCount?: number\n}\n\nexport function eventBuildOptimize(\n  pagePaths: string[],\n  event: Omit<\n    EventBuildOptimized,\n    'totalPageCount' | 'hasDunderPages' | 'hasTestPages' | 'isRspack'\n  >\n): { eventName: string; payload: EventBuildOptimized } {\n  return {\n    eventName: EVENT_BUILD_OPTIMIZED,\n    payload: {\n      ...event,\n      totalPageCount: pagePaths.length,\n      hasDunderPages: pagePaths.some((path) =>\n        REGEXP_DIRECTORY_DUNDER.test(path)\n      ),\n      hasTestPages: pagePaths.some(\n        (path) =>\n          REGEXP_DIRECTORY_TESTS.test(path) || REGEXP_FILE_TEST.test(path)\n      ),\n      totalAppPagesCount: event.totalAppPagesCount,\n      staticAppPagesCount: event.staticAppPagesCount,\n      serverAppPagesCount: event.serverAppPagesCount,\n      edgeRuntimeAppCount: event.edgeRuntimeAppCount,\n      edgeRuntimePagesCount: event.edgeRuntimePagesCount,\n      isRspack: process.env.NEXT_RSPACK !== undefined,\n    },\n  }\n}\n\nexport const EVENT_BUILD_FEATURE_USAGE = 'NEXT_BUILD_FEATURE_USAGE'\nexport type EventBuildFeatureUsage = {\n  // NOTE: If you are adding features, make sure to update the `enum` field\n  // for `featureName` in https://github.com/vercel/next-telemetry/blob/master/events/v1/featureUsage.ts\n  // *before* you make changes here.\n  featureName:\n    | 'next/image'\n    | 'next/legacy/image'\n    | 'next/future/image'\n    | 'next/script'\n    | 'next/dynamic'\n    | '@next/font/google'\n    | '@next/font/local'\n    | 'next/font/google'\n    | 'next/font/local'\n    | 'experimental/nextScriptWorkers'\n    | 'experimental/cacheComponents'\n    | 'experimental/optimizeCss'\n    | 'experimental/ppr'\n    | 'swcLoader'\n    | 'swcRelay'\n    | 'swcStyledComponents'\n    | 'swcReactRemoveProperties'\n    | 'swcExperimentalDecorators'\n    | 'swcRemoveConsole'\n    | 'swcImportSource'\n    | 'swcEmotion'\n    | `swc/target/${SWC_TARGET_TRIPLE}`\n    | 'turbotrace'\n    | 'vercelImageGeneration'\n    | 'transpilePackages'\n    | 'skipProxyUrlNormalize'\n    | 'skipTrailingSlashRedirect'\n    | 'modularizeImports'\n    | 'esmExternals'\n    | 'webpackPlugins'\n    | UseCacheTrackerKey\n    | 'turbopackFileSystemCache'\n    | 'runAfterProductionCompile'\n  invocationCount: number\n}\nexport function eventBuildFeatureUsage(\n  usages: ReturnType<TelemetryPlugin['usages']>\n): Array<{ eventName: string; payload: EventBuildFeatureUsage }> {\n  return usages.map(({ featureName, invocationCount }) => ({\n    eventName: EVENT_BUILD_FEATURE_USAGE,\n    payload: {\n      featureName,\n      invocationCount,\n    },\n  }))\n}\n\nexport const EVENT_NAME_PACKAGE_USED_IN_GET_SERVER_SIDE_PROPS =\n  'NEXT_PACKAGE_USED_IN_GET_SERVER_SIDE_PROPS'\n\nexport type EventPackageUsedInGetServerSideProps = {\n  package: string\n}\n\nexport function eventPackageUsedInGetServerSideProps(\n  packagesUsedInServerSideProps: ReturnType<\n    TelemetryPlugin['packagesUsedInServerSideProps']\n  >\n): Array<{ eventName: string; payload: EventPackageUsedInGetServerSideProps }> {\n  return packagesUsedInServerSideProps.map((packageName) => ({\n    eventName: EVENT_NAME_PACKAGE_USED_IN_GET_SERVER_SIDE_PROPS,\n    payload: {\n      package: packageName,\n    },\n  }))\n}\n\nexport const EVENT_MCP_TOOL_USAGE = 'NEXT_MCP_TOOL_USAGE'\n\nexport type McpToolName =\n  | 'mcp/get_errors'\n  | 'mcp/get_logs'\n  | 'mcp/get_page_metadata'\n  | 'mcp/get_project_metadata'\n  | 'mcp/get_routes'\n  | 'mcp/get_server_action_by_id'\n\nexport type EventMcpToolUsage = {\n  toolName: McpToolName\n  invocationCount: number\n}\n\nexport function eventMcpToolUsage(\n  usages: Array<{ featureName: McpToolName; invocationCount: number }>\n): Array<{ eventName: string; payload: EventMcpToolUsage }> {\n  return usages.map(({ featureName, invocationCount }) => ({\n    eventName: EVENT_MCP_TOOL_USAGE,\n    payload: {\n      toolName: featureName,\n      invocationCount,\n    },\n  }))\n}\n\nexport const ERROR_THROWN_EVENT = 'NEXT_ERROR_THROWN'\ntype ErrorThrownEvent = {\n  eventName: typeof ERROR_THROWN_EVENT\n  payload: {\n    errorCode: string | undefined\n    location: string | undefined\n  }\n}\n\n// Creates a Telemetry event for errors. For privacy, only includes the error code and not the error\n// message.\n//\n// `location` may be included if it's a location internal to the next.js source tree (i.e. a\n// non-absolute path).\nexport function eventErrorThrown(\n  error: Error,\n  anonymizedLocation: string | undefined\n): ErrorThrownEvent {\n  return {\n    eventName: ERROR_THROWN_EVENT,\n    payload: {\n      errorCode: extractNextErrorCode(error) || 'Unknown',\n      location: anonymizedLocation,\n    },\n  }\n}\n"],"names":["ERROR_THROWN_EVENT","EVENT_BUILD_FEATURE_USAGE","EVENT_MCP_TOOL_USAGE","EVENT_NAME_PACKAGE_USED_IN_GET_SERVER_SIDE_PROPS","eventAnalyzeCompleted","eventBuildCompleted","eventBuildFailed","eventBuildFeatureUsage","eventBuildOptimize","eventErrorThrown","eventLintCheckCompleted","eventMcpToolUsage","eventPackageUsedInGetServerSideProps","eventTypeCheckCompleted","REGEXP_DIRECTORY_DUNDER","REGEXP_DIRECTORY_TESTS","REGEXP_FILE_TEST","EVENT_TYPE_CHECK_COMPLETED","event","eventName","payload","EVENT_LINT_CHECK_COMPLETED","EVENT_ANALYZE_COMPLETED","EVENT_BUILD_COMPLETED","pagePaths","totalPageCount","length","hasDunderPages","some","path","test","hasTestPages","totalAppPagesCount","EVENT_BUILD_FAILED","EVENT_BUILD_OPTIMIZED","staticAppPagesCount","serverAppPagesCount","edgeRuntimeAppCount","edgeRuntimePagesCount","isRspack","process","env","NEXT_RSPACK","undefined","usages","map","featureName","invocationCount","packagesUsedInServerSideProps","packageName","package","toolName","error","anonymizedLocation","errorCode","extractNextErrorCode","location"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;IAuRaA,kBAAkB;eAAlBA;;IApGAC,yBAAyB;eAAzBA;;IAyEAC,oBAAoB;eAApBA;;IApBAC,gDAAgD;eAAhDA;;IAvKGC,qBAAqB;eAArBA;;IAoBAC,mBAAmB;eAAnBA;;IA+BAC,gBAAgB;eAAhBA;;IAwGAC,sBAAsB;eAAtBA;;IAtEAC,kBAAkB;eAAlBA;;IA+IAC,gBAAgB;eAAhBA;;IAzPAC,uBAAuB;eAAvBA;;IA+NAC,iBAAiB;eAAjBA;;IA5BAC,oCAAoC;eAApCA;;IA5NAC,uBAAuB;eAAvBA;;;qCAhBqB;AAErC,MAAMC,0BACJ;AACF,MAAMC,yBAAyB;AAC/B,MAAMC,mBAAmB;AAEzB,MAAMC,6BAA6B;AAS5B,SAASJ,wBAAwBK,KAA8B;IAIpE,OAAO;QACLC,WAAWF;QACXG,SAASF;IACX;AACF;AAEA,MAAMG,6BAA6B;AAe5B,SAASX,wBAAwBQ,KAA8B;IAIpE,OAAO;QACLC,WAAWE;QACXD,SAASF;IACX;AACF;AAEA,MAAMI,0BAA0B;AAWzB,SAASlB,sBAAsBc,KAA4B;IAIhE,OAAO;QACLC,WAAWG;QACXF,SAASF;IACX;AACF;AAEA,MAAMK,wBAAwB;AAUvB,SAASlB,oBACdmB,SAAmB,EACnBN,KAGC;IAED,OAAO;QACLC,WAAWI;QACXH,SAAS;YACP,GAAGF,KAAK;YACRO,gBAAgBD,UAAUE,MAAM;YAChCC,gBAAgBH,UAAUI,IAAI,CAAC,CAACC,OAC9Bf,wBAAwBgB,IAAI,CAACD;YAE/BE,cAAcP,UAAUI,IAAI,CAC1B,CAACC,OACCd,uBAAuBe,IAAI,CAACD,SAASb,iBAAiBc,IAAI,CAACD;YAE/DG,oBAAoBd,MAAMc,kBAAkB;QAC9C;IACF;AACF;AAEA,MAAMC,qBAAqB;AAOpB,SAAS3B,iBAAiBY,KAAuB;IACtD,OAAO;QACLC,WAAWc;QACXb,SAASF;IACX;AACF;AAEA,MAAMgB,wBAAwB;AA2BvB,SAAS1B,mBACdgB,SAAmB,EACnBN,KAGC;IAED,OAAO;QACLC,WAAWe;QACXd,SAAS;YACP,GAAGF,KAAK;YACRO,gBAAgBD,UAAUE,MAAM;YAChCC,gBAAgBH,UAAUI,IAAI,CAAC,CAACC,OAC9Bf,wBAAwBgB,IAAI,CAACD;YAE/BE,cAAcP,UAAUI,IAAI,CAC1B,CAACC,OACCd,uBAAuBe,IAAI,CAACD,SAASb,iBAAiBc,IAAI,CAACD;YAE/DG,oBAAoBd,MAAMc,kBAAkB;YAC5CG,qBAAqBjB,MAAMiB,mBAAmB;YAC9CC,qBAAqBlB,MAAMkB,mBAAmB;YAC9CC,qBAAqBnB,MAAMmB,mBAAmB;YAC9CC,uBAAuBpB,MAAMoB,qBAAqB;YAClDC,UAAUC,QAAQC,GAAG,CAACC,WAAW,KAAKC;QACxC;IACF;AACF;AAEO,MAAM1C,4BAA4B;AAyClC,SAASM,uBACdqC,MAA6C;IAE7C,OAAOA,OAAOC,GAAG,CAAC,CAAC,EAAEC,WAAW,EAAEC,eAAe,EAAE,GAAM,CAAA;YACvD5B,WAAWlB;YACXmB,SAAS;gBACP0B;gBACAC;YACF;QACF,CAAA;AACF;AAEO,MAAM5C,mDACX;AAMK,SAASS,qCACdoC,6BAEC;IAED,OAAOA,8BAA8BH,GAAG,CAAC,CAACI,cAAiB,CAAA;YACzD9B,WAAWhB;YACXiB,SAAS;gBACP8B,SAASD;YACX;QACF,CAAA;AACF;AAEO,MAAM/C,uBAAuB;AAe7B,SAASS,kBACdiC,MAAoE;IAEpE,OAAOA,OAAOC,GAAG,CAAC,CAAC,EAAEC,WAAW,EAAEC,eAAe,EAAE,GAAM,CAAA;YACvD5B,WAAWjB;YACXkB,SAAS;gBACP+B,UAAUL;gBACVC;YACF;QACF,CAAA;AACF;AAEO,MAAM/C,qBAAqB;AAc3B,SAASS,iBACd2C,KAAY,EACZC,kBAAsC;IAEtC,OAAO;QACLlC,WAAWnB;QACXoB,SAAS;YACPkC,WAAWC,IAAAA,yCAAoB,EAACH,UAAU;YAC1CI,UAAUH;QACZ;IACF;AACF","ignoreList":[0]}