From 021077e612692b797f0f9520fcd9fcd1cbc3cbdb Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 19 Sep 2024 12:02:19 +0200 Subject: [PATCH 1/3] feat(nuxt): Improve logs about adding Node option 'import' --- packages/nuxt/src/module.ts | 34 ++++++++++++++++----------- packages/nuxt/src/vite/utils.ts | 10 ++++++++ packages/nuxt/test/vite/utils.test.ts | 28 +++++++++++++++++++++- 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index f43f30d7e5ee..6c65cd42655e 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -3,7 +3,7 @@ import { consoleSandbox } from '@sentry/utils'; import type { SentryNuxtModuleOptions } from './common/types'; import { addSentryTopImport, addServerConfigToBuild } from './vite/addServerConfig'; import { setupSourceMaps } from './vite/sourceMaps'; -import { findDefaultSdkInitFile } from './vite/utils'; +import { findDefaultSdkInitFile, getStringSuffixDiff } from './vite/utils'; export type ModuleOptions = SentryNuxtModuleOptions; @@ -63,22 +63,28 @@ export default defineNuxtModule({ if (clientConfigFile || serverConfigFile) { setupSourceMaps(moduleOptions, nuxt); } + nuxt.hooks.hook('nitro:init', nitro => { + if (serverConfigFile && serverConfigFile.includes('.server.config')) { + addServerConfigToBuild(moduleOptions, nuxt, serverConfigFile); - if (serverConfigFile && serverConfigFile.includes('.server.config')) { - addServerConfigToBuild(moduleOptions, nuxt, serverConfigFile); + if (moduleOptions.experimental_basicServerTracing) { + addSentryTopImport(moduleOptions, nuxt); + } else { + if (moduleOptions.debug) { + const serverDirResolver = createResolver(nitro.options.output.serverDir); + const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs'); - if (moduleOptions.experimental_basicServerTracing) { - addSentryTopImport(moduleOptions, nuxt); - } else { - if (moduleOptions.debug) { - consoleSandbox(() => { - // eslint-disable-next-line no-console - console.log( - `[Sentry] Using your \`${serverConfigFile}\` file for the server-side Sentry configuration. In case you have a \`public/instrument.server\` file, the \`public/instrument.server\` file will be ignored. Make sure the file path in your node \`--import\` option matches the Sentry server config file in your \`.output\` folder and has a \`.mjs\` extension.`, - ); - }); + const serverConfigRelativePath = `.${getStringSuffixDiff(serverConfigPath, nitro.options.rootDir)}`; + + consoleSandbox(() => { + // eslint-disable-next-line no-console + console.log( + `[Sentry] Using your \`${serverConfigFile}\` file for the server-side Sentry configuration. Make sure to add the Node option \`import\` to the Node command where you deploy and/or run your application. This preloads the Sentry configuration at server startup. You can do this via a command-line flag (\`node --import ${serverConfigRelativePath} [...]\`) or via an environment variable (\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\`).`, + ); + }); + } } } - } + }); }, }); diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 7d794e807fd7..6d9b17eb069f 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -26,3 +26,13 @@ export function findDefaultSdkInitFile(type: 'server' | 'client'): string | unde return filePath ? path.basename(filePath) : undefined; } + +/** + * Get the diff suffix part between two strings. + * + * Example: getStringDiff('abcdef', 'abc') => 'def' + */ +export function getStringSuffixDiff(longerStr: string, shorterStr: string): string { + const commonPrefixLength = [...longerStr].findIndex((char, index) => char !== shorterStr[index]); + return commonPrefixLength === -1 ? '' : longerStr.slice(commonPrefixLength); +} diff --git a/packages/nuxt/test/vite/utils.test.ts b/packages/nuxt/test/vite/utils.test.ts index 0ca81b3e2986..04c06fe1f68d 100644 --- a/packages/nuxt/test/vite/utils.test.ts +++ b/packages/nuxt/test/vite/utils.test.ts @@ -1,6 +1,6 @@ import * as fs from 'fs'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import { findDefaultSdkInitFile } from '../../src/vite/utils'; +import { findDefaultSdkInitFile, getStringSuffixDiff } from '../../src/vite/utils'; vi.mock('fs'); @@ -59,3 +59,29 @@ describe('findDefaultSdkInitFile', () => { expect(result).toBe('sentry.server.config.js'); }); }); + +describe('getStringDiff', () => { + it('should return the suffix of the longer string when there is a common prefix', () => { + expect(getStringSuffixDiff('abcdef', 'abc')).toBe('def'); + }); + + it('should return an empty string when both strings are identical', () => { + expect(getStringSuffixDiff('abc', 'abc')).toBe(''); + }); + + it('should return the entire longer string when the shorter string is empty', () => { + expect(getStringSuffixDiff('abcdef', '')).toBe('abcdef'); + }); + + it('should return the entire longer string when there is no overlap', () => { + expect(getStringSuffixDiff('abcdef', 'ghijkl')).toBe('abcdef'); + }); + + it('should return an empty string when the longer string is empty', () => { + expect(getStringSuffixDiff('', 'abc')).toBe(''); + }); + + it('should return the suffix of the longer string when the shorter string is a prefix', () => { + expect(getStringSuffixDiff('abcdef', 'abcd')).toBe('ef'); + }); +}); From 7a4b212139e3b0394be85cd955fbd2fcb7f55ae6 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 19 Sep 2024 14:14:06 +0200 Subject: [PATCH 2/3] Use path.relative --- packages/nuxt/src/module.ts | 6 ++++-- packages/nuxt/src/vite/utils.ts | 10 ---------- packages/nuxt/test/vite/utils.test.ts | 28 +-------------------------- 3 files changed, 5 insertions(+), 39 deletions(-) diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 6c65cd42655e..f951a1542ee4 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -1,9 +1,10 @@ +import * as path from 'path'; import { addPlugin, addPluginTemplate, addServerPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'; import { consoleSandbox } from '@sentry/utils'; import type { SentryNuxtModuleOptions } from './common/types'; import { addSentryTopImport, addServerConfigToBuild } from './vite/addServerConfig'; import { setupSourceMaps } from './vite/sourceMaps'; -import { findDefaultSdkInitFile, getStringSuffixDiff } from './vite/utils'; +import { findDefaultSdkInitFile } from './vite/utils'; export type ModuleOptions = SentryNuxtModuleOptions; @@ -74,7 +75,8 @@ export default defineNuxtModule({ const serverDirResolver = createResolver(nitro.options.output.serverDir); const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs'); - const serverConfigRelativePath = `.${getStringSuffixDiff(serverConfigPath, nitro.options.rootDir)}`; + // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs + const serverConfigRelativePath = `./${path.relative(nitro.options.rootDir, serverConfigPath)}`; consoleSandbox(() => { // eslint-disable-next-line no-console diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 6d9b17eb069f..7d794e807fd7 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -26,13 +26,3 @@ export function findDefaultSdkInitFile(type: 'server' | 'client'): string | unde return filePath ? path.basename(filePath) : undefined; } - -/** - * Get the diff suffix part between two strings. - * - * Example: getStringDiff('abcdef', 'abc') => 'def' - */ -export function getStringSuffixDiff(longerStr: string, shorterStr: string): string { - const commonPrefixLength = [...longerStr].findIndex((char, index) => char !== shorterStr[index]); - return commonPrefixLength === -1 ? '' : longerStr.slice(commonPrefixLength); -} diff --git a/packages/nuxt/test/vite/utils.test.ts b/packages/nuxt/test/vite/utils.test.ts index 04c06fe1f68d..0ca81b3e2986 100644 --- a/packages/nuxt/test/vite/utils.test.ts +++ b/packages/nuxt/test/vite/utils.test.ts @@ -1,6 +1,6 @@ import * as fs from 'fs'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import { findDefaultSdkInitFile, getStringSuffixDiff } from '../../src/vite/utils'; +import { findDefaultSdkInitFile } from '../../src/vite/utils'; vi.mock('fs'); @@ -59,29 +59,3 @@ describe('findDefaultSdkInitFile', () => { expect(result).toBe('sentry.server.config.js'); }); }); - -describe('getStringDiff', () => { - it('should return the suffix of the longer string when there is a common prefix', () => { - expect(getStringSuffixDiff('abcdef', 'abc')).toBe('def'); - }); - - it('should return an empty string when both strings are identical', () => { - expect(getStringSuffixDiff('abc', 'abc')).toBe(''); - }); - - it('should return the entire longer string when the shorter string is empty', () => { - expect(getStringSuffixDiff('abcdef', '')).toBe('abcdef'); - }); - - it('should return the entire longer string when there is no overlap', () => { - expect(getStringSuffixDiff('abcdef', 'ghijkl')).toBe('abcdef'); - }); - - it('should return an empty string when the longer string is empty', () => { - expect(getStringSuffixDiff('', 'abc')).toBe(''); - }); - - it('should return the suffix of the longer string when the shorter string is a prefix', () => { - expect(getStringSuffixDiff('abcdef', 'abcd')).toBe('ef'); - }); -}); From 4235d2a18f82c285f2794cde7599e818d2d8c5da Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 19 Sep 2024 14:50:09 +0200 Subject: [PATCH 3/3] use path.sep instead of / (windows support) --- packages/nuxt/src/module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index f951a1542ee4..9be1474958bd 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -76,7 +76,7 @@ export default defineNuxtModule({ const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs'); // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs - const serverConfigRelativePath = `./${path.relative(nitro.options.rootDir, serverConfigPath)}`; + const serverConfigRelativePath = `.${path.sep}${path.relative(nitro.options.rootDir, serverConfigPath)}`; consoleSandbox(() => { // eslint-disable-next-line no-console