diff --git a/apps/docs/CHANGELOG.md b/apps/docs/CHANGELOG.md index f5a0da2..10b2e89 100644 --- a/apps/docs/CHANGELOG.md +++ b/apps/docs/CHANGELOG.md @@ -1,5 +1,12 @@ # @webaseui/docs +## 0.0.2 + +### Patch Changes + +- Updated dependencies + - @webaseui/svelte@0.3.1 + ## 0.0.1 ### Patch Changes diff --git a/apps/docs/package.json b/apps/docs/package.json index 9bef0eb..efd1878 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "@webaseui/docs", - "version": "0.0.1", + "version": "0.0.2", "private": true, "type": "module", "scripts": { @@ -9,7 +9,7 @@ }, "dependencies": { "@webaseui/core": "0.1.0", - "@webaseui/svelte": "0.3.0", + "@webaseui/svelte": "0.3.1", "svelte": "^5.56.8" }, "devDependencies": { diff --git a/examples/webaseui-svelte-consumer/package.json b/examples/webaseui-svelte-consumer/package.json index 3b66c35..6520174 100644 --- a/examples/webaseui-svelte-consumer/package.json +++ b/examples/webaseui-svelte-consumer/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@webaseui/core": "0.1.0", - "@webaseui/svelte": "0.2.0", + "@webaseui/svelte": "0.3.0", "svelte": "^5.56.8" }, "devDependencies": { diff --git a/examples/webaseui-svelte-consumer/src/App.svelte b/examples/webaseui-svelte-consumer/src/App.svelte index eabb27b..ffabffd 100644 --- a/examples/webaseui-svelte-consumer/src/App.svelte +++ b/examples/webaseui-svelte-consumer/src/App.svelte @@ -16,7 +16,7 @@

This body is supplied through the Svelte 5 children snippet.

{#snippet footer()} - Installed artifact / 0.2.0 + Installed artifact / 0.3.0 {/snippet} diff --git a/package-lock.json b/package-lock.json index a40ad78..928c6a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,10 +27,10 @@ }, "apps/docs": { "name": "@webaseui/docs", - "version": "0.0.1", + "version": "0.0.2", "dependencies": { "@webaseui/core": "0.1.0", - "@webaseui/svelte": "0.3.0", + "@webaseui/svelte": "0.3.1", "svelte": "^5.56.8" }, "devDependencies": { @@ -4013,7 +4013,7 @@ }, "packages/webaseui-svelte": { "name": "@webaseui/svelte", - "version": "0.3.0", + "version": "0.3.1", "license": "MIT", "dependencies": { "@lucide/svelte": "^1.28.0", diff --git a/packages/webaseui-svelte/CHANGELOG.md b/packages/webaseui-svelte/CHANGELOG.md index 24e2e97..daa210c 100644 --- a/packages/webaseui-svelte/CHANGELOG.md +++ b/packages/webaseui-svelte/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.3.1 + +### Patch Changes + +- Declare the package side-effect free so bundlers can tree-shake unused components, styles, and icon code from package-root imports. + ## 0.3.0 ### Minor Changes diff --git a/packages/webaseui-svelte/package.json b/packages/webaseui-svelte/package.json index 31b7be4..59e63a8 100644 --- a/packages/webaseui-svelte/package.json +++ b/packages/webaseui-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@webaseui/svelte", - "version": "0.3.0", + "version": "0.3.1", "description": "Svelte 5 components for WeBaseUI.", "repository": { "type": "git", @@ -9,6 +9,7 @@ }, "homepage": "https://github.com/WeOpen/WeBaseUI#readme", "type": "module", + "sideEffects": false, "svelte": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { diff --git a/scripts/check-webaseui-packages.mjs b/scripts/check-webaseui-packages.mjs index 3131ba8..ddccaf4 100644 --- a/scripts/check-webaseui-packages.mjs +++ b/scripts/check-webaseui-packages.mjs @@ -92,6 +92,10 @@ invariant(tokenSource.includes('--webase-color-canvas'), 'core tokens must use t invariant(!tokenSource.includes(legacyTokenPrefix), 'legacy token namespace must not be published'); invariant(svelteManifest.exports['.'], '@webaseui/svelte must expose a package-root entry'); +invariant( + svelteManifest.sideEffects === false, + '@webaseui/svelte must declare sideEffects=false so root imports remain tree-shakeable' +); invariant(!svelteManifest.exports['./components/*'], 'component deep imports must stay private'); invariant(svelteFiles.has('dist/index.js'), '@webaseui/svelte tarball is missing dist/index.js'); invariant(svelteFiles.has('dist/index.d.ts'), '@webaseui/svelte tarball is missing dist/index.d.ts'); diff --git a/scripts/test-webaseui-consumer.mjs b/scripts/test-webaseui-consumer.mjs index 906552b..0939c37 100644 --- a/scripts/test-webaseui-consumer.mjs +++ b/scripts/test-webaseui-consumer.mjs @@ -1,4 +1,4 @@ -import { cpSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync } from 'node:fs'; +import { cpSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from 'node:fs'; import { spawnSync } from 'node:child_process'; import os from 'node:os'; import path from 'node:path'; @@ -32,6 +32,15 @@ function pack(workspace) { return path.join(packs, JSON.parse(output)[0].filename); } +function readBuildOutput(directory) { + return readdirSync(directory, { withFileTypes: true }) + .flatMap((entry) => { + const target = path.join(directory, entry.name); + return entry.isDirectory() ? [readBuildOutput(target)] : [readFileSync(target, 'utf8')]; + }) + .join('\n'); +} + try { mkdirSync(packs); cpSync(fixture, app, { recursive: true }); @@ -46,12 +55,20 @@ try { run('npm', ['install', '--ignore-scripts', '--no-audit', '--no-fund'], app); run('npm', ['run', 'build'], app); + const output = readBuildOutput(path.join(app, 'dist')); + if (output.includes('ds-select')) { + throw new Error('consumer bundle contains styles from the unused WeBaseSelect export'); + } + if (output.includes('Dialogs keep decisions close')) { + throw new Error('consumer bundle contains code from the unused WeBaseDialog export'); + } + const installedPackage = realpathSync(path.join(app, 'node_modules/@webaseui/svelte')); if (!installedPackage.startsWith(realpathSync(app))) { throw new Error(`consumer resolved a workspace link instead of its tarball: ${installedPackage}`); } - console.log('Validated WeBaseUI from packed tarballs in an isolated Svelte consumer build.'); + console.log('Validated tree-shakeable WeBaseUI tarballs in an isolated Svelte consumer build.'); } finally { rmSync(temporaryRoot, { recursive: true, force: true }); }