@config-plugins/react-native-siri-shortcut
Version:
Config plugin for react-native-siri-shortcut package
129 lines (128 loc) • 5.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.addSiriShortcutAppDelegateImport = addSiriShortcutAppDelegateImport;
exports.addSiriShortcutAppDelegateInit = addSiriShortcutAppDelegateInit;
exports.addSiriShortcutBridgingHeaderImport = addSiriShortcutBridgingHeaderImport;
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
const config_plugins_1 = require("expo/config-plugins");
const fs_1 = __importDefault(require("fs"));
const glob_1 = require("glob");
const path_1 = __importDefault(require("path"));
/**
* Apply react-native-siri-shortcut configuration for Expo SDK 44 projects.
*/
const withReactNativeSiriShortcut = (config, activityTypes) => {
withSiriShortcutAppDelegate(config);
withSiriEntitlements(config);
const items = activityTypes || [];
if (!Array.isArray(items) || !items.length) {
return config;
}
(0, config_plugins_1.withInfoPlist)(config, (config) => {
config.modResults.NSUserActivityTypes = items;
return config;
});
return config;
};
function addSiriShortcutAppDelegateImport(src, lang) {
if (lang !== "swift") {
// ObjC
return (0, generateCode_1.mergeContents)({
tag: "react-native-siri-shortcut",
src,
newSrc: "#import <RNSiriShortcuts/RNSiriShortcuts.h>",
anchor: /#import "AppDelegate\.h"/,
offset: 1,
comment: "//",
});
}
return null;
}
function addSiriShortcutAppDelegateInit(src, lang) {
if (lang === "swift") {
return (0, generateCode_1.mergeContents)({
tag: "react-native-siri-shortcut-delegate",
src,
newSrc: " RNSSSiriShortcuts.application(application, continue: userActivity, restorationHandler: restorationHandler)",
anchor: /return super.application\(application,(\s+)?continue:(\s+)?userActivity,(\s+)?restorationHandler:(\s+)?restorationHandler\)/,
offset: -1,
comment: "//",
});
}
return (0, generateCode_1.mergeContents)({
tag: "react-native-siri-shortcut-delegate",
src,
newSrc: " [RNSSSiriShortcuts application:application continueUserActivity:userActivity restorationHandler:restorationHandler];",
anchor: / return \[super application:application continueUserActivity:userActivity restorationHandler:restorationHandler\] \|\| result;/,
offset: -1,
comment: "//",
});
}
function addSiriShortcutBridgingHeaderImport(src) {
return (0, generateCode_1.mergeContents)({
tag: "react-native-siri-shortcut",
src,
newSrc: "#import <RNSiriShortcuts/RNSiriShortcuts.h>",
anchor: /\/\//,
offset: 4,
comment: "//",
});
}
/** Append the siri entitlement on iOS */
const withSiriEntitlements = (config) => {
return (0, config_plugins_1.withEntitlementsPlist)(config, (config) => {
config.modResults["com.apple.developer.siri"] = true;
return config;
});
};
const withSiriShortcutAppDelegate = (config) => {
// Quick dirty hack to support Swift AppDelegate
(0, config_plugins_1.withDangerousMod)(config, [
"ios",
async (config) => {
const [using] = (0, glob_1.globSync)("*-Bridging-Header.h", {
absolute: true,
cwd: path_1.default.join(config.modRequest.platformProjectRoot, config.modRequest.projectName),
});
if (!using) {
throw new Error("Cannot find bridging header. Please make sure you have a bridging header in your project.");
}
const src = await fs_1.default.promises.readFile(using, "utf-8");
const res = addSiriShortcutBridgingHeaderImport(src);
await fs_1.default.promises.writeFile(using, res.contents, "utf-8");
return config;
},
]);
return (0, config_plugins_1.withAppDelegate)(config, (config) => {
if (!["objc", "objcpp", "swift"].includes(config.modResults.language)) {
throw new Error("Cannot setup Siri Shortcut because the AppDelegate is not in a support language:" +
` ${config.modResults.language}. Only ObjC, ObjCpp and Swift are supported.`);
}
try {
config.modResults.contents =
addSiriShortcutAppDelegateImport(config.modResults.contents, config.modResults.language)?.contents ?? config.modResults.contents;
config.modResults.contents = addSiriShortcutAppDelegateInit(config.modResults.contents, config.modResults.language).contents;
}
catch (error) {
if (error.code === "ERR_NO_MATCH") {
throw new Error(`Cannot add Siri Shortcut to the project's AppDelegate because it's malformed. Please report this with a copy of your project AppDelegate.`);
}
throw error;
}
return config;
});
};
const pkg = {
// Prevent this plugin from being run more than once.
// This pattern enables users to safely migrate off of this
// out-of-tree `@config-plugins/react-native-siri-shortcut` to a future
// upstream plugin in `react-native-siri-shortcut`
name: "react-native-siri-shortcut",
// Indicates that this plugin is dangerously linked to a module,
// and might not work with the latest version of that module.
version: "UNVERSIONED",
};
exports.default = (0, config_plugins_1.createRunOncePlugin)(withReactNativeSiriShortcut, pkg.name, pkg.version);