From 8b2b78e2debc2bc189165f51c85b2f6c502a7b87 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 18 Oct 2022 14:36:55 +0200 Subject: [PATCH] fix(nextjs): Fix typing issue with `withSentryConfig` and `NextConfig` (#5967) --- packages/nextjs/package.json | 3 ++- packages/nextjs/src/config/types.ts | 9 +++++++-- packages/nextjs/src/config/webpack.ts | 4 +++- packages/nextjs/test/config/fixtures.ts | 2 ++ packages/nextjs/test/types/.gitignore | 2 ++ packages/nextjs/test/types/next.config.ts | 18 ++++++++++++++++++ packages/nextjs/test/types/package.json | 9 +++++++++ packages/nextjs/test/types/test.ts | 12 ++++++++++++ packages/nextjs/test/types/tsconfig.json | 6 ++++++ 9 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 packages/nextjs/test/types/.gitignore create mode 100644 packages/nextjs/test/types/next.config.ts create mode 100644 packages/nextjs/test/types/package.json create mode 100644 packages/nextjs/test/types/test.ts create mode 100644 packages/nextjs/test/types/tsconfig.json diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index f4c4544654ac..e60aeddf7efc 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -66,7 +66,8 @@ "test": "run-s test:unit", "test:all": "run-s test:unit test:integration", "test:unit": "jest", - "test:integration": "test/run-integration-tests.sh", + "test:integration": "test/run-integration-tests.sh && yarn test:types", + "test:types": "cd test/types && yarn test", "test:watch": "jest --watch", "vercel:branch": "source vercel/set-up-branch-for-test-app-use.sh", "vercel:project": "source vercel/make-project-use-current-branch.sh" diff --git a/packages/nextjs/src/config/types.ts b/packages/nextjs/src/config/types.ts index b39c3777bfa0..6324b35fa36e 100644 --- a/packages/nextjs/src/config/types.ts +++ b/packages/nextjs/src/config/types.ts @@ -23,7 +23,7 @@ export type NextConfigFunctionWithSentry = ( export type NextConfigObject = { // Custom webpack options - webpack?: WebpackConfigFunction; + webpack?: WebpackConfigFunction | null; // Whether to build serverless functions for all pages, not just API routes. Removed in nextjs 12+. target?: 'server' | 'experimental-serverless-trace'; // The output directory for the built app (defaults to ".next") @@ -93,8 +93,13 @@ export type BuildContext = { isServer: boolean; buildId: string; dir: string; - config: NextConfigObject; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + config: any; webpack: { version: string }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + defaultLoaders: any; + totalPages: number; + nextRuntime?: 'nodejs' | 'edge'; }; /** diff --git a/packages/nextjs/src/config/webpack.ts b/packages/nextjs/src/config/webpack.ts index 8e697ac0a317..9cdfe2753e51 100644 --- a/packages/nextjs/src/config/webpack.ts +++ b/packages/nextjs/src/config/webpack.ts @@ -410,7 +410,9 @@ export function getWebpackPluginOptions( userPluginOptions: Partial, userSentryOptions: UserSentryOptions, ): SentryWebpackPluginOptions { - const { buildId, isServer, webpack, config: userNextConfig, dev: isDev, dir: projectDir } = buildContext; + const { buildId, isServer, webpack, config, dev: isDev, dir: projectDir } = buildContext; + const userNextConfig = config as NextConfigObject; + const distDir = userNextConfig.distDir ?? '.next'; // `.next` is the default directory const isWebpack5 = webpack.version.startsWith('5'); diff --git a/packages/nextjs/test/config/fixtures.ts b/packages/nextjs/test/config/fixtures.ts index afaf51e7ee25..ef73a1a08010 100644 --- a/packages/nextjs/test/config/fixtures.ts +++ b/packages/nextjs/test/config/fixtures.ts @@ -93,6 +93,8 @@ export function getBuildContext( ...materializedNextConfig, } as NextConfigObject, webpack: { version: webpackVersion }, + defaultLoaders: true, + totalPages: 2, isServer: buildTarget === 'server', }; } diff --git a/packages/nextjs/test/types/.gitignore b/packages/nextjs/test/types/.gitignore new file mode 100644 index 000000000000..23d67fc10447 --- /dev/null +++ b/packages/nextjs/test/types/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +yarn.lock diff --git a/packages/nextjs/test/types/next.config.ts b/packages/nextjs/test/types/next.config.ts new file mode 100644 index 000000000000..56d47a0d203b --- /dev/null +++ b/packages/nextjs/test/types/next.config.ts @@ -0,0 +1,18 @@ +import { NextConfig } from 'next'; + +import { withSentryConfig } from '../../src/config'; + +const config: NextConfig = { + hideSourceMaps: true, + webpack: config => ({ + ...config, + module: { + ...config.module, + rules: [...config.module.rules], + }, + }), +}; + +module.exports = withSentryConfig(config, { + validate: true, +}); diff --git a/packages/nextjs/test/types/package.json b/packages/nextjs/test/types/package.json new file mode 100644 index 000000000000..b73620071d6c --- /dev/null +++ b/packages/nextjs/test/types/package.json @@ -0,0 +1,9 @@ +{ + "description": "This is used to install the nextjs v12 so we can test against those types", + "scripts": { + "test": "ts-node test.ts" + }, + "dependencies": { + "next": "12.3.1" + } +} diff --git a/packages/nextjs/test/types/test.ts b/packages/nextjs/test/types/test.ts new file mode 100644 index 000000000000..5ff6045952fb --- /dev/null +++ b/packages/nextjs/test/types/test.ts @@ -0,0 +1,12 @@ +/* eslint-disable no-console */ +import { parseSemver } from '@sentry/utils'; +import { execSync } from 'child_process'; + +const NODE_VERSION = parseSemver(process.versions.node); + +if (NODE_VERSION.major && NODE_VERSION.major >= 12) { + console.log('Installing next@v12...'); + execSync('yarn install', { stdio: 'inherit' }); + console.log('Testing some types...'); + execSync('tsc --noEmit --project tsconfig.json', { stdio: 'inherit' }); +} diff --git a/packages/nextjs/test/types/tsconfig.json b/packages/nextjs/test/types/tsconfig.json new file mode 100644 index 000000000000..adedc2fafa6c --- /dev/null +++ b/packages/nextjs/test/types/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "./**/*" + ] +}