react-native-flip
Version:
77 lines (66 loc) • 2.29 kB
text/typescript
import glob from 'fast-glob';
import fs from 'fs-extra';
import path from 'path';
import { ModuleDescriptor, PackageRevision, SearchOptions } from '../types';
/**
* Resolves module search result with additional details required for iOS platform.
*/
export async function resolveModuleAsync(
packageName: string,
revision: PackageRevision,
options: SearchOptions
): Promise<ModuleDescriptor | null> {
const [podspecFile] = await glob('*/*.podspec', {
cwd: revision.path,
ignore: ['**/node_modules/**'],
});
if (!podspecFile) {
return null;
}
const podName = path.basename(podspecFile, path.extname(podspecFile));
const podspecDir = path.dirname(path.join(revision.path, podspecFile));
return {
podName,
podspecDir,
flags: options.flags,
modulesClassNames: revision.config?.iosModulesClassNames(),
};
}
/**
* Generates Swift file that contains all autolinked Swift packages.
*/
export async function generatePackageListAsync(
modules: ModuleDescriptor[],
targetPath: string
): Promise<void> {
const className = path.basename(targetPath, path.extname(targetPath));
const generatedFileContent = await generatePackageListFileContentAsync(modules, className);
await fs.outputFile(targetPath, generatedFileContent);
}
/**
* Generates the string to put into the generated package list.
*/
async function generatePackageListFileContentAsync(
modules: ModuleDescriptor[],
className: string
): Promise<string> {
const modulesToProvide = modules.filter((module) => module.modulesClassNames.length > 0);
const pods = modulesToProvide.map((module) => module.podName);
const classNames = [].concat(...modulesToProvide.map((module) => module.modulesClassNames));
return `/**
* Automatically generated by expo-modules-autolinking.
*
* This autogenerated class provides a list of classes of native Expo modules,
* but only these that are written in Swift and use the new API for creating Expo modules.
*/
import ExpoModulesCore
${pods.map((podName) => `import ${podName}\n`).join('')}
@objc(${className})
public class ${className}: ModulesProvider {
public override func getModuleClasses() -> [AnyModule.Type] {
return [${classNames.map((className) => `\n ${className}.self`).join(',')}
]
}
}
`;
}