ohif-viewer/publish-package.mjs
Bill Wallace 256b8347e7
fix(docs): remove stray tool-call tags breaking the MDX build (#6081)
This is a fix to pnpm deployment which needs testing as the final part of origin/master release
No functional changes

* fix(docs): remove stray tool-call tags breaking the MDX build

platform/docs/docs/migration-guide/3p12-to-3p13/build-tooling.md ended with
two orphan closing tags (leftover tool-call serialization artifacts):

  </content>
  </invoke>

Docusaurus compiles Markdown as MDX (JSX-aware), so the orphan closing tag
failed the docs build:

  MDX compilation failed ... Unexpected closing slash in tag, expected an
  open tag first (build-tooling.md line 402)

This was the remaining blocker for build-and-deploy-docs once the
--no-frozen-lockfile change let the install step succeed. A scan of the docs
tree found no other such artifacts. Verified locally: docusaurus build now
generates static files with no MDX errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Update lockfile and avoid freshness check on every command

* fix(release): keep workspace:* in the repo, concretize only at publish

The release flow rewrote internal @ohif/* dependency specifiers to the concrete
version and committed them, so pnpm-lock.yaml (which records workspace links)
drifted from the manifests on every version bump. The resulting
ERR_PNPM_OUTDATED_LOCKFILE broke every frozen install: Netlify (viewer-dev),
the docs deploy, pnpm's pre-run deps check, and post-merge installs.

Keep workspace:* everywhere in the committed repo and move the concrete-version
substitution to publish time only:

- publish-version.mjs: bump each package's own `version` field only; stop
  rewriting @ohif/* dependency/peerDependency specifiers.
- publish-package.mjs: publish with `pnpm publish --no-git-checks` instead of
  `npm publish`. pnpm rewrites workspace:* to the exact version in the published
  tarball; npm would publish the literal "workspace:*", which npm/yarn consumers
  cannot resolve.
- One-time: revert the 25 workspace manifests' @ohif/* specifiers to workspace:*
  (version fields untouched) and regenerate pnpm-lock.yaml to match.

Because internal deps are workspace:* (links, not versions in the lockfile),
version bumps no longer change pnpm-lock.yaml, so it stays in sync and frozen
installs keep working.

Verified: `pnpm install --frozen-lockfile` passes, and `pnpm pack` of @ohif/core
emits a tarball whose @ohif/ui dependency is the exact version (3.13.0-beta.92),
not workspace:*.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(ci): correct build-docs install comment for workspace:* release flow

publish-version.mjs no longer rewrites @ohif/* deps to concrete versions, so
the old comment was stale. Internal deps stay workspace:* and the lockfile
stays consistent; pnpm publish concretizes only the published tarball.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci(docs): use --frozen-lockfile now that the lockfile no longer drifts

With internal deps as workspace:* the lockfile stays in sync across version
bumps, so the docs deploy can install frozen -- failing fast on genuine
lockfile drift instead of silently reconciling. The --no-frozen-lockfile
workaround is no longer needed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci: use --frozen-lockfile in CI install steps now that the lockfile is stable

Internal @ohif/* deps are workspace:* so pnpm-lock.yaml no longer drifts; the
UNIT_TESTS/BUILD/NPM_PUBLISH installs can run frozen and fail fast on genuine
drift. Kept --no-frozen-lockfile only where it is still required: the Dockerfile
(platform/docs is excluded from the build context) and the playwright CS3D-version
step (mutates @cornerstonejs versions before installing).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: stability of seg load mpr test

* Better drag fix for crosshairs

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 11:59:04 -04:00

77 lines
2.6 KiB
JavaScript

import { execa } from 'execa';
import fs from 'fs/promises';
import glob from 'glob';
import path from 'path';
const MAX_RETRIES = 3;
const RETRY_DELAY = 10000; // 10 seconds
async function run() {
const { stdout: branchName } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD']);
const packages = ['extensions/*', 'platform/*', 'modes/*'];
const rootDir = process.cwd();
for (const packagePathPattern of packages) {
const matchingDirectories = glob.sync(packagePathPattern, { cwd: rootDir });
for (const packageDirectory of matchingDirectories) {
try {
// change back to the root directory
process.chdir(rootDir);
const packageJsonPath = path.join(packageDirectory, 'package.json');
const packageJsonContent = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
if (packageJsonContent.private) {
console.log(`Skipping private package at ${packageDirectory}`);
continue;
}
// move to package directory
process.chdir(packageDirectory);
let retries = 0;
while (retries < MAX_RETRIES) {
try {
console.log(`Tying to publishing package at ${packageDirectory}`);
// Use `pnpm publish` (not npm) so the workspace:* specifiers on our
// internal @ohif/* deps are rewritten to the exact version in the
// published tarball. npm would publish the literal "workspace:*",
// which npm/yarn consumers cannot resolve. --no-git-checks because
// the bump commit/tag is created in CI on a possibly-detached ref.
const publishArgs = ['publish', '--no-git-checks'];
if (branchName === 'master') {
publishArgs.push('--tag', 'beta');
}
await execa('pnpm', publishArgs);
console.log(`Successfully published package at ${packageDirectory}`);
break;
} catch (error) {
retries++;
console.error(
`Failed to publish package at ${packageDirectory} with error ${error}, retrying... (${retries}/${MAX_RETRIES})`
);
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));
}
}
} catch (error) {
console.error(`An error occurred while processing ${packageDirectory}: ${error}`);
} finally {
process.chdir(rootDir); // Ensure we always move back to the root directory
}
}
}
console.log('Finished');
}
run().catch(err => {
console.error('Error encountered during package publish:', err);
process.exit(1);
});