From addb83b3a4cb0afac40744f6990571168ceda823 Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Tue, 28 Jul 2026 07:36:34 +1000 Subject: [PATCH 1/2] fix: export documented fixture and recorder modules --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 5b37877..6e1ff03 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ ".": "./src/index.js", "./web": "./src/web.js", "./fixtures": "./src/fixtures.js", + "./fixture-io": "./src/fixture-io.js", "./integrations": "./src/integrations.js", + "./recorder": "./src/recorder.js", "./tuning": "./src/tuning.js" }, "files": [ From b249a559568c46125cd20c190327e69572a08b11 Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Tue, 28 Jul 2026 07:37:08 +1000 Subject: [PATCH 2/2] test: verify documented imports from packed tarball --- package.json | 3 +- scripts/verify-documented-imports.mjs | 63 +++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 scripts/verify-documented-imports.mjs diff --git a/package.json b/package.json index 6e1ff03..972001b 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "test": "node --test", "typecheck": "tsc --project tsconfig.json", "build": "node scripts/build.mjs", - "package:smoke": "node scripts/verify-package.mjs && npm pack --dry-run", + "package:imports": "node scripts/verify-documented-imports.mjs", + "package:smoke": "node scripts/verify-package.mjs && npm run package:imports && npm pack --dry-run", "release:check": "npm run check && npm test && npm run typecheck && npm run build && npm run smoke && npm run package:smoke", "smoke": "node test/fixtures.test.js", "lint": "npm run check" diff --git a/scripts/verify-documented-imports.mjs b/scripts/verify-documented-imports.mjs new file mode 100644 index 0000000..30307ef --- /dev/null +++ b/scripts/verify-documented-imports.mjs @@ -0,0 +1,63 @@ +import { execFileSync } from 'node:child_process'; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; + +const projectRoot = new URL('..', import.meta.url); +const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')); +const apiDocs = readFileSync(new URL('../docs/API.md', import.meta.url), 'utf8'); +const documentedImports = [ + ...new Set( + [...apiDocs.matchAll(/\bfrom\s+['"](@bargekit\/core(?:\/[^'"]+)?)['"]/g)] + .map((match) => match[1]) + ) +]; + +if (documentedImports.length === 0) { + throw new Error('docs/API.md does not contain any @bargekit/core imports'); +} + +const consumerDir = mkdtempSync(join(tmpdir(), 'bargekit-package-consumer-')); + +try { + const packResult = JSON.parse(execFileSync( + 'npm', + ['pack', '--json', '--pack-destination', consumerDir], + { cwd: projectRoot, encoding: 'utf8' } + )); + const packed = packResult[0]; + const packedPaths = new Set(packed.files.map((file) => file.path)); + + for (const specifier of documentedImports) { + const subpath = specifier.slice(packageJson.name.length) || '.'; + const exportKey = subpath === '.' ? '.' : `.${subpath}`; + const target = packageJson.exports?.[exportKey]; + + if (!target) { + throw new Error(`${specifier} is documented but missing from package.json exports`); + } + if (!packedPaths.has(target.replace(/^\.\//, ''))) { + throw new Error(`${specifier} targets ${target}, which is missing from the packed tarball`); + } + } + + const tarballPath = join(consumerDir, packed.filename); + writeFileSync( + join(consumerDir, 'package.json'), + JSON.stringify({ private: true, type: 'module' }) + ); + execFileSync( + 'npm', + ['install', '--ignore-scripts', '--no-audit', '--no-fund', tarballPath], + { cwd: consumerDir, stdio: 'inherit' } + ); + writeFileSync( + join(consumerDir, 'verify.mjs'), + `await Promise.all(${JSON.stringify(documentedImports)}.map((specifier) => import(specifier)));\n` + ); + execFileSync('node', ['verify.mjs'], { cwd: consumerDir, stdio: 'inherit' }); + + console.log(`verified documented imports from packed tarball: ${documentedImports.join(', ')}`); +} finally { + rmSync(consumerDir, { recursive: true, force: true }); +}