// @ts-check const { withDangerousMod, withXcodeProject, IOSConfig, } = require("@expo/config-plugins"); const fs = require("fs"); const path = require("path"); const SWIFT_FILES = [ "ClockInIntent.swift", "ClockOutIntent.swift", "OpenTimerIntent.swift", "BeenVoiceShortcuts.swift", ]; /** @type {import('@expo/config-plugins').ConfigPlugin} */ function withAppIntents(config) { const appIntentsSource = path.join( config._internal?.projectRoot ?? process.cwd(), "plugins", "app-intents", ); config = withDangerousMod(config, [ "ios", async (config) => { const platformRoot = config.modRequest.platformProjectRoot; const projectName = IOSConfig.XcodeUtils.getProjectName(platformRoot); const targetDir = path.join(platformRoot, projectName); fs.mkdirSync(targetDir, { recursive: true }); for (const file of SWIFT_FILES) { fs.copyFileSync(path.join(appIntentsSource, file), path.join(targetDir, file)); } return config; }, ]); return withXcodeProject(config, (config) => { const project = config.modResults; const platformRoot = config.modRequest.platformProjectRoot; const projectName = IOSConfig.XcodeUtils.getProjectName(platformRoot); for (const file of SWIFT_FILES) { const filepath = `${projectName}/${file}`; const absolutePath = path.join(platformRoot, filepath); if (!fs.existsSync(absolutePath)) continue; const fileRef = project.pbxFileReferenceSection(); const alreadyLinked = Object.values(fileRef).some( (entry) => entry && typeof entry === "object" && "path" in entry && entry.path === file, ); if (!alreadyLinked) { IOSConfig.XcodeUtils.addBuildSourceFileToGroup({ filepath, groupName: projectName, project, verbose: true, }); } } return config; }); } module.exports = withAppIntents;