Skip to content

Commit 593ae18

Browse files
committed
add --preserve-extensions option
1 parent fa492f9 commit 593ae18

File tree

20 files changed

+299
-3
lines changed

20 files changed

+299
-3
lines changed

src/cli.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ const cli = cac("@atomico/exports").version("1.11.0");
1111

1212
cli.command("<...files>", "Build files")
1313
.option("--dist <dist>", "Destination directory")
14-
.option("--main <dist>", "Nain file")
14+
.option("--main <dist>", "Main file")
1515
.option("--watch", "watch mode")
1616
.option("--wrappers", "enable the wrapper generator")
17+
.option(
18+
"--preserve-extensions",
19+
"preserve file extensions in exports, for broader ESM compatibility"
20+
)
1721
.option("--ignore-types", "enable the wrapper generator")
1822
.option("--workspaces", "enable dependency merging")
1923
.option(
@@ -35,8 +39,10 @@ cli.command("<...files>", "Build files")
3539
* @param {string[]} src
3640
* @param {object} flags
3741
* @param {boolean} flags.watch
42+
* @param {string} flags.dist
3843
* @param {string} flags.main
39-
* @param {string} flags.wrappers
44+
* @param {boolean} flags.wrappers
45+
* @param {boolean} flags.preserveExtensions
4046
* @param {boolean} flags.tmp
4147
* @param {boolean} flags.workspaces
4248
* @param {boolean} flags.publish
@@ -49,6 +55,7 @@ cli.command("<...files>", "Build files")
4955
{
5056
watch,
5157
main = "index",
58+
preserveExtensions,
5259
wrappers,
5360
dist,
5461
tmp,
@@ -66,6 +73,7 @@ cli.command("<...files>", "Build files")
6673
src,
6774
main,
6875
wrappers,
76+
preserveExtensions,
6977
dist,
7078
pkg: {
7179
src: tmp

src/create-exports.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { cleanPath, getModules, isJs, isTsDeclaration } from "./utils.js";
88
* @param {Pkg} options.pkg
99
* @param {string} [options.main]
1010
* @param {string} [options.dist]
11+
* @param {boolean} [options.preserveExtensions]
1112
* @param {boolean} [options.wrappers]
1213
* @param {boolean} [options.ignoreTypes]
1314
* @param {boolean} [options.centralizePackages]

src/merge-exports.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@ import glob from "fast-glob";
22
import { createExports } from "./create-exports.js";
33
import { createPublish } from "./create-publish.js";
44
import { getJsonFormat, logger, read, write } from "./utils.js";
5+
import { extname } from "path";
56

67
/**
78
* @param {object} options
89
* @param {string[]} options.src
910
* @param {string} options.main
1011
* @param {string} options.dist
12+
* @param {boolean} options.preserveExtensions
1113
* @param {boolean} options.wrappers
1214
* @param {boolean} options.workspaces
1315
* @param {boolean} [options.publish]
1416
* @param {boolean} [options.watch]
1517
* @param {boolean} [options.ignoreTypes]
1618
* @param {boolean} [options.centralizePackages]
1719
* @param {boolean} [options.centralizeWrappers]
18-
* @param {{src: string, snap: import("./create-exports").Pkg}} options.pkg
20+
* @param {{src: string, snap: string}} options.pkg
1921
*/
2022
export async function mergeExports(options) {
2123
logger(`getting files...`);
@@ -95,6 +97,7 @@ export async function mergeExports(options) {
9597
dist: options.dist,
9698
wrappers: options.wrappers,
9799
ignoreTypes: options.ignoreTypes,
100+
preserveExtensions: options.preserveExtensions,
98101
centralizePackages: options.centralizePackages,
99102
centralizeWrappers: options.centralizeWrappers,
100103
});
@@ -112,6 +115,30 @@ export async function mergeExports(options) {
112115
logger(`${result.wrappers.length} wrappers created`);
113116
}
114117

118+
if (options.preserveExtensions) {
119+
const mappedExports = {};
120+
const mappedTypes = {};
121+
122+
for (const key in result.pkg.exports) {
123+
const value = result.pkg.exports[key];
124+
const k =
125+
extname(value.default) === ".js" && key !== "."
126+
? `${key}.js`
127+
: key;
128+
129+
mappedExports[k] = value;
130+
}
131+
132+
for (const key in result.pkg.typesVersions["*"]) {
133+
mappedTypes[`${key}.js`] = result.pkg.typesVersions["*"][key];
134+
}
135+
136+
result.pkg.exports = mappedExports;
137+
result.pkg.typesVersions["*"] = mappedTypes;
138+
139+
logger(`extensions preserved`);
140+
}
141+
115142
if (options.pkg?.src) {
116143
logger(`${pkg.name} updating...`);
117144
const format = getJsonFormat(options.pkg?.snap);
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"name": "demo",
3+
"dependencies": {
4+
"atomico": "latest"
5+
},
6+
"peerDependencies": {
7+
"@atomico/react": "*",
8+
"@atomico/vue": "*"
9+
},
10+
"peerDependenciesMeta": {
11+
"@atomico/react": {
12+
"optional": true
13+
},
14+
"@atomico/vue": {
15+
"optional": true
16+
}
17+
},
18+
"main": "./tests/module/atomico.js",
19+
"module": "./tests/module/atomico.js",
20+
"types": "./tests/module/atomico.d.ts",
21+
"exports": {
22+
"./atomico.js": {
23+
"types": "./tests/module/atomico.d.ts",
24+
"default": "./tests/module/atomico.js"
25+
},
26+
"./components/a.js": {
27+
"default": "./tests/module/components/a/a.js"
28+
},
29+
"./components/b.js": {
30+
"default": "./tests/module/components/b/b.js"
31+
},
32+
"./components/c.js": {
33+
"types": "./tests/module/components/c/c.d.ts",
34+
"default": "./tests/module/components/c/c.js"
35+
},
36+
"./react.js": {
37+
"types": "./tests/extensions-dist/module/react.d.ts",
38+
"default": "./tests/extensions-dist/module/react.js"
39+
},
40+
"./preact.js": {
41+
"types": "./tests/extensions-dist/module/preact.d.ts",
42+
"default": "./tests/extensions-dist/module/preact.js"
43+
},
44+
"./vue.js": {
45+
"types": "./tests/extensions-dist/module/vue.d.ts",
46+
"default": "./tests/extensions-dist/module/vue.js"
47+
},
48+
".": {
49+
"types": "./tests/module/atomico.d.ts",
50+
"default": "./tests/module/atomico.js"
51+
},
52+
"./package.json": {
53+
"default": "./tests/module/package.json"
54+
}
55+
},
56+
"typesVersions": {
57+
"*": {
58+
"atomico.js": [
59+
"./tests/module/atomico.d.ts"
60+
],
61+
"components/c.js": [
62+
"./tests/module/components/c/c.d.ts"
63+
],
64+
"react.js": [
65+
"./tests/extensions-dist/module/react.d.ts"
66+
],
67+
"preact.js": [
68+
"./tests/extensions-dist/module/preact.d.ts"
69+
],
70+
"vue.js": [
71+
"./tests/extensions-dist/module/vue.d.ts"
72+
]
73+
}
74+
}
75+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { MyComponent as _MyComponent } from "demo";
2+
import { Component } from "@atomico/react/preact";
3+
export const MyComponent: Component<typeof _MyComponent>;
4+
declare namespace JSX {
5+
interface IntrinsicElements{
6+
"my-component": Component<typeof _MyComponent>;
7+
}
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"use client";
2+
import { MyComponent as _MyComponent } from "demo";
3+
import { auto } from "@atomico/react/preact";
4+
export const MyComponent = auto(_MyComponent);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { MyComponent as _MyComponent } from "demo";
2+
import { Component } from "@atomico/react";
3+
export const MyComponent: Component<typeof _MyComponent>;
4+
declare namespace JSX {
5+
interface IntrinsicElements{
6+
"my-component": Component<typeof _MyComponent>;
7+
}
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"use client";
2+
import { MyComponent as _MyComponent } from "demo";
3+
import { auto } from "@atomico/react";
4+
export const MyComponent = auto(_MyComponent);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { MyComponent as _MyComponent } from "demo";
2+
import { Component } from "@atomico/vue";
3+
export const MyComponent: Component<typeof _MyComponent>;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"use client";
2+
import { MyComponent as _MyComponent } from "demo";
3+
import { auto } from "@atomico/vue";
4+
export const MyComponent = auto(_MyComponent);

0 commit comments

Comments
 (0)