From fe5634f33184e06a6b18ecfbfe397af4706989a1 Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Fri, 14 Oct 2022 13:59:29 -0400 Subject: [PATCH] fix(js): handle different exports field shapes --- .../package-json/update-package-json.spec.ts | 92 +++++++++++++++++++ .../utils/package-json/update-package-json.ts | 28 ++++-- packages/nx/src/utils/package-json.ts | 10 +- .../rollup/lib/update-package-json.ts | 2 +- 4 files changed, 121 insertions(+), 11 deletions(-) diff --git a/packages/js/src/utils/package-json/update-package-json.spec.ts b/packages/js/src/utils/package-json/update-package-json.spec.ts index a7bdcf47a4ca8..75ca39593c420 100644 --- a/packages/js/src/utils/package-json/update-package-json.spec.ts +++ b/packages/js/src/utils/package-json/update-package-json.spec.ts @@ -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', + }, + }); + }); }); diff --git a/packages/js/src/utils/package-json/update-package-json.ts b/packages/js/src/utils/package-json/update-package-json.ts index 2934963e3f8b8..126b34f2a9bd3 100644 --- a/packages/js/src/utils/package-json/update-package-json.ts +++ b/packages/js/src/utils/package-json/update-package-json.ts @@ -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`; @@ -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. @@ -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) { diff --git a/packages/nx/src/utils/package-json.ts b/packages/nx/src/utils/package-json.ts index 71fc349ede722..d71fa5c7ee06b 100644 --- a/packages/nx/src/utils/package-json.ts +++ b/packages/nx/src/utils/package-json.ts @@ -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; devDependencies?: Record; peerDependencies?: Record; diff --git a/packages/rollup/src/executors/rollup/lib/update-package-json.ts b/packages/rollup/src/executors/rollup/lib/update-package-json.ts index 88848cadf1fcb..e46a53857f239 100644 --- a/packages/rollup/src/executors/rollup/lib/update-package-json.ts +++ b/packages/rollup/src/executors/rollup/lib/update-package-json.ts @@ -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,