next 15.4.0-canary.4 → 15.4.0-canary.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +2 -2
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack-config.js +2 -2
  5. package/dist/client/app-bootstrap.js +1 -1
  6. package/dist/client/index.js +1 -1
  7. package/dist/compiled/next-server/app-page-experimental.runtime.prod.js.map +1 -1
  8. package/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js.map +1 -1
  9. package/dist/compiled/next-server/app-page-turbo.runtime.prod.js.map +1 -1
  10. package/dist/compiled/next-server/app-page.runtime.prod.js.map +1 -1
  11. package/dist/esm/build/index.js +2 -2
  12. package/dist/esm/build/swc/index.js +1 -1
  13. package/dist/esm/build/webpack-config.js +2 -2
  14. package/dist/esm/client/app-bootstrap.js +1 -1
  15. package/dist/esm/client/index.js +1 -1
  16. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  17. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  18. package/dist/esm/server/lib/app-info-log.js +1 -1
  19. package/dist/esm/server/lib/start-server.js +1 -1
  20. package/dist/esm/server/typescript/rules/metadata.js +2 -2
  21. package/dist/esm/server/typescript/rules/metadata.js.map +1 -1
  22. package/dist/esm/shared/lib/canary-only.js +1 -1
  23. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  24. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  25. package/dist/server/lib/app-info-log.js +1 -1
  26. package/dist/server/lib/start-server.js +1 -1
  27. package/dist/server/typescript/rules/metadata.js +2 -2
  28. package/dist/server/typescript/rules/metadata.js.map +1 -1
  29. package/dist/shared/lib/canary-only.js +1 -1
  30. package/dist/telemetry/anonymous-meta.js +1 -1
  31. package/dist/telemetry/events/session-stopped.js +2 -2
  32. package/dist/telemetry/events/version.js +2 -2
  33. package/package.json +15 -15
@@ -307,7 +307,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
307
307
  const nextBuildSpan = trace('next-build', undefined, {
308
308
  buildMode: experimentalBuildMode,
309
309
  isTurboBuild: String(isTurbopack),
310
- version: "15.4.0-canary.4"
310
+ version: "15.4.0-canary.5"
311
311
  });
312
312
  NextBuildContext.nextBuildSpan = nextBuildSpan;
313
313
  NextBuildContext.dir = dir;
@@ -688,7 +688,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
688
688
  // Files outside of the distDir can be "type": "module"
689
689
  await writeFileUtf8(path.join(distDir, 'package.json'), '{"type": "commonjs"}');
690
690
  // These are written to distDir, so they need to come after creating and cleaning distDr.
691
- await recordFrameworkVersion("15.4.0-canary.4");
691
+ await recordFrameworkVersion("15.4.0-canary.5");
692
692
  await updateBuildDiagnostics({
693
693
  buildStage: 'start'
694
694
  });
@@ -11,7 +11,7 @@ import { isDeepStrictEqual } from 'util';
11
11
  import { getDefineEnv } from '../webpack/plugins/define-env-plugin';
12
12
  import { getReactCompilerLoader } from '../get-babel-loader-config';
13
13
  import { TurbopackInternalError } from '../../shared/lib/turbopack/utils';
14
- const nextVersion = "15.4.0-canary.4";
14
+ const nextVersion = "15.4.0-canary.5";
15
15
  const ArchName = arch();
16
16
  const PlatformName = platform();
17
17
  function infoLog(...args) {
@@ -1553,7 +1553,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1553
1553
  isClient && new CopyFilePlugin({
1554
1554
  // file path to build output of `@next/polyfill-nomodule`
1555
1555
  filePath: require.resolve('./polyfills/polyfill-nomodule'),
1556
- cacheKey: "15.4.0-canary.4",
1556
+ cacheKey: "15.4.0-canary.5",
1557
1557
  name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
1558
1558
  minimize: false,
1559
1559
  info: {
@@ -1730,7 +1730,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1730
1730
  // - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
1731
1731
  // - Next.js version
1732
1732
  // - next.config.js keys that affect compilation
1733
- version: `${__dirname}|${"15.4.0-canary.4"}|${configVars}`,
1733
+ version: `${__dirname}|${"15.4.0-canary.5"}|${configVars}`,
1734
1734
  cacheDirectory: path.join(distDir, 'cache', 'webpack'),
1735
1735
  // For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
1736
1736
  // So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
@@ -3,7 +3,7 @@
3
3
  * sure the following scripts are executed in the correct order:
4
4
  * - Polyfills
5
5
  * - next/script with `beforeInteractive` strategy
6
- */ const version = "15.4.0-canary.4";
6
+ */ const version = "15.4.0-canary.5";
7
7
  window.next = {
8
8
  version,
9
9
  appDir: true
@@ -26,7 +26,7 @@ import { SearchParamsContext, PathParamsContext } from '../shared/lib/hooks-clie
26
26
  import { onRecoverableError } from './react-client-callbacks/on-recoverable-error';
27
27
  import tracer from './tracing/tracer';
28
28
  import { isNextRouterError } from './components/is-next-router-error';
29
- export const version = "15.4.0-canary.4";
29
+ export const version = "15.4.0-canary.5";
30
30
  export let router;
31
31
  export const emitter = mitt();
32
32
  const looseToArray = (input)=>[].slice.call(input);
@@ -83,7 +83,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
83
83
  }
84
84
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
85
85
  const hotReloaderSpan = trace('hot-reloader', undefined, {
86
- version: "15.4.0-canary.4"
86
+ version: "15.4.0-canary.5"
87
87
  });
88
88
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
89
89
  // of the current `next dev` invocation.
@@ -181,7 +181,7 @@ export default class HotReloaderWebpack {
181
181
  this.previewProps = previewProps;
182
182
  this.rewrites = rewrites;
183
183
  this.hotReloaderSpan = trace('hot-reloader', undefined, {
184
- version: "15.4.0-canary.4"
184
+ version: "15.4.0-canary.5"
185
185
  });
186
186
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
187
187
  // of the current `next dev` invocation.
@@ -12,7 +12,7 @@ export function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures
12
12
  } else {
13
13
  bundlerSuffix = '';
14
14
  }
15
- Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.4.0-canary.4"}`))}${bundlerSuffix}`);
15
+ Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.4.0-canary.5"}`))}${bundlerSuffix}`);
16
16
  if (appUrl) {
17
17
  Log.bootstrap(`- Local: ${appUrl}`);
18
18
  }
@@ -42,7 +42,7 @@ export async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup,
42
42
  export async function startServer(serverOptions) {
43
43
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
44
44
  let { port } = serverOptions;
45
- process.title = `next-server (v${"15.4.0-canary.4"})`;
45
+ process.title = `next-server (v${"15.4.0-canary.5"})`;
46
46
  let handlersReady = ()=>{};
47
47
  let handlersError = ()=>{};
48
48
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -166,7 +166,7 @@ const metadata = {
166
166
  }
167
167
  }
168
168
  }
169
- if (!hasCorrectType(declaration)) {
169
+ if (declaration && ts.isFunctionDeclaration(declaration) && !hasCorrectType(declaration)) {
170
170
  diagnostics.push({
171
171
  file: source,
172
172
  category: ts.DiagnosticCategory.Warning,
@@ -180,7 +180,7 @@ const metadata = {
180
180
  var _symbol_declarations;
181
181
  // must be 'metadata' at this point
182
182
  const declaration = (_symbol_declarations = symbol.declarations) == null ? void 0 : _symbol_declarations[0];
183
- if (!hasCorrectType(declaration)) {
183
+ if (declaration && ts.isVariableDeclaration(declaration) && !hasCorrectType(declaration)) {
184
184
  diagnostics.push({
185
185
  file: source,
186
186
  category: ts.DiagnosticCategory.Warning,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/typescript/rules/metadata.ts"],"sourcesContent":["import { NEXT_TS_ERRORS } from '../constant'\nimport { getSource, getTs, getTypeChecker } from '../utils'\n\nimport type tsModule from 'typescript/lib/tsserverlibrary'\n\nconst metadata = {\n client: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n // It is not allowed to export `metadata` or `generateMetadata` in client entry\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'generateMetadata' API is not allowed in a Client Component.`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'metadata' API is not allowed in a Client Component.`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ): tsModule.Diagnostic[] {\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (['generateMetadata', 'metadata'].includes(e.name.getText())) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js '${e.name.getText()}' API is not allowed in a Client Component.`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n\n return diagnostics\n },\n },\n server: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n if (hasCorrectType(node)) {\n return []\n }\n\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n if (hasCorrectType(declaration)) {\n return []\n }\n\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n if (name === 'generateMetadata') {\n // Check if it's a function expression or arrow function\n if (\n declaration.initializer &&\n (ts.isFunctionExpression(declaration.initializer) ||\n ts.isArrowFunction(declaration.initializer))\n ) {\n const isAsync = declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ) {\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return []\n }\n\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (!node.isTypeOnly && exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (e.isTypeOnly) {\n continue\n }\n const exportName = e.name.getText()\n if (exportName !== 'generateMetadata' && exportName !== 'metadata') {\n continue\n }\n\n // Get the symbol and type for the export\n const symbol = typeChecker.getSymbolAtLocation(e.name)\n if (!symbol) continue\n\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, e.name)\n if (!type) continue\n\n if (exportName === 'generateMetadata') {\n let isAsync = false\n\n // For export declarations, we need to get the actual declaration through the type checker\n const originalSymbol = typeChecker.getAliasedSymbol(symbol)\n const declaration = originalSymbol?.declarations?.[0]\n\n if (declaration) {\n if (ts.isFunctionDeclaration(declaration)) {\n isAsync =\n declaration.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n } else if (\n ts.isVariableDeclaration(declaration) &&\n declaration.initializer\n ) {\n if (\n ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer)\n ) {\n isAsync =\n declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n }\n }\n }\n\n if (!hasCorrectType(declaration as tsModule.FunctionDeclaration)) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n } else {\n // must be 'metadata' at this point\n const declaration = symbol.declarations?.[0]\n if (!hasCorrectType(declaration as tsModule.VariableDeclaration)) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n }\n\n return diagnostics\n },\n },\n}\n\nfunction hasCorrectType(\n node: tsModule.FunctionDeclaration | tsModule.VariableDeclaration\n): boolean {\n // Skip if already has type.\n if (node.type) {\n return true\n }\n\n const ts = getTs()\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return false\n }\n\n // For generateMetadata, check if it's Promise<Metadata> for async or Metadata for sync\n if (ts.isFunctionDeclaration(node)) {\n return checkFunctionReturnType(node, typeChecker)\n } else {\n // For variable declarations (const/let/var)\n const name = node.name.getText()\n\n if (name === 'generateMetadata') {\n // For generateMetadata as a variable, it must be a function expression or arrow function\n if (\n !node.initializer ||\n (!ts.isFunctionExpression(node.initializer) &&\n !ts.isArrowFunction(node.initializer))\n ) {\n return false\n }\n\n // Check the return type of the function expression/arrow function\n if (node.initializer.type) {\n // If it has an explicit return type annotation\n return checkFunctionReturnType(node.initializer, typeChecker)\n } else {\n // If no explicit return type, infer it from the function\n const signature = typeChecker.getSignatureFromDeclaration(\n node.initializer\n )\n if (!signature) return false\n\n const returnType = typeChecker.getReturnTypeOfSignature(signature)\n if (!returnType) return false\n\n const isAsync =\n node.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n\n if (isAsync) {\n // For async functions, check if it's Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') return false\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (\n returnType as { typeArguments: readonly tsModule.Type[] }\n ).typeArguments\n if (!typeArgs || typeArgs.length !== 1) return false\n\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, check if it returns Metadata\n const returnTypeSymbol = returnType.getSymbol()\n return returnTypeSymbol?.getName() === 'Metadata'\n }\n }\n } else {\n // For metadata export, we just need Metadata type\n if (!node.type) return false\n const type = typeChecker.getTypeFromTypeNode(node.type)\n if (!type) return false\n const symbol = type.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n }\n}\n\nfunction checkFunctionReturnType(\n node:\n | tsModule.FunctionDeclaration\n | tsModule.FunctionExpression\n | tsModule.ArrowFunction,\n typeChecker: tsModule.TypeChecker\n): boolean {\n const ts = getTs()\n\n if (!node.type) return false\n\n const returnType = typeChecker.getTypeFromTypeNode(node.type)\n if (!returnType) return false\n\n const isAsync =\n node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ?? false\n\n if (isAsync) {\n // For async functions, we need Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') {\n return false\n }\n\n // Get the type argument of Promise<T>\n if (!ts.isTypeReferenceNode(node.type)) {\n return false\n }\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (returnType as { typeArguments: readonly tsModule.Type[] })\n .typeArguments\n if (!typeArgs || typeArgs.length !== 1) {\n return false\n }\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, we need Metadata directly\n const symbol = returnType.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n}\n\nexport default metadata\n"],"names":["NEXT_TS_ERRORS","getSource","getTs","getTypeChecker","metadata","client","getSemanticDiagnosticsForExportVariableStatement","fileName","node","source","ts","isFunctionDeclaration","name","getText","file","category","DiagnosticCategory","Error","code","INVALID_METADATA_EXPORT","messageText","start","getStart","length","getWidth","declaration","declarationList","declarations","getSemanticDiagnosticsForExportDeclaration","diagnostics","exportClause","isNamedExports","e","elements","includes","push","server","hasCorrectType","isAsync","modifiers","some","m","kind","SyntaxKind","AsyncKeyword","Warning","initializer","isFunctionExpression","isArrowFunction","typeChecker","isTypeOnly","exportName","symbol","getSymbolAtLocation","type","getTypeOfSymbolAtLocation","originalSymbol","getAliasedSymbol","isVariableDeclaration","checkFunctionReturnType","signature","getSignatureFromDeclaration","returnType","getReturnTypeOfSignature","typeSymbol","getSymbol","getName","flags","TypeFlags","Object","typeArgs","typeArguments","promiseType","promiseTypeSymbol","returnTypeSymbol","getTypeFromTypeNode","isTypeReferenceNode"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../src/server/typescript/rules/metadata.ts"],"sourcesContent":["import { NEXT_TS_ERRORS } from '../constant'\nimport { getSource, getTs, getTypeChecker } from '../utils'\n\nimport type tsModule from 'typescript/lib/tsserverlibrary'\n\nconst metadata = {\n client: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n // It is not allowed to export `metadata` or `generateMetadata` in client entry\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'generateMetadata' API is not allowed in a Client Component.`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'metadata' API is not allowed in a Client Component.`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ): tsModule.Diagnostic[] {\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (['generateMetadata', 'metadata'].includes(e.name.getText())) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js '${e.name.getText()}' API is not allowed in a Client Component.`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n\n return diagnostics\n },\n },\n server: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n if (hasCorrectType(node)) {\n return []\n }\n\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n if (hasCorrectType(declaration)) {\n return []\n }\n\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n if (name === 'generateMetadata') {\n // Check if it's a function expression or arrow function\n if (\n declaration.initializer &&\n (ts.isFunctionExpression(declaration.initializer) ||\n ts.isArrowFunction(declaration.initializer))\n ) {\n const isAsync = declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ) {\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return []\n }\n\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (!node.isTypeOnly && exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (e.isTypeOnly) {\n continue\n }\n const exportName = e.name.getText()\n if (exportName !== 'generateMetadata' && exportName !== 'metadata') {\n continue\n }\n\n // Get the symbol and type for the export\n const symbol = typeChecker.getSymbolAtLocation(e.name)\n if (!symbol) continue\n\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, e.name)\n if (!type) continue\n\n if (exportName === 'generateMetadata') {\n let isAsync = false\n\n // For export declarations, we need to get the actual declaration through the type checker\n const originalSymbol = typeChecker.getAliasedSymbol(symbol)\n const declaration = originalSymbol?.declarations?.[0]\n\n if (declaration) {\n if (ts.isFunctionDeclaration(declaration)) {\n isAsync =\n declaration.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n } else if (\n ts.isVariableDeclaration(declaration) &&\n declaration.initializer\n ) {\n if (\n ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer)\n ) {\n isAsync =\n declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n }\n }\n }\n\n if (\n declaration &&\n ts.isFunctionDeclaration(declaration) &&\n !hasCorrectType(declaration)\n ) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n } else {\n // must be 'metadata' at this point\n const declaration = symbol.declarations?.[0]\n if (\n declaration &&\n ts.isVariableDeclaration(declaration) &&\n !hasCorrectType(declaration)\n ) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n }\n\n return diagnostics\n },\n },\n}\n\nfunction hasCorrectType(\n node: tsModule.FunctionDeclaration | tsModule.VariableDeclaration\n): boolean {\n // Skip if already has type.\n if (node.type) {\n return true\n }\n\n const ts = getTs()\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return false\n }\n\n // For generateMetadata, check if it's Promise<Metadata> for async or Metadata for sync\n if (ts.isFunctionDeclaration(node)) {\n return checkFunctionReturnType(node, typeChecker)\n } else {\n // For variable declarations (const/let/var)\n const name = node.name.getText()\n\n if (name === 'generateMetadata') {\n // For generateMetadata as a variable, it must be a function expression or arrow function\n if (\n !node.initializer ||\n (!ts.isFunctionExpression(node.initializer) &&\n !ts.isArrowFunction(node.initializer))\n ) {\n return false\n }\n\n // Check the return type of the function expression/arrow function\n if (node.initializer.type) {\n // If it has an explicit return type annotation\n return checkFunctionReturnType(node.initializer, typeChecker)\n } else {\n // If no explicit return type, infer it from the function\n const signature = typeChecker.getSignatureFromDeclaration(\n node.initializer\n )\n if (!signature) return false\n\n const returnType = typeChecker.getReturnTypeOfSignature(signature)\n if (!returnType) return false\n\n const isAsync =\n node.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n\n if (isAsync) {\n // For async functions, check if it's Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') return false\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (\n returnType as { typeArguments: readonly tsModule.Type[] }\n ).typeArguments\n if (!typeArgs || typeArgs.length !== 1) return false\n\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, check if it returns Metadata\n const returnTypeSymbol = returnType.getSymbol()\n return returnTypeSymbol?.getName() === 'Metadata'\n }\n }\n } else {\n // For metadata export, we just need Metadata type\n if (!node.type) return false\n const type = typeChecker.getTypeFromTypeNode(node.type)\n if (!type) return false\n const symbol = type.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n }\n}\n\nfunction checkFunctionReturnType(\n node:\n | tsModule.FunctionDeclaration\n | tsModule.FunctionExpression\n | tsModule.ArrowFunction,\n typeChecker: tsModule.TypeChecker\n): boolean {\n const ts = getTs()\n\n if (!node.type) return false\n\n const returnType = typeChecker.getTypeFromTypeNode(node.type)\n if (!returnType) return false\n\n const isAsync =\n node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ?? false\n\n if (isAsync) {\n // For async functions, we need Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') {\n return false\n }\n\n // Get the type argument of Promise<T>\n if (!ts.isTypeReferenceNode(node.type)) {\n return false\n }\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (returnType as { typeArguments: readonly tsModule.Type[] })\n .typeArguments\n if (!typeArgs || typeArgs.length !== 1) {\n return false\n }\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, we need Metadata directly\n const symbol = returnType.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n}\n\nexport default metadata\n"],"names":["NEXT_TS_ERRORS","getSource","getTs","getTypeChecker","metadata","client","getSemanticDiagnosticsForExportVariableStatement","fileName","node","source","ts","isFunctionDeclaration","name","getText","file","category","DiagnosticCategory","Error","code","INVALID_METADATA_EXPORT","messageText","start","getStart","length","getWidth","declaration","declarationList","declarations","getSemanticDiagnosticsForExportDeclaration","diagnostics","exportClause","isNamedExports","e","elements","includes","push","server","hasCorrectType","isAsync","modifiers","some","m","kind","SyntaxKind","AsyncKeyword","Warning","initializer","isFunctionExpression","isArrowFunction","typeChecker","isTypeOnly","exportName","symbol","getSymbolAtLocation","type","getTypeOfSymbolAtLocation","originalSymbol","getAliasedSymbol","isVariableDeclaration","checkFunctionReturnType","signature","getSignatureFromDeclaration","returnType","getReturnTypeOfSignature","typeSymbol","getSymbol","getName","flags","TypeFlags","Object","typeArgs","typeArguments","promiseType","promiseTypeSymbol","returnTypeSymbol","getTypeFromTypeNode","isTypeReferenceNode"],"mappings":"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","ignoreList":[0]}
@@ -1,6 +1,6 @@
1
1
  export function isStableBuild() {
2
2
  var _process_env___NEXT_VERSION;
3
- return !((_process_env___NEXT_VERSION = "15.4.0-canary.4") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
3
+ return !((_process_env___NEXT_VERSION = "15.4.0-canary.5") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
4
4
  }
5
5
  export class CanaryOnlyError extends Error {
6
6
  constructor(arg){
@@ -139,7 +139,7 @@ async function createHotReloaderTurbopack(opts, serverFields, distDir, resetFetc
139
139
  }
140
140
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
141
141
  const hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
142
- version: "15.4.0-canary.4"
142
+ version: "15.4.0-canary.5"
143
143
  });
144
144
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
145
145
  // of the current `next dev` invocation.
@@ -257,7 +257,7 @@ class HotReloaderWebpack {
257
257
  this.previewProps = previewProps;
258
258
  this.rewrites = rewrites;
259
259
  this.hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
260
- version: "15.4.0-canary.4"
260
+ version: "15.4.0-canary.5"
261
261
  });
262
262
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
263
263
  // of the current `next dev` invocation.
@@ -75,7 +75,7 @@ function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures, maxEx
75
75
  } else {
76
76
  bundlerSuffix = '';
77
77
  }
78
- _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.4.0-canary.4"}`))}${bundlerSuffix}`);
78
+ _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.4.0-canary.5"}`))}${bundlerSuffix}`);
79
79
  if (appUrl) {
80
80
  _log.bootstrap(`- Local: ${appUrl}`);
81
81
  }
@@ -110,7 +110,7 @@ async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup, server
110
110
  async function startServer(serverOptions) {
111
111
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
112
112
  let { port } = serverOptions;
113
- process.title = `next-server (v${"15.4.0-canary.4"})`;
113
+ process.title = `next-server (v${"15.4.0-canary.5"})`;
114
114
  let handlersReady = ()=>{};
115
115
  let handlersError = ()=>{};
116
116
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -176,7 +176,7 @@ const metadata = {
176
176
  }
177
177
  }
178
178
  }
179
- if (!hasCorrectType(declaration)) {
179
+ if (declaration && ts.isFunctionDeclaration(declaration) && !hasCorrectType(declaration)) {
180
180
  diagnostics.push({
181
181
  file: source,
182
182
  category: ts.DiagnosticCategory.Warning,
@@ -190,7 +190,7 @@ const metadata = {
190
190
  var _symbol_declarations;
191
191
  // must be 'metadata' at this point
192
192
  const declaration = (_symbol_declarations = symbol.declarations) == null ? void 0 : _symbol_declarations[0];
193
- if (!hasCorrectType(declaration)) {
193
+ if (declaration && ts.isVariableDeclaration(declaration) && !hasCorrectType(declaration)) {
194
194
  diagnostics.push({
195
195
  file: source,
196
196
  category: ts.DiagnosticCategory.Warning,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/typescript/rules/metadata.ts"],"sourcesContent":["import { NEXT_TS_ERRORS } from '../constant'\nimport { getSource, getTs, getTypeChecker } from '../utils'\n\nimport type tsModule from 'typescript/lib/tsserverlibrary'\n\nconst metadata = {\n client: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n // It is not allowed to export `metadata` or `generateMetadata` in client entry\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'generateMetadata' API is not allowed in a Client Component.`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'metadata' API is not allowed in a Client Component.`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ): tsModule.Diagnostic[] {\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (['generateMetadata', 'metadata'].includes(e.name.getText())) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js '${e.name.getText()}' API is not allowed in a Client Component.`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n\n return diagnostics\n },\n },\n server: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n if (hasCorrectType(node)) {\n return []\n }\n\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n if (hasCorrectType(declaration)) {\n return []\n }\n\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n if (name === 'generateMetadata') {\n // Check if it's a function expression or arrow function\n if (\n declaration.initializer &&\n (ts.isFunctionExpression(declaration.initializer) ||\n ts.isArrowFunction(declaration.initializer))\n ) {\n const isAsync = declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ) {\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return []\n }\n\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (!node.isTypeOnly && exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (e.isTypeOnly) {\n continue\n }\n const exportName = e.name.getText()\n if (exportName !== 'generateMetadata' && exportName !== 'metadata') {\n continue\n }\n\n // Get the symbol and type for the export\n const symbol = typeChecker.getSymbolAtLocation(e.name)\n if (!symbol) continue\n\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, e.name)\n if (!type) continue\n\n if (exportName === 'generateMetadata') {\n let isAsync = false\n\n // For export declarations, we need to get the actual declaration through the type checker\n const originalSymbol = typeChecker.getAliasedSymbol(symbol)\n const declaration = originalSymbol?.declarations?.[0]\n\n if (declaration) {\n if (ts.isFunctionDeclaration(declaration)) {\n isAsync =\n declaration.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n } else if (\n ts.isVariableDeclaration(declaration) &&\n declaration.initializer\n ) {\n if (\n ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer)\n ) {\n isAsync =\n declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n }\n }\n }\n\n if (!hasCorrectType(declaration as tsModule.FunctionDeclaration)) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n } else {\n // must be 'metadata' at this point\n const declaration = symbol.declarations?.[0]\n if (!hasCorrectType(declaration as tsModule.VariableDeclaration)) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n }\n\n return diagnostics\n },\n },\n}\n\nfunction hasCorrectType(\n node: tsModule.FunctionDeclaration | tsModule.VariableDeclaration\n): boolean {\n // Skip if already has type.\n if (node.type) {\n return true\n }\n\n const ts = getTs()\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return false\n }\n\n // For generateMetadata, check if it's Promise<Metadata> for async or Metadata for sync\n if (ts.isFunctionDeclaration(node)) {\n return checkFunctionReturnType(node, typeChecker)\n } else {\n // For variable declarations (const/let/var)\n const name = node.name.getText()\n\n if (name === 'generateMetadata') {\n // For generateMetadata as a variable, it must be a function expression or arrow function\n if (\n !node.initializer ||\n (!ts.isFunctionExpression(node.initializer) &&\n !ts.isArrowFunction(node.initializer))\n ) {\n return false\n }\n\n // Check the return type of the function expression/arrow function\n if (node.initializer.type) {\n // If it has an explicit return type annotation\n return checkFunctionReturnType(node.initializer, typeChecker)\n } else {\n // If no explicit return type, infer it from the function\n const signature = typeChecker.getSignatureFromDeclaration(\n node.initializer\n )\n if (!signature) return false\n\n const returnType = typeChecker.getReturnTypeOfSignature(signature)\n if (!returnType) return false\n\n const isAsync =\n node.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n\n if (isAsync) {\n // For async functions, check if it's Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') return false\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (\n returnType as { typeArguments: readonly tsModule.Type[] }\n ).typeArguments\n if (!typeArgs || typeArgs.length !== 1) return false\n\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, check if it returns Metadata\n const returnTypeSymbol = returnType.getSymbol()\n return returnTypeSymbol?.getName() === 'Metadata'\n }\n }\n } else {\n // For metadata export, we just need Metadata type\n if (!node.type) return false\n const type = typeChecker.getTypeFromTypeNode(node.type)\n if (!type) return false\n const symbol = type.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n }\n}\n\nfunction checkFunctionReturnType(\n node:\n | tsModule.FunctionDeclaration\n | tsModule.FunctionExpression\n | tsModule.ArrowFunction,\n typeChecker: tsModule.TypeChecker\n): boolean {\n const ts = getTs()\n\n if (!node.type) return false\n\n const returnType = typeChecker.getTypeFromTypeNode(node.type)\n if (!returnType) return false\n\n const isAsync =\n node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ?? false\n\n if (isAsync) {\n // For async functions, we need Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') {\n return false\n }\n\n // Get the type argument of Promise<T>\n if (!ts.isTypeReferenceNode(node.type)) {\n return false\n }\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (returnType as { typeArguments: readonly tsModule.Type[] })\n .typeArguments\n if (!typeArgs || typeArgs.length !== 1) {\n return false\n }\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, we need Metadata directly\n const symbol = returnType.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n}\n\nexport default metadata\n"],"names":["metadata","client","getSemanticDiagnosticsForExportVariableStatement","fileName","node","source","getSource","ts","getTs","isFunctionDeclaration","name","getText","file","category","DiagnosticCategory","Error","code","NEXT_TS_ERRORS","INVALID_METADATA_EXPORT","messageText","start","getStart","length","getWidth","declaration","declarationList","declarations","getSemanticDiagnosticsForExportDeclaration","diagnostics","exportClause","isNamedExports","e","elements","includes","push","server","hasCorrectType","isAsync","modifiers","some","m","kind","SyntaxKind","AsyncKeyword","Warning","initializer","isFunctionExpression","isArrowFunction","typeChecker","getTypeChecker","isTypeOnly","exportName","symbol","getSymbolAtLocation","type","getTypeOfSymbolAtLocation","originalSymbol","getAliasedSymbol","isVariableDeclaration","checkFunctionReturnType","signature","getSignatureFromDeclaration","returnType","getReturnTypeOfSignature","typeSymbol","getSymbol","getName","flags","TypeFlags","Object","typeArgs","typeArguments","promiseType","promiseTypeSymbol","returnTypeSymbol","getTypeFromTypeNode","isTypeReferenceNode"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../src/server/typescript/rules/metadata.ts"],"sourcesContent":["import { NEXT_TS_ERRORS } from '../constant'\nimport { getSource, getTs, getTypeChecker } from '../utils'\n\nimport type tsModule from 'typescript/lib/tsserverlibrary'\n\nconst metadata = {\n client: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n // It is not allowed to export `metadata` or `generateMetadata` in client entry\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'generateMetadata' API is not allowed in a Client Component.`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js 'metadata' API is not allowed in a Client Component.`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ): tsModule.Diagnostic[] {\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (['generateMetadata', 'metadata'].includes(e.name.getText())) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Error,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js '${e.name.getText()}' API is not allowed in a Client Component.`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n\n return diagnostics\n },\n },\n server: {\n getSemanticDiagnosticsForExportVariableStatement(\n fileName: string,\n node: tsModule.VariableStatement | tsModule.FunctionDeclaration\n ): tsModule.Diagnostic[] {\n const source = getSource(fileName)\n const ts = getTs()\n\n if (ts.isFunctionDeclaration(node)) {\n if (node.name?.getText() === 'generateMetadata') {\n if (hasCorrectType(node)) {\n return []\n }\n\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: node.name.getStart(),\n length: node.name.getWidth(),\n },\n ]\n }\n } else {\n for (const declaration of node.declarationList.declarations) {\n if (hasCorrectType(declaration)) {\n return []\n }\n\n const name = declaration.name.getText()\n if (name === 'metadata') {\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n if (name === 'generateMetadata') {\n // Check if it's a function expression or arrow function\n if (\n declaration.initializer &&\n (ts.isFunctionExpression(declaration.initializer) ||\n ts.isArrowFunction(declaration.initializer))\n ) {\n const isAsync = declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n return [\n {\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: declaration.name.getStart(),\n length: declaration.name.getWidth(),\n },\n ]\n }\n }\n }\n }\n return []\n },\n getSemanticDiagnosticsForExportDeclaration(\n fileName: string,\n node: tsModule.ExportDeclaration\n ) {\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return []\n }\n\n const ts = getTs()\n const source = getSource(fileName)\n const diagnostics: tsModule.Diagnostic[] = []\n\n const exportClause = node.exportClause\n if (!node.isTypeOnly && exportClause && ts.isNamedExports(exportClause)) {\n for (const e of exportClause.elements) {\n if (e.isTypeOnly) {\n continue\n }\n const exportName = e.name.getText()\n if (exportName !== 'generateMetadata' && exportName !== 'metadata') {\n continue\n }\n\n // Get the symbol and type for the export\n const symbol = typeChecker.getSymbolAtLocation(e.name)\n if (!symbol) continue\n\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, e.name)\n if (!type) continue\n\n if (exportName === 'generateMetadata') {\n let isAsync = false\n\n // For export declarations, we need to get the actual declaration through the type checker\n const originalSymbol = typeChecker.getAliasedSymbol(symbol)\n const declaration = originalSymbol?.declarations?.[0]\n\n if (declaration) {\n if (ts.isFunctionDeclaration(declaration)) {\n isAsync =\n declaration.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n } else if (\n ts.isVariableDeclaration(declaration) &&\n declaration.initializer\n ) {\n if (\n ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer)\n ) {\n isAsync =\n declaration.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n }\n }\n }\n\n if (\n declaration &&\n ts.isFunctionDeclaration(declaration) &&\n !hasCorrectType(declaration)\n ) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The \"generateMetadata\" export should have a return type of ${isAsync ? '\"Promise<Metadata>\"' : '\"Metadata\"'} from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n } else {\n // must be 'metadata' at this point\n const declaration = symbol.declarations?.[0]\n if (\n declaration &&\n ts.isVariableDeclaration(declaration) &&\n !hasCorrectType(declaration)\n ) {\n diagnostics.push({\n file: source,\n category: ts.DiagnosticCategory.Warning,\n code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT,\n messageText: `The Next.js \"metadata\" export should be type of \"Metadata\" from \"next\".`,\n start: e.name.getStart(),\n length: e.name.getWidth(),\n })\n }\n }\n }\n }\n\n return diagnostics\n },\n },\n}\n\nfunction hasCorrectType(\n node: tsModule.FunctionDeclaration | tsModule.VariableDeclaration\n): boolean {\n // Skip if already has type.\n if (node.type) {\n return true\n }\n\n const ts = getTs()\n const typeChecker = getTypeChecker()\n if (!typeChecker) {\n return false\n }\n\n // For generateMetadata, check if it's Promise<Metadata> for async or Metadata for sync\n if (ts.isFunctionDeclaration(node)) {\n return checkFunctionReturnType(node, typeChecker)\n } else {\n // For variable declarations (const/let/var)\n const name = node.name.getText()\n\n if (name === 'generateMetadata') {\n // For generateMetadata as a variable, it must be a function expression or arrow function\n if (\n !node.initializer ||\n (!ts.isFunctionExpression(node.initializer) &&\n !ts.isArrowFunction(node.initializer))\n ) {\n return false\n }\n\n // Check the return type of the function expression/arrow function\n if (node.initializer.type) {\n // If it has an explicit return type annotation\n return checkFunctionReturnType(node.initializer, typeChecker)\n } else {\n // If no explicit return type, infer it from the function\n const signature = typeChecker.getSignatureFromDeclaration(\n node.initializer\n )\n if (!signature) return false\n\n const returnType = typeChecker.getReturnTypeOfSignature(signature)\n if (!returnType) return false\n\n const isAsync =\n node.initializer.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n ) ?? false\n\n if (isAsync) {\n // For async functions, check if it's Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') return false\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (\n returnType as { typeArguments: readonly tsModule.Type[] }\n ).typeArguments\n if (!typeArgs || typeArgs.length !== 1) return false\n\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, check if it returns Metadata\n const returnTypeSymbol = returnType.getSymbol()\n return returnTypeSymbol?.getName() === 'Metadata'\n }\n }\n } else {\n // For metadata export, we just need Metadata type\n if (!node.type) return false\n const type = typeChecker.getTypeFromTypeNode(node.type)\n if (!type) return false\n const symbol = type.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n }\n}\n\nfunction checkFunctionReturnType(\n node:\n | tsModule.FunctionDeclaration\n | tsModule.FunctionExpression\n | tsModule.ArrowFunction,\n typeChecker: tsModule.TypeChecker\n): boolean {\n const ts = getTs()\n\n if (!node.type) return false\n\n const returnType = typeChecker.getTypeFromTypeNode(node.type)\n if (!returnType) return false\n\n const isAsync =\n node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ?? false\n\n if (isAsync) {\n // For async functions, we need Promise<Metadata>\n const typeSymbol = returnType.getSymbol()\n if (!typeSymbol || typeSymbol.getName() !== 'Promise') {\n return false\n }\n\n // Get the type argument of Promise<T>\n if (!ts.isTypeReferenceNode(node.type)) {\n return false\n }\n\n // Check if it's a reference type (like Promise<T>)\n if (\n !(returnType.flags & ts.TypeFlags.Object) ||\n !('typeArguments' in returnType)\n ) {\n return false\n }\n\n const typeArgs = (returnType as { typeArguments: readonly tsModule.Type[] })\n .typeArguments\n if (!typeArgs || typeArgs.length !== 1) {\n return false\n }\n const promiseType = typeArgs[0]\n const promiseTypeSymbol = promiseType.getSymbol()\n return promiseTypeSymbol?.getName() === 'Metadata'\n } else {\n // For sync functions, we need Metadata directly\n const symbol = returnType.getSymbol()\n return symbol?.getName() === 'Metadata'\n }\n}\n\nexport default metadata\n"],"names":["metadata","client","getSemanticDiagnosticsForExportVariableStatement","fileName","node","source","getSource","ts","getTs","isFunctionDeclaration","name","getText","file","category","DiagnosticCategory","Error","code","NEXT_TS_ERRORS","INVALID_METADATA_EXPORT","messageText","start","getStart","length","getWidth","declaration","declarationList","declarations","getSemanticDiagnosticsForExportDeclaration","diagnostics","exportClause","isNamedExports","e","elements","includes","push","server","hasCorrectType","isAsync","modifiers","some","m","kind","SyntaxKind","AsyncKeyword","Warning","initializer","isFunctionExpression","isArrowFunction","typeChecker","getTypeChecker","isTypeOnly","exportName","symbol","getSymbolAtLocation","type","getTypeOfSymbolAtLocation","originalSymbol","getAliasedSymbol","isVariableDeclaration","checkFunctionReturnType","signature","getSignatureFromDeclaration","returnType","getReturnTypeOfSignature","typeSymbol","getSymbol","getName","flags","TypeFlags","Object","typeArgs","typeArguments","promiseType","promiseTypeSymbol","returnTypeSymbol","getTypeFromTypeNode","isTypeReferenceNode"],"mappings":"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","ignoreList":[0]}
@@ -22,7 +22,7 @@ _export(exports, {
22
22
  });
23
23
  function isStableBuild() {
24
24
  var _process_env___NEXT_VERSION;
25
- return !((_process_env___NEXT_VERSION = "15.4.0-canary.4") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
25
+ return !((_process_env___NEXT_VERSION = "15.4.0-canary.5") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
26
26
  }
27
27
  class CanaryOnlyError extends Error {
28
28
  constructor(arg){
@@ -81,7 +81,7 @@ function getAnonymousMeta() {
81
81
  isWsl: _iswsl.default,
82
82
  isCI: _ciinfo.isCI,
83
83
  ciName: _ciinfo.isCI && _ciinfo.name || null,
84
- nextVersion: "15.4.0-canary.4"
84
+ nextVersion: "15.4.0-canary.5"
85
85
  };
86
86
  return traits;
87
87
  }
@@ -11,11 +11,11 @@ Object.defineProperty(exports, "eventCliSessionStopped", {
11
11
  const EVENT_VERSION = 'NEXT_CLI_SESSION_STOPPED';
12
12
  function eventCliSessionStopped(event) {
13
13
  // This should be an invariant, if it fails our build tooling is broken.
14
- if (typeof "15.4.0-canary.4" !== 'string') {
14
+ if (typeof "15.4.0-canary.5" !== 'string') {
15
15
  return [];
16
16
  }
17
17
  const payload = {
18
- nextVersion: "15.4.0-canary.4",
18
+ nextVersion: "15.4.0-canary.5",
19
19
  nodeVersion: process.version,
20
20
  cliCommand: event.cliCommand,
21
21
  durationMilliseconds: event.durationMilliseconds,
@@ -36,12 +36,12 @@ function hasBabelConfig(dir) {
36
36
  function eventCliSession(dir, nextConfig, event) {
37
37
  var _nextConfig_experimental_staleTimes, _nextConfig_experimental_staleTimes1, _nextConfig_experimental_reactCompiler, _nextConfig_experimental_reactCompiler1;
38
38
  // This should be an invariant, if it fails our build tooling is broken.
39
- if (typeof "15.4.0-canary.4" !== 'string') {
39
+ if (typeof "15.4.0-canary.5" !== 'string') {
40
40
  return [];
41
41
  }
42
42
  const { images, i18n } = nextConfig || {};
43
43
  const payload = {
44
- nextVersion: "15.4.0-canary.4",
44
+ nextVersion: "15.4.0-canary.5",
45
45
  nodeVersion: process.version,
46
46
  cliCommand: event.cliCommand,
47
47
  isSrcDir: event.isSrcDir,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next",
3
- "version": "15.4.0-canary.4",
3
+ "version": "15.4.0-canary.5",
4
4
  "description": "The React Framework",
5
5
  "main": "./dist/server/next.js",
6
6
  "license": "MIT",
@@ -100,7 +100,7 @@
100
100
  ]
101
101
  },
102
102
  "dependencies": {
103
- "@next/env": "15.4.0-canary.4",
103
+ "@next/env": "15.4.0-canary.5",
104
104
  "@swc/counter": "0.1.3",
105
105
  "@swc/helpers": "0.5.15",
106
106
  "busboy": "1.6.0",
@@ -132,14 +132,14 @@
132
132
  },
133
133
  "optionalDependencies": {
134
134
  "sharp": "^0.34.1",
135
- "@next/swc-darwin-arm64": "15.4.0-canary.4",
136
- "@next/swc-darwin-x64": "15.4.0-canary.4",
137
- "@next/swc-linux-arm64-gnu": "15.4.0-canary.4",
138
- "@next/swc-linux-arm64-musl": "15.4.0-canary.4",
139
- "@next/swc-linux-x64-gnu": "15.4.0-canary.4",
140
- "@next/swc-linux-x64-musl": "15.4.0-canary.4",
141
- "@next/swc-win32-arm64-msvc": "15.4.0-canary.4",
142
- "@next/swc-win32-x64-msvc": "15.4.0-canary.4"
135
+ "@next/swc-darwin-arm64": "15.4.0-canary.5",
136
+ "@next/swc-darwin-x64": "15.4.0-canary.5",
137
+ "@next/swc-linux-arm64-gnu": "15.4.0-canary.5",
138
+ "@next/swc-linux-arm64-musl": "15.4.0-canary.5",
139
+ "@next/swc-linux-x64-gnu": "15.4.0-canary.5",
140
+ "@next/swc-linux-x64-musl": "15.4.0-canary.5",
141
+ "@next/swc-win32-arm64-msvc": "15.4.0-canary.5",
142
+ "@next/swc-win32-x64-msvc": "15.4.0-canary.5"
143
143
  },
144
144
  "devDependencies": {
145
145
  "@ampproject/toolbox-optimizer": "2.8.3",
@@ -172,11 +172,11 @@
172
172
  "@jest/types": "29.5.0",
173
173
  "@mswjs/interceptors": "0.23.0",
174
174
  "@napi-rs/triples": "1.2.0",
175
- "@next/font": "15.4.0-canary.4",
176
- "@next/polyfill-module": "15.4.0-canary.4",
177
- "@next/polyfill-nomodule": "15.4.0-canary.4",
178
- "@next/react-refresh-utils": "15.4.0-canary.4",
179
- "@next/swc": "15.4.0-canary.4",
175
+ "@next/font": "15.4.0-canary.5",
176
+ "@next/polyfill-module": "15.4.0-canary.5",
177
+ "@next/polyfill-nomodule": "15.4.0-canary.5",
178
+ "@next/react-refresh-utils": "15.4.0-canary.5",
179
+ "@next/swc": "15.4.0-canary.5",
180
180
  "@opentelemetry/api": "1.6.0",
181
181
  "@playwright/test": "1.41.2",
182
182
  "@storybook/addon-a11y": "8.6.0",