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

[config] minor plugin updates #2788

Merged
merged 4 commits into from Oct 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
36 changes: 12 additions & 24 deletions packages/config/src/android/Facebook.ts
@@ -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
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
@@ -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
@@ -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
@@ -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
@@ -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
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
@@ -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