diff --git a/.changeset/big-countries-pump.md b/.changeset/big-countries-pump.md new file mode 100644 index 000000000000..3a9fb9a9086b --- /dev/null +++ b/.changeset/big-countries-pump.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Add public API to let adapters update .gitignore diff --git a/documentation/docs/10-adapters.md b/documentation/docs/10-adapters.md index fcfb8bbdef15..1514ea3c5d34 100644 --- a/documentation/docs/10-adapters.md +++ b/documentation/docs/10-adapters.md @@ -31,6 +31,15 @@ export default { }; ``` +Some adapters may modify your project's `.gitignore` to include their build output. In case you don't want those patterns included you can comment them out: + +```diff +.svelte-kit +.env + +- build ++ # build +``` A variety of official adapters exist for serverless platforms... - [`adapter-cloudflare-workers`](https://github.com/sveltejs/kit/tree/master/packages/adapter-cloudflare-workers) — for [Cloudflare Workers](https://developers.cloudflare.com/workers/) diff --git a/documentation/docs/80-adapter-api.md b/documentation/docs/80-adapter-api.md index 0f14a4d275b3..1b67b66e6ec1 100644 --- a/documentation/docs/80-adapter-api.md +++ b/documentation/docs/80-adapter-api.md @@ -26,6 +26,7 @@ The types for `Adapter` and its parameters are available in [types/config.d.ts]( Within the `adapt` method, there are a number of things that an adapter should do: - Clear out the build directory +- Call `utils.update_ignores` to ignore build output in existing `.gitignore` files at the location of `svelte.config.js` - Output code that: - Calls `init` - Converts from the patform's request to a [SvelteKit request](#hooks-handle), calls `render`, and converts from a [SvelteKit response](#hooks-handle) to the platform's diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index 856d162d3f27..ac52cf03fcc3 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -16,6 +16,8 @@ export default function () { const files = fileURLToPath(new URL('./files', import.meta.url)); + utils.update_ignores({ patterns: [bucket, entrypoint] }); + utils.rimraf(bucket); utils.rimraf(entrypoint); diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index fe2f48a6f64c..218cb4214c45 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -17,6 +17,8 @@ export default function () { const files = fileURLToPath(new URL('./files', import.meta.url)); + utils.update_ignores({ patterns: [publish, functions] }); + utils.log.minor('Generating serverless function...'); utils.copy(join(files, 'entry.js'), '.svelte-kit/netlify/entry.js'); diff --git a/packages/adapter-node/index.js b/packages/adapter-node/index.js index 5640e6804986..631af7880d98 100644 --- a/packages/adapter-node/index.js +++ b/packages/adapter-node/index.js @@ -36,6 +36,7 @@ export default function ({ name: '@sveltejs/adapter-node', async adapt({ utils, config }) { + utils.update_ignores({ patterns: [out] }); utils.log.minor('Copying assets'); const static_directory = join(out, 'assets'); utils.copy_client_files(static_directory); diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index 5155fec1b8a6..d684cba3dd48 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -11,6 +11,7 @@ export default function ({ pages = 'build', assets = pages, fallback } = {}) { name: '@sveltejs/adapter-static', async adapt({ utils }) { + utils.update_ignores({ patterns: [pages, assets] }); utils.copy_static_files(assets); utils.copy_client_files(assets); diff --git a/packages/adapter-static/test/apps/prerendered/.gitignore b/packages/adapter-static/test/apps/prerendered/.gitignore index 0a4623184983..06f3fb94e666 100644 --- a/packages/adapter-static/test/apps/prerendered/.gitignore +++ b/packages/adapter-static/test/apps/prerendered/.gitignore @@ -3,3 +3,5 @@ node_modules /.svelte-kit /build /functions + +build diff --git a/packages/adapter-static/test/apps/spa/.gitignore b/packages/adapter-static/test/apps/spa/.gitignore index 0a4623184983..06f3fb94e666 100644 --- a/packages/adapter-static/test/apps/spa/.gitignore +++ b/packages/adapter-static/test/apps/spa/.gitignore @@ -3,3 +3,5 @@ node_modules /.svelte-kit /build /functions + +build diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index aef613d2f895..7beac2f6ca46 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -10,6 +10,8 @@ export default function () { async adapt({ utils }) { const dir = '.vercel_build_output'; + + utils.update_ignores({ patterns: [dir] }); utils.rimraf(dir); const files = fileURLToPath(new URL('./files', import.meta.url)); diff --git a/packages/create-svelte/shared/+eslint+prettier/package.json b/packages/create-svelte/shared/+eslint+prettier/package.json index ac3aca10acf1..8cb0595e99da 100644 --- a/packages/create-svelte/shared/+eslint+prettier/package.json +++ b/packages/create-svelte/shared/+eslint+prettier/package.json @@ -3,7 +3,7 @@ "eslint-config-prettier": "^8.1.0" }, "scripts": { - "lint": "prettier --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", - "format": "prettier --write --plugin-search-dir=. ." + "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", + "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ." } } diff --git a/packages/create-svelte/shared/+prettier/.prettierignore b/packages/create-svelte/shared/+prettier/.prettierignore deleted file mode 100644 index d26fa1cff1b9..000000000000 --- a/packages/create-svelte/shared/+prettier/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -.svelte-kit/** -static/** -build/** -node_modules/** diff --git a/packages/create-svelte/shared/-eslint+prettier/package.json b/packages/create-svelte/shared/-eslint+prettier/package.json index e9103a7e238c..af5326c65c5a 100644 --- a/packages/create-svelte/shared/-eslint+prettier/package.json +++ b/packages/create-svelte/shared/-eslint+prettier/package.json @@ -1,6 +1,6 @@ { "scripts": { - "lint": "prettier --check --plugin-search-dir=. .", - "format": "prettier --write --plugin-search-dir=. ." + "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. .", + "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ." } } diff --git a/packages/kit/src/core/adapt/utils.js b/packages/kit/src/core/adapt/utils.js index 21ee6822b0f4..a26c8164cc69 100644 --- a/packages/kit/src/core/adapt/utils.js +++ b/packages/kit/src/core/adapt/utils.js @@ -1,6 +1,7 @@ import { SVELTE_KIT } from '../constants.js'; import { copy, rimraf, mkdirp } from '../filesystem/index.js'; import { prerender } from './prerender.js'; +import fs from 'fs'; /** * @@ -47,6 +48,25 @@ export function get_utils({ cwd, config, build_data, log }) { log }); } + }, + + /** @param {{patterns: string[], log?: boolean}} options */ + update_ignores({ patterns, log = true }) { + const target = '.gitignore'; + if (!fs.existsSync(target)) return; + + const file = fs.readFileSync(target, { encoding: 'utf-8' }); + const eol = file.includes('\r\n') ? '\r\n' : '\n'; + const lines = file.split(eol); + const new_lines = new Set(patterns); + // remove repeated lines + for (const line of lines) { + // this will prevent commented ignores to be reinserted + new_lines.delete(line.replace(/#\s*/, '')); + } + if (new_lines.size === 0) return; + fs.writeFileSync(target, [...lines, ...new_lines].join(eol)); + if (log) this.log.success(`Updated ${target}`); } }; } diff --git a/packages/kit/types/config.d.ts b/packages/kit/types/config.d.ts index 45482dddb12f..5903e4c9cc0c 100644 --- a/packages/kit/types/config.d.ts +++ b/packages/kit/types/config.d.ts @@ -9,6 +9,7 @@ export type AdapterUtils = { copy_server_files: (dest: string) => void; copy_static_files: (dest: string) => void; copy: (from: string, to: string, filter?: (basename: string) => boolean) => void; + update_ignores: ({ patterns, log }: { patterns: string[]; log?: boolean }) => void; prerender: ({ all, dest,