UNPKG

one

Version:

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

81 lines (80 loc) • 5.19 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var swiftPackageModule_exports = {}; __export(swiftPackageModule_exports, { renderSwiftPackageModule: () => renderSwiftPackageModule }); module.exports = __toCommonJS(swiftPackageModule_exports); var import_node_fs = require("node:fs"); var import_node_module = require("node:module"); var import_node_path = require("node:path"); var import_swift_package_id = require("vxrn/swift-package-id"); var import_nativeSourceWires = require("./nativeSourceWires.cjs"); function renderSwiftPackageModule(id, platform, root) { if (platform !== "ios") { throw new Error(`[one] ${id} is Swift source and cannot be imported into an Android build; use an .android.ts entry`); } const appManifest = (0, import_node_path.join)(root, "package.json"); const app = (0, import_node_fs.existsSync)(appManifest) ? JSON.parse((0, import_node_fs.readFileSync)(appManifest, "utf8")) : {}; const packageDir = (0, import_swift_package_id.swiftPackageDirOf)(id); if (!packageDir) { throw new Error(`[one] ${id} is not inside a swift package (no Package.swift above it)`); } const packageName = (0, import_swift_package_id.swiftPackageId)(packageDir); if (Object.hasOwn(app.dependencies ?? {}, "expo") || Object.hasOwn(app.devDependencies ?? {}, "expo")) { const podspec = (0, import_node_path.join)(root, "ios", "OneSwiftPackages", packageName, `${packageName}.podspec`); if (!(0, import_node_fs.existsSync)(podspec)) { throw new Error(`[one] ${id} needs one prebuild, or Expo prebuild with nativeSource enabled in the vxrn config plugin and ios generated`); } } const requireFromFile = (0, import_node_module.createRequire)(id); const { writeNativeSourceDeclaration, writeSwiftPackageArtifacts } = requireFromFile("vxrn/native-source-contract"); const contract = writeNativeSourceDeclaration(id); const artifacts = writeSwiftPackageArtifacts(packageDir); const hash = artifacts.hash; const watchFiles = Object.keys(artifacts.files).map((file) => (0, import_node_path.join)(packageDir, file)); const fill = /@main\s+struct\s+\w+\s*:\s*(SwiftUI\.)?App\b/.test((0, import_node_fs.readFileSync)(id, "utf8")); const oneRoot = (0, import_node_path.dirname)(requireFromFile.resolve("one/package.json")); const swiftHost = (0, import_node_path.join)(oneRoot, "dist/esm/platform/swift/index.native.js"); const nativeSource = (0, import_node_path.join)(oneRoot, "dist/esm/platform/native-source/index.native.js"); const wireModule = (0, import_node_path.join)(oneRoot, "dist/esm/platform/native-source/wire.native.js"); const eventsModule = (0, import_node_path.join)(oneRoot, "dist/esm/platform/native-source/events.native.js"); const needsWire = contract.modules.some((module2) => module2.methods.some(import_nativeSourceWires.methodWired)); const needsEvents = contract.modules.some((module2) => module2.methods.some(import_nativeSourceWires.methodSubscribed)); const structs = needsWire || needsEvents ? ` const nativeSourceStructs = ${JSON.stringify((0, import_nativeSourceWires.toNativeSourceStructs)(contract.structs))} ` : ""; const exports = contract.modules.map((module2) => `export const ${module2.name} = Object.freeze({${module2.methods.map((method) => (0, import_nativeSourceWires.renderMethodCall)(`${packageName}.${module2.name}`, method, hash)).join(",")}})`).join("\n"); const views = contract.views.map((view) => `export function ${view.name}(props) { return createElement(SwiftPackageView, { packageName: ${JSON.stringify(packageName)}, view: ${JSON.stringify(view.name)}, contractHash: ${JSON.stringify(hash)}, props, fill: false${(0, import_nativeSourceWires.renderViewWires)(view, contract.structs)} }) }`).join("\n"); const 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 }; }