diff --git a/.changeset/mean-ladybugs-sparkle.md b/.changeset/mean-ladybugs-sparkle.md new file mode 100644 index 000000000000..8c2c81b70972 --- /dev/null +++ b/.changeset/mean-ladybugs-sparkle.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/package": minor +--- + +feat: add `--preserve-output` flag to prevent deletion of the output directory before packaging diff --git a/documentation/docs/30-advanced/70-packaging.md b/documentation/docs/30-advanced/70-packaging.md index 93294e3f2616..49f650edeaf5 100644 --- a/documentation/docs/30-advanced/70-packaging.md +++ b/documentation/docs/30-advanced/70-packaging.md @@ -242,6 +242,7 @@ You can create so-called declaration maps (`d.ts.map` files) by setting `"declar - `-w`/`--watch` — watch files in `src/lib` for changes and rebuild the package - `-i`/`--input` — the input directory which contains all the files of the package. Defaults to `src/lib` - `-o`/`--output` — the output directory where the processed files are written to. Your `package.json`'s `exports` should point to files inside there, and the `files` array should include that folder. Defaults to `dist` +- `-p`/`--preserve-output` — prevent deletion of the output directory before packaging. Defaults to `false`, which means that the output directory will be emptied first - `-t`/`--types` — whether or not to create type definitions (`d.ts` files). We strongly recommend doing this as it fosters ecosystem library quality. Defaults to `true` - `--tsconfig` - the path to a tsconfig or jsconfig. When not provided, searches for the next upper tsconfig/jsconfig in the workspace path. diff --git a/packages/package/src/cli.js b/packages/package/src/cli.js index 6deffa3c20a6..ca28b1ee1464 100644 --- a/packages/package/src/cli.js +++ b/packages/package/src/cli.js @@ -23,6 +23,7 @@ prog .describe('Create a package') .option('-i, --input', 'Input directory') .option('-o, --output', 'Output directory', 'dist') + .option('-p, --preserve-output', 'Do not delete the output directory before packaging', false) .option('-t, --types', 'Emit type declarations', true) .option('-w, --watch', 'Rerun when files change', false) .option( @@ -47,6 +48,7 @@ prog cwd: process.cwd(), input: args.input ?? config.kit?.files?.lib ?? 'src/lib', output: args.output, + preserve_output: args['preserve-output'], tsconfig: args.tsconfig, types: args.types, config diff --git a/packages/package/src/index.js b/packages/package/src/index.js index 1f25fb3b0eab..fb540e7bae51 100644 --- a/packages/package/src/index.js +++ b/packages/package/src/index.js @@ -41,7 +41,10 @@ async function do_build(options, analyse_code) { await process_file(input, temp, file, options.config.preprocess, alias, tsconfig, analyse_code); } - rimraf(output); + if (!options.preserve_output) { + rimraf(output); + } + mkdirp(output); copy(temp, output); @@ -173,6 +176,7 @@ export async function watch(options) { function normalize_options(options) { const input = path.resolve(options.cwd, options.input); const output = path.resolve(options.cwd, options.output); + const preserve_output = options.preserve_output; const temp = path.resolve( options.cwd, options.config.kit?.outDir ?? '.svelte-kit', @@ -189,6 +193,7 @@ function normalize_options(options) { return { input, output, + preserve_output, temp, extensions, alias, diff --git a/packages/package/src/types.d.ts b/packages/package/src/types.d.ts index f575d4627cee..f04ae6744d52 100644 --- a/packages/package/src/types.d.ts +++ b/packages/package/src/types.d.ts @@ -4,6 +4,7 @@ export interface Options { cwd: string; input: string; output: string; + preserve_output: boolean; types: boolean; tsconfig?: string; config: { diff --git a/packages/package/test/fixtures/preserve-output/expected/assets/theme.css b/packages/package/test/fixtures/preserve-output/expected/assets/theme.css new file mode 100644 index 000000000000..4f6c32c064b0 --- /dev/null +++ b/packages/package/test/fixtures/preserve-output/expected/assets/theme.css @@ -0,0 +1 @@ +:root { color: red } \ No newline at end of file diff --git a/packages/package/test/fixtures/preserve-output/expected/index.d.ts b/packages/package/test/fixtures/preserve-output/expected/index.d.ts new file mode 100644 index 000000000000..de88fd2dcd89 --- /dev/null +++ b/packages/package/test/fixtures/preserve-output/expected/index.d.ts @@ -0,0 +1 @@ +export declare const foo = 'bar'; diff --git a/packages/package/test/fixtures/preserve-output/expected/index.js b/packages/package/test/fixtures/preserve-output/expected/index.js new file mode 100644 index 000000000000..c155820bf773 --- /dev/null +++ b/packages/package/test/fixtures/preserve-output/expected/index.js @@ -0,0 +1 @@ +export const foo = 'bar'; diff --git a/packages/package/test/fixtures/preserve-output/package.json b/packages/package/test/fixtures/preserve-output/package.json new file mode 100644 index 000000000000..1ecf036afa15 --- /dev/null +++ b/packages/package/test/fixtures/preserve-output/package.json @@ -0,0 +1,16 @@ +{ + "name": "preserve-output", + "private": true, + "type": "module", + "description": "with additional things running before svelte-package", + "peerDependencies": { + "svelte": "^4.0.0" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js" + }, + "./theme.css": "./dist/assets/theme.css" + } +} diff --git a/packages/package/test/fixtures/preserve-output/src/lib/index.ts b/packages/package/test/fixtures/preserve-output/src/lib/index.ts new file mode 100644 index 000000000000..c155820bf773 --- /dev/null +++ b/packages/package/test/fixtures/preserve-output/src/lib/index.ts @@ -0,0 +1 @@ +export const foo = 'bar'; diff --git a/packages/package/test/fixtures/preserve-output/tsconfig.json b/packages/package/test/fixtures/preserve-output/tsconfig.json new file mode 100644 index 000000000000..c24ac80d1521 --- /dev/null +++ b/packages/package/test/fixtures/preserve-output/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "target": "ESNext" + } +} diff --git a/packages/package/test/index.spec.js b/packages/package/test/index.spec.js index c4cec8f8da56..0b1cc9b2dccb 100644 --- a/packages/package/test/index.spec.js +++ b/packages/package/test/index.spec.js @@ -31,6 +31,7 @@ async function test_make_package(path, options) { cwd, input, output, + preserve_output: false, types: true, config, ...options @@ -93,7 +94,7 @@ for (const dir of fs.readdirSync(join(__dirname, 'errors'))) { const input = resolve(cwd, config.kit?.files?.lib ?? 'src/lib'); try { - await build({ cwd, input, output, types: true, config }); + await build({ cwd, input, output, types: true, config, preserve_output: false }); throw new Error('Must not pass build'); } catch (/** @type {any} */ error) { expect(error).toBeInstanceOf(Error); @@ -183,6 +184,7 @@ if (!process.env.CI) { cwd, input: 'src/lib', output: 'package', + preserve_output: false, types: true, config }); @@ -271,6 +273,7 @@ test('validates package (1)', () => { cwd: '', input: '', output: '', + preserve_output: false, types: true }); analyse_code('src/lib/index.js', 'export const a = 1;import.meta.env;'); @@ -290,6 +293,7 @@ test('validates package (2)', () => { cwd: '', input: '', output: '', + preserve_output: false, types: true }); analyse_code('src/lib/C.svelte', ''); @@ -309,6 +313,7 @@ test('validates package (all ok 1)', () => { cwd: '', input: '', output: '', + preserve_output: false, types: true }); analyse_code('src/lib/C.svelte', ''); @@ -326,6 +331,7 @@ test('validates package (all ok 2)', () => { cwd: '', input: '', output: '', + preserve_output: false, types: true }); analyse_code('src/lib/C.svelte', ''); @@ -337,3 +343,11 @@ test('validates package (all ok 2)', () => { expect(warnings.length).toEqual(0); }); + +test('create package with preserved output', async () => { + const output = join(__dirname, 'fixtures', 'preserve-output', 'dist'); + rimraf(output); + fs.mkdirSync(join(output, 'assets'), { recursive: true }); + fs.writeFileSync(join(output, 'assets', 'theme.css'), ':root { color: red }'); + await test_make_package('preserve-output', { preserve_output: true }); +});