nx/packages/react-native/src/migrations/update-12-10-0/add-react-native-svg-12-10-0.ts

79 lines
2.2 KiB
TypeScript

import {
Tree,
formatFiles,
getProjects,
updateJson,
offsetFromRoot,
ProjectConfiguration,
logger,
stripIndents,
} from '@nrwl/devkit';
/**
* Add support to display svg in react native:
* - Add react-native-svg-transform and react-native-svg packages to workspace's package.json.
* - Add typing to app's tsconfig.json.
* - Add react-native-svg to app's package.json.
*/
export default async function update(tree: Tree) {
const projects = getProjects(tree);
projects.forEach((project) => {
if (project.targets?.start?.executor !== '@nrwl/react-native:start') return;
addReactNativeSvgToAppPackageJson(tree, project);
addReactNativeSvgToTsconfig(tree, project);
mockSvgInJestConfig(tree, project);
});
await formatFiles(tree);
}
function addReactNativeSvgToAppPackageJson(
host: Tree,
project: ProjectConfiguration
) {
const packageJSonPath = `${project.root}/package.json`;
if (!host.exists(packageJSonPath)) return;
updateJson(host, packageJSonPath, (json) => {
const dependencies = json.dependencies || {};
dependencies['react-native-svg'] = '*';
return json;
});
}
function addReactNativeSvgToTsconfig(
host: Tree,
project: ProjectConfiguration
) {
const tsconfigPath = `${project.root}/tsconfig.json`;
if (!host.exists(tsconfigPath)) return;
const offset = offsetFromRoot(project.root);
updateJson(host, tsconfigPath, (json) => {
const files = json.files || [];
files.push(`${offset}node_modules/@nrwl/react-native/typings/svg.d.ts`);
json.files = files;
return json;
});
}
function mockSvgInJestConfig(host: Tree, project: ProjectConfiguration) {
const jestConfigPath = project.targets?.test?.options?.jestConfig;
if (!jestConfigPath || !host.exists(jestConfigPath)) return;
try {
const contents = host.read(jestConfigPath, 'utf-8');
if (contents.includes('moduleNameMapper')) return;
host.write(
jestConfigPath,
contents.replace(
/,([^,]*)$/,
`, moduleNameMapper: {'\\.svg': '@nrwl/react-native/plugins/jest/svg-mock'}, $1`
)
);
} catch {
logger.error(
stripIndents`Unable to update ${jestConfigPath} for project ${project.root}.`
);
}
}