one
Version:
One is a React framework for web, iOS, and Android apps.
71 lines (70 loc) • 4.48 kB
JavaScript
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 kotlinSourceModule_exports = {};
__export(kotlinSourceModule_exports, { renderKotlinSourceModule: () => renderKotlinSourceModule });
module.exports = __toCommonJS(kotlinSourceModule_exports);
var import_node_fs = require("node:fs");
var import_node_module = require("node:module");
var import_node_path = require("node:path");
var import_nativeSourceWires = require("./nativeSourceWires.cjs");
function renderKotlinSourceModule(id, platform, root) {
if (platform !== "android") {
throw new Error(`[one] ${id} is Kotlin source and cannot be imported into an iOS build; use an .ios.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 requireFromFile = (0, import_node_module.createRequire)(id);
const { kotlinSourceId, renderKotlinSourceGlue, writeNativeSourceDeclaration } = requireFromFile("vxrn/native-source-contract");
const contract = writeNativeSourceDeclaration(id);
const sourceId = kotlinSourceId(root, id);
if (Object.hasOwn(app.dependencies ?? {}, "expo") || Object.hasOwn(app.devDependencies ?? {}, "expo")) {
if (!(0, import_node_fs.existsSync)((0, import_node_path.join)(root, "android", "app", "src", "main", "java", "one", "source", sourceId))) {
throw new Error(`[one] ${id} needs one prebuild, or Expo prebuild with nativeSource enabled in the vxrn config plugin and android generated`);
}
}
const hash = renderKotlinSourceGlue(sourceId, contract).hash;
const oneRoot = (0, import_node_path.dirname)(requireFromFile.resolve("one/package.json"));
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 exports = contract.modules.map((module2) => `export const ${module2.name} = Object.freeze({${module2.methods.map((method) => (0, import_nativeSourceWires.renderMethodCall)(`${sourceId}.${module2.name}`, method, hash)).join(",")}})`).join("\n");
const viewHost = (0, import_node_path.join)(oneRoot, "dist/esm/platform/native-source/view.native.js");
const views = contract.views.map((view) => `export function ${view.name}(props) { return createElement(KotlinSourceView, { source: ${JSON.stringify(sourceId)}, view: ${JSON.stringify(view.name)}, contractHash: ${JSON.stringify(hash)}, props${(0, import_nativeSourceWires.renderViewWires)(view, contract.structs)} }) }`).join("\n");
if (!exports && !views) {
throw new Error(`[one] ${id} has no OneModule object or public @Composable function to import`);
}
const code = [
exports && `import { callNativeSource } from ${JSON.stringify(nativeSource)}`,
needsWire && `import { encodeNativeSourceArgs, decodeNativeSourceResult } from ${JSON.stringify(wireModule)}`,
needsEvents && `import { subscribeNativeSourceEvent } from ${JSON.stringify(eventsModule)}`,
(needsWire || needsEvents) && `const nativeSourceStructs = ${JSON.stringify((0, import_nativeSourceWires.toNativeSourceStructs)(contract.structs))}`,
views && `import { createElement } from 'react'
import { KotlinSourceView } from ${JSON.stringify(viewHost)}`,
exports,
views
].filter(Boolean).join("\n") + "\n";
return {
code,
watchFiles: [id]
};
}