You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
6.2 KiB

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createBridgingHeaderFile = createBridgingHeaderFile;
exports.ensureSwiftBridgingHeaderSetup = ensureSwiftBridgingHeaderSetup;
exports.getDesignatedSwiftBridgingHeaderFileReference = getDesignatedSwiftBridgingHeaderFileReference;
exports.linkBridgingHeaderFile = linkBridgingHeaderFile;
exports.withSwiftBridgingHeader = exports.withNoopSwiftFile = void 0;
function _fs() {
const data = _interopRequireDefault(require("fs"));
_fs = function () {
return data;
};
return data;
}
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function _iosPlugins() {
const data = require("../plugins/ios-plugins");
_iosPlugins = function () {
return data;
};
return data;
}
function _Paths() {
const data = require("./Paths");
_Paths = function () {
return data;
};
return data;
}
function _XcodeProjectFile() {
const data = require("./XcodeProjectFile");
_XcodeProjectFile = function () {
return data;
};
return data;
}
function _Xcodeproj() {
const data = require("./utils/Xcodeproj");
_Xcodeproj = function () {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const templateBridgingHeader = `//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
`;
/**
* Ensure a Swift bridging header is created for the project.
* This helps fix problems related to using modules that are written in Swift (lottie, FBSDK).
*
* 1. Ensures the file exists given the project path.
* 2. Writes the file and links to Xcode as a resource file.
* 3. Sets the build configuration `SWIFT_OBJC_BRIDGING_HEADER = [PROJECT_NAME]-Bridging-Header.h`
*/
const withSwiftBridgingHeader = config => {
return (0, _iosPlugins().withXcodeProject)(config, config => {
config.modResults = ensureSwiftBridgingHeaderSetup({
project: config.modResults,
projectRoot: config.modRequest.projectRoot
});
return config;
});
};
exports.withSwiftBridgingHeader = withSwiftBridgingHeader;
function ensureSwiftBridgingHeaderSetup({
projectRoot,
project
}) {
// Only create a bridging header if using objective-c
if (shouldCreateSwiftBridgingHeader({
projectRoot,
project
})) {
const projectName = (0, _Xcodeproj().getProjectName)(projectRoot);
const bridgingHeader = createBridgingHeaderFileName(projectName); // Ensure a bridging header is created in the Xcode project.
project = createBridgingHeaderFile({
project,
projectName,
projectRoot,
bridgingHeader
}); // Designate the newly created file as the Swift bridging header in the Xcode project.
project = linkBridgingHeaderFile({
project,
bridgingHeader: _path().default.join(projectName, bridgingHeader)
});
}
return project;
}
function shouldCreateSwiftBridgingHeader({
projectRoot,
project
}) {
// Only create a bridging header if the project is using in Objective C (AppDelegate is written in Objc).
const isObjc = (0, _Paths().getAppDelegate)(projectRoot).language === 'objc';
return isObjc && !getDesignatedSwiftBridgingHeaderFileReference({
project
});
}
/**
* @returns String matching the default name used when Xcode automatically creates a bridging header file.
*/
function createBridgingHeaderFileName(projectName) {
return `${projectName}-Bridging-Header.h`;
}
function getDesignatedSwiftBridgingHeaderFileReference({
project
}) {
const configurations = project.pbxXCBuildConfigurationSection(); // @ts-ignore
for (const {
buildSettings
} of Object.values(configurations || {})) {
// Guessing that this is the best way to emulate Xcode.
// Using `project.addToBuildSettings` modifies too many targets.
if (typeof (buildSettings === null || buildSettings === void 0 ? void 0 : buildSettings.PRODUCT_NAME) !== 'undefined') {
if (typeof buildSettings.SWIFT_OBJC_BRIDGING_HEADER === 'string' && buildSettings.SWIFT_OBJC_BRIDGING_HEADER) {
return buildSettings.SWIFT_OBJC_BRIDGING_HEADER;
}
}
}
return null;
}
/**
*
* @param bridgingHeader The bridging header filename ex: `ExpoAPIs-Bridging-Header.h`
* @returns
*/
function linkBridgingHeaderFile({
project,
bridgingHeader
}) {
const configurations = project.pbxXCBuildConfigurationSection(); // @ts-ignore
for (const {
buildSettings
} of Object.values(configurations || {})) {
// Guessing that this is the best way to emulate Xcode.
// Using `project.addToBuildSettings` modifies too many targets.
if (typeof (buildSettings === null || buildSettings === void 0 ? void 0 : buildSettings.PRODUCT_NAME) !== 'undefined') {
buildSettings.SWIFT_OBJC_BRIDGING_HEADER = bridgingHeader;
}
}
return project;
}
function createBridgingHeaderFile({
projectRoot,
projectName,
project,
bridgingHeader
}) {
const bridgingHeaderProjectPath = _path().default.join((0, _Paths().getSourceRoot)(projectRoot), bridgingHeader);
if (!_fs().default.existsSync(bridgingHeaderProjectPath)) {
// Create the file
_fs().default.writeFileSync(bridgingHeaderProjectPath, templateBridgingHeader, 'utf8');
} // This is non-standard, Xcode generates the bridging header in `/ios` which is kinda annoying.
// Instead, this'll generate the default header in the application code folder `/ios/myproject/`.
const filePath = `${projectName}/${bridgingHeader}`; // Ensure the file is linked with Xcode resource files
if (!project.hasFile(filePath)) {
project = (0, _Xcodeproj().addResourceFileToGroup)({
filepath: filePath,
groupName: projectName,
project,
// Not sure why, but this is how Xcode generates it.
isBuildFile: false,
verbose: false
});
}
return project;
}
const withNoopSwiftFile = config => {
return (0, _XcodeProjectFile().withBuildSourceFile)(config, {
filePath: 'noop-file.swift',
contents: ['//', '// @generated', '// A blank Swift file must be created for native modules with Swift files to work correctly.', '//', ''].join('\n')
});
};
exports.withNoopSwiftFile = withNoopSwiftFile;
//# sourceMappingURL=Swift.js.map