next 15.4.0-canary.3 → 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.
- package/dist/bin/next +1 -1
- package/dist/build/index.js +2 -2
- package/dist/build/swc/index.js +1 -1
- package/dist/build/webpack-config.js +2 -2
- package/dist/client/app-bootstrap.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/esm/build/index.js +2 -2
- package/dist/esm/build/swc/index.js +1 -1
- package/dist/esm/build/webpack-config.js +2 -2
- package/dist/esm/client/app-bootstrap.js +1 -1
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/esm/server/lib/app-info-log.js +1 -1
- package/dist/esm/server/lib/start-server.js +1 -1
- package/dist/esm/server/typescript/rules/metadata.js +2 -2
- package/dist/esm/server/typescript/rules/metadata.js.map +1 -1
- package/dist/esm/shared/lib/canary-only.js +1 -1
- package/dist/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/server/lib/app-info-log.js +1 -1
- package/dist/server/lib/start-server.js +1 -1
- package/dist/server/typescript/rules/metadata.js +2 -2
- package/dist/server/typescript/rules/metadata.js.map +1 -1
- package/dist/shared/lib/canary-only.js +1 -1
- package/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/telemetry/events/session-stopped.js +2 -2
- package/dist/telemetry/events/version.js +2 -2
- package/package.json +15 -15
package/dist/bin/next
CHANGED
@@ -79,7 +79,7 @@ const program = new NextRootCommand();
|
|
79
79
|
program.name('next').description('The Next.js CLI allows you to develop, build, start your application, and more.').configureHelp({
|
80
80
|
formatHelp: (cmd, helper)=>(0, _formatclihelpoutput.formatCliHelpOutput)(cmd, helper),
|
81
81
|
subcommandTerm: (cmd)=>`${cmd.name()} ${cmd.usage()}`
|
82
|
-
}).helpCommand(false).helpOption('-h, --help', 'Displays this message.').version(`Next.js v${"15.4.0-canary.
|
82
|
+
}).helpCommand(false).helpOption('-h, --help', 'Displays this message.').version(`Next.js v${"15.4.0-canary.5"}`, '-v, --version', 'Outputs the Next.js version.');
|
83
83
|
program.command('build').description('Creates an optimized production build of your application. The output displays information about each route.').argument('[directory]', `A directory on which to build the application. ${(0, _picocolors.italic)('If no directory is provided, the current directory will be used.')}`).option('-d, --debug', 'Enables a more verbose build output.').option('--no-lint', 'Disables linting.').option('--no-mangling', 'Disables mangling.').option('--profile', 'Enables production profiling for React.').option('--experimental-app-only', 'Builds only App Router routes.').option('--turbo', 'Starts development mode using Turbopack.').option('--turbopack', 'Starts development mode using Turbopack.').addOption(new _commander.Option('--experimental-build-mode [mode]', 'Uses an experimental build mode.').choices([
|
84
84
|
'compile',
|
85
85
|
'generate',
|
package/dist/build/index.js
CHANGED
@@ -375,7 +375,7 @@ async function build(dir, reactProductionProfiling = false, debugOutput = false,
|
|
375
375
|
const nextBuildSpan = (0, _trace.trace)('next-build', undefined, {
|
376
376
|
buildMode: experimentalBuildMode,
|
377
377
|
isTurboBuild: String(isTurbopack),
|
378
|
-
version: "15.4.0-canary.
|
378
|
+
version: "15.4.0-canary.5"
|
379
379
|
});
|
380
380
|
_buildcontext.NextBuildContext.nextBuildSpan = nextBuildSpan;
|
381
381
|
_buildcontext.NextBuildContext.dir = dir;
|
@@ -756,7 +756,7 @@ async function build(dir, reactProductionProfiling = false, debugOutput = false,
|
|
756
756
|
// Files outside of the distDir can be "type": "module"
|
757
757
|
await writeFileUtf8(_path.default.join(distDir, 'package.json'), '{"type": "commonjs"}');
|
758
758
|
// These are written to distDir, so they need to come after creating and cleaning distDr.
|
759
|
-
await (0, _builddiagnostics.recordFrameworkVersion)("15.4.0-canary.
|
759
|
+
await (0, _builddiagnostics.recordFrameworkVersion)("15.4.0-canary.5");
|
760
760
|
await (0, _builddiagnostics.updateBuildDiagnostics)({
|
761
761
|
buildStage: 'start'
|
762
762
|
});
|
package/dist/build/swc/index.js
CHANGED
@@ -123,7 +123,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
123
123
|
}
|
124
124
|
return newObj;
|
125
125
|
}
|
126
|
-
const nextVersion = "15.4.0-canary.
|
126
|
+
const nextVersion = "15.4.0-canary.5";
|
127
127
|
const ArchName = (0, _os.arch)();
|
128
128
|
const PlatformName = (0, _os.platform)();
|
129
129
|
function infoLog(...args) {
|
@@ -1652,7 +1652,7 @@ async function getBaseWebpackConfig(dir, { buildId, encryptionKey, config, compi
|
|
1652
1652
|
isClient && new _copyfileplugin.CopyFilePlugin({
|
1653
1653
|
// file path to build output of `@next/polyfill-nomodule`
|
1654
1654
|
filePath: require.resolve('./polyfills/polyfill-nomodule'),
|
1655
|
-
cacheKey: "15.4.0-canary.
|
1655
|
+
cacheKey: "15.4.0-canary.5",
|
1656
1656
|
name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
|
1657
1657
|
minimize: false,
|
1658
1658
|
info: {
|
@@ -1829,7 +1829,7 @@ async function getBaseWebpackConfig(dir, { buildId, encryptionKey, config, compi
|
|
1829
1829
|
// - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
|
1830
1830
|
// - Next.js version
|
1831
1831
|
// - next.config.js keys that affect compilation
|
1832
|
-
version: `${__dirname}|${"15.4.0-canary.
|
1832
|
+
version: `${__dirname}|${"15.4.0-canary.5"}|${configVars}`,
|
1833
1833
|
cacheDirectory: _path.default.join(distDir, 'cache', 'webpack'),
|
1834
1834
|
// For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
|
1835
1835
|
// So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
|
package/dist/client/index.js
CHANGED
@@ -61,7 +61,7 @@ const _hooksclientcontextsharedruntime = require("../shared/lib/hooks-client-con
|
|
61
61
|
const _onrecoverableerror = require("./react-client-callbacks/on-recoverable-error");
|
62
62
|
const _tracer = /*#__PURE__*/ _interop_require_default._(require("./tracing/tracer"));
|
63
63
|
const _isnextroutererror = require("./components/is-next-router-error");
|
64
|
-
const version = "15.4.0-canary.
|
64
|
+
const version = "15.4.0-canary.5";
|
65
65
|
let router;
|
66
66
|
const emitter = (0, _mitt.default)();
|
67
67
|
const looseToArray = (input)=>[].slice.call(input);
|
package/dist/esm/build/index.js
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
package/dist/esm/client/index.js
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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){
|
@@ -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.
|
14
|
+
if (typeof "15.4.0-canary.5" !== 'string') {
|
15
15
|
return [];
|
16
16
|
}
|
17
17
|
const payload = {
|
18
|
-
nextVersion: "15.4.0-canary.
|
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.
|
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.
|
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.
|
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.
|
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.
|
136
|
-
"@next/swc-darwin-x64": "15.4.0-canary.
|
137
|
-
"@next/swc-linux-arm64-gnu": "15.4.0-canary.
|
138
|
-
"@next/swc-linux-arm64-musl": "15.4.0-canary.
|
139
|
-
"@next/swc-linux-x64-gnu": "15.4.0-canary.
|
140
|
-
"@next/swc-linux-x64-musl": "15.4.0-canary.
|
141
|
-
"@next/swc-win32-arm64-msvc": "15.4.0-canary.
|
142
|
-
"@next/swc-win32-x64-msvc": "15.4.0-canary.
|
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.
|
176
|
-
"@next/polyfill-module": "15.4.0-canary.
|
177
|
-
"@next/polyfill-nomodule": "15.4.0-canary.
|
178
|
-
"@next/react-refresh-utils": "15.4.0-canary.
|
179
|
-
"@next/swc": "15.4.0-canary.
|
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",
|