From e847b496738fe968610a858b7a703935abfa2505 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Tue, 20 Dec 2022 20:20:44 +0100 Subject: [PATCH] Add telemetry for stable features (#44201) Follow up to #44195 #44194. ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see [`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md) ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] [e2e](https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs) tests added - [ ] Documentation added - [x] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see [`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md) ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) --- packages/next/build/webpack-config.ts | 10 ++++ .../build/webpack/plugins/telemetry-plugin.ts | 8 +++ packages/next/telemetry/events/build.ts | 4 ++ .../telemetry/next.config.middleware-options | 5 ++ .../telemetry/next.config.transpile-packages | 3 + test/integration/telemetry/test/index.test.js | 60 +++++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 test/integration/telemetry/next.config.middleware-options create mode 100644 test/integration/telemetry/next.config.transpile-packages diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index ad3220b0de6eb76..c62b6df789a283d 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -2147,6 +2147,16 @@ export default async function getBaseWebpackConfig( ['swcImportSource', !!jsConfig?.compilerOptions?.jsxImportSource], ['swcEmotion', !!config.compiler?.emotion], ['turbotrace', !!config.experimental.turbotrace], + ['transpilePackages', !!config.transpilePackages], + [ + 'allowMiddlewareResponseBody', + !!config.allowMiddlewareResponseBody, + ], + [ + 'skipMiddlewareUrlNormalize', + !!config.skipMiddlewareUrlNormalize, + ], + ['skipTrailingSlashRedirect', !!config.skipTrailingSlashRedirect], SWCBinaryTarget, ].filter<[Feature, boolean]>(Boolean as any) ) diff --git a/packages/next/build/webpack/plugins/telemetry-plugin.ts b/packages/next/build/webpack/plugins/telemetry-plugin.ts index 7e62625b45814ae..37b96aa416eb0cf 100644 --- a/packages/next/build/webpack/plugins/telemetry-plugin.ts +++ b/packages/next/build/webpack/plugins/telemetry-plugin.ts @@ -37,6 +37,10 @@ export type Feature = | 'swcEmotion' | `swc/target/${SWC_TARGET_TRIPLE}` | 'turbotrace' + | 'transpilePackages' + | 'allowMiddlewareResponseBody' + | 'skipMiddlewareUrlNormalize' + | 'skipTrailingSlashRedirect' interface FeatureUsage { featureName: Feature @@ -96,6 +100,10 @@ const BUILD_FEATURES: Array = [ 'swc/target/aarch64-unknown-linux-musl', 'swc/target/aarch64-pc-windows-msvc', 'turbotrace', + 'transpilePackages', + 'allowMiddlewareResponseBody', + 'skipMiddlewareUrlNormalize', + 'skipTrailingSlashRedirect', ] const ELIMINATED_PACKAGES = new Set() diff --git a/packages/next/telemetry/events/build.ts b/packages/next/telemetry/events/build.ts index 91e2dd0f92091e2..2deee0d6bb14193 100644 --- a/packages/next/telemetry/events/build.ts +++ b/packages/next/telemetry/events/build.ts @@ -166,6 +166,10 @@ export type EventBuildFeatureUsage = { | 'turbotrace' | 'build-lint' | 'vercelImageGeneration' + | 'transpilePackages' + | 'allowMiddlewareResponseBody' + | 'skipMiddlewareUrlNormalize' + | 'skipTrailingSlashRedirect' invocationCount: number } export function eventBuildFeatureUsage( diff --git a/test/integration/telemetry/next.config.middleware-options b/test/integration/telemetry/next.config.middleware-options new file mode 100644 index 000000000000000..892345d5d3e41d1 --- /dev/null +++ b/test/integration/telemetry/next.config.middleware-options @@ -0,0 +1,5 @@ +module.exports = { + allowMiddlewareResponseBody: true, + skipMiddlewareUrlNormalize: true, + skipTrailingSlashRedirect: true, +} \ No newline at end of file diff --git a/test/integration/telemetry/next.config.transpile-packages b/test/integration/telemetry/next.config.transpile-packages new file mode 100644 index 000000000000000..b40e5b190bd23b3 --- /dev/null +++ b/test/integration/telemetry/next.config.transpile-packages @@ -0,0 +1,3 @@ +module.exports = { + transpilePackages: ["foo"] +} \ No newline at end of file diff --git a/test/integration/telemetry/test/index.test.js b/test/integration/telemetry/test/index.test.js index dd33274444d5edc..76767314514fba5 100644 --- a/test/integration/telemetry/test/index.test.js +++ b/test/integration/telemetry/test/index.test.js @@ -1090,4 +1090,64 @@ describe('Telemetry CLI', () => { invocationCount: 1, }) }) + + it('emits telemetry for transpilePackages', async () => { + await fs.rename( + path.join(appDir, 'next.config.transpile-packages'), + path.join(appDir, 'next.config.js') + ) + + const { stderr } = await nextBuild(appDir, [], { + stderr: true, + env: { NEXT_TELEMETRY_DEBUG: 1 }, + }) + + await fs.rename( + path.join(appDir, 'next.config.js'), + path.join(appDir, 'next.config.transpile-packages') + ) + + const featureUsageEvents = findAllTelemetryEvents( + stderr, + 'NEXT_BUILD_FEATURE_USAGE' + ) + expect(featureUsageEvents).toContainEqual({ + featureName: 'transpilePackages', + invocationCount: 1, + }) + }) + + it('emits telemetry for middleware related options', async () => { + await fs.rename( + path.join(appDir, 'next.config.middleware-options'), + path.join(appDir, 'next.config.js') + ) + + const { stderr } = await nextBuild(appDir, [], { + stderr: true, + env: { NEXT_TELEMETRY_DEBUG: 1 }, + }) + + await fs.rename( + path.join(appDir, 'next.config.js'), + path.join(appDir, 'next.config.middleware-options') + ) + + const featureUsageEvents = findAllTelemetryEvents( + stderr, + 'NEXT_BUILD_FEATURE_USAGE' + ) + expect(featureUsageEvents).toContainEqual({ + featureName: 'allowMiddlewareResponseBody', + invocationCount: 1, + }) + expect(featureUsageEvents).toContainEqual({ + featureName: 'skipMiddlewareUrlNormalize', + invocationCount: 1, + }) + expect(featureUsageEvents).toContainEqual({ + featureName: 'skipTrailingSlashRedirect', + invocationCount: 1, + }) + }) })