From 703cbdd48fc87a5441afb2972283e0903b6553f8 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 3 Jul 2023 15:54:59 +0200 Subject: [PATCH] Add integration test --- packages/bundler-plugin-core/src/index.ts | 3 +- packages/bundler-plugin-core/src/types.ts | 2 +- .../metadata-injection/input/bundle.js | 3 + .../metadata-injection.test.ts | 26 +++++ .../fixtures/metadata-injection/setup.ts | 17 +++ .../utils/create-cjs-bundles.ts | 108 ++++++++++-------- 6 files changed, 107 insertions(+), 52 deletions(-) create mode 100644 packages/integration-tests/fixtures/metadata-injection/input/bundle.js create mode 100644 packages/integration-tests/fixtures/metadata-injection/metadata-injection.test.ts create mode 100644 packages/integration-tests/fixtures/metadata-injection/setup.ts diff --git a/packages/bundler-plugin-core/src/index.ts b/packages/bundler-plugin-core/src/index.ts index 96163e7c..7873f943 100644 --- a/packages/bundler-plugin-core/src/index.ts +++ b/packages/bundler-plugin-core/src/index.ts @@ -184,9 +184,10 @@ export function sentryUnpluginFactory({ project: options.project, release: options.release.name, }; - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call metadata = options._experiments.moduleMetadata(args); } else { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment metadata = options._experiments.moduleMetadata; } diff --git a/packages/bundler-plugin-core/src/types.ts b/packages/bundler-plugin-core/src/types.ts index b8bd1f04..339dc32a 100644 --- a/packages/bundler-plugin-core/src/types.ts +++ b/packages/bundler-plugin-core/src/types.ts @@ -245,7 +245,7 @@ export interface Options { /** * Metadata associated with this module. * - * The metadata is serialized and can be looked up at runtime by URL. + * The metadata is serialized and can be looked up at runtime by filename. * * Metadata can either be passed directly or alternatively a callback can be provided that will be * called with the following arguments: diff --git a/packages/integration-tests/fixtures/metadata-injection/input/bundle.js b/packages/integration-tests/fixtures/metadata-injection/input/bundle.js new file mode 100644 index 00000000..bf138963 --- /dev/null +++ b/packages/integration-tests/fixtures/metadata-injection/input/bundle.js @@ -0,0 +1,3 @@ +// Simply output the metadata to the console so it can be checked in a test +// eslint-disable-next-line no-console +console.log(JSON.stringify(global._sentryModuleMetadata)); diff --git a/packages/integration-tests/fixtures/metadata-injection/metadata-injection.test.ts b/packages/integration-tests/fixtures/metadata-injection/metadata-injection.test.ts new file mode 100644 index 00000000..83640d1b --- /dev/null +++ b/packages/integration-tests/fixtures/metadata-injection/metadata-injection.test.ts @@ -0,0 +1,26 @@ +/* eslint-disable jest/no-standalone-expect */ +/* eslint-disable jest/expect-expect */ +import { execSync } from "child_process"; +import path from "path"; +import { testIfNodeMajorVersionIsLessThan18 } from "../../utils/testIf"; + +function checkBundle(bundlePath: string): void { + const output = execSync(`node ${bundlePath}`, { encoding: "utf-8" }); + + const map = JSON.parse(output) as Record; + + // There should be only one key in the map + expect(Object.values(map)).toHaveLength(1); + // The value should be the expected metadata + expect(Object.values(map)).toEqual([{ team: "frontend" }]); +} + +describe("metadata injection", () => { + testIfNodeMajorVersionIsLessThan18("webpack 4 bundle", () => { + checkBundle(path.join(__dirname, "out", "webpack4", "bundle.js")); + }); + + test("webpack 5 bundle", () => { + checkBundle(path.join(__dirname, "out", "webpack5", "bundle.js")); + }); +}); diff --git a/packages/integration-tests/fixtures/metadata-injection/setup.ts b/packages/integration-tests/fixtures/metadata-injection/setup.ts new file mode 100644 index 00000000..1a7fc221 --- /dev/null +++ b/packages/integration-tests/fixtures/metadata-injection/setup.ts @@ -0,0 +1,17 @@ +import * as path from "path"; +import { createCjsBundles } from "../../utils/create-cjs-bundles"; + +const outputDir = path.resolve(__dirname, "out"); + +createCjsBundles( + { + bundle: path.resolve(__dirname, "input", "bundle.js"), + }, + outputDir, + { + _experiments: { + moduleMetadata: { team: "frontend" }, + }, + }, + ["webpack4", "webpack5"] +); diff --git a/packages/integration-tests/utils/create-cjs-bundles.ts b/packages/integration-tests/utils/create-cjs-bundles.ts index 5f85d8ec..1569b3ea 100644 --- a/packages/integration-tests/utils/create-cjs-bundles.ts +++ b/packages/integration-tests/utils/create-cjs-bundles.ts @@ -16,47 +16,53 @@ const nodejsMajorversion = process.version.split(".")[0]!.slice(1); export function createCjsBundles( entrypoints: { [name: string]: string }, outFolder: string, - sentryUnpluginOptions: Options + sentryUnpluginOptions: Options, + plugins: string[] = [] ): void { - void vite.build({ - clearScreen: false, - build: { - outDir: path.join(outFolder, "vite"), - rollupOptions: { - input: entrypoints, - output: { - format: "cjs", - entryFileNames: "[name].js", + if (plugins.length === 0 || plugins.includes("vite")) { + void vite.build({ + clearScreen: false, + build: { + outDir: path.join(outFolder, "vite"), + rollupOptions: { + input: entrypoints, + output: { + format: "cjs", + entryFileNames: "[name].js", + }, }, }, - }, - plugins: [sentryVitePlugin(sentryUnpluginOptions)], - }); - - void rollup - .rollup({ - input: entrypoints, - plugins: [sentryRollupPlugin(sentryUnpluginOptions)], - }) - .then((bundle) => - bundle.write({ - dir: path.join(outFolder, "rollup"), - format: "cjs", - exports: "named", + plugins: [sentryVitePlugin(sentryUnpluginOptions)], + }); + } + if (plugins.length === 0 || plugins.includes("rollup")) { + void rollup + .rollup({ + input: entrypoints, + plugins: [sentryRollupPlugin(sentryUnpluginOptions)], }) - ); + .then((bundle) => + bundle.write({ + dir: path.join(outFolder, "rollup"), + format: "cjs", + exports: "named", + }) + ); + } - void esbuild.build({ - entryPoints: entrypoints, - outdir: path.join(outFolder, "esbuild"), - plugins: [sentryEsbuildPlugin(sentryUnpluginOptions)], - minify: true, - bundle: true, - format: "cjs", - }); + if (plugins.length === 0 || plugins.includes("esbuild")) { + void esbuild.build({ + entryPoints: entrypoints, + outdir: path.join(outFolder, "esbuild"), + plugins: [sentryEsbuildPlugin(sentryUnpluginOptions)], + minify: true, + bundle: true, + format: "cjs", + }); + } // Webpack 4 doesn't work on Node.js versions >= 18 - if (parseInt(nodejsMajorversion) < 18) { + if (parseInt(nodejsMajorversion) < 18 && (plugins.length === 0 || plugins.includes("webpack4"))) { webpack4( { mode: "production", @@ -77,23 +83,25 @@ export function createCjsBundles( ); } - webpack5( - { - cache: false, - entry: entrypoints, - output: { - path: path.join(outFolder, "webpack5"), - library: { - type: "commonjs", + if (plugins.length === 0 || plugins.includes("webpack5")) { + webpack5( + { + cache: false, + entry: entrypoints, + output: { + path: path.join(outFolder, "webpack5"), + library: { + type: "commonjs", + }, }, + mode: "production", + plugins: [sentryWebpackPlugin(sentryUnpluginOptions)], }, - mode: "production", - plugins: [sentryWebpackPlugin(sentryUnpluginOptions)], - }, - (err) => { - if (err) { - throw err; + (err) => { + if (err) { + throw err; + } } - } - ); + ); + } }