Skip to content

feat(packaging): native-Node-resolvable ESM (extensions, type:module, exports) + CI - #2773

Merged
sedghi merged 9 commits into
mainfrom
cornerstoneNodeCompat
Jul 4, 2026
Merged

feat(packaging): native-Node-resolvable ESM (extensions, type:module, exports) + CI#2773
sedghi merged 9 commits into
mainfrom
cornerstoneNodeCompat

Conversation

@sedghi

@sedghi sedghi commented Jun 26, 2026

Copy link
Copy Markdown
Member

Summary

The published @cornerstonejs/* packages emit ESM into dist/esm/** but didn't fully declare it: no type:module, slightly inconsistent exports, and extensionless relative imports. Bundlers (webpack/Vite/Next — OHIF and most viewers) tolerate all of this, but a consumer loading the files on a native Node code path (SSR, server, Node test runners, packaging linters) cannot resolve them — Node 22–24 limp along via syntax detection, Node ≥25 hard-fails at link time, and publint/@arethetypeswrong flag FILE_INVALID_FORMAT. Reported in #2763.

This PR makes the published packages correct and self-describing for both bundlers and native Node, and adds CI so it can't regress. It is non-breaking (the files were already ESM; this makes Node classify and resolve them correctly) and applies to every published package: core, tools, dicom-image-loader, nifti-volume-loader, polymorphic-segmentation, ai, labelmap-interpolation, adapters, metadata, utils.

Changes

Packaging metadata

  • Declare ESM via a scoped dist/esm/package.json = {"type":"module"} (postbuild step), so Node treats the output as ESM without forcing ESM onto each package's root-level CommonJS config files (.webpack/*.js, babel.config.js, karma.conf.js).
  • Tidy every exports map: types first, then import/default; drop the redundant standalone node condition; add "./package.json": "./package.json".
  • Fix a latent broken export in adapters: Rollup preserveModules never emitted version.js (not reachable from the entry) though exports["./version"] pointed at it — src/version.ts is now an explicit Rollup input.

Real extensions (native-Node resolution)

  • Run tsc-alias --resolve-full-paths after tsc (and after rollup for adapters) so emitted relative imports in both .js and .d.ts carry explicit .js extensions (directory imports → /index.js). Source stays extensionless — this is a dist-only post-build rewrite, not a source codemod.
  • The dicom-image-loader decode worker (new Worker(new URL('./decodeImageFrameWorker.js', import.meta.url))) and the codec new URL(..., import.meta.url) references are emitted verbatim, and the worker file ships as a real sibling, so consumer bundlers continue to handle them.

Tests + CI (so this can't regress)

Validation

publint is clean and attw reports node16 (from ESM): 🟢 for all 10 packages; the full validator passes for all 10 from a clean rm dist → build → validate.

Notes for release

  • Non-breaking → minor. No public API or exports surface change; bundler consumers resolve identically. Lands as a feat: (semantic-release cuts the minor).
  • TypeScript moduleResolution caveat: types now use .js-extensioned ESM imports. Consumers on the legacy moduleResolution: "node" (node10) — which can't map a .js specifier to its .d.ts and ignores exports — may see some deep types resolve as any; switch to "bundler", "node16", or "nodenext". Type-only, no runtime impact. Documented in migration-guides/5x.
  • The large pnpm-lock.yaml diff is mostly a pnpm 11.5.2 reserialization of the previously stale-format lockfile (no dependency version changes) plus the three new dev dependencies (tsc-alias, publint, @arethetypeswrong/cli).

Out of scope (separate follow-ups)

Removing the orphan UMD bundles (a breaking change → the eventual major), lazy-loading vtk.js, and DOM-access guards so the heavy package entries (core/tools) also execute in DOM-less Node. Native-Node WASM decode in dicom-image-loader additionally needs a small source change (bare-specifier new URLimport.meta.resolve) and is independent of this packaging work.

Refs #2763

Summary by CodeRabbit

  • New Features
    • ESM builds now write a dist/esm/package.json marker (type: "module"), and multiple packages expose ./package.json publicly.
    • Public ESM entry points now consistently include default alongside import and type definitions.
  • Bug Fixes
    • Improved ./version subpath ESM resolution by adjusting ESM build outputs and export conditions.
  • Tests / CI
    • Added a “Validate ESM Packaging” workflow and a validate:packaging script to verify ESM correctness.
  • Chores
    • Reduced Playwright PR concurrency (3 → 2).

@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds ESM packaging validation tooling, updates package exports and build scripts across multiple packages, adds a dist/esm package.json writer, and lowers Playwright matrix concurrency.

Changes

ESM packaging updates

Layer / File(s) Summary
Dist esm package.json writer
scripts/write-dist-esm-package-json.js
Writes dist/esm/package.json with type: module after checking that the target directory exists.
Packaging validation tooling
package.json, .github/workflows/validate-packaging.yml, scripts/validate-esm-packaging.mjs
Adds a validation script, dependencies, workflow, and checks for ESM markers, emitted imports, asset targets, publint, attw, and native Node import.
Adapters version entrypoint
packages/adapters/rollup.config.mjs, packages/adapters/package.json
Adds src/version.ts to the ESM build, removes the node export condition from ./version, and runs the ESM package JSON writer after build steps.
Workspace package exports and build scripts
packages/ai/package.json, packages/core/package.json, packages/dicomImageLoader/package.json, packages/labelmap-interpolation/package.json, packages/metadata/package.json, packages/nifti-volume-loader/package.json, packages/polymorphic-segmentation/package.json, packages/tools/package.json, packages/utils/package.json
Updates package exports to use ESM import/types entries, adds ./package.json exports, and appends the ESM package JSON writer to build:esm in the affected packages.
Migration guidance
packages/docs/docs/migration-guides/5x/1-migration-notes.md
Adds a migration note section for ESM packaging and TypeScript module resolution.

Playwright CI concurrency

Layer / File(s) Summary
Playwright max parallel
.github/workflows/playwright.yml
The Playwright matrix max-parallel value changes from 3 to 2.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related issues

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise, follows semantic-release format, and accurately summarizes the packaging and CI changes.
Description check ✅ Passed The description is detailed and covers context, changes, validation, and rollout notes, though it doesn't mirror the template headings exactly.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cornerstoneNodeCompat

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/core/package.json (1)

14-59: 🗄️ Data Integrity & Integration | 🟡 Minor

Confirm ESM-only exports are intentional (no require/default fallback).

The packages/core/package.json exports expose only types and import for all subpaths, with no require or default conditions and no dist/cjs build. Node will throw ERR_PACKAGE_PATH_NOT_EXPORTED for require('@cornerstonejs/core') or its subpaths. If this ESM-only migration is deliberate and CJS consumers will use dynamic import() or a bundler, this is correct. Otherwise, add require/default conditions pointing to CJS outputs and publish those artifacts to avoid breaking CommonJS users.

Relevant config excerpt
// packages/core/package.json (lines 12–59)
"exports": {
  ".": {
    "types": "./dist/esm/index.d.ts",
    "import": "./dist/esm/index.js"
  },
  "./utilities": {
    "types": "./dist/esm/utilities/index.d.ts",
    "import": "./dist/esm/utilities/index.js"
  },
  "./utilities/*": {
    "types": "./dist/esm/utilities/*.d.ts",
    "import": "./dist/esm/utilities/*.js"
  },
  "./constants": {
    "types": "./dist/esm/constants/index.d.ts",
    "import": "./dist/esm/constants/index.js"
  },
  "./constants/*": {
    "types": "./dist/esm/constants/*.d.ts",
    "import": "./dist/esm/constants/*.js"
  },
  "./enums": {
    "types": "./dist/esm/enums/index.d.ts",
    "import": "./dist/esm/enums/index.js"
  },
  "./enums/*": {
    "types": "./dist/esm/enums/*.d.ts",
    "import": "./dist/esm/enums/*.js"
  },
  "./loaders": {
    "types": "./dist/esm/loaders/index.d.ts",
    "import": "./dist/esm/loaders/index.js"
  },
  "./loaders/*": {
    "types": "./dist/esm/loaders/*.d.ts",
    "import": "./dist/esm/loaders/*.js"
  },
  "./types": {
    "types": "./dist/esm/types/index.d.ts"
  },
  "./types/*": {
    "types": "./dist/esm/types/*.d.ts"
  },
  "./version": {
    "types": "./dist/esm/version.d.ts",
    "import": "./dist/esm/version.js"
  },
  "./package.json": "./package.json"
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/package.json` around lines 14 - 59, The package exports in
package.json are ESM-only, so confirm this is intentional and acceptable for
consumers of the main entry and subpaths. Review the export map for ".",
"./utilities", "./constants", "./enums", "./loaders", "./types", and "./version"
and either document that `@cornerstonejs/core` must be consumed via import/dynamic
import only, or add require/default conditions plus the corresponding CJS build
outputs if CommonJS support is still needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/adapters/package.json`:
- Around line 15-55: The package exports are ESM-only because the exports map in
package.json entries like "./cornerstone", "./cornerstone3D", "./enums",
"./helpers", and "./version" only provide types/import paths with no CommonJS
fallback. Confirm this is an intentional breaking change for consumers of the
adapters package; if CJS support is still required, update the exports map to
include a require condition (or default fallback) pointing to the CommonJS
build, otherwise keep it as-is and ensure the release notes/major version
reflect the removal of require() support.

---

Outside diff comments:
In `@packages/core/package.json`:
- Around line 14-59: The package exports in package.json are ESM-only, so
confirm this is intentional and acceptable for consumers of the main entry and
subpaths. Review the export map for ".", "./utilities", "./constants",
"./enums", "./loaders", "./types", and "./version" and either document that
`@cornerstonejs/core` must be consumed via import/dynamic import only, or add
require/default conditions plus the corresponding CJS build outputs if CommonJS
support is still needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c05e10cd-2342-4ac6-a115-b02fecba6737

📥 Commits

Reviewing files that changed from the base of the PR and between 0cc8f0d and 4b50e2b.

📒 Files selected for processing (12)
  • packages/adapters/package.json
  • packages/adapters/rollup.config.mjs
  • packages/ai/package.json
  • packages/core/package.json
  • packages/dicomImageLoader/package.json
  • packages/labelmap-interpolation/package.json
  • packages/metadata/package.json
  • packages/nifti-volume-loader/package.json
  • packages/polymorphic-segmentation/package.json
  • packages/tools/package.json
  • packages/utils/package.json
  • scripts/write-dist-esm-package-json.js

Comment thread packages/adapters/package.json
… resolution

The published packages emit ESM into dist/esm but never declare it, so Node
classifies the output as CommonJS. Node 22-24 tolerate this via syntax detection
(at a small perf cost), but Node >=25 hard-fails at link time, and publint /
@arethetypeswrong report FILE_INVALID_FORMAT. See #2763.

Make the packaging metadata correct and self-describing for every published
package (core, tools, dicom-image-loader, nifti-volume-loader,
polymorphic-segmentation, ai, labelmap-interpolation, adapters, metadata, utils):

- Emit a scoped dist/esm/package.json with {"type":"module"} as a postbuild step
  (scripts/write-dist-esm-package-json.js). This signals ESM for the published
  output without adding top-level "type":"module", which would force ESM
  semantics onto each package's root-level CommonJS config files (.webpack/*.js,
  babel.config.js, karma.conf.js).
- Rewrite every exports map: "types" first, then "import", then a "default"
  condition pointing at the same ESM file. The "default" replaces the uneven
  standalone "node" condition and keeps require(esm) resolving on Node >=22.12
  (an exports map with only "import" makes require() throw
  ERR_PACKAGE_PATH_NOT_EXPORTED), so this stays non-breaking. Also add
  "./package.json": "./package.json".
- adapters builds with rollup preserveModules from src/index.ts, so version.js
  was never emitted (nothing imports it) even though exports["./version"] points
  at it. Add src/version.ts as an explicit rollup input so the file is emitted.

This is the non-breaking packaging-metadata step. Rewriting the still-extensionless
relative import specifiers to explicit .js extensions (by moving the library build
onto a bundler) is the follow-up needed for a full native-Node import() of the
package entry points.

Refs #2763
@sedghi
sedghi force-pushed the cornerstoneNodeCompat branch from 4b50e2b to 3693c53 Compare June 26, 2026 15:59

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/dicomImageLoader/package.json`:
- Around line 29-75: The package exports are now ESM-only in the package.json
exports map, so this is a breaking change for CommonJS consumers. Make sure the
package metadata and release notes explicitly document that require() is no
longer supported, and confirm the exports entries such as "./imageLoader",
"./wadors", and "./wadouri" intentionally resolve only to the ESM dist paths
with no require condition or CJS fallback.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 257818ea-3e9e-441d-ad35-367a85b35eca

📥 Commits

Reviewing files that changed from the base of the PR and between 4b50e2b and 3693c53.

📒 Files selected for processing (12)
  • packages/adapters/package.json
  • packages/adapters/rollup.config.mjs
  • packages/ai/package.json
  • packages/core/package.json
  • packages/dicomImageLoader/package.json
  • packages/labelmap-interpolation/package.json
  • packages/metadata/package.json
  • packages/nifti-volume-loader/package.json
  • packages/polymorphic-segmentation/package.json
  • packages/tools/package.json
  • packages/utils/package.json
  • scripts/write-dist-esm-package-json.js
🚧 Files skipped from review as they are similar to previous changes (9)
  • packages/adapters/rollup.config.mjs
  • packages/ai/package.json
  • packages/labelmap-interpolation/package.json
  • packages/core/package.json
  • packages/utils/package.json
  • packages/adapters/package.json
  • packages/tools/package.json
  • packages/metadata/package.json
  • packages/polymorphic-segmentation/package.json

Comment thread packages/dicomImageLoader/package.json
sedghi added 2 commits June 26, 2026 13:18
…ner count

Only two runners carry the self-hosted label, so the matrix never ran more
than two legs concurrently anyway; max-parallel: 3 left the third leg queued
behind a slot that can never be filled. Align the declared limit with reality.
Phase B of the ESM packaging work (follows the type:module + exports cleanup).
The published packages emitted ESM with extensionless relative imports, which
bundlers tolerate but native Node ESM rejects (Node >=25 hard-fails). See #2763.

- Build: run `tsc-alias --resolve-full-paths` after tsc (and after rollup for
  adapters) so emitted .js AND .d.ts relative imports carry explicit .js
  extensions (directory imports -> /index.js). Source stays extensionless; this
  is a dist-only post-build rewrite, not a source codemod.
- Tests: add scripts/validate-esm-packaging.mjs (pnpm run validate:packaging).
  Per published package it checks the dist/esm type:module marker, that every
  relative import in .js/.d.ts resolves to a real file, that relative
  `new URL(...)` assets exist (e.g. the dicom-image-loader decode worker),
  publint (errors), attw (esm-only profile), and a native-Node leaf import.
- CI: add .github/workflows/validate-packaging.yml (PR + dispatch) that builds
  and validates on Node 24 and 25, so this cannot regress.
- Docs: note the native-Node ESM change and that legacy moduleResolution:node
  (node10) consumers should move to bundler/node16/nodenext.

Adds tsc-alias, publint and @arethetypeswrong/cli as dev dependencies; the large
pnpm-lock.yaml diff is mostly a pnpm 11.5.2 reserialization of the previously
stale-format lockfile (no dependency version changes).

Refs #2763
@sedghi sedghi changed the title feat(packaging): declare ESM and tidy package exports for native Node resolution feat(packaging): native-Node-resolvable ESM (extensions, type:module, exports) + CI Jun 26, 2026
Comment thread .github/workflows/validate-packaging.yml Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/validate-packaging.yml:
- Around line 14-16: Add an explicit least-privilege permissions block to the
validate-packaging job so it does not inherit the default broad GITHUB_TOKEN
scopes; in the validate-packaging workflow, update the job definition to set
only the minimal read-only permissions needed for checkout/build/validation. Use
the validate-packaging job as the anchor for the change and keep the permissions
scoped tightly since this workflow performs no write operations.
- Around line 22-29: Add `persist-credentials: false` to the Checkout code step
that uses actions/checkout@v6.0.3 in the validate-packaging workflow so the
GitHub token is not left in local git config; update the checkout action’s with
block in that job while leaving the pnpm/action-setup and actions/setup-node
steps unchanged.

In `@scripts/validate-esm-packaging.mjs`:
- Around line 32-51: The listPublishedPackages helper currently assumes every
lerna.json package entry is a literal directory, which could silently skip
packages if a glob pattern is introduced later. Update listPublishedPackages in
scripts/validate-esm-packaging.mjs to explicitly validate each lerna.packages
entry before iterating, and throw if any entry matches a glob pattern instead of
being a direct directory path. Keep the existing package discovery logic for
package.json and dist/esm, but make the glob guard part of the early validation
so future lerna.json format changes fail fast rather than reducing coverage.
- Around line 158-178: The `checkPublint` helper is importing `formatMessage`
from the wrong module path, so it stays unavailable and the formatted error
output never works. Update the `checkPublint` import logic to load
`formatMessage` from the `publint/utils` subpath while keeping the existing
fallback behavior, and leave the `publint` root import only for the main API
used to collect messages. Ensure the `formatMessage` reference in `checkPublint`
continues to be used for human-readable error strings before falling back to raw
codes/args.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6c6e34a0-1059-456f-90ef-b6d6302e5bb7

📥 Commits

Reviewing files that changed from the base of the PR and between a29e425 and 1fd1dfd.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (14)
  • .github/workflows/validate-packaging.yml
  • package.json
  • packages/adapters/package.json
  • packages/ai/package.json
  • packages/core/package.json
  • packages/dicomImageLoader/package.json
  • packages/docs/docs/migration-guides/5x/1-migration-notes.md
  • packages/labelmap-interpolation/package.json
  • packages/metadata/package.json
  • packages/nifti-volume-loader/package.json
  • packages/polymorphic-segmentation/package.json
  • packages/tools/package.json
  • packages/utils/package.json
  • scripts/validate-esm-packaging.mjs
✅ Files skipped from review due to trivial changes (1)
  • packages/docs/docs/migration-guides/5x/1-migration-notes.md
🚧 Files skipped from review as they are similar to previous changes (9)
  • packages/nifti-volume-loader/package.json
  • packages/core/package.json
  • packages/tools/package.json
  • packages/labelmap-interpolation/package.json
  • packages/ai/package.json
  • packages/utils/package.json
  • packages/polymorphic-segmentation/package.json
  • packages/metadata/package.json
  • packages/dicomImageLoader/package.json

Comment thread .github/workflows/validate-packaging.yml
Comment thread .github/workflows/validate-packaging.yml
Comment thread scripts/validate-esm-packaging.mjs
Comment thread scripts/validate-esm-packaging.mjs
# Conflicts:
#	pnpm-lock.yaml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
.github/workflows/playwright.yml (1)

19-19: 🧹 Nitpick | 🔵 Trivial

Reduced concurrency will slow overall Playwright CI runtime.

Dropping max-parallel from 3 to 2 forces one of the three matrix jobs (legacy/compatibility/next) to queue, increasing total pipeline duration. This is likely intentional to reduce load on the self-hosted nashua runner pool, but worth confirming that's the goal versus an oversight.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/playwright.yml at line 19, The Playwright workflow matrix
is throttled by reducing max-parallel, which increases CI runtime; review the
concurrency setting in the workflow job and either restore the previous level or
keep the lower limit only if reducing load on the self-hosted nashua runners is
intentional. Update the matrix configuration around max-parallel in the
Playwright workflow so it matches the desired balance between throughput and
runner capacity.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.github/workflows/playwright.yml:
- Line 19: The Playwright workflow matrix is throttled by reducing max-parallel,
which increases CI runtime; review the concurrency setting in the workflow job
and either restore the previous level or keep the lower limit only if reducing
load on the self-hosted nashua runners is intentional. Update the matrix
configuration around max-parallel in the Playwright workflow so it matches the
desired balance between throughput and runner capacity.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b15897a1-e798-4840-a6e8-eadc1d8f600c

📥 Commits

Reviewing files that changed from the base of the PR and between 1fd1dfd and 81f243d.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (11)
  • .github/workflows/playwright.yml
  • packages/adapters/package.json
  • packages/ai/package.json
  • packages/core/package.json
  • packages/dicomImageLoader/package.json
  • packages/labelmap-interpolation/package.json
  • packages/metadata/package.json
  • packages/nifti-volume-loader/package.json
  • packages/polymorphic-segmentation/package.json
  • packages/tools/package.json
  • packages/utils/package.json
🚧 Files skipped from review as they are similar to previous changes (10)
  • packages/ai/package.json
  • packages/labelmap-interpolation/package.json
  • packages/nifti-volume-loader/package.json
  • packages/dicomImageLoader/package.json
  • packages/tools/package.json
  • packages/polymorphic-segmentation/package.json
  • packages/core/package.json
  • packages/adapters/package.json
  • packages/utils/package.json
  • packages/metadata/package.json

Comment thread package.json Outdated
"webpack:watch": "pnpm -r --filter=!docs run webpack:watch"
},
"devDependencies": {
"@arethetypeswrong/cli": "^0.18.4",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

exact versioning please

Comment thread package.json Outdated
"postcss-loader": "7.3.4",
"postcss-preset-env": "8.5.1",
"prettier": "3.6.2",
"publint": "^0.3.21",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

exact versioning please

Comment thread package.json Outdated
"stylelint-config-recommended": "12.0.0",
"ts-loader": "9.5.1",
"ts-node": "10.9.2",
"tsc-alias": "^1.8.17",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you know...

Comment thread scripts/validate-esm-packaging.mjs Outdated
// from ever regressing. Run AFTER building (dist/esm must exist).
//
// Per package it checks:
// 1. ESM marker - dist/esm/package.json declares {"type":"module"}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indentation is off

@jbocce jbocce left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use exact versioning in the package.json files.

@cursor

cursor Bot commented Jul 3, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@cursor

cursor Bot commented Jul 3, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@sedghi
sedghi requested a review from jbocce July 3, 2026 23:56
// Absorb sub-pixel font drift on the "138 mm" label across CI
// environments; a missing/mis-drawn annotation differs by far more.
{ maxDiffPixelRatio: 0.003 }
{ maxDiffPixelRatio: 0.003, timeoutMs: 20000 }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am surprised you needed this. In general I have found that the timeout for visitExample needs to be increased for these types of tests. FYI.

@sedghi
sedghi merged commit 26d7234 into main Jul 4, 2026
17 checks passed
@sedghi
sedghi deleted the cornerstoneNodeCompat branch July 6, 2026 12:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants