diff --git a/packages/build/src/plugins_core/deploy_config/index.ts b/packages/build/src/plugins_core/deploy_config/index.ts index 163a78a63d..bfc8a567f8 100644 --- a/packages/build/src/plugins_core/deploy_config/index.ts +++ b/packages/build/src/plugins_core/deploy_config/index.ts @@ -17,11 +17,12 @@ const ALLOWED_PROPERTIES = [['images', 'remote_images']] const coreStep: CoreStepFunction = async function ({ buildDir, netlifyConfig, + packagePath, systemLog = () => { // no-op }, }) { - const configPath = resolve(buildDir, '.netlify/deploy/v1/config.json') + const configPath = resolve(buildDir, packagePath ?? '', '.netlify/deploy/v1/config.json') let config: Partial = {} diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/build.mjs b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/build.mjs new file mode 100644 index 0000000000..90728738a3 --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/build.mjs @@ -0,0 +1,10 @@ +import { mkdir, writeFile } from 'node:fs/promises' + +const config = { + images: { + remote_images: ["domain1.netlify", "domain2.netlify"] + } +} + +await mkdir('.netlify/deploy/v1', { recursive: true }); +await writeFile('.netlify/deploy/v1/config.json', JSON.stringify(config)); diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/netlify.toml b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/netlify.toml new file mode 100644 index 0000000000..c348cc4347 --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/netlify.toml @@ -0,0 +1,3 @@ +[build] +command = "pnpm --filter app-1 build" +publish = "apps/app-1/dist" diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/package.json b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/package.json new file mode 100644 index 0000000000..a9ced25594 --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-1/package.json @@ -0,0 +1,6 @@ +{ + "name": "app-1", + "scripts": { + "build": "node build.mjs" + } +} diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/build.mjs b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/build.mjs new file mode 100644 index 0000000000..8b23fad140 --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/build.mjs @@ -0,0 +1,10 @@ +import { mkdir, writeFile } from 'node:fs/promises' + +const config = { + images: { + remote_images: ["domain3.netlify", "domain4.netlify"] + } +} + +await mkdir('.netlify/deploy/v1', { recursive: true }); +await writeFile('.netlify/deploy/v1/config.json', JSON.stringify(config)); diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/netlify.toml b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/netlify.toml new file mode 100644 index 0000000000..94bae6348b --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/netlify.toml @@ -0,0 +1,3 @@ +[build] +command = "pnpm --filter app-2 build" +publish = "apps/app-2/dist" diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/package.json b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/package.json new file mode 100644 index 0000000000..431ad013ca --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/apps/app-2/package.json @@ -0,0 +1,6 @@ +{ + "name": "app-2", + "scripts": { + "build": "node build.mjs" + } +} diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/package.json b/packages/build/tests/deploy_config/fixtures/monorepo/package.json new file mode 100644 index 0000000000..4d8fc694fb --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/package.json @@ -0,0 +1,4 @@ +{ + "name": "monorepo", + "type": "module" +} diff --git a/packages/build/tests/deploy_config/fixtures/monorepo/pnpm-workspace.yaml b/packages/build/tests/deploy_config/fixtures/monorepo/pnpm-workspace.yaml new file mode 100644 index 0000000000..8ab3e17a0d --- /dev/null +++ b/packages/build/tests/deploy_config/fixtures/monorepo/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'apps/*' diff --git a/packages/build/tests/deploy_config/tests.js b/packages/build/tests/deploy_config/tests.js index cf242e23d0..243370f9a8 100644 --- a/packages/build/tests/deploy_config/tests.js +++ b/packages/build/tests/deploy_config/tests.js @@ -43,6 +43,22 @@ test('Loads configuration data that has been generated by the build command', as } }) +test('In a monorepo setup, loads package-specific configuration data', async (t) => { + const fixture = await new Fixture('./fixtures/monorepo').withCopyRoot({ git: false }) + const { success, netlifyConfig } = await fixture + .withFlags({ + cwd: fixture.repositoryRoot, + featureFlags: { netlify_build_deploy_configuration_api: true }, + packagePath: 'apps/app-1', + }) + .runBuildProgrammatic() + + t.true(success) + t.deepEqual(netlifyConfig.images, { + remote_images: ['domain1.netlify', 'domain2.netlify'], + }) +}) + test('Configuration data is exposed to build plugins in the `onBuild` event', async (t) => { const { netlifyConfig, success } = await new Fixture('./fixtures/with_build_plugin') .withFlags({