1624497a6SCedric van Puttenimport chalk from 'chalk'; 2624497a6SCedric van Putten 3624497a6SCedric van Puttenimport * as Log from '../../log'; 48d307f52SEvan Baconimport { isModuleSymlinked } from '../../utils/isModuleSymlinked'; 54149568cSEvan Baconimport { hashForDependencyMap, updatePkgDependencies } from '../updatePackageJson'; 68d307f52SEvan Bacon 78d307f52SEvan Baconjest.mock('../../utils/isModuleSymlinked'); 8624497a6SCedric van Puttenjest.mock('../../log'); 98d307f52SEvan Bacon 108d307f52SEvan Bacondescribe(hashForDependencyMap, () => { 118d307f52SEvan Bacon it(`dependencies in any order hash to the same value`, () => { 128d307f52SEvan Bacon expect(hashForDependencyMap({ a: '1.0.0', b: 2, c: '~3.0' })).toBe( 138d307f52SEvan Bacon hashForDependencyMap({ c: '~3.0', b: 2, a: '1.0.0' }) 148d307f52SEvan Bacon ); 158d307f52SEvan Bacon }); 168d307f52SEvan Bacon}); 178d307f52SEvan Bacon 188d307f52SEvan Bacondescribe(updatePkgDependencies, () => { 198d307f52SEvan Bacon beforeAll(() => { 208d307f52SEvan Bacon (isModuleSymlinked as any).mockImplementation(() => false); 218d307f52SEvan Bacon }); 228d307f52SEvan Bacon const requiredPackages = { 238d307f52SEvan Bacon react: 'version-from-template-required-1', 248d307f52SEvan Bacon 'react-native': 'version-from-template-required-1', 258d307f52SEvan Bacon 'react-native-unimodules': 'version-from-template-required-1', 268d307f52SEvan Bacon 'expo-updates': 'version-from-template-required-1', 278d307f52SEvan Bacon }; 288d307f52SEvan Bacon 298d307f52SEvan Bacon test('default bahaviour', () => { 308d307f52SEvan Bacon const pkg = { 318d307f52SEvan Bacon dependencies: { 328d307f52SEvan Bacon 'react-native': 'version-from-project', 338d307f52SEvan Bacon 'optional-package': 'version-from-project-1', 348d307f52SEvan Bacon 'optional-package-3': 'version-from-project-3', 358d307f52SEvan Bacon }, 368d307f52SEvan Bacon devDependencies: {}, 378d307f52SEvan Bacon }; 388d307f52SEvan Bacon updatePkgDependencies('fake path', { 398d307f52SEvan Bacon templatePkg: { 408d307f52SEvan Bacon dependencies: { 418d307f52SEvan Bacon ...requiredPackages, 428d307f52SEvan Bacon 'optional-package': 'version-from-template-1', 438d307f52SEvan Bacon 'optional-package-2': 'version-from-template-2', 448d307f52SEvan Bacon }, 458d307f52SEvan Bacon devDependencies: {}, 468d307f52SEvan Bacon }, 478d307f52SEvan Bacon pkg, 488d307f52SEvan Bacon }); 498d307f52SEvan Bacon expect(pkg.dependencies).toStrictEqual({ 508d307f52SEvan Bacon ...requiredPackages, 51624497a6SCedric van Putten 'react-native': 'version-from-project', // add-only package, do not overwrite 528d307f52SEvan Bacon 'optional-package': 'version-from-project-1', 538d307f52SEvan Bacon 'optional-package-2': 'version-from-template-2', 548d307f52SEvan Bacon 'optional-package-3': 'version-from-project-3', 558d307f52SEvan Bacon }); 568d307f52SEvan Bacon }); 578d307f52SEvan Bacon test('with skipDependencyUpdate', () => { 588d307f52SEvan Bacon const pkg = { 598d307f52SEvan Bacon dependencies: { 608d307f52SEvan Bacon 'react-native': 'version-from-project', 618d307f52SEvan Bacon 'optional-package': 'version-from-project-1', 628d307f52SEvan Bacon 'optional-package-3': 'version-from-project-3', 638d307f52SEvan Bacon }, 648d307f52SEvan Bacon devDependencies: {}, 658d307f52SEvan Bacon }; 668d307f52SEvan Bacon updatePkgDependencies('fake path', { 678d307f52SEvan Bacon pkg, 688d307f52SEvan Bacon templatePkg: { 698d307f52SEvan Bacon dependencies: { 708d307f52SEvan Bacon ...requiredPackages, 718d307f52SEvan Bacon 'react-native': 'version-from-project', 728d307f52SEvan Bacon 'optional-package': 'version-from-template-1', 738d307f52SEvan Bacon 'optional-package-2': 'version-from-template-2', 748d307f52SEvan Bacon }, 758d307f52SEvan Bacon devDependencies: {}, 768d307f52SEvan Bacon }, 778d307f52SEvan Bacon skipDependencyUpdate: ['react-native'], 788d307f52SEvan Bacon }); 798d307f52SEvan Bacon expect(pkg.dependencies).toStrictEqual({ 808d307f52SEvan Bacon ...requiredPackages, 818d307f52SEvan Bacon 'react-native': 'version-from-project', 828d307f52SEvan Bacon 'optional-package': 'version-from-project-1', 838d307f52SEvan Bacon 'optional-package-2': 'version-from-template-2', 848d307f52SEvan Bacon 'optional-package-3': 'version-from-project-3', 858d307f52SEvan Bacon }); 868d307f52SEvan Bacon }); 878d307f52SEvan Bacon test('test expo-updates not required by default in sdk 44', () => { 888d307f52SEvan Bacon const sdk44RequiredPackages = { 898d307f52SEvan Bacon react: 'version-from-template-required-1', 908d307f52SEvan Bacon 'react-native': 'version-from-template-required-1', 918d307f52SEvan Bacon }; 928d307f52SEvan Bacon const pkg = { 938d307f52SEvan Bacon dependencies: { 948d307f52SEvan Bacon 'react-native': 'version-from-project', 958d307f52SEvan Bacon 'optional-package': 'version-from-project-1', 968d307f52SEvan Bacon 'optional-package-3': 'version-from-project-3', 978d307f52SEvan Bacon }, 988d307f52SEvan Bacon devDependencies: {}, 998d307f52SEvan Bacon }; 1008d307f52SEvan Bacon updatePkgDependencies('fake path', { 1018d307f52SEvan Bacon templatePkg: { 1028d307f52SEvan Bacon dependencies: { 1038d307f52SEvan Bacon ...sdk44RequiredPackages, 1048d307f52SEvan Bacon 'optional-package': 'version-from-template-1', 1058d307f52SEvan Bacon 'optional-package-2': 'version-from-template-2', 1068d307f52SEvan Bacon }, 1078d307f52SEvan Bacon devDependencies: {}, 1088d307f52SEvan Bacon }, 1098d307f52SEvan Bacon pkg, 1108d307f52SEvan Bacon }); 1118d307f52SEvan Bacon expect(pkg.dependencies).toStrictEqual({ 1128d307f52SEvan Bacon ...sdk44RequiredPackages, 113624497a6SCedric van Putten 'react-native': 'version-from-project', // add-only package, do not overwrite 1148d307f52SEvan Bacon 'optional-package': 'version-from-project-1', 1158d307f52SEvan Bacon 'optional-package-2': 'version-from-template-2', 1168d307f52SEvan Bacon 'optional-package-3': 'version-from-project-3', 1178d307f52SEvan Bacon }); 1188d307f52SEvan Bacon }); 119624497a6SCedric van Putten test('does not overwrite add-only packages when defined', () => { 120624497a6SCedric van Putten const pkg = { 121624497a6SCedric van Putten dependencies: { 122624497a6SCedric van Putten expo: 'version-from-project', 123624497a6SCedric van Putten 'react-native': 'version-from-project', 124624497a6SCedric van Putten }, 125624497a6SCedric van Putten devDependencies: {}, 126624497a6SCedric van Putten }; 127624497a6SCedric van Putten updatePkgDependencies('fake path', { 128624497a6SCedric van Putten templatePkg: { 129624497a6SCedric van Putten dependencies: { 130624497a6SCedric van Putten ...requiredPackages, 131624497a6SCedric van Putten expo: 'version-from-template', 132624497a6SCedric van Putten }, 133624497a6SCedric van Putten devDependencies: {}, 134624497a6SCedric van Putten }, 135624497a6SCedric van Putten pkg, 136624497a6SCedric van Putten }); 137624497a6SCedric van Putten expect(pkg.dependencies).toStrictEqual({ 138624497a6SCedric van Putten ...requiredPackages, 139624497a6SCedric van Putten 'react-native': 'version-from-project', // add-only package, do not overwrite 140*7e91778dSCedric van Putten expo: 'version-from-project', 141624497a6SCedric van Putten }); 142624497a6SCedric van Putten expect(Log.warn).toBeCalledWith( 143624497a6SCedric van Putten expect.stringContaining( 144*7e91778dSCedric van Putten `instead of recommended ${[ 145*7e91778dSCedric van Putten `expo@version-from-template`, 146*7e91778dSCedric van Putten `react-native@version-from-template-required-1`, 147*7e91778dSCedric van Putten ] 148*7e91778dSCedric van Putten .map((dep) => chalk.bold(dep)) 149*7e91778dSCedric van Putten .join(', ')}` 150624497a6SCedric van Putten ) 151624497a6SCedric van Putten ); 152624497a6SCedric van Putten }); 1538d307f52SEvan Bacon}); 154