Skip to content

Commit

Permalink
fix(js): handle different exports field shapes (#12613)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaysoo committed Oct 15, 2022
1 parent f26f2a1 commit 8944223
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 11 deletions.
92 changes: 92 additions & 0 deletions packages/js/src/utils/package-json/update-package-json.spec.ts
Expand Up @@ -166,4 +166,96 @@ describe('getUpdatedPackageJsonContent', () => {
version: '0.0.1',
});
});

it('should support different exports field shape', () => {
// exports: string
expect(
getUpdatedPackageJsonContent(
{
name: 'test',
version: '0.0.1',
exports: './custom.js',
},
{
main: 'proj/src/index.ts',
outputPath: 'dist/proj',
projectRoot: 'proj',
format: ['esm', 'cjs'],
outputFileExtensionForCjs: '.cjs',
generateExportsField: true,
}
)
).toEqual({
name: 'test',
main: './src/index.cjs',
module: './src/index.js',
types: './src/index.d.ts',
version: '0.0.1',
exports: './custom.js',
});

// exports: { '.': string }
expect(
getUpdatedPackageJsonContent(
{
name: 'test',
version: '0.0.1',
exports: {
'.': './custom.js',
},
},
{
main: 'proj/src/index.ts',
outputPath: 'dist/proj',
projectRoot: 'proj',
format: ['esm', 'cjs'],
outputFileExtensionForCjs: '.cjs',
generateExportsField: true,
}
)
).toEqual({
name: 'test',
main: './src/index.cjs',
module: './src/index.js',
types: './src/index.d.ts',
version: '0.0.1',
exports: {
'.': './custom.js',
},
});

// exports: { './custom': string }
expect(
getUpdatedPackageJsonContent(
{
name: 'test',
version: '0.0.1',
exports: {
'./custom': './custom.js',
},
},
{
main: 'proj/src/index.ts',
outputPath: 'dist/proj',
projectRoot: 'proj',
format: ['esm', 'cjs'],
outputFileExtensionForCjs: '.cjs',
generateExportsField: true,
}
)
).toEqual({
name: 'test',
main: './src/index.cjs',
module: './src/index.js',
types: './src/index.d.ts',
version: '0.0.1',
exports: {
'.': {
import: './src/index.js',
require: './src/index.cjs',
},
'./custom': './custom.js',
},
});
});
});
28 changes: 22 additions & 6 deletions packages/js/src/utils/package-json/update-package-json.ts
Expand Up @@ -88,10 +88,14 @@ export function getUpdatedPackageJsonContent(
options.projectRoot
);
const typingsFile = `${relativeMainFileDir}${mainFile}.d.ts`;
const exports = {
'.': {},
...packageJson.exports,
};

const exports =
typeof packageJson.exports === 'string'
? packageJson.exports
: {
'.': {},
...packageJson.exports,
};

const mainJsFile =
options.outputFileName ?? `${relativeMainFileDir}${mainFile}.js`;
Expand All @@ -105,7 +109,13 @@ export function getUpdatedPackageJsonContent(
packageJson.main ??= mainJsFile;
}

exports['.']['import'] = mainJsFile;
if (typeof exports !== 'string') {
if (typeof exports['.'] !== 'string') {
exports['.']['import'] ??= mainJsFile;
} else if (!hasCjsFormat) {
exports['.'] ??= mainJsFile;
}
}
}

// CJS output may have .cjs or .js file extensions.
Expand All @@ -117,7 +127,13 @@ export function getUpdatedPackageJsonContent(
options.outputFileExtensionForCjs ?? '.js'
}`;
packageJson.main ??= cjsMain;
exports['.']['require'] = cjsMain;
if (typeof exports !== 'string') {
if (typeof exports['.'] !== 'string') {
exports['.']['require'] ??= cjsMain;
} else if (!hasEsmFormat) {
exports['.'] ??= cjsMain;
}
}
}

if (options.generateExportsField) {
Expand Down
10 changes: 6 additions & 4 deletions packages/nx/src/utils/package-json.ts
Expand Up @@ -37,10 +37,12 @@ export interface PackageJson {
main?: string;
types?: string;
module?: string;
exports?: Record<
string,
{ types?: string; require?: string; import?: string }
>;
exports?:
| string
| Record<
string,
string | { types?: string; require?: string; import?: string }
>;
dependencies?: Record<string, string>;
devDependencies?: Record<string, string>;
peerDependencies?: Record<string, string>;
Expand Down
Expand Up @@ -54,7 +54,7 @@ export function updatePackageJson(
packageJson.types = types;

// TODO(jack): remove this for Nx 16
if (options.generateExportsField) {
if (options.generateExportsField && typeof packageJson.exports !== 'string') {
packageJson.exports = {
...packageJson.exports,
...exports,
Expand Down

1 comment on commit 8944223

@vercel
Copy link

@vercel vercel bot commented on 8944223 Oct 15, 2022

Choose a reason for hiding this comment

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

Successfully deployed to the following URLs:

nx-dev – ./

nx.dev
nx-five.vercel.app
nx-dev-nrwl.vercel.app
nx-dev-git-master-nrwl.vercel.app

Please sign in to comment.