Skip to content

Commit

Permalink
fix(js): handle different exports field shapes
Browse files Browse the repository at this point in the history
  • Loading branch information
jaysoo authored and Jack Hsu committed Oct 14, 2022
1 parent 840f462 commit 944bbc3
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 10 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',
},
});
});
});
31 changes: 25 additions & 6 deletions packages/js/src/utils/package-json/update-package-json.ts
Expand Up @@ -88,10 +88,17 @@ export function getUpdatedPackageJsonContent(
options.projectRoot
);
const typingsFile = `${relativeMainFileDir}${mainFile}.d.ts`;
const exports = {
'.': {},
...packageJson.exports,
};

let exports;
const { exports: originalExports } = packageJson;
exports = originalExports;
if (typeof originalExports === 'string') {
} else {
exports = {
'.': {},
...originalExports,
};
}

const mainJsFile =
options.outputFileName ?? `${relativeMainFileDir}${mainFile}.js`;
Expand All @@ -105,7 +112,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 +130,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

0 comments on commit 944bbc3

Please sign in to comment.