Skip to content

Commit 4b50e2b

Browse files
committed
feat(packaging): declare ESM and tidy package exports for native Node 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"; drop the redundant standalone "node" condition (for ESM-only packages it resolves identically to "import"); 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
1 parent 0cc8f0d commit 4b50e2b

12 files changed

Lines changed: 214 additions & 207 deletions

File tree

packages/adapters/package.json

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,54 +12,54 @@
1212
},
1313
"exports": {
1414
".": {
15-
"import": "./dist/esm/index.js",
16-
"types": "./dist/esm/index.d.ts"
15+
"types": "./dist/esm/index.d.ts",
16+
"import": "./dist/esm/index.js"
1717
},
1818
"./cornerstone": {
19-
"import": "./dist/esm/adapters/Cornerstone/index.js",
20-
"types": "./dist/esm/adapters/Cornerstone/index.d.ts"
19+
"types": "./dist/esm/adapters/Cornerstone/index.d.ts",
20+
"import": "./dist/esm/adapters/Cornerstone/index.js"
2121
},
2222
"./cornerstone/*": {
23-
"import": "./dist/esm/adapters/Cornerstone/*.js",
24-
"types": "./dist/esm/adapters/Cornerstone/*.d.ts"
23+
"types": "./dist/esm/adapters/Cornerstone/*.d.ts",
24+
"import": "./dist/esm/adapters/Cornerstone/*.js"
2525
},
2626
"./cornerstone3D": {
27-
"import": "./dist/esm/adapters/Cornerstone3D/index.js",
28-
"types": "./dist/esm/adapters/Cornerstone3D/index.d.ts"
27+
"types": "./dist/esm/adapters/Cornerstone3D/index.d.ts",
28+
"import": "./dist/esm/adapters/Cornerstone3D/index.js"
2929
},
3030
"./cornerstone3D/*": {
31-
"import": "./dist/esm/adapters/Cornerstone3D/*.js",
32-
"types": "./dist/esm/adapters/Cornerstone3D/*.d.ts"
31+
"types": "./dist/esm/adapters/Cornerstone3D/*.d.ts",
32+
"import": "./dist/esm/adapters/Cornerstone3D/*.js"
3333
},
3434
"./enums": {
35-
"import": "./dist/esm/adapters/enums/index.js",
36-
"types": "./dist/esm/adapters/enums/index.d.ts"
35+
"types": "./dist/esm/adapters/enums/index.d.ts",
36+
"import": "./dist/esm/adapters/enums/index.js"
3737
},
3838
"./enums/*": {
39-
"import": "./dist/esm/adapters/enums/*.js",
40-
"types": "./dist/esm/adapters/enums/*.d.ts"
39+
"types": "./dist/esm/adapters/enums/*.d.ts",
40+
"import": "./dist/esm/adapters/enums/*.js"
4141
},
4242
"./helpers": {
43-
"import": "./dist/esm/adapters/helpers/index.js",
44-
"types": "./dist/esm/adapters/helpers/index.d.ts"
43+
"types": "./dist/esm/adapters/helpers/index.d.ts",
44+
"import": "./dist/esm/adapters/helpers/index.js"
4545
},
4646
"./helpers/*": {
47-
"import": "./dist/esm/adapters/helpers/*.js",
48-
"types": "./dist/esm/adapters/helpers/*.d.ts"
47+
"types": "./dist/esm/adapters/helpers/*.d.ts",
48+
"import": "./dist/esm/adapters/helpers/*.js"
4949
},
5050
"./version": {
51-
"node": "./dist/esm/version.js",
52-
"import": "./dist/esm/version.js",
53-
"types": "./dist/esm/version.d.ts"
54-
}
51+
"types": "./dist/esm/version.d.ts",
52+
"import": "./dist/esm/version.js"
53+
},
54+
"./package.json": "./package.json"
5555
},
5656
"publishConfig": {
5757
"access": "public"
5858
},
5959
"scripts": {
6060
"test": "jest --testTimeout 60000",
61-
"build": "rollup -c rollup.config.mjs",
62-
"build:esm": "pnpm run prebuild && rollup -c rollup.config.mjs",
61+
"build": "rollup -c rollup.config.mjs && node ../../scripts/write-dist-esm-package-json.js ./",
62+
"build:esm": "pnpm run prebuild && rollup -c rollup.config.mjs && node ../../scripts/write-dist-esm-package-json.js ./",
6363
"build:esm:watch": "rollup --watch -c rollup.config.mjs",
6464
"clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist",
6565
"clean:deep": "pnpm run clean && shx rm -rf node_modules",

packages/adapters/rollup.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ export default [
3030
// ESM configuration
3131
{
3232
external: isExternal,
33-
input: pkg.src || 'src/index.ts',
33+
// version.ts is not reachable from index.ts, but the package exposes a
34+
// "./version" subpath export. With preserveModules, rollup only emits modules
35+
// in the graph, so list it as an explicit input to emit dist/esm/version.js.
36+
input: [pkg.src || 'src/index.ts', 'src/version.ts'],
3437
output: [
3538
{
3639
dir: 'dist/esm',

packages/ai/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
},
1313
"exports": {
1414
".": {
15-
"import": "./dist/esm/index.js",
16-
"types": "./dist/esm/index.d.ts"
15+
"types": "./dist/esm/index.d.ts",
16+
"import": "./dist/esm/index.js"
1717
},
1818
"./version": {
19-
"node": "./dist/esm/version.js",
20-
"import": "./dist/esm/version.js",
21-
"types": "./dist/esm/version.d.ts"
22-
}
19+
"types": "./dist/esm/version.d.ts",
20+
"import": "./dist/esm/version.js"
21+
},
22+
"./package.json": "./package.json"
2323
},
2424
"publishConfig": {
2525
"access": "public"
@@ -30,7 +30,7 @@
3030
"clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist",
3131
"clean:deep": "pnpm run clean && shx rm -rf node_modules",
3232
"build": "pnpm run build:esm",
33-
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json",
33+
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json && node ../../scripts/write-dist-esm-package-json.js ./",
3434
"build:esm:watch": "tsc --project ./tsconfig.json --watch",
3535
"dev": "tsc --project ./tsconfig.json --watch",
3636
"build:all": "pnpm run build:esm",

packages/core/package.json

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,49 +11,40 @@
1111
"sideEffects": false,
1212
"exports": {
1313
".": {
14-
"import": "./dist/esm/index.js",
15-
"node": "./dist/esm/index.js",
16-
"types": "./dist/esm/index.d.ts"
14+
"types": "./dist/esm/index.d.ts",
15+
"import": "./dist/esm/index.js"
1716
},
1817
"./utilities": {
19-
"import": "./dist/esm/utilities/index.js",
20-
"node": "./dist/esm/utilities/index.js",
21-
"types": "./dist/esm/utilities/index.d.ts"
18+
"types": "./dist/esm/utilities/index.d.ts",
19+
"import": "./dist/esm/utilities/index.js"
2220
},
2321
"./utilities/*": {
24-
"import": "./dist/esm/utilities/*.js",
25-
"node": "./dist/esm/utilities/*.js",
26-
"types": "./dist/esm/utilities/*.d.ts"
22+
"types": "./dist/esm/utilities/*.d.ts",
23+
"import": "./dist/esm/utilities/*.js"
2724
},
2825
"./constants": {
29-
"import": "./dist/esm/constants/index.js",
30-
"node": "./dist/esm/constants/index.js",
31-
"types": "./dist/esm/constants/index.d.ts"
26+
"types": "./dist/esm/constants/index.d.ts",
27+
"import": "./dist/esm/constants/index.js"
3228
},
3329
"./constants/*": {
34-
"import": "./dist/esm/constants/*.js",
35-
"node": "./dist/esm/constants/*.js",
36-
"types": "./dist/esm/constants/*.d.ts"
30+
"types": "./dist/esm/constants/*.d.ts",
31+
"import": "./dist/esm/constants/*.js"
3732
},
3833
"./enums": {
39-
"import": "./dist/esm/enums/index.js",
40-
"node": "./dist/esm/enums/index.js",
41-
"types": "./dist/esm/enums/index.d.ts"
34+
"types": "./dist/esm/enums/index.d.ts",
35+
"import": "./dist/esm/enums/index.js"
4236
},
4337
"./enums/*": {
44-
"import": "./dist/esm/enums/*.js",
45-
"node": "./dist/esm/enums/*.js",
46-
"types": "./dist/esm/enums/*.d.ts"
38+
"types": "./dist/esm/enums/*.d.ts",
39+
"import": "./dist/esm/enums/*.js"
4740
},
4841
"./loaders": {
49-
"import": "./dist/esm/loaders/index.js",
50-
"node": "./dist/esm/loaders/index.js",
51-
"types": "./dist/esm/loaders/index.d.ts"
42+
"types": "./dist/esm/loaders/index.d.ts",
43+
"import": "./dist/esm/loaders/index.js"
5244
},
5345
"./loaders/*": {
54-
"import": "./dist/esm/loaders/*.js",
55-
"node": "./dist/esm/loaders/*.js",
56-
"types": "./dist/esm/loaders/*.d.ts"
46+
"types": "./dist/esm/loaders/*.d.ts",
47+
"import": "./dist/esm/loaders/*.js"
5748
},
5849
"./types": {
5950
"types": "./dist/esm/types/index.d.ts"
@@ -62,17 +53,17 @@
6253
"types": "./dist/esm/types/*.d.ts"
6354
},
6455
"./version": {
65-
"import": "./dist/esm/version.js",
66-
"node": "./dist/esm/version.js",
67-
"types": "./dist/esm/version.d.ts"
68-
}
56+
"types": "./dist/esm/version.d.ts",
57+
"import": "./dist/esm/version.js"
58+
},
59+
"./package.json": "./package.json"
6960
},
7061
"publishConfig": {
7162
"access": "public"
7263
},
7364
"scripts": {
7465
"prebuild": "node ../../scripts/generate-version.js ./",
75-
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json",
66+
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json && node ../../scripts/write-dist-esm-package-json.js ./",
7667
"build:esm:watch": "tsc --project ./tsconfig.json --watch",
7768
"clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist",
7869
"clean:deep": "pnpm run clean && shx rm -rf node_modules",

packages/dicomImageLoader/package.json

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,48 +26,49 @@
2626
},
2727
"exports": {
2828
".": {
29-
"import": "./dist/esm/index.js",
30-
"types": "./dist/esm/index.d.ts"
29+
"types": "./dist/esm/index.d.ts",
30+
"import": "./dist/esm/index.js"
3131
},
3232
"./constants": {
33-
"import": "./dist/esm/constants/index.js",
34-
"types": "./dist/esm/constants/index.d.ts"
33+
"types": "./dist/esm/constants/index.d.ts",
34+
"import": "./dist/esm/constants/index.js"
3535
},
3636
"./constants/*": {
37-
"import": "./dist/esm/constants/*.js",
38-
"types": "./dist/esm/constants/*.d.ts"
37+
"types": "./dist/esm/constants/*.d.ts",
38+
"import": "./dist/esm/constants/*.js"
3939
},
4040
"./imageLoader": {
41-
"import": "./dist/esm/imageLoader/index.js",
42-
"types": "./dist/esm/imageLoader/index.d.ts"
41+
"types": "./dist/esm/imageLoader/index.d.ts",
42+
"import": "./dist/esm/imageLoader/index.js"
4343
},
4444
"./wadors": {
45-
"import": "./dist/esm/imageLoader/wadors/index.js",
46-
"types": "./dist/esm/imageLoader/wadors/index.d.ts"
45+
"types": "./dist/esm/imageLoader/wadors/index.d.ts",
46+
"import": "./dist/esm/imageLoader/wadors/index.js"
4747
},
4848
"./wadors/*": {
49-
"import": "./dist/esm/imageLoader/wadors/*.js",
50-
"types": "./dist/esm/imageLoader/wadors/*.d.ts"
49+
"types": "./dist/esm/imageLoader/wadors/*.d.ts",
50+
"import": "./dist/esm/imageLoader/wadors/*.js"
5151
},
5252
"./wadouri": {
53-
"import": "./dist/esm/imageLoader/wadouri/index.js",
54-
"types": "./dist/esm/imageLoader/wadouri/index.d.ts"
53+
"types": "./dist/esm/imageLoader/wadouri/index.d.ts",
54+
"import": "./dist/esm/imageLoader/wadouri/index.js"
5555
},
5656
"./wadouri/*": {
57-
"import": "./dist/esm/imageLoader/wadouri/*.js",
58-
"types": "./dist/esm/imageLoader/wadouri/*.d.ts"
57+
"types": "./dist/esm/imageLoader/wadouri/*.d.ts",
58+
"import": "./dist/esm/imageLoader/wadouri/*.js"
5959
},
6060
"./types": {
6161
"types": "./dist/esm/types/index.d.ts"
6262
},
6363
"./types/*": {
6464
"types": "./dist/esm/types/*.d.ts"
65-
}
65+
},
66+
"./package.json": "./package.json"
6667
},
6768
"scripts": {
6869
"build:loader": "pnpm run build:all && pnpm run copy-dts",
6970
"build": "pnpm run build:esm",
70-
"build:esm": "tsc --project ./tsconfig.json",
71+
"build:esm": "tsc --project ./tsconfig.json && node ../../scripts/write-dist-esm-package-json.js ./",
7172
"build:esm:watch": "tsc --project ./tsconfig.json --watch",
7273
"build:umd:dynamic": "cross-env NODE_ENV=production webpack --config .webpack/webpack-dynamic-import.js",
7374
"build:umd:bundle": "cross-env NODE_ENV=production webpack --config .webpack/webpack-bundle.js",

packages/labelmap-interpolation/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
},
1313
"exports": {
1414
".": {
15-
"import": "./dist/esm/index.js",
16-
"types": "./dist/esm/index.d.ts"
15+
"types": "./dist/esm/index.d.ts",
16+
"import": "./dist/esm/index.js"
1717
},
1818
"./version": {
19-
"node": "./dist/esm/version.js",
20-
"import": "./dist/esm/version.js",
21-
"types": "./dist/esm/version.d.ts"
22-
}
19+
"types": "./dist/esm/version.d.ts",
20+
"import": "./dist/esm/version.js"
21+
},
22+
"./package.json": "./package.json"
2323
},
2424
"publishConfig": {
2525
"access": "public"
@@ -30,7 +30,7 @@
3030
"clean": "rimraf dist",
3131
"clean:deep": "pnpm run clean && shx rm -rf node_modules",
3232
"build": "pnpm run build:esm",
33-
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json",
33+
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json && node ../../scripts/write-dist-esm-package-json.js ./",
3434
"build:esm:watch": "tsc --project ./tsconfig.json --watch",
3535
"dev": "tsc --project ./tsconfig.json --watch",
3636
"build:all": "pnpm run build:esm",

packages/metadata/package.json

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,44 +11,36 @@
1111
"sideEffects": false,
1212
"exports": {
1313
".": {
14-
"import": "./dist/esm/index.js",
15-
"node": "./dist/esm/index.js",
16-
"types": "./dist/esm/index.d.ts"
14+
"types": "./dist/esm/index.d.ts",
15+
"import": "./dist/esm/index.js"
1716
},
1817
"./metaData": {
19-
"import": "./dist/esm/metaData.js",
20-
"node": "./dist/esm/metaData.js",
21-
"types": "./dist/esm/metaData.d.ts"
18+
"types": "./dist/esm/metaData.d.ts",
19+
"import": "./dist/esm/metaData.js"
2220
},
2321
"./enums": {
24-
"import": "./dist/esm/enums/index.js",
25-
"node": "./dist/esm/enums/index.js",
26-
"types": "./dist/esm/enums/index.d.ts"
22+
"types": "./dist/esm/enums/index.d.ts",
23+
"import": "./dist/esm/enums/index.js"
2724
},
2825
"./enums/*": {
29-
"import": "./dist/esm/enums/*.js",
30-
"node": "./dist/esm/enums/*.js",
31-
"types": "./dist/esm/enums/*.d.ts"
26+
"types": "./dist/esm/enums/*.d.ts",
27+
"import": "./dist/esm/enums/*.js"
3228
},
3329
"./utilities": {
34-
"import": "./dist/esm/utilities/index.js",
35-
"node": "./dist/esm/utilities/index.js",
36-
"types": "./dist/esm/utilities/index.d.ts"
30+
"types": "./dist/esm/utilities/index.d.ts",
31+
"import": "./dist/esm/utilities/index.js"
3732
},
3833
"./utilities/dicomStream": {
39-
"import": "./dist/esm/utilities/dicomStream/index.js",
40-
"node": "./dist/esm/utilities/dicomStream/index.js",
41-
"types": "./dist/esm/utilities/dicomStream/index.d.ts"
34+
"types": "./dist/esm/utilities/dicomStream/index.d.ts",
35+
"import": "./dist/esm/utilities/dicomStream/index.js"
4236
},
4337
"./utilities/metadataProvider": {
44-
"import": "./dist/esm/utilities/metadataProvider/index.js",
45-
"node": "./dist/esm/utilities/metadataProvider/index.js",
46-
"types": "./dist/esm/utilities/metadataProvider/index.d.ts"
38+
"types": "./dist/esm/utilities/metadataProvider/index.d.ts",
39+
"import": "./dist/esm/utilities/metadataProvider/index.js"
4740
},
4841
"./utilities/*": {
49-
"import": "./dist/esm/utilities/*.js",
50-
"node": "./dist/esm/utilities/*.js",
51-
"types": "./dist/esm/utilities/*.d.ts"
42+
"types": "./dist/esm/utilities/*.d.ts",
43+
"import": "./dist/esm/utilities/*.js"
5244
},
5345
"./types": {
5446
"types": "./dist/esm/types/index.d.ts"
@@ -57,17 +49,17 @@
5749
"types": "./dist/esm/types/*.d.ts"
5850
},
5951
"./version": {
60-
"import": "./dist/esm/version.js",
61-
"node": "./dist/esm/version.js",
62-
"types": "./dist/esm/version.d.ts"
63-
}
52+
"types": "./dist/esm/version.d.ts",
53+
"import": "./dist/esm/version.js"
54+
},
55+
"./package.json": "./package.json"
6456
},
6557
"publishConfig": {
6658
"access": "public"
6759
},
6860
"scripts": {
6961
"prebuild": "node ../../scripts/generate-version.js ./",
70-
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json",
62+
"build:esm": "pnpm run prebuild && tsc --project ./tsconfig.json && node ../../scripts/write-dist-esm-package-json.js ./",
7163
"build:esm:watch": "tsc --project ./tsconfig.json --watch",
7264
"clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist",
7365
"clean:deep": "pnpm run clean && shx rm -rf node_modules",

0 commit comments

Comments
 (0)