Skip to content

Commit

Permalink
fix: Improve handling of default for package exports. (#127)
Browse files Browse the repository at this point in the history
* Add default.

* Fix tests.

* Fix tests.

* Run build.
  • Loading branch information
milesj authored May 19, 2022
1 parent 04ee133 commit 08f5995
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 32 deletions.
6 changes: 4 additions & 2 deletions packages/babel-plugin-cjs-esm-interop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,13 @@
"./package.json": "./package.json",
"./*": {
"types": "./dts/*.d.ts",
"node": "./lib/*.js"
"node": "./lib/*.js",
"default": "./lib/*.js"
},
".": {
"types": "./dts/index.d.ts",
"node": "./lib/index.js"
"node": "./lib/index.js",
"default": "./lib/index.js"
}
}
}
6 changes: 4 additions & 2 deletions packages/babel-plugin-conditional-invariant/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@
"./package.json": "./package.json",
"./*": {
"types": "./dts/*.d.ts",
"node": "./lib/*.js"
"node": "./lib/*.js",
"default": "./lib/*.js"
},
".": {
"types": "./dts/index.d.ts",
"node": "./lib/index.js"
"node": "./lib/index.js",
"default": "./lib/index.js"
}
}
}
6 changes: 4 additions & 2 deletions packages/babel-plugin-env-constants/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@
"./package.json": "./package.json",
"./*": {
"types": "./dts/*.d.ts",
"node": "./lib/*.js"
"node": "./lib/*.js",
"default": "./lib/*.js"
},
".": {
"types": "./dts/index.d.ts",
"node": "./lib/index.js"
"node": "./lib/index.js",
"default": "./lib/index.js"
}
}
}
16 changes: 12 additions & 4 deletions packages/packemon/src/CodeArtifact.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ export class CodeArtifact extends Artifact<CodeBuild> {

protected mapPackageExportsFromBuilds(outputName: string, exportMap: PackageExports) {
const paths: PackageExportPaths = {};
let defaultEntry = '';

this.builds.forEach(({ format }) => {
const entry = this.findEntryPoint([format], outputName);
Expand All @@ -226,18 +227,25 @@ export class CodeArtifact extends Artifact<CodeBuild> {
break;

case 'lib':
paths.default = entry;
defaultEntry = entry;
break;

default:
break;
}
});

// eslint-disable-next-line no-param-reassign
exportMap[outputName === 'index' ? '.' : `./${outputName}`] = {
const pathsMap = {
[this.platform === 'native' ? 'react-native' : this.platform]:
Object.keys(paths).length === 1 && paths.default ? paths.default : paths,
Object.keys(paths).length === 0 && defaultEntry ? defaultEntry : paths,
};

// Provide fallbacks if condition above is not
if (defaultEntry) {
pathsMap.default = defaultEntry;
}

// eslint-disable-next-line no-param-reassign
exportMap[outputName === 'index' ? '.' : `./${outputName}`] = pathsMap;
}
}
6 changes: 5 additions & 1 deletion packages/packemon/src/Package.ts
Original file line number Diff line number Diff line change
Expand Up @@ -489,13 +489,17 @@ export class Package {

this.artifacts.forEach((artifact) => {
Object.entries(artifact.getPackageExports()).forEach(([path, conditions]) => {
if (!conditions) {
return;
}

if (!exportMap[path]) {
exportMap[path] = {};
} else if (typeof exportMap[path] === 'string') {
exportMap[path] = { default: exportMap[path] };
}

Object.assign(exportMap[path], conditions);
Object.assign(exportMap[path]!, conditions);
});
});

Expand Down
6 changes: 4 additions & 2 deletions packages/packemon/src/helpers/sortExportConditions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ const WEIGHTS = {
default: 100, // Default must be last
};

export function sortExportConditions<T extends PackageExportPaths | string>(paths: T): T {
if (typeof paths === 'string') {
export function sortExportConditions<T extends PackageExportPaths | string | undefined>(
paths: T,
): T {
if (!paths || typeof paths === 'string') {
return paths;
}

Expand Down
7 changes: 6 additions & 1 deletion packages/packemon/src/helpers/sortExports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,10 @@ export function sortExports(exportMap: PackageExports): PackageExports {
return diff === 0 ? d.length - a.length : diff;
});

return Object.fromEntries(paths.map((path) => [path, sortExportConditions(exportMap[path])]));
return Object.fromEntries(
paths.map((path) => [
path,
exportMap[path] === undefined ? undefined : sortExportConditions(exportMap[path]),
]),
);
}
2 changes: 1 addition & 1 deletion packages/packemon/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ export type PackageExportPaths = {
[K in PackageExportConditions]?: PackageExportPaths | string;
};

export type PackageExports = Record<string, PackageExportPaths | string>;
export type PackageExports = Record<string, PackageExportPaths | string | undefined>;

// BUILD

Expand Down
7 changes: 6 additions & 1 deletion packages/packemon/tests/CodeArtifact.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ describe('CodeArtifact', () => {
expect(artifact.getPackageExports()).toEqual({
'.': {
node: './lib/index.js',
default: './lib/index.js',
},
});
});
Expand All @@ -227,6 +228,7 @@ describe('CodeArtifact', () => {
expect(artifact.getPackageExports()).toEqual({
'.': {
node: './lib/node/index.js',
default: './lib/node/index.js',
},
});
});
Expand All @@ -238,6 +240,7 @@ describe('CodeArtifact', () => {
expect(artifact.getPackageExports()).toEqual({
'./sub': {
node: './lib/sub.js',
default: './lib/sub.js',
},
});
});
Expand All @@ -250,8 +253,8 @@ describe('CodeArtifact', () => {
node: {
import: './mjs/index.mjs',
require: './cjs/index.cjs',
default: './lib/index.js',
},
default: './lib/index.js',
},
});
});
Expand All @@ -277,6 +280,7 @@ describe('CodeArtifact', () => {
expect(artifact.getPackageExports()).toEqual({
'.': {
browser: './lib/index.js',
default: './lib/index.js',
},
});
});
Expand All @@ -288,6 +292,7 @@ describe('CodeArtifact', () => {
expect(artifact.getPackageExports()).toEqual({
'.': {
'react-native': './lib/index.js',
default: './lib/index.js',
},
});
});
Expand Down
34 changes: 18 additions & 16 deletions packages/packemon/tests/Package.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ describe('Package', () => {
await pkg.build({ addExports: true }, config);

expect(pkg.packageJson.exports).toEqual({
'.': { node: './lib/index.js' },
'.': { node: './lib/index.js', default: './lib/index.js' },
'./package.json': './package.json',
});
});
Expand All @@ -547,8 +547,8 @@ describe('Package', () => {
node: {
import: './mjs/index.mjs',
require: './cjs/index.cjs',
default: './lib/index.js',
},
default: './lib/index.js',
},
'./package.json': './package.json',
});
Expand All @@ -574,6 +574,7 @@ describe('Package', () => {
node: './lib/node/index.js',
browser: './lib/browser/index.js',
'react-native': './lib/native/index.js',
default: './lib/native/index.js',
},
'./package.json': './package.json',
});
Expand All @@ -596,13 +597,12 @@ describe('Package', () => {
node: {
import: './mjs/index.mjs',
require: './cjs/index.cjs',
default: './lib/index.js',
},
browser: {
import: './esm/index.js',
module: './esm/index.js',
default: './lib/index.js',
},
default: './lib/index.js',
},
'./package.json': './package.json',
});
Expand All @@ -619,8 +619,8 @@ describe('Package', () => {
await pkg.build({ addExports: true }, config);

expect(pkg.packageJson.exports).toEqual({
'.': { node: './lib/index.js' },
'./client': { browser: './lib/client.js' },
'.': { node: './lib/index.js', default: './lib/index.js' },
'./client': { browser: './lib/client.js', default: './lib/client.js' },
'./package.json': './package.json',
});
});
Expand All @@ -643,15 +643,15 @@ describe('Package', () => {
node: {
import: './mjs/index.mjs',
require: './cjs/index.cjs',
default: './lib/index.js',
},
default: './lib/index.js',
},
'./client': {
browser: {
import: './esm/client.js',
module: './esm/client.js',
default: './lib/client.js',
},
default: './lib/client.js',
},
'./package.json': './package.json',
});
Expand All @@ -664,7 +664,7 @@ describe('Package', () => {
await pkg.build({ addExports: true }, config);

expect(pkg.packageJson.exports).toEqual({
'.': { node: './lib/index.js', types: './dts/index.d.ts' },
'.': { node: './lib/index.js', types: './dts/index.d.ts', default: './lib/index.js' },
'./package.json': './package.json',
});
});
Expand All @@ -679,7 +679,7 @@ describe('Package', () => {
await pkg.build({ addExports: true }, config);

expect(pkg.packageJson.exports).toEqual({
'.': { node: './lib/index.js' },
'.': { node: './lib/index.js', default: './lib/index.js' },
'./foo': './lib/foo.js',
'./package.json': './package.json',
});
Expand Down Expand Up @@ -868,13 +868,13 @@ describe('Package', () => {
exports: {
'./package.json': './package.json',
'.': { node: { import: './cjs/index-wrapper.mjs', require: './cjs/index.cjs' } },
'./bin': { node: './lib/bin.js' },
'./bin': { node: './lib/bin.js', default: './lib/bin.js' },
'./web': {
browser: {
import: './esm/web.js',
module: './esm/web.js',
default: './lib/web.js',
},
default: './lib/web.js',
},
'./import': { node: { import: './mjs/import.mjs' } },
},
Expand Down Expand Up @@ -917,10 +917,11 @@ describe('Package', () => {
bin: './lib/cli.js',
exports: {
'./package.json': './package.json',
'./bin': { node: './lib/cli.js' },
'./bin': { node: './lib/cli.js', default: './lib/cli.js' },
'./import': { node: { import: './mjs/web.mjs' } },
'./web': {
browser: { default: './lib/web.js', import: './esm/web.js', module: './esm/web.js' },
browser: { import: './esm/web.js', module: './esm/web.js' },
default: './lib/web.js',
},
'.': { node: { import: './cjs/node-wrapper.mjs', require: './cjs/node.cjs' } },
},
Expand Down Expand Up @@ -964,16 +965,17 @@ describe('Package', () => {
exports: {
'./package.json': './package.json',
'./*': {
browser: { import: './esm/*.js', module: './esm/*.js', default: './lib/*.js' },
browser: { import: './esm/*.js', module: './esm/*.js' },
node: { import: './mjs/*.mjs' },
default: './lib/*.js',
},
'.': {
browser: {
import: './esm/index.js',
module: './esm/index.js',
default: './lib/index.js',
},
node: { import: './mjs/index.mjs' },
default: './lib/index.js',
},
},
}),
Expand Down

0 comments on commit 08f5995

Please sign in to comment.