diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 00000000..3f4bd79d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,14 @@ +# Any Doc viewer releases + +Changesets manages the eight public `@baseblocks/anydoc-*` npm packages as one +fixed, lockstep release. The workspace is in the `alpha` prerelease channel, so +each accepted patch changeset advances the shared `0.1.0-alpha.N` version. + +- Run `pnpm changeset` in a feature branch and commit the generated Markdown file. +- Use a patch release type while the viewer platform remains in alpha. +- Use `pnpm changeset --empty` for changes that intentionally do not release packages. +- Open a `changeset-release/*` version PR with `pnpm version:viewers` when a release is ready. +- Publication remains gated by the verified `viewer-v*` tag workflow. + +The Rust, Node native, WASM, and Python `@firecrawl/anydoc` release family is +intentionally outside this Changesets workspace and keeps its existing release process. diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 00000000..2149b566 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@4.0.0/schema.json", + "changelog": false, + "commit": false, + "fixed": [ + [ + "@baseblocks/anydoc-contracts", + "@baseblocks/anydoc-spreadsheet-engine", + "@baseblocks/anydoc-spreadsheet-viewer", + "@baseblocks/anydoc-presentation-viewer", + "@baseblocks/anydoc-react-viewer", + "@baseblocks/anydoc-ingestion", + "@baseblocks/anydoc", + "@baseblocks/anydoc-convex" + ] + ], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "privatePackages": { + "version": false, + "tag": false + }, + "format": "auto", + "ignore": [] +} diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000..9a89b8a3 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,4 @@ +{ + "mode": "pre", + "tag": "alpha" +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b7eed82..da9891c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 + with: + fetch-depth: 0 + persist-credentials: false + - name: Expose the Changesets base branch + if: github.event_name == 'pull_request' + run: git branch --force main origin/main - uses: pnpm/action-setup@v4 with: version: 11.9.0 @@ -27,6 +33,10 @@ jobs: node-version: 24 cache: pnpm - run: pnpm install --frozen-lockfile + - run: pnpm run release:metadata + - name: Require release intent for changed viewer packages + if: github.event_name != 'pull_request' || !startsWith(github.head_ref, 'changeset-release/') + run: pnpm run release:status # Build workspace packages first so umbrella subpath declarations resolve # exactly as they will for registry consumers. - run: pnpm run build:viewers diff --git a/.github/workflows/publish-viewers.yml b/.github/workflows/publish-viewers.yml index b50c4493..d1265382 100644 --- a/.github/workflows/publish-viewers.yml +++ b/.github/workflows/publish-viewers.yml @@ -28,6 +28,9 @@ jobs: node-version: 24 cache: pnpm - run: pnpm install --frozen-lockfile + - run: pnpm run release:metadata + - name: Confirm the tagged packages are publishable + run: pnpm run release:plan - run: pnpm run build:viewers - run: pnpm run typecheck:viewers - run: pnpm run test:viewers diff --git a/README.md b/README.md index da44ea8f..3fb4b589 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,9 @@ The BaseBlocks application façade exposes `ingest(...)`, the universal React viewer, and durable Convex ingestion. See [`packages/platform/README.md`](packages/platform/README.md) and the runtime-light [`packages/ingestion/README.md`](packages/ingestion/README.md). +The public viewer packages use Changesets v3 for lockstep alpha versioning; see +[`docs/VIEWER_PUBLISHING.md`](docs/VIEWER_PUBLISHING.md) for the contribution, +version-PR, and tag-gated publishing workflow. Built by [Firecrawl](https://firecrawl.dev) to turn any office document into LLM-ready Markdown in single-digit milliseconds, with one consistent output no matter which format goes in. It powers [Firecrawl Parse](https://firecrawl.dev/parse), so if you'd rather not run it yourself, the hosted API gives you the same conversion plus our OCR models for the scanned pages anydoc can't read on its own. diff --git a/docs/VIEWER_PUBLISHING.md b/docs/VIEWER_PUBLISHING.md new file mode 100644 index 00000000..93c1b236 --- /dev/null +++ b/docs/VIEWER_PUBLISHING.md @@ -0,0 +1,59 @@ +# Viewer package publishing + +The eight public `@baseblocks/anydoc-*` npm packages are versioned together with +Changesets v3. They remain independent from the Rust, native Node, WASM, and +Python `@firecrawl/anydoc` release family. + +## Day-to-day changes + +Add a patch changeset with every public viewer-package change: + +```sh +pnpm changeset +``` + +Commit the generated `.changeset/*.md` file with the implementation. Changes +that do not affect a published package can carry an explicit empty changeset: + +```sh +pnpm changeset --empty +``` + +CI runs `changeset status --since main` so a changed viewer package cannot be +merged without recorded release intent. Changesets keeps all eight packages in +one fixed group and updates their internal `workspace:` dependency ranges. + +## Version PR + +When a viewer release is ready, create a branch from `main`, apply the accumulated +changesets, and open a dedicated version PR: + +```sh +git switch -c changeset-release/viewers +pnpm version:viewers +git add . +git commit -m "Version Any Doc viewer packages" +``` + +The command consumes accumulated changesets and advances the shared alpha +version, for example from `0.1.0-alpha.13` to `0.1.0-alpha.14`. + +Review the package versions and dependency ranges before merging that PR. + +## Publish + +Publication remains an explicit, tag-gated operation so the existing build, +test, package, checksum, and registry-integrity checks stay authoritative: + +```sh +git tag viewer-v0.1.0-alpha.14 +git push origin viewer-v0.1.0-alpha.14 +``` + +The `Publish viewer platform` workflow verifies that every package manifest +matches the tag, uploads the exact verified tarballs, publishes only missing +packages, verifies any already-published artifacts, and creates the GitHub +release. Alpha versions publish under the npm `next` dist-tag. + +Do not use Changesets to version the `@firecrawl/anydoc` binding packages. Their +cross-language `v*` workflow and version gate remain separate. diff --git a/package.json b/package.json index 5ceb028f..ca832678 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,10 @@ "type": "module", "packageManager": "pnpm@11.9.0", "engines": { - "node": ">=20" + "node": ">=22.11.0" }, "scripts": { + "changeset": "changeset", "dev:playground": "pnpm --dir apps/playground dev", "build:viewers": "pnpm --recursive --if-present build", "test:viewers": "pnpm --recursive --if-present test", @@ -21,9 +22,15 @@ "budget:viewers": "node scripts/check-viewer-budgets.mjs", "budget:ingestion": "node scripts/benchmark-ingestion.mjs", "closure:server": "node scripts/verify-server-closure.mjs", - "closure:platform": "node scripts/verify-packed-platform.mjs" + "closure:platform": "node scripts/verify-packed-platform.mjs", + "release:metadata": "node scripts/validate-viewer-releases.mjs", + "release:status": "changeset status --since main", + "release:validate": "pnpm release:metadata && pnpm release:status", + "release:plan": "changeset publish-plan", + "version:viewers": "pnpm release:metadata && changeset version" }, "devDependencies": { + "@changesets/cli": "3.0.0", "typescript": "5.9.3", "vitest": "3.2.6" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65f9c250..c5461b22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,15 @@ importers: .: devDependencies: + '@changesets/cli': + specifier: 3.0.0 + version: 3.0.0 typescript: specifier: 5.9.3 version: 5.9.3 vitest: specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) apps/playground: dependencies: @@ -38,16 +41,16 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)) + version: 4.7.0(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0)) typescript: specifier: ^5.9.0 version: 5.9.3 vite: specifier: ^7.3.6 - version: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0) + version: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) vitest: specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) packages/contracts: {} @@ -65,13 +68,13 @@ importers: version: 1.43.0(react@19.2.3) tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.26)(typescript@5.9.3) + version: 8.5.1(postcss@8.5.26)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^3.2.6 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) packages/ingestion: dependencies: @@ -137,13 +140,13 @@ importers: version: 19.2.3(react@19.2.3) tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.26)(typescript@5.9.3) + version: 8.5.1(postcss@8.5.26)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.2 version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) packages/react-viewer: dependencies: @@ -210,22 +213,22 @@ importers: version: 19.2.3(@types/react@19.2.15) '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)) + version: 4.7.0(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0)) jsdom: specifier: ^26.1.0 version: 26.1.0 tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.26)(typescript@5.9.3) + version: 8.5.1(postcss@8.5.26)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.2 version: 5.9.3 vite: specifier: ^7.1.1 - version: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0) + version: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) vitest: specifier: ^3.2.4 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) packages/spreadsheet-engine: dependencies: @@ -247,7 +250,7 @@ importers: version: 5.9.3 vitest: specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) packages/spreadsheet-viewer: dependencies: @@ -278,7 +281,7 @@ importers: version: 5.9.3 vitest: specifier: 3.2.6 - version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0) + version: 3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0) packages: @@ -383,6 +386,75 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@8.0.0': + resolution: {integrity: sha512-kUd2pbf1w5/AYmBMb0Tt+rkIPCjFJdT0SZMrkOjJT/WV/QbtmvkyB5jkV0oaNPheavprZk+SfUiozUti7TIL2w==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/assemble-release-plan@7.0.0': + resolution: {integrity: sha512-oEW8BxdA604kGGtDSCiHr5w9Tv4UWe9I2k61IBNZzCOE1kbYaJj4v+lFQNgcEZFkUc2pV/+hASErGDvpJOZCTg==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/changelog-git@1.0.0': + resolution: {integrity: sha512-3Dst2Ime2Op5nd4XmWJLPIgp11ZFqJqSkVug9izK6TDcIV4YlhPS4ECbEVR+eGI0bk0r1ItogD4j2Oli87bJrA==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/cli@3.0.0': + resolution: {integrity: sha512-V7Gm+GP5OT3mJinMI2YcJD/JyO/a4WChnaMCCzTRhWHgu1zhtsyY7zCjP6n5W6zsgSjJKs+yPmvtREvE0F2g8A==} + engines: {node: ^22.11 || ^24 || >=26, npm: '>=10.9.0', pnpm: '>=10.0.0', yarn: '>=4.5.2'} + hasBin: true + + '@changesets/config@4.0.0': + resolution: {integrity: sha512-mw95/YrkOuhZZxfnVAA4bSXOFUi+KlhzOBTM8C4x777NhUU6HWIl9Z+K+nME+E4PVsv5NQVQwTfiHihAS1A/ow==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/errors@1.0.0': + resolution: {integrity: sha512-ElN/mEzn6zmETgjwf5MclCMa9ef59sAR0lfO8VSYIsiRvbC2FbLB/92EoYw10Sl0kGixxHFiJZUSv7dA+YpR8g==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/format@0.1.1': + resolution: {integrity: sha512-OBN/xfe+lcNWCv8P4Ogop9EOTi5QRKd1c2JJfZRBT9AT3AybzDYDfHeX4Y7j20Q4e16BPu3XvcdOe9sPZmTEig==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/get-dependents-graph@3.0.0': + resolution: {integrity: sha512-ji/t5wFA1zREKXRUePE6Qi+Qu2UgxCeSSGQrphezwvQZrp49B7sJ+8+wvM0tA7zPeSxYKCojDy3WWgrl+s+awg==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/git@4.0.0': + resolution: {integrity: sha512-uIEswpPUgzBBqrC0qg13byNaPorzhf05LE2T+gRizEKCXvMsJC6NPJp5iNDSV/gYj4Viqh09UiOF5E7XWeH5lQ==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/parse@1.0.0': + resolution: {integrity: sha512-P0iaMb9p9CRYZiTgAllEIF9AUMQHIy1G72tKlcIqJp61icZSsKQNiOPdxAMZG8m/DvZwt/oz5xEbTpike//dWg==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/pre@3.0.0': + resolution: {integrity: sha512-Zm/6YliV/a2oeWTqHJf6KxLrQwgcK1i/BRDl2m0EKZvbnxV5fG9QRhwJJGshjsZTUTS6dkfURQ2K6aAvgNw/3Q==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/read@1.0.0': + resolution: {integrity: sha512-8TdE2PwG6yArPt5Ozej83Z6iHz1G8BDBKvIEKZ455MccR4K3GNbLR2XqjBxa+5yLFnEd3xAOPXYboBg1pt8stQ==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/should-skip-package@1.0.0': + resolution: {integrity: sha512-pwqoJmbONn1XgXmZXPEExgAaT+HdZLjALFTDgIm+PnS5KeO2nLtzA2/Q+4aMFY14kFMuXKG30MObhvDzWgzDgg==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/types@7.0.0': + resolution: {integrity: sha512-c5GoiQyt3pxiXjrWSNoP8/GRf4kG+VnKzovx1OQM8dYYALlSwgedmkPmJ+ZqGxqwg9D3Bkj85Uo4KLd5BN3A0w==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/write@1.0.0': + resolution: {integrity: sha512-xCK3/4C7Z7muQB/wguE6HcbjtY9iOtaK9orZKE+7xi573cMGD8rLZz7qlo6IvK7s+SIUIKajzj1l+F1QuP97tw==} + engines: {node: ^22.11 || ^24 || >=26} + + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} + '@convex-dev/batch-worker@0.2.0': resolution: {integrity: sha512-dn0L/5jqufXHzgzAhWqjGBmDGXbwRA0S6YVV5Z66y4pMXZ+YL3M4aHCk9iBInPp5zOtEPgVbfo/BYMxhLxVP+w==} peerDependencies: @@ -961,6 +1033,18 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@manypkg/find-root@3.1.0': + resolution: {integrity: sha512-BcSqCyKhBVZ5YkSzOiheMCV41kqAFptW6xGqYSTjkVTl9XQpr+pqHhwgGCOHQtjDCv7Is6EFyA14Sm5GVbVABA==} + engines: {node: '>=20.0.0'} + + '@manypkg/get-packages@3.1.0': + resolution: {integrity: sha512-0TbBVyvPrP7xGYBI/cP8UP+yl/z+HtbTttAD7FMAJgn/kXOTwh5/60TsqP9ZYY710forNfyV0N8P/IE/ujGZJg==} + engines: {node: '>=20.0.0'} + + '@manypkg/tools@2.1.2': + resolution: {integrity: sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==} + engines: {node: '>=20.0.0'} + '@napi-rs/canvas-android-arm64@1.0.3': resolution: {integrity: sha512-7kSCdUhoXiO+AaIMXdBGdtp6EctZNkmF62Rea/BmVQlwKaM3bBhOzyGUzxyxz9dv5vdBfpyAaxhSRSJF4kqK4A==} engines: {node: '>= 10'} @@ -1043,6 +1127,10 @@ packages: os: [linux] libc: [glibc] + '@pnpm/deps.graph-sequencer@1100.0.1': + resolution: {integrity: sha512-pOr5+q1fLYKwFN3LAJuGZEnfXDcQ73zqgDHMtGy+K+uIoUqyY+6MeDCWFwfu+4EFuq76I5EPFofoNAI+Bmmq4A==} + engines: {node: '>=22.13'} + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -1371,6 +1459,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + caniuse-lite@1.0.30001806: resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} @@ -1564,6 +1656,15 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1636,6 +1737,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-id@4.2.0: + resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} + hasBin: true + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -1643,6 +1748,9 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -1675,6 +1783,9 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -1704,9 +1815,15 @@ packages: engines: {node: '>=6'} hasBin: true + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -1975,6 +2092,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -2137,12 +2257,24 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2200,6 +2332,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2449,6 +2585,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + zrender@6.1.0: resolution: {integrity: sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==} @@ -2588,6 +2729,122 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@changesets/apply-release-plan@8.0.0': + dependencies: + '@changesets/config': 4.0.0 + '@changesets/format': 0.1.1 + '@changesets/git': 4.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + import-meta-resolve: 4.2.0 + jsonc-parser: 3.3.1 + semver: 7.8.5 + + '@changesets/assemble-release-plan@7.0.0': + dependencies: + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + semver: 7.8.5 + + '@changesets/changelog-git@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + + '@changesets/cli@3.0.0': + dependencies: + '@changesets/apply-release-plan': 8.0.0 + '@changesets/assemble-release-plan': 7.0.0 + '@changesets/changelog-git': 1.0.0 + '@changesets/config': 4.0.0 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/git': 4.0.0 + '@changesets/pre': 3.0.0 + '@changesets/read': 1.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@changesets/write': 1.0.0 + '@clack/prompts': 1.7.0 + '@manypkg/get-packages': 3.1.0 + '@pnpm/deps.graph-sequencer': 1100.0.1 + cac: 7.0.0 + import-meta-resolve: 4.2.0 + launch-editor: 2.14.1 + package-manager-detector: 1.8.0 + semver: 7.8.5 + tinyexec: 1.3.0 + + '@changesets/config@4.0.0': + dependencies: + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.5 + + '@changesets/errors@1.0.0': {} + + '@changesets/format@0.1.1': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 + + '@changesets/get-dependents-graph@3.0.0': + dependencies: + '@changesets/types': 7.0.0 + semver: 7.8.5 + + '@changesets/git@4.0.0': + dependencies: + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.5 + tinyexec: 1.3.0 + + '@changesets/parse@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + yaml: 2.9.0 + + '@changesets/pre@3.0.0': + dependencies: + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + + '@changesets/read@1.0.0': + dependencies: + '@changesets/git': 4.0.0 + '@changesets/parse': 1.0.0 + '@changesets/types': 7.0.0 + + '@changesets/should-skip-package@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + + '@changesets/types@7.0.0': {} + + '@changesets/write@1.0.0': + dependencies: + '@changesets/format': 0.1.1 + '@changesets/types': 7.0.0 + human-id: 4.2.0 + + '@clack/core@1.4.3': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.7.0': + dependencies: + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + '@convex-dev/batch-worker@0.2.0(convex@1.43.0(react@19.2.3))(react@19.2.3)': dependencies: convex: 1.43.0(react@19.2.3) @@ -2908,6 +3165,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@manypkg/find-root@3.1.0': + dependencies: + '@manypkg/tools': 2.1.2 + + '@manypkg/get-packages@3.1.0': + dependencies: + '@manypkg/find-root': 3.1.0 + '@manypkg/tools': 2.1.2 + + '@manypkg/tools@2.1.2': + dependencies: + jju: 1.4.0 + tinyglobby: 0.2.17 + yaml: 2.9.0 + '@napi-rs/canvas-android-arm64@1.0.3': optional: true @@ -2959,6 +3231,8 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@pnpm/deps.graph-sequencer@1100.0.1': {} + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/rollup-android-arm-eabi@4.62.4': @@ -3142,7 +3416,7 @@ snapshots: '@ungap/structured-clone@1.3.3': {} - '@vitejs/plugin-react@4.7.0(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0))': + '@vitejs/plugin-react@4.7.0(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) @@ -3150,7 +3424,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0) + vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -3162,13 +3436,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.6(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0))': + '@vitest/mocker@3.2.6(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0) + vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) '@vitest/pretty-format@3.2.6': dependencies: @@ -3239,6 +3513,8 @@ snapshots: cac@6.7.14: {} + cac@7.0.0: {} + caniuse-lite@1.0.30001806: {} ccount@2.0.1: {} @@ -3450,6 +3726,16 @@ snapshots: extend@3.0.2: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 @@ -3576,12 +3862,16 @@ snapshots: transitivePeerDependencies: - supports-color + human-id@4.2.0: {} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 immediate@3.0.6: {} + import-meta-resolve@4.2.0: {} + indent-string@4.0.0: {} inherits@2.0.4: {} @@ -3605,6 +3895,8 @@ snapshots: isarray@1.0.0: {} + jju@1.4.0: {} + joycon@3.1.1: {} js-tokens@4.0.0: {} @@ -3642,6 +3934,8 @@ snapshots: json5@2.2.3: {} + jsonc-parser@3.3.1: {} + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -3649,6 +3943,11 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.10.0 + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -4096,6 +4395,8 @@ snapshots: object-assign@4.1.1: {} + package-manager-detector@1.8.0: {} + pako@1.0.11: {} parse-entities@4.0.2: @@ -4132,11 +4433,12 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - postcss-load-config@6.0.1(postcss@8.5.26): + postcss-load-config@6.0.1(postcss@8.5.26)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: postcss: 8.5.26 + yaml: 2.9.0 postcss@8.5.26: dependencies: @@ -4309,10 +4611,16 @@ snapshots: semver@6.3.1: {} + semver@7.8.5: {} + setimmediate@1.0.5: {} + shell-quote@1.10.0: {} + siginfo@2.0.0: {} + sisteransi@1.0.5: {} + source-map-js@1.2.1: {} source-map@0.7.6: {} @@ -4372,6 +4680,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.3.0: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.5) @@ -4407,7 +4717,7 @@ snapshots: tslib@2.3.0: {} - tsup@8.5.1(postcss@8.5.26)(typescript@5.9.3): + tsup@8.5.1(postcss@8.5.26)(typescript@5.9.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 @@ -4418,7 +4728,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.26) + postcss-load-config: 6.0.1(postcss@8.5.26)(yaml@2.9.0) resolve-from: 5.0.0 rollup: 4.62.4 source-map: 0.7.6 @@ -4497,13 +4807,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@24.10.1)(lightningcss@1.33.0): + vite-node@3.2.4(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0) + vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -4518,7 +4828,7 @@ snapshots: - tsx - yaml - vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0): + vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0): dependencies: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.5) @@ -4530,12 +4840,13 @@ snapshots: '@types/node': 24.10.1 fsevents: 2.3.3 lightningcss: 1.33.0 + yaml: 2.9.0 - vitest@3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0): + vitest@3.2.6(@types/debug@4.1.13)(@types/node@24.10.1)(jsdom@26.1.0)(lightningcss@1.33.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)) + '@vitest/mocker': 3.2.6(vite@7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.7 '@vitest/runner': 3.2.6 '@vitest/snapshot': 3.2.6 @@ -4553,8 +4864,8 @@ snapshots: tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0) - vite-node: 3.2.4(@types/node@24.10.1)(lightningcss@1.33.0) + vite: 7.3.6(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@24.10.1)(lightningcss@1.33.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 @@ -4608,6 +4919,8 @@ snapshots: yallist@3.1.1: {} + yaml@2.9.0: {} + zrender@6.1.0: dependencies: tslib: 2.3.0 diff --git a/scripts/validate-viewer-releases.mjs b/scripts/validate-viewer-releases.mjs new file mode 100644 index 00000000..6982897b --- /dev/null +++ b/scripts/validate-viewer-releases.mjs @@ -0,0 +1,105 @@ +import { readdirSync, readFileSync } from "node:fs"; +import { resolve } from "node:path"; + +const rootDir = resolve(import.meta.dirname, ".."); +const changesetDir = resolve(rootDir, ".changeset"); +const packageDirs = [ + "packages/contracts", + "packages/spreadsheet-engine", + "packages/spreadsheet-viewer", + "packages/presentation-viewer", + "packages/react-viewer", + "packages/ingestion", + "packages/platform", + "packages/convex", +]; + +const packages = packageDirs.map((dir) => ({ + dir, + manifest: JSON.parse( + readFileSync(resolve(rootDir, dir, "package.json"), "utf8"), + ), +})); +const packageNames = packages.map(({ manifest }) => manifest.name); +const violations = []; + +function comparePackageSets(actual, expected, label) { + const actualSet = new Set(actual); + const expectedSet = new Set(expected); + for (const name of expectedSet) { + if (!actualSet.has(name)) violations.push(`${label} is missing ${name}`); + } + for (const name of actualSet) { + if (!expectedSet.has(name)) + violations.push(`${label} contains unexpected package ${name}`); + } + if (actualSet.size !== actual.length) + violations.push(`${label} contains duplicate package names`); +} + +for (const { dir, manifest } of packages) { + if (manifest.private) violations.push(`${dir} must remain publishable`); + if (!String(manifest.name).startsWith("@baseblocks/anydoc")) { + violations.push( + `${dir} has unexpected package name ${String(manifest.name)}`, + ); + } +} + +const versions = new Set(packages.map(({ manifest }) => manifest.version)); +if (versions.size !== 1) { + violations.push( + `Viewer packages are not on one lockstep version: ${[...versions].join(", ")}`, + ); +} + +const config = JSON.parse( + readFileSync(resolve(changesetDir, "config.json"), "utf8"), +); +if (!Array.isArray(config.fixed) || config.fixed.length !== 1) { + violations.push("Changesets must define exactly one fixed package group"); +} else { + comparePackageSets(config.fixed[0], packageNames, "Changesets fixed group"); +} + +const preState = JSON.parse( + readFileSync(resolve(changesetDir, "pre.json"), "utf8"), +); +if (preState.mode !== "pre" || preState.tag !== "alpha") { + violations.push( + 'Viewer packages must remain in the Changesets "alpha" prerelease channel', + ); +} + +for (const file of readdirSync(changesetDir).filter( + (name) => name.endsWith(".md") && name !== "README.md", +)) { + const content = readFileSync(resolve(changesetDir, file), "utf8"); + const frontmatter = content.match(/^---\n([\s\S]*?)\n---/)?.[1]; + if (!frontmatter) { + violations.push(`${file}: missing valid changeset frontmatter`); + continue; + } + + for (const packageName of packageNames) { + const release = frontmatter.match( + new RegExp( + `["']${packageName.replace("/", "\\/")}["']:\\s*(patch|minor|major)`, + "i", + ), + ); + if (release && release[1].toLowerCase() !== "patch") { + violations.push( + `${file}: ${packageName} must use a patch release while in alpha`, + ); + } + } +} + +if (violations.length > 0) { + console.error("Any Doc viewer release metadata is invalid."); + for (const violation of violations) console.error(`- ${violation}`); + process.exit(1); +} + +console.log("Any Doc viewer release metadata check passed.");