From 1b2142d2d8b353f52f50680f64e24d9afb3a4338 Mon Sep 17 00:00:00 2001 From: Scott Meyer Date: Thu, 23 Jul 2026 12:38:36 -0600 Subject: [PATCH] feat(apps): set @datadog/apps backend context Follows the @datadog/apps-backend runtime entry-point split: the apps plugin now sets the JS-Function-with-Actions backend context and gates it on SDK availability, using the new backend-internal SDK entry and resolving published package exports to built dist output. Adds an integration test that exercises the real (non-mocked) @datadog/apps-backend SDK end-to-end through an actual Vite build via a new fixture project. Building that test surfaced and fixed a pre-existing bug: the Vite plugin destructured context.buildRoot once at setup time, before Vite's configResolved hook overwrites it with the resolved build root, so every downstream use (proxy codegen, backend function builds, dev-server middleware) could use a stale root when the bundler's resolved root differs from process.cwd() at setup time. Fixed by reading context.buildRoot live at each use site. That fix also exposed a second, previously dormant bug: the E2E appsPlugin fixture's @datadog/action-catalog stub was missing a package.json, so Node's require.resolve reported it as installed while Vite/Rollup failed to resolve the bare-specifier subpath import at build time. Fixed by adding the missing package.json. Co-Authored-By: Claude Sonnet 5 --- .../apps/src/backend/integration.test.ts | 140 ++++++++++++++++++ .../plugins/apps/src/backend/shared.test.ts | 38 ++++- packages/plugins/apps/src/backend/shared.ts | 34 ++++- .../apps/src/backend/virtual-entry.test.ts | 41 +++++ .../plugins/apps/src/backend/virtual-entry.ts | 13 ++ packages/plugins/apps/src/vite/index.ts | 12 +- ...ackend-npm-0.0.1-bc8eb96736-3245683498.zip | Bin 0 -> 65176 bytes .../getRuntimeUsers.backend.ts | 21 +++ .../fixtures/apps_backend_project/main.ts | 12 ++ .../apps_backend_project/noSdk.backend.ts | 7 + .../apps_backend_project/package.json | 10 ++ .../tests/src/_jest/fixtures/package.json | 3 +- packages/tests/src/_jest/fixtures/yarn.lock | 15 ++ .../@datadog/action-catalog/package.json | 4 + packages/tests/tsconfig.json | 3 +- 15 files changed, 339 insertions(+), 14 deletions(-) create mode 100644 packages/plugins/apps/src/backend/integration.test.ts create mode 100644 packages/tests/src/_jest/fixtures/.yarn/cache/@datadog-apps-backend-npm-0.0.1-bc8eb96736-3245683498.zip create mode 100644 packages/tests/src/_jest/fixtures/apps_backend_project/getRuntimeUsers.backend.ts create mode 100644 packages/tests/src/_jest/fixtures/apps_backend_project/main.ts create mode 100644 packages/tests/src/_jest/fixtures/apps_backend_project/noSdk.backend.ts create mode 100644 packages/tests/src/_jest/fixtures/apps_backend_project/package.json create mode 100644 packages/tests/src/e2e/appsPlugin/project/node_modules/@datadog/action-catalog/package.json diff --git a/packages/plugins/apps/src/backend/integration.test.ts b/packages/plugins/apps/src/backend/integration.test.ts new file mode 100644 index 000000000..e6858a654 --- /dev/null +++ b/packages/plugins/apps/src/backend/integration.test.ts @@ -0,0 +1,140 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import * as fsHelpers from '@dd/core/helpers/fs'; +import { runBundlers } from '@dd/tests/_jest/helpers/runBundlers'; +import fsp from 'fs/promises'; +import path from 'path'; +import { pathToFileURL } from 'url'; + +const BACKEND_OUT_DIR_PREFIX = 'dd-apps-backend-'; +const BUNDLE_FILENAME_RE = /^[0-9a-f]{64}\.(.+)\.js$/; + +type BackendMainModule = { + main: (context: unknown) => Promise; +}; + +function isBackendMainModule(mod: unknown): mod is BackendMainModule { + if (typeof mod !== 'object' || mod === null) { + return false; + } + if (!('main' in mod)) { + return false; + } + return typeof mod.main === 'function'; +} + +describe('apps backend runtime — real @datadog/apps-backend integration', () => { + let backendOutDir: string | undefined; + let bundlesByFunctionName: Map; + + beforeAll(async () => { + const realRm = fsHelpers.rm; + const rmSpy = jest.spyOn(fsHelpers, 'rm').mockImplementation(async (dir: string) => { + if (dir.includes(BACKEND_OUT_DIR_PREFIX)) { + backendOutDir = dir; + return; + } + await realRm(dir); + }); + + const { errors } = await runBundlers( + { apps: { identifier: 'app-id', name: 'test-app', dryRun: true } }, + { entry: { main: './apps_backend_project/main.ts' } }, + ['vite'], + ); + rmSpy.mockRestore(); + + if (errors.length > 0) { + throw new Error(`Expected no build errors, got: ${errors.join(', ')}`); + } + if (!backendOutDir) { + throw new Error('Expected the apps plugin to build backend function bundles.'); + } + + const files = await fsp.readdir(backendOutDir); + bundlesByFunctionName = new Map(); + for (const file of files) { + const match = BUNDLE_FILENAME_RE.exec(file); + if (match) { + bundlesByFunctionName.set(match[1], path.join(backendOutDir, file)); + } + } + }, 30000); + + afterAll(async () => { + if (backendOutDir) { + await fsp.rm(backendOutDir, { recursive: true, force: true }); + } + }); + + const importBackendMain = async (functionName: string) => { + const bundlePath = bundlesByFunctionName.get(functionName); + if (!bundlePath) { + throw new Error(`No emitted bundle found for backend function "${functionName}".`); + } + const mod: unknown = await import(pathToFileURL(bundlePath).href); + if (!isBackendMainModule(mod)) { + throw new Error(`Expected ${bundlePath} to export a "main" function.`); + } + return mod.main; + }; + + const validSource = () => ({ + initiator: { id: 'initiator-id', orgId: 'org-1' }, + runAsUser: { id: 'run-as-id', orgId: 'org-1' }, + }); + + test('resolves execution and initiating users from the real SDK', async () => { + const main = await importBackendMain('getRuntimeUsers'); + const { initiator, runAsUser } = validSource(); + + const result = await main({ + Source: { initiator, runAsUser }, + backendFunctionArgs: ['integration-test'], + }); + + expect(result).toEqual({ + label: 'integration-test', + executionUser: runAsUser, + initiatingUser: initiator, + }); + }); + + test('forwards arguments to the backend function', async () => { + const main = await importBackendMain('plainEcho'); + + const result = await main({ + Source: validSource(), + backendFunctionArgs: ['hello'], + }); + + expect(result).toEqual({ value: 'hello' }); + }); + + test('a backend that does not use the runtime SDK still works', async () => { + const main = await importBackendMain('noSdkFunction'); + + const result = await main({ + Source: validSource(), + backendFunctionArgs: [], + }); + + expect(result).toEqual({ ok: true }); + }); + + test('rejects an invalid context', async () => { + const main = await importBackendMain('getRuntimeUsers'); + + await expect( + main({ + Source: { + initiator: { orgId: 'org-1' }, + runAsUser: { id: 'run-as-id', orgId: 'org-1' }, + }, + backendFunctionArgs: ['integration-test'], + }), + ).rejects.toThrow(/is missing the required "id" property/); + }); +}); diff --git a/packages/plugins/apps/src/backend/shared.test.ts b/packages/plugins/apps/src/backend/shared.test.ts index 9a9508394..04c7b5493 100644 --- a/packages/plugins/apps/src/backend/shared.test.ts +++ b/packages/plugins/apps/src/backend/shared.test.ts @@ -2,7 +2,43 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. -import { SET_EXECUTE_ACTION_SNIPPET } from '@dd/apps-plugin/backend/shared'; +import { + SET_BACKEND_CONTEXT_SNIPPET, + SET_EXECUTE_ACTION_SNIPPET, +} from '@dd/apps-plugin/backend/shared'; + +describe('SET_BACKEND_CONTEXT_SNIPPET', () => { + test('registers the backend runtime context', () => { + const runtimeHandle = { opaque: true }; + const buildRuntimeFromJsFunctionWithActions = jest.fn().mockReturnValue(runtimeHandle); + const setBackend = jest.fn(); + const context = { Source: { initiator: { id: 'user-id' } } }; + + // eslint-disable-next-line no-new-func + const run = new Function( + 'buildRuntimeFromJsFunctionWithActions', + 'setBackend', + '$', + SET_BACKEND_CONTEXT_SNIPPET, + ); + run(buildRuntimeFromJsFunctionWithActions, setBackend, context); + + expect(buildRuntimeFromJsFunctionWithActions).toHaveBeenCalledWith(context); + expect(setBackend).toHaveBeenCalledWith(runtimeHandle); + }); + + test('does not throw when buildRuntimeFromJsFunctionWithActions/setBackend are unavailable', () => { + // eslint-disable-next-line no-new-func + const run = new Function( + 'buildRuntimeFromJsFunctionWithActions', + 'setBackend', + '$', + SET_BACKEND_CONTEXT_SNIPPET, + ); + + expect(() => run(undefined, undefined, {})).not.toThrow(); + }); +}); /** * Evaluate SET_EXECUTE_ACTION_SNIPPET in a controlled scope and return the diff --git a/packages/plugins/apps/src/backend/shared.ts b/packages/plugins/apps/src/backend/shared.ts index 249e3ed60..42834068b 100644 --- a/packages/plugins/apps/src/backend/shared.ts +++ b/packages/plugins/apps/src/backend/shared.ts @@ -2,24 +2,44 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. -/** - * Check if @datadog/action-catalog is installed using Node's module resolution. - * Resolves from the given directory (defaults to cwd) so the check works - * even when the plugin itself is loaded from a different location (e.g. linked). - */ -export function isActionCatalogInstalled(fromDir: string): boolean { +function isPackageExportInstalled(packageExport: string, fromDir: string): boolean { try { - require.resolve('@datadog/action-catalog/action-execution', { paths: [fromDir] }); + require.resolve(packageExport, { paths: [fromDir] }); return true; } catch { return false; } } +/** + * Check if @datadog/action-catalog is installed using Node's module resolution. + * Resolves from the given directory so the check works even when the plugin + * itself is loaded from a different location (e.g. linked). + */ +export function isActionCatalogInstalled(fromDir: string): boolean { + return isPackageExportInstalled('@datadog/action-catalog/action-execution', fromDir); +} + +/** Check if the @datadog/apps-backend "JS Function with Actions" runtime factory is installed. */ +export function isDatadogAppsBackendInstalled(fromDir: string): boolean { + return isPackageExportInstalled('@datadog/apps-backend/runtime/jsFunctionWithActions', fromDir); +} + /** The import line to pull action-catalog's setExecuteActionImplementation into bundles. */ export const ACTION_CATALOG_IMPORT = "import { setExecuteActionImplementation } from '@datadog/action-catalog/action-execution';"; +/** The import line that exposes @datadog/apps-backend backend context initialization. */ +export const DATADOG_APPS_BACKEND_IMPORT = `\ +import { buildRuntimeFromJsFunctionWithActions } from '@datadog/apps-backend/runtime/jsFunctionWithActions'; +import { setBackend } from '@datadog/apps-backend/runtime';`; + +/** Script snippet that supplies the backend runtime context to @datadog/apps. */ +export const SET_BACKEND_CONTEXT_SNIPPET = `\ + if (typeof buildRuntimeFromJsFunctionWithActions === 'function' && typeof setBackend === 'function') { + setBackend(buildRuntimeFromJsFunctionWithActions($)); + }`; + /** Script snippet that registers the $.Actions-based executeAction implementation at runtime. */ export const SET_EXECUTE_ACTION_SNIPPET = `\ if (typeof setExecuteActionImplementation === 'function') { diff --git a/packages/plugins/apps/src/backend/virtual-entry.test.ts b/packages/plugins/apps/src/backend/virtual-entry.test.ts index 376b15a3c..434e458b5 100644 --- a/packages/plugins/apps/src/backend/virtual-entry.test.ts +++ b/packages/plugins/apps/src/backend/virtual-entry.test.ts @@ -18,6 +18,7 @@ describe('Backend Functions - generateVirtualEntryContent', () => { describe('without action-catalog', () => { beforeEach(() => { jest.spyOn(shared, 'isActionCatalogInstalled').mockReturnValue(false); + jest.spyOn(shared, 'isDatadogAppsBackendInstalled').mockReturnValue(false); }); test('Should import the function by name from the entry path', () => { @@ -89,11 +90,22 @@ describe('Backend Functions - generateVirtualEntryContent', () => { ); expect(result).not.toContain('@datadog/action-catalog'); }); + + test('Should not include Datadog Apps backend context setup', () => { + const result = generateVirtualEntryContent( + 'myHandler', + '/src/handler.ts', + PROJECT_ROOT, + ); + expect(result).not.toContain('@datadog/apps-backend/runtime'); + expect(result).not.toContain('setBackend(buildRuntimeFromJsFunctionWithActions($))'); + }); }); describe('with action-catalog', () => { beforeEach(() => { jest.spyOn(shared, 'isActionCatalogInstalled').mockReturnValue(true); + jest.spyOn(shared, 'isDatadogAppsBackendInstalled').mockReturnValue(false); }); test('Should include action-catalog import', () => { @@ -117,8 +129,35 @@ describe('Backend Functions - generateVirtualEntryContent', () => { }); }); + describe('with @datadog/apps-backend', () => { + beforeEach(() => { + jest.spyOn(shared, 'isActionCatalogInstalled').mockReturnValue(false); + jest.spyOn(shared, 'isDatadogAppsBackendInstalled').mockReturnValue(true); + }); + + test('Should import and set the backend context before calling the handler', () => { + const result = generateVirtualEntryContent( + 'myHandler', + '/src/handler.ts', + PROJECT_ROOT, + ); + + expect(result).toContain( + "import { buildRuntimeFromJsFunctionWithActions } from '@datadog/apps-backend/runtime/jsFunctionWithActions'", + ); + expect(result).toContain("import { setBackend } from '@datadog/apps-backend/runtime'"); + expect( + result.indexOf('setBackend(buildRuntimeFromJsFunctionWithActions($))'), + ).toBeGreaterThan(result.indexOf('globalThis.$ = $')); + expect(result.indexOf('await myHandler(...args)')).toBeGreaterThan( + result.indexOf('setBackend(buildRuntimeFromJsFunctionWithActions($))'), + ); + }); + }); + test('Should escape entry paths with special characters', () => { jest.spyOn(shared, 'isActionCatalogInstalled').mockReturnValue(false); + jest.spyOn(shared, 'isDatadogAppsBackendInstalled').mockReturnValue(false); const result = generateVirtualEntryContent( 'handler', '/path/with "quotes"/handler.ts', @@ -132,6 +171,7 @@ describe('Backend Functions - generateDevVirtualEntryContent', () => { beforeEach(() => { jest.restoreAllMocks(); jest.spyOn(shared, 'isActionCatalogInstalled').mockReturnValue(false); + jest.spyOn(shared, 'isDatadogAppsBackendInstalled').mockReturnValue(false); }); test('Should produce identical output to generateVirtualEntryContent', () => { @@ -162,6 +202,7 @@ describe('Backend Functions - args round-trip via $.backendFunctionArgs', () => beforeEach(() => { jest.restoreAllMocks(); jest.spyOn(shared, 'isActionCatalogInstalled').mockReturnValue(false); + jest.spyOn(shared, 'isDatadogAppsBackendInstalled').mockReturnValue(false); }); // Extract the body of the generated `main($)` function so we can eval it diff --git a/packages/plugins/apps/src/backend/virtual-entry.ts b/packages/plugins/apps/src/backend/virtual-entry.ts index 235d9b1a5..4085d61b7 100644 --- a/packages/plugins/apps/src/backend/virtual-entry.ts +++ b/packages/plugins/apps/src/backend/virtual-entry.ts @@ -4,8 +4,11 @@ import { ACTION_CATALOG_IMPORT, + DATADOG_APPS_BACKEND_IMPORT, + SET_BACKEND_CONTEXT_SNIPPET, SET_EXECUTE_ACTION_SNIPPET, isActionCatalogInstalled, + isDatadogAppsBackendInstalled, } from './shared'; /** @@ -18,9 +21,14 @@ export function generateVirtualEntryContent( projectRoot: string, ): string { const lines: string[] = []; + const hasDatadogAppsBackendRuntime = isDatadogAppsBackendInstalled(projectRoot); lines.push(`import { ${functionName} } from ${JSON.stringify(entryPath)};`); + if (hasDatadogAppsBackendRuntime) { + lines.push(DATADOG_APPS_BACKEND_IMPORT); + } + if (isActionCatalogInstalled(projectRoot)) { lines.push(ACTION_CATALOG_IMPORT); } @@ -30,6 +38,11 @@ export function generateVirtualEntryContent( lines.push('export async function main($) {'); lines.push(' globalThis.$ = $;'); lines.push(''); + if (hasDatadogAppsBackendRuntime) { + lines.push(' // Supply the backend runtime context'); + lines.push(SET_BACKEND_CONTEXT_SNIPPET); + lines.push(''); + } lines.push(` // Register the $.Actions-based implementation for executeAction`); lines.push(SET_EXECUTE_ACTION_SNIPPET); lines.push(''); diff --git a/packages/plugins/apps/src/vite/index.ts b/packages/plugins/apps/src/vite/index.ts index 22380926b..831ce75c2 100644 --- a/packages/plugins/apps/src/vite/index.ts +++ b/packages/plugins/apps/src/vite/index.ts @@ -107,7 +107,7 @@ export const getVitePlugin = ({ options, }: VitePluginOptions): PluginOptions['vite'] => { const log = context.getLogger(PLUGIN_NAME); - const { auth, buildRoot } = context; + const { auth } = context; context.inject({ type: 'file', @@ -142,7 +142,11 @@ export const getVitePlugin = ({ return { code: '', map: null }; } - const { functions, proxyCode } = buildProxyModule(exportNames, id, buildRoot); + const { functions, proxyCode } = buildProxyModule( + exportNames, + id, + context.buildRoot, + ); setBackendFunctions(id, functions); log.debug(`Generated proxy for ${id} with ${functions.length} export(s)`); @@ -157,7 +161,7 @@ export const getVitePlugin = ({ const result = await buildBackendFunctions( bundler.build, backendFunctions, - buildRoot, + context.buildRoot, log, ); backendOutDir = result.outDir; @@ -202,7 +206,7 @@ export const getVitePlugin = ({ getBackendFunctions, auth, doAuthenticatedRequest, - buildRoot, + context.buildRoot, log, ), ); diff --git a/packages/tests/src/_jest/fixtures/.yarn/cache/@datadog-apps-backend-npm-0.0.1-bc8eb96736-3245683498.zip b/packages/tests/src/_jest/fixtures/.yarn/cache/@datadog-apps-backend-npm-0.0.1-bc8eb96736-3245683498.zip new file mode 100644 index 0000000000000000000000000000000000000000..69e0d27d0c5a3a7b50fbeef65ac0d3278806ec60 GIT binary patch literal 65176 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

g)VPRJ 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 R0to|Ouc<(w-l?5e{|AHb865xs literal 0 HcmV?d00001 diff --git a/packages/tests/src/_jest/fixtures/apps_backend_project/getRuntimeUsers.backend.ts b/packages/tests/src/_jest/fixtures/apps_backend_project/getRuntimeUsers.backend.ts new file mode 100644 index 000000000..71e7b8b93 --- /dev/null +++ b/packages/tests/src/_jest/fixtures/apps_backend_project/getRuntimeUsers.backend.ts @@ -0,0 +1,21 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { + getExecutionUser, + getInitiatingUser, +} from '@datadog/apps-backend/user'; + +export async function getRuntimeUsers(label: string) { + const [executionUser, initiatingUser] = await Promise.all([ + getExecutionUser(), + getInitiatingUser(), + ]); + + return { label, executionUser, initiatingUser }; +} + +export async function plainEcho(value: string) { + return { value }; +} diff --git a/packages/tests/src/_jest/fixtures/apps_backend_project/main.ts b/packages/tests/src/_jest/fixtures/apps_backend_project/main.ts new file mode 100644 index 000000000..a241ad012 --- /dev/null +++ b/packages/tests/src/_jest/fixtures/apps_backend_project/main.ts @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import './getRuntimeUsers.backend'; +import './noSdk.backend'; + +export const main = () => { + console.log('apps_backend_project fixture built.'); +}; + +main(); diff --git a/packages/tests/src/_jest/fixtures/apps_backend_project/noSdk.backend.ts b/packages/tests/src/_jest/fixtures/apps_backend_project/noSdk.backend.ts new file mode 100644 index 000000000..22d1c9219 --- /dev/null +++ b/packages/tests/src/_jest/fixtures/apps_backend_project/noSdk.backend.ts @@ -0,0 +1,7 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +export async function noSdkFunction() { + return { ok: true }; +} diff --git a/packages/tests/src/_jest/fixtures/apps_backend_project/package.json b/packages/tests/src/_jest/fixtures/apps_backend_project/package.json new file mode 100644 index 000000000..988be3f0a --- /dev/null +++ b/packages/tests/src/_jest/fixtures/apps_backend_project/package.json @@ -0,0 +1,10 @@ +{ + "name": "@tests/apps_backend_project", + "private": true, + "license": "MIT", + "author": "Datadog", + "packageManager": "yarn@4.2.1", + "dependencies": { + "@datadog/apps-backend": "0.0.1" + } +} diff --git a/packages/tests/src/_jest/fixtures/package.json b/packages/tests/src/_jest/fixtures/package.json index baafdfc02..df591e7ce 100644 --- a/packages/tests/src/_jest/fixtures/package.json +++ b/packages/tests/src/_jest/fixtures/package.json @@ -6,6 +6,7 @@ "packageManager": "yarn@4.2.1", "workspaces": [ "hard_project", - "easy_project" + "easy_project", + "apps_backend_project" ] } diff --git a/packages/tests/src/_jest/fixtures/yarn.lock b/packages/tests/src/_jest/fixtures/yarn.lock index ee71a905c..0a81c424b 100644 --- a/packages/tests/src/_jest/fixtures/yarn.lock +++ b/packages/tests/src/_jest/fixtures/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 8 cacheKey: 10 +"@datadog/apps-backend@npm:0.0.1": + version: 0.0.1 + resolution: "@datadog/apps-backend@npm:0.0.1" + checksum: 10/32456834986ff47095357ad4c021ed390e9955313e5d6c0e8ffccccfb5bc41224b516ed156b6ab1f8e2150531a6beb109e0eeb3e8d913827c806c8feb1639908 + languageName: node + linkType: hard + "@remix-run/router@npm:1.21.0": version: 1.21.0 resolution: "@remix-run/router@npm:1.21.0" @@ -12,6 +19,14 @@ __metadata: languageName: node linkType: hard +"@tests/apps_backend_project@workspace:apps_backend_project": + version: 0.0.0-use.local + resolution: "@tests/apps_backend_project@workspace:apps_backend_project" + dependencies: + "@datadog/apps-backend": "npm:0.0.1" + languageName: unknown + linkType: soft + "@tests/easy_project@workspace:easy_project": version: 0.0.0-use.local resolution: "@tests/easy_project@workspace:easy_project" diff --git a/packages/tests/src/e2e/appsPlugin/project/node_modules/@datadog/action-catalog/package.json b/packages/tests/src/e2e/appsPlugin/project/node_modules/@datadog/action-catalog/package.json new file mode 100644 index 000000000..aed82081b --- /dev/null +++ b/packages/tests/src/e2e/appsPlugin/project/node_modules/@datadog/action-catalog/package.json @@ -0,0 +1,4 @@ +{ + "name": "@datadog/action-catalog", + "version": "0.0.0" +} diff --git a/packages/tests/tsconfig.json b/packages/tests/tsconfig.json index 4d16db9bb..1ae820a35 100644 --- a/packages/tests/tsconfig.json +++ b/packages/tests/tsconfig.json @@ -10,6 +10,7 @@ "exclude": [ "dist", "node_modules", - "src/_playwright/public" + "src/_playwright/public", + "src/_jest/fixtures" ] } \ No newline at end of file