Skip to content
This repository has been archived by the owner on Jan 18, 2024. It is now read-only.

Commit

Permalink
[config] minor plugin updates (#2788)
Browse files Browse the repository at this point in the history
* unify android metadata tools

* Update Icon.ts

* added unified project modifier

* Update Facebook.ts
  • Loading branch information
EvanBacon authored Oct 14, 2020
1 parent fa3f3b0 commit 2418139
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 55 deletions.
36 changes: 12 additions & 24 deletions packages/config/src/android/Facebook.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { Parser } from 'xml2js';

import { ExpoConfig } from '../Config.types';
import { addMetaDataItemToMainApplication, Document, getMainApplication } from './Manifest';
import {
addMetaDataItemToMainApplication,
Document,
getMainApplication,
removeMetaDataItemFromMainApplication,
} from './Manifest';
import { readResourcesXMLAsync, ResourceItemXML } from './Resources';
import { getProjectStringsXMLPathAsync, removeStringItem, setStringItem } from './Strings';
import { writeXMLAsync } from './XML';
Expand Down Expand Up @@ -62,16 +67,13 @@ async function ensureFacebookActivityAsync({
}) {
const facebookSchemeActivityXML = facebookSchemeActivity(scheme);
const parser = new Parser();
const facebookSchemeActivityJSON = await parser.parseStringPromise(facebookSchemeActivityXML);
const facebookSchemeActivityJSON = (await parser.parseStringPromise(facebookSchemeActivityXML))
.activity;

//TODO: don't write if facebook scheme activity is already present
if ('activity' in mainApplication) {
mainApplication['activity'] = mainApplication['activity'].concat(
facebookSchemeActivityJSON['activity']
);
} else {
mainApplication['activity'] = facebookSchemeActivityJSON['activity'];
if (!Array.isArray(mainApplication.activity)) {
mainApplication.activity = [];
}
mainApplication.activity.push(facebookSchemeActivityJSON);
}

export async function setFacebookAppIdString(config: ExpoConfig, projectDirectory: string) {
Expand All @@ -98,7 +100,7 @@ export async function setFacebookAppIdString(config: ExpoConfig, projectDirector
return true;
}

export async function setFacebookConfig(config: ExpoConfig, manifestDocument: Document) {
export function setFacebookConfig(config: ExpoConfig, manifestDocument: Document) {
const scheme = getFacebookScheme(config);
const appId = getFacebookAppId(config);
const displayName = getFacebookDisplayName(config);
Expand Down Expand Up @@ -177,17 +179,3 @@ export async function setFacebookConfig(config: ExpoConfig, manifestDocument: Do

return manifestDocument;
}

// TODO: Use Manifest version after https://github.com/expo/expo-cli/pull/2587 lands
function removeMetaDataItemFromMainApplication(mainApplication: any, itemName: string) {
if (mainApplication.hasOwnProperty('meta-data')) {
const index = mainApplication['meta-data'].findIndex(
(e: any) => e['$']['android:name'] === itemName
);

if (index > -1) {
mainApplication['meta-data'].splice(index, 1);
}
}
return mainApplication;
}
2 changes: 1 addition & 1 deletion packages/config/src/android/Icon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ async function createAdaptiveIconXmlFiles(projectRoot: string, icLauncherXmlStri

async function removeBackgroundImageFilesAsync(projectRoot: string) {
Promise.all(
Object.values(dpiValues).map(async ({ folderName, scale }) => {
Object.values(dpiValues).map(async ({ folderName }) => {
const dpiFolderPath = path.resolve(projectRoot, ANDROID_RES_PATH, folderName);
await fs.remove(path.resolve(dpiFolderPath, IC_LAUNCHER_BACKGROUND_PNG));
})
Expand Down
11 changes: 6 additions & 5 deletions packages/config/src/ios/DeviceFamily.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as fs from 'fs-extra';
import { XcodeProject } from 'xcode';

import { ExpoConfig } from '../Config.types';
import { getPbxproj } from './utils/Xcodeproj';

export function getSupportsTablet(config: ExpoConfig): boolean {
return !!config.ios?.supportsTablet;
Expand Down Expand Up @@ -38,10 +37,12 @@ export function formatDeviceFamilies(deviceFamilies: number[]): string {
/**
* Add to pbxproj under TARGETED_DEVICE_FAMILY
*/
export function setDeviceFamily(config: ExpoConfig, projectRoot: string) {
export function setDeviceFamily(
config: ExpoConfig,
{ project }: { project: XcodeProject }
): XcodeProject {
const deviceFamilies = formatDeviceFamilies(getDeviceFamilies(config));

const project = getPbxproj(projectRoot);
const configurations = project.pbxXCBuildConfigurationSection();
// @ts-ignore
for (const { buildSettings } of Object.values(configurations || {})) {
Expand All @@ -52,5 +53,5 @@ export function setDeviceFamily(config: ExpoConfig, projectRoot: string) {
}
}

fs.writeFileSync(project.filepath, project.writeSync());
return project;
}
13 changes: 8 additions & 5 deletions packages/config/src/ios/Google.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import fs from 'fs-extra';
import path from 'path';
import { XcodeProject } from 'xcode';

import { ExpoConfig } from '../Config.types';
import { InfoPlist } from './IosConfig.types';
import { getSourceRoot } from './Paths';
import { appendScheme } from './Scheme';
import { addFileToGroup, getPbxproj, getProjectName } from './utils/Xcodeproj';
import { addFileToGroup, getProjectName } from './utils/Xcodeproj';

export function getGoogleMapsApiKey(config: ExpoConfig) {
return config.ios?.config?.googleMapsApiKey ?? null;
Expand Down Expand Up @@ -82,10 +83,13 @@ export function setGoogleConfig(config: ExpoConfig, infoPlist: InfoPlist): InfoP
return infoPlist;
}

export function setGoogleServicesFile(config: ExpoConfig, projectRoot: string) {
export function setGoogleServicesFile(
config: ExpoConfig,
{ projectRoot, project }: { project: XcodeProject; projectRoot: string }
): XcodeProject {
const googleServicesFileRelativePath = getGoogleServicesFile(config);
if (googleServicesFileRelativePath === null) {
return;
return project;
}

const googleServiceFilePath = path.resolve(projectRoot, googleServicesFileRelativePath);
Expand All @@ -94,8 +98,7 @@ export function setGoogleServicesFile(config: ExpoConfig, projectRoot: string) {
path.join(getSourceRoot(projectRoot), 'GoogleService-Info.plist')
);

let project = getPbxproj(projectRoot);
const projectName = getProjectName(projectRoot);
project = addFileToGroup(`${projectName}/GoogleService-Info.plist`, projectName, project);
fs.writeFileSync(project.filepath, project.writeSync());
return project;
}
19 changes: 8 additions & 11 deletions packages/config/src/ios/Locales.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import JsonFile from '@expo/json-file';
import * as fs from 'fs-extra';
import { join } from 'path';
import { XcodeProject } from 'xcode';

import { ExpoConfig } from '../Config.types';
import { addWarningIOS } from '../WarningAggregator';
import {
addFileToGroup,
ensureGroupRecursively,
getPbxproj,
getProjectName,
} from './utils/Xcodeproj';
import { addFileToGroup, ensureGroupRecursively, getProjectName } from './utils/Xcodeproj';

type LocaleJson = Record<string, string>;
type ResolvedLocalesJson = Record<string, LocaleJson>;
Expand All @@ -19,15 +15,17 @@ export function getLocales(config: ExpoConfig): Record<string, string | LocaleJs
return config.locales ?? null;
}

export async function setLocalesAsync(config: ExpoConfig, projectRoot: string): Promise<void> {
export async function setLocalesAsync(
config: ExpoConfig,
{ projectRoot, project }: { projectRoot: string; project: XcodeProject }
): Promise<XcodeProject> {
const locales = getLocales(config);
if (!locales) {
return;
return project;
}
// possibly validate CFBundleAllowMixedLocalizations is enabled
const localesMap = await getResolvedLocalesAsync(projectRoot, locales);

let project = getPbxproj(projectRoot);
const projectName = getProjectName(projectRoot);
const supportingDirectory = join(projectRoot, 'ios', projectName, 'Supporting');

Expand Down Expand Up @@ -55,8 +53,7 @@ export async function setLocalesAsync(config: ExpoConfig, projectRoot: string):
}
}

// Sync the Xcode project with the changes.
fs.writeFileSync(project.filepath, project.writeSync());
return project;
}

export async function getResolvedLocalesAsync(
Expand Down
14 changes: 11 additions & 3 deletions packages/config/src/ios/__tests__/DeviceFamily-test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ExpoConfig } from '@expo/config-types';
import { fs, vol } from 'memfs';
import * as path from 'path';

Expand All @@ -8,6 +9,7 @@ import {
getSupportsTablet,
setDeviceFamily,
} from '../DeviceFamily';
import { getPbxproj } from '../utils/Xcodeproj';

const actualFs = jest.requireActual('fs') as typeof fs;

Expand Down Expand Up @@ -99,8 +101,14 @@ describe(setDeviceFamily, () => {
});

it('updates device families without throwing', async () => {
setDeviceFamily({ name: '', slug: '', ios: {} }, projectRoot);
setDeviceFamily({ name: '', slug: '', ios: { supportsTablet: true } }, projectRoot);
setDeviceFamily({ name: '', slug: '', ios: { isTabletOnly: true } }, projectRoot);
setDeviceFamilyForRoot({ name: '', slug: '', ios: {} }, projectRoot);
setDeviceFamilyForRoot({ name: '', slug: '', ios: { supportsTablet: true } }, projectRoot);
setDeviceFamilyForRoot({ name: '', slug: '', ios: { isTabletOnly: true } }, projectRoot);
});
});

function setDeviceFamilyForRoot(config: ExpoConfig, projectRoot: string) {
let project = getPbxproj(projectRoot);
project = setDeviceFamily(config, { project });
fs.writeFileSync(project.filepath, project.writeSync());
}
9 changes: 7 additions & 2 deletions packages/config/src/ios/__tests__/Locales-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as path from 'path';

import { addWarningIOS } from '../../WarningAggregator';
import { getLocales, setLocalesAsync } from '../Locales';
import { getPbxproj } from '../utils/Xcodeproj';
const actualFs = jest.requireActual('fs') as typeof fs;

jest.mock('fs');
Expand Down Expand Up @@ -61,7 +62,9 @@ describe('e2e: iOS locales', () => {
projectRoot
);

await setLocalesAsync(
let project = getPbxproj(projectRoot);

project = await setLocalesAsync(
{
slug: 'testproject',
version: '1',
Expand All @@ -75,8 +78,10 @@ describe('e2e: iOS locales', () => {
es: { CFBundleDisplayName: 'spanish-name' },
},
},
projectRoot
{ project, projectRoot }
);
// Sync the Xcode project with the changes.
fs.writeFileSync(project.filepath, project.writeSync());
});

afterAll(() => {
Expand Down
23 changes: 19 additions & 4 deletions packages/expo-cli/src/commands/apply/configureIOSProjectAsync.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { getConfig, IOSConfig, WarningAggregator } from '@expo/config';
import { getProjectName } from '@expo/config/build/ios/utils/Xcodeproj';
import { getPbxproj, getProjectName } from '@expo/config/build/ios/utils/Xcodeproj';
import { IosPlist, UserManager } from '@expo/xdl';
import { writeFile } from 'fs-extra';
import path from 'path';
import { XcodeProject } from 'xcode';

import { getOrPromptForBundleIdentifier } from '../eject/ConfigValidation';

Expand All @@ -13,7 +15,13 @@ export default async function configureIOSProjectAsync(projectRoot: string) {
const { exp } = getConfig(projectRoot, { skipSDKVersionRequirement: true });
const username = await UserManager.getCurrentUsernameAsync();

IOSConfig.Google.setGoogleServicesFile(exp, projectRoot);
// Configure the Xcode project
await modifyPbxprojAsync(projectRoot, async project => {
project = await IOSConfig.Google.setGoogleServicesFile(exp, { project, projectRoot });
project = await IOSConfig.Locales.setLocalesAsync(exp, { project, projectRoot });
project = IOSConfig.DeviceFamily.setDeviceFamily(exp, { project });
return project;
});

// Configure the Info.plist
await modifyInfoPlistAsync(projectRoot, infoPlist => {
Expand Down Expand Up @@ -70,8 +78,15 @@ export default async function configureIOSProjectAsync(projectRoot: string) {
// Other
await IOSConfig.Icons.setIconsAsync(exp, projectRoot);
await IOSConfig.SplashScreen.setSplashScreenAsync(exp, projectRoot);
await IOSConfig.Locales.setLocalesAsync(exp, projectRoot);
IOSConfig.DeviceFamily.setDeviceFamily(exp, projectRoot);
}

async function modifyPbxprojAsync(
projectRoot: string,
callbackAsync: (project: XcodeProject) => Promise<XcodeProject>
) {
const project = getPbxproj(projectRoot);
const result = await callbackAsync(project);
await writeFile(project.filepath, result.writeSync());
}

async function modifyEntitlementsPlistAsync(projectRoot: string, callback: (plist: any) => any) {
Expand Down

0 comments on commit 2418139

Please sign in to comment.