Skip to content

Commit

Permalink
fix(react-native): add release option to publisable react-native library
Browse files Browse the repository at this point in the history
  • Loading branch information
xiongemi committed Feb 4, 2025
1 parent 1122711 commit 2ca4617
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 64 deletions.
9 changes: 9 additions & 0 deletions e2e/release/src/publishable-libraries-release.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,13 @@ describe('publishable libraries release', () => {
const versionOutput = runCLI(`release patch`);
expect(versionOutput).toContain('Executing pre-version command');
});

it('should be able release react native publishable libraries', async () => {
const reactNativeLib = uniq('react-native-lib');
runCLI(
`generate @nx/react:lib ${reactNativeLib} --publishable --importPath=@proj/${reactNativeLib}`
);
const versionOutput = runCLI(`release patch`);
expect(versionOutput).toContain('Executing pre-version command');
});
});

This file was deleted.

30 changes: 20 additions & 10 deletions packages/react-native/src/generators/library/library.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -492,16 +492,26 @@ describe('lib', () => {
]
`);
// Make sure keys are in idiomatic order
expect(Object.keys(readJson(appTree, 'my-lib/package.json')))
.toMatchInlineSnapshot(`
[
"name",
"version",
"main",
"types",
"exports",
"nx",
]
expect(readJson(appTree, 'my-lib/package.json')).toMatchInlineSnapshot(`
{
"exports": {
".": {
"default": "./src/index.ts",
"import": "./src/index.ts",
"types": "./src/index.ts",
},
"./package.json": "./package.json",
},
"main": "./src/index.ts",
"name": "@proj/my-lib",
"nx": {},
"peerDependencies": {
"react": "~18.3.1",
"react-native": "~0.76.3",
},
"types": "./src/index.ts",
"version": "0.0.1",
}
`);
expect(readJson(appTree, 'my-lib/tsconfig.json')).toMatchInlineSnapshot(`
{
Expand Down
67 changes: 24 additions & 43 deletions packages/react-native/src/generators/library/library.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ import {
addProjectToTsSolutionWorkspace,
updateTsconfigFiles,
} from '@nx/js/src/utils/typescript/ts-solution-setup';
import { getImportPath } from '@nx/js/src/utils/get-import-path';
import type { PackageJson } from 'nx/src/utils/package-json';
import { sortPackageJsonFields } from '@nx/js/src/utils/package-json/sort-fields';
import {
addReleaseOptionForPublishableTarget,
releaseTasks,
} from '@nx/js/src/generators/library/utils/add-release-config';
import { determineEntryFields } from '@nx/react/src/generators/library/lib/determine-entry-fields';

export async function reactNativeLibraryGenerator(
host: Tree,
Expand Down Expand Up @@ -106,8 +109,8 @@ export async function reactNativeLibraryGeneratorInternal(
);
tasks.push(jestTask);

if (options.publishable || options.buildable) {
updateLibPackageNpmScope(host, options);
if (options.publishable) {
tasks.push(await releaseTasks(host));
}

if (!options.skipTsConfig && !options.isUsingTsSolutionConfig) {
Expand Down Expand Up @@ -175,10 +178,17 @@ async function addProject(
writeJson(host, joinPathFragments(options.projectRoot, 'package.json'), {
name: options.name,
version: '0.0.1',
...determineEntryFields(options),
...determineEntryFields(
options.buildable || options.publishable ? 'rollup' : 'none',
options.js
),
nx: {
tags: options.parsedTags?.length ? options.parsedTags : undefined,
},
peerDependencies: {
react: reactVersion,
'react-native': reactNativeVersion,
},
});
} else {
addProjectConfiguration(host, options.name, project);
Expand Down Expand Up @@ -231,6 +241,15 @@ async function addProject(
},
};

if (options.publishable) {
await addReleaseOptionForPublishableTarget(
host,
options.name,
project,
options.isUsingTsSolutionConfig
);
}

updateProjectConfiguration(host, options.name, project);

return rollupConfigTask;
Expand Down Expand Up @@ -276,55 +295,17 @@ function createFiles(host: Tree, options: NormalizedSchema) {
}
);

if (!options.publishable && !options.buildable) {
host.delete(`${options.projectRoot}/package.json`);
}

if (options.js) {
toJS(host);
}

updateTsConfig(host, options);
}

function updateLibPackageNpmScope(host: Tree, options: NormalizedSchema) {
return updateJson(host, `${options.projectRoot}/package.json`, (json) => {
json.name = options.importPath;
json.peerDependencies = {
react: reactVersion,
'react-native': reactNativeVersion,
};
return json;
});
}

function maybeJs(options: NormalizedSchema, path: string): string {
return options.js && (path.endsWith('.ts') || path.endsWith('.tsx'))
? path.replace(/\.tsx?$/, '.js')
: path;
}

function determineEntryFields(
options: NormalizedSchema
): Pick<PackageJson, 'main' | 'types' | 'exports'> {
if (options.buildable) {
return {};
}

return {
main: options.js ? './src/index.js' : './src/index.ts',
types: options.js ? './src/index.js' : './src/index.ts',
exports: {
'.': options.js
? './src/index.js'
: {
types: './src/index.ts',
import: './src/index.ts',
default: './src/index.ts',
},
'./package.json': './package.json',
},
};
}

export default reactNativeLibraryGenerator;
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import type { PackageJson } from 'nx/src/utils/package-json';
import type { NormalizedSchema } from '../schema';

export function determineEntryFields(
options: NormalizedSchema
bundler: string,
js: boolean
): Pick<PackageJson, 'main' | 'types' | 'exports'> {
if (options.bundler !== 'none') {
if (bundler !== 'none') {
return {};
}

return {
main: options.js ? './src/index.js' : './src/index.ts',
types: options.js ? './src/index.js' : './src/index.ts',
main: js ? './src/index.js' : './src/index.ts',
types: js ? './src/index.js' : './src/index.ts',
exports: {
'.': options.js
'.': js
? './src/index.js'
: {
types: './src/index.ts',
Expand Down
2 changes: 1 addition & 1 deletion packages/react/src/generators/library/library.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export async function libraryGeneratorInternal(host: Tree, schema: Schema) {
writeJson(host, `${options.projectRoot}/package.json`, {
name: options.importPath ?? options.name,
version: '0.0.1',
...determineEntryFields(options),
...determineEntryFields(options.bundler, options.js),
nx: options.parsedTags?.length
? {
tags: options.parsedTags,
Expand Down

0 comments on commit 2ca4617

Please sign in to comment.