From 77f8711dfa2f79b0f97256a46b1444dcc26af30d Mon Sep 17 00:00:00 2001 From: Michael Kantor <6068672+kantorcodes@users.noreply.github.com> Date: Fri, 10 Apr 2026 14:57:14 -0700 Subject: [PATCH] test: lock browser package export contract --- __tests__/package-exports.test.ts | 77 +++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 __tests__/package-exports.test.ts diff --git a/__tests__/package-exports.test.ts b/__tests__/package-exports.test.ts new file mode 100644 index 0000000..0624c82 --- /dev/null +++ b/__tests__/package-exports.test.ts @@ -0,0 +1,77 @@ +import { readFileSync, existsSync } from 'node:fs'; +import path from 'node:path'; + +type PackageExportTarget = + | string + | { + types?: string; + import?: string; + browser?: string | PackageExportTarget; + require?: string; + default?: string; + }; + +type PackageJsonShape = { + browser?: string; + exports?: Record; + scripts?: Record; +}; + +function readPackageJson(): PackageJsonShape { + const packagePath = path.resolve(process.cwd(), 'package.json'); + const raw = readFileSync(packagePath, 'utf8'); + return JSON.parse(raw) as PackageJsonShape; +} + +describe('published package contract', () => { + it('keeps browser entrypoints exported for consumers', () => { + const packageJson = readPackageJson(); + const rootExport = packageJson.exports?.['.']; + const browserExport = packageJson.exports?.['./browser']; + + expect(packageJson.browser).toBe( + './dist/browser-root/standards-sdk.root-browser.js', + ); + expect(rootExport).toEqual( + expect.objectContaining({ + browser: expect.objectContaining({ + types: './dist/browser-root/browser-root.d.ts', + default: './dist/browser-root/standards-sdk.root-browser.js', + }), + }), + ); + expect(browserExport).toEqual( + expect.objectContaining({ + types: './dist/browser/browser.d.ts', + import: './dist/browser/standards-sdk.browser.js', + browser: './dist/browser/standards-sdk.browser.js', + default: './dist/browser/standards-sdk.browser.js', + }), + ); + }); + + it('builds the browser bundles that back those exports', () => { + const packageJson = readPackageJson(); + + expect(packageJson.scripts).toEqual( + expect.objectContaining({ + 'build:browser-root': 'BUILD_FORMAT=browser-root vite build', + 'build:browser': 'BUILD_FORMAT=browser vite build', + }), + ); + expect(packageJson.scripts?.build).toContain('pnpm run build:browser-root'); + expect(packageJson.scripts?.build).toContain('pnpm run build:browser'); + expect(packageJson.scripts?.prepublishOnly).toContain( + 'pnpm run build:browser-root', + ); + expect(packageJson.scripts?.prepublishOnly).toContain( + 'pnpm run build:browser', + ); + }); + + it('retains the browser-root source entry used by the root browser export', () => { + const browserRootPath = path.resolve(process.cwd(), 'src/browser-root.ts'); + + expect(existsSync(browserRootPath)).toBe(true); + }); +});