one
Version:
One is a React framework for web, iOS, and Android apps.
63 lines (60 loc) • 3.57 kB
JavaScript
import { existsSync, readFileSync } from "fs";
import { createRequire } from "module";
import { dirname, join } from "path";
import { methodSubscribed, methodWired, renderMethodCall, renderViewWires, toNativeSourceStructs } from "./nativeSourceWires.native.js";
function renderKotlinSourceModule(id, platform, root) {
var _app_dependencies, _app_devDependencies;
if (platform !== "android") {
throw new Error(`[one] ${id} is Kotlin source and cannot be imported into an iOS build; use an .ios.ts entry`);
}
var appManifest = join(root, "package.json");
var app = existsSync(appManifest) ? JSON.parse(readFileSync(appManifest, "utf8")) : {};
var requireFromFile = createRequire(id);
var { kotlinSourceId, renderKotlinSourceGlue, writeNativeSourceDeclaration } = requireFromFile("vxrn/native-source-contract");
var contract = writeNativeSourceDeclaration(id);
var sourceId = kotlinSourceId(root, id);
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")) {
if (!existsSync(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`);
}
}
var hash = renderKotlinSourceGlue(sourceId, contract).hash;
var oneRoot = dirname(requireFromFile.resolve("one/package.json"));
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 exports = contract.modules.map(function(module) {
return `export const ${module.name} = Object.freeze({${module.methods.map(function(method) {
return renderMethodCall(`${sourceId}.${module.name}`, method, hash);
}).join(",")}})`;
}).join("\n");
var viewHost = join(oneRoot, "dist/esm/platform/native-source/view.native.js");
var views = contract.views.map(function(view) {
return `export function ${view.name}(props) { return createElement(KotlinSourceView, { source: ${JSON.stringify(sourceId)}, view: ${JSON.stringify(view.name)}, contractHash: ${JSON.stringify(hash)}, props${renderViewWires(view, contract.structs)} }) }`;
}).join("\n");
if (!exports && !views) {
throw new Error(`[one] ${id} has no OneModule object or public @Composable function to import`);
}
var 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(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]
};
}
export { renderKotlinSourceModule };
//# sourceMappingURL=kotlinSourceModule.native.js.map