UNPKG

@config-plugins/react-native-siri-shortcut

Version:

Config plugin for react-native-siri-shortcut package

129 lines (128 loc) 5.7 kB
"use strict"; 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);