From 3389f0ce919dad14b15613f9ca24449ae02ab2e0 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 22 Sep 2022 16:37:16 -0400 Subject: [PATCH] Prevent the root from being deleted during the build (#4845) * Prevent the root from being deleted during the build * Adding a changeset --- .changeset/hot-lamps-search.md | 5 +++ packages/astro/src/core/build/index.ts | 10 +++++ packages/astro/test/dont-delete-root.test.js | 40 +++++++++++++++++++ .../fixtures/dont-delete-me/astro.config.mjs | 5 +++ .../test/fixtures/dont-delete-me/package.json | 6 +++ .../dont-delete-me/src/pages/index.astro | 8 ++++ pnpm-lock.yaml | 6 +++ 7 files changed, 80 insertions(+) create mode 100644 .changeset/hot-lamps-search.md create mode 100644 packages/astro/test/dont-delete-root.test.js create mode 100644 packages/astro/test/fixtures/dont-delete-me/astro.config.mjs create mode 100644 packages/astro/test/fixtures/dont-delete-me/package.json create mode 100644 packages/astro/test/fixtures/dont-delete-me/src/pages/index.astro diff --git a/.changeset/hot-lamps-search.md b/.changeset/hot-lamps-search.md new file mode 100644 index 000000000..47c7becb5 --- /dev/null +++ b/.changeset/hot-lamps-search.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Prevent the root folder from being deleted during the build diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index 33e7d1626..65c01697b 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -91,6 +91,7 @@ class AstroBuilder { serverEntry: 'entry.mjs', }; await runHookBuildStart({ config: this.settings.config, buildConfig, logging: this.logging }); + this.validateConfig(); info(this.logging, 'build', `output target: ${colors.green(this.settings.config.output)}`); if (this.settings.adapter) { @@ -171,6 +172,15 @@ class AstroBuilder { } } + private validateConfig() { + const { config } = this.settings; + + // outDir gets blown away so it can't be the root. + if(config.outDir.toString() === config.root.toString()) { + throw new Error(`the outDir cannot be the root folder. Please build to a folder such as dist.`); + } + } + /** Stats */ private async printStats({ logging, diff --git a/packages/astro/test/dont-delete-root.test.js b/packages/astro/test/dont-delete-root.test.js new file mode 100644 index 000000000..7aef854d1 --- /dev/null +++ b/packages/astro/test/dont-delete-root.test.js @@ -0,0 +1,40 @@ +import { expect } from 'chai'; +import { loadFixture } from './test-utils.js'; +import * as fs from 'fs'; + +describe('outDir set to project root', async () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + /** @type {Error | undefined} */ + let error; + + before(async () => { + fixture = await loadFixture({ root: './fixtures/dont-delete-me/' }); + try { + await fixture.build(); + } catch(err) { + error = err; + } + }); + + it('Throws an error when you attempt to build', async () => { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.match(/outDir cannot be the root folder/); + }); + + it('Files have not been deleted', async () => { + const expectedFiles = [ + 'package.json', + 'astro.config.mjs', + 'src/pages/index.astro' + ]; + + for(const rel of expectedFiles) { + const root = new URL('./fixtures/dont-delete-me/', import.meta.url); + const url = new URL('./' + rel, root); + const stats = await fs.promises.stat(url); + expect(stats).to.not.be.undefined; + } + }); +}); diff --git a/packages/astro/test/fixtures/dont-delete-me/astro.config.mjs b/packages/astro/test/fixtures/dont-delete-me/astro.config.mjs new file mode 100644 index 000000000..9caa10aab --- /dev/null +++ b/packages/astro/test/fixtures/dont-delete-me/astro.config.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + outDir: './' +}); diff --git a/packages/astro/test/fixtures/dont-delete-me/package.json b/packages/astro/test/fixtures/dont-delete-me/package.json new file mode 100644 index 000000000..7ef7c1f14 --- /dev/null +++ b/packages/astro/test/fixtures/dont-delete-me/package.json @@ -0,0 +1,6 @@ +{ + "name": "@test/dont-delete-me", + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/dont-delete-me/src/pages/index.astro b/packages/astro/test/fixtures/dont-delete-me/src/pages/index.astro new file mode 100644 index 000000000..1d5ff1172 --- /dev/null +++ b/packages/astro/test/fixtures/dont-delete-me/src/pages/index.astro @@ -0,0 +1,8 @@ + + + Testing + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53967b1c5..0ef3baaff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1511,6 +1511,12 @@ importers: dependencies: astro: link:../../.. + packages/astro/test/fixtures/dont-delete-me: + specifiers: + astro: workspace:* + dependencies: + astro: link:../../.. + packages/astro/test/fixtures/entry-file-names: specifiers: '@astrojs/preact': 'workspace:'