UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

75 lines (72 loc) • 4.19 kB
import { existsSync, readFileSync } from "fs"; import { createRequire } from "module"; import { dirname, join } from "path"; import { swiftPackageDirOf, swiftPackageId } from "vxrn/swift-package-id"; import { methodSubscribed, methodWired, renderMethodCall, renderViewWires, toNativeSourceStructs } from "./nativeSourceWires.native.js"; function renderSwiftPackageModule(id, platform, root) { var _app_dependencies, _app_devDependencies; if (platform !== "ios") { throw new Error(`[one] ${id} is Swift source and cannot be imported into an Android build; use an .android.ts entry`); } var appManifest = join(root, "package.json"); var app = existsSync(appManifest) ? JSON.parse(readFileSync(appManifest, "utf8")) : {}; var packageDir = swiftPackageDirOf(id); if (!packageDir) { throw new Error(`[one] ${id} is not inside a swift package (no Package.swift above it)`); } var packageName = swiftPackageId(packageDir); if (Object.hasOwn((_app_dependencies = app.dependencies) !== null && _app_dependencies !== void 0 ? _app_dependencies : {}, "expo") || Object.hasOwn((_app_devDependencies = app.devDependencies) !== null && _app_devDependencies !== void 0 ? _app_devDependencies : {}, "expo")) { var podspec = join(root, "ios", "OneSwiftPackages", packageName, `${packageName}.podspec`); if (!existsSync(podspec)) { throw new Error(`[one] ${id} needs one prebuild, or Expo prebuild with nativeSource enabled in the vxrn config plugin and ios generated`); } } var requireFromFile = createRequire(id); var { writeNativeSourceDeclaration, writeSwiftPackageArtifacts } = requireFromFile("vxrn/native-source-contract"); var contract = writeNativeSourceDeclaration(id); var artifacts = writeSwiftPackageArtifacts(packageDir); var hash = artifacts.hash; var watchFiles = Object.keys(artifacts.files).map(function(file) { return join(packageDir, file); }); var fill = /@main\s+struct\s+\w+\s*:\s*(SwiftUI\.)?App\b/.test(readFileSync(id, "utf8")); var oneRoot = dirname(requireFromFile.resolve("one/package.json")); var swiftHost = join(oneRoot, "dist/esm/platform/swift/index.native.js"); var nativeSource = join(oneRoot, "dist/esm/platform/native-source/index.native.js"); var wireModule = join(oneRoot, "dist/esm/platform/native-source/wire.native.js"); var eventsModule = join(oneRoot, "dist/esm/platform/native-source/events.native.js"); var needsWire = contract.modules.some(function(module) { return module.methods.some(methodWired); }); var needsEvents = contract.modules.some(function(module) { return module.methods.some(methodSubscribed); }); var structs = needsWire || needsEvents ? ` const nativeSourceStructs = ${JSON.stringify(toNativeSourceStructs(contract.structs))} ` : ""; var exports = contract.modules.map(function(module) { return `export const ${module.name} = Object.freeze({${module.methods.map(function(method) { return renderMethodCall(`${packageName}.${module.name}`, method, hash); }).join(",")}})`; }).join("\n"); var views = contract.views.map(function(view) { return `export function ${view.name}(props) { return createElement(SwiftPackageView, { packageName: ${JSON.stringify(packageName)}, view: ${JSON.stringify(view.name)}, contractHash: ${JSON.stringify(hash)}, props, fill: false${renderViewWires(view, contract.structs)} }) }`; }).join("\n"); var code = `${contract.modules.length > 0 ? `import { callNativeSource } from ${JSON.stringify(nativeSource)} ` : ""}${needsWire ? `import { encodeNativeSourceArgs, decodeNativeSourceResult } from ${JSON.stringify(wireModule)} ` : ""}${needsEvents ? `import { subscribeNativeSourceEvent } from ${JSON.stringify(eventsModule)} ` : ""}${contract.defaultView || views ? `import { createElement } from 'react' import { SwiftPackageView } from ${JSON.stringify(swiftHost)} ` : ""}${structs}${contract.defaultView ? `export default function SwiftPackage(props) { return createElement(SwiftPackageView, { packageName: ${JSON.stringify(packageName)}, view: '', contractHash: '', props, fill: ${fill} }) } ` : ""}${exports} ${views} `; return { code, watchFiles }; } export { renderSwiftPackageModule }; //# sourceMappingURL=swiftPackageModule.native.js.map