UNPKG

linvail

Version:

Provenancial Equality for JavaScript

142 lines (132 loc) 4.62 kB
import { createRegion as createRegionInner } from "./runtime/region.mjs"; import { createLibrary as createLibraryInternal } from "./library/create.mjs"; import { library_hidden_variable } from "./library/library-variable.mjs"; import { registerOracleAran, registerOracleGlobal, registerOracleLinvail, } from "./runtime/oracle.mjs"; import { createCustomAdvice as createCustomAdviceInner } from "./runtime/advice/custom.mjs"; import { createStandardAdvice as createStandardAdviceInner } from "./runtime/advice/standard.mjs"; import { completeAdviceConfig } from "./runtime/advice/config.mjs"; import { completeRegionConfig } from "./runtime/config.mjs"; import { wrapCloneGuestReference } from "./runtime/clone.mjs"; export { createMembrane } from "./runtime/membrane.mjs"; const { Error, Reflect: { defineProperty }, } = globalThis; /** * @type {( * global: typeof globalThis, * config?: import("./runtime/config.d.ts").PartialRegionConfig, * ) => import("./runtime/region.d.ts").Region} */ export const createRegion = (global, config) => { const region = createRegionInner(global, completeRegionConfig(config)); for (const miss of registerOracleGlobal(region, global)) { const { warn } = region; warn(`Missing global intrinsic: ${miss}`); } return region; }; /** * @type {( * region: import("./runtime/region.d.ts").Region, * intrinsics: import("aran").ExtraIntrinsicRecord, * ) => void} */ export const registerAranIntrinsicRecord = (region, intrinsics) => { for (const miss of registerOracleAran(region, intrinsics)) { const { warn } = region; warn(`Missing Aran intrinsic: ${miss}`); } }; /** * @type {( * region: import("./runtime/region.d.ts").Region, * config?: import("./runtime/advice/config.js").PartialAdviceConfig, * ) => import("./runtime/advice/custom.js").CustomAdvice} */ export const createCustomAdvice = (region, config) => createCustomAdviceInner(region, completeAdviceConfig(config)); /** * @type {<T>( * region: import("./runtime/region.d.ts").Region, * config?: import("./runtime/advice/config.js").PartialAdviceConfig, * ) => import("./runtime/advice/standard.js").StandardAdvice<T>} */ export const createStandardAdvice = (region, config) => createStandardAdviceInner(region, completeAdviceConfig(config)); /** * @type {( * region: import("./runtime/region.d.ts").Region, * ) => import("./library/library.d.ts").Library} */ export const createLibrary = (region) => { const library = createLibraryInternal(region); for (const miss of registerOracleLinvail(region, library)) { const { warn } = region; warn(`Missing linvail library intrinsic: ${miss}`); } return library; }; /** * @type {( * library: import("./linvail.js").Library, * config: { * global: typeof globalThis, * }, * ) => void} */ export const exposeLibrary = (library, { global }) => { if (library_hidden_variable in global) { throw new Error("Linvail is already set up"); } const descriptor = { __proto__: null, value: library, writable: true, enumerable: false, configurable: true, }; defineProperty(global, library_hidden_variable, descriptor); }; /** * @deprecated Use `createRegion`, `createCustomAdvice`, and `createLibrary` instead. * @type {( * intrinsics: import("aran").IntrinsicRecord, * config: import("./runtime/config.d.ts").PartialRegionConfig, * ) => { * library: import("./library/library.js").Library, * advice: import("./runtime/advice/custom.js").CustomAdvice & { * toHostReferenceWrapper: import("./runtime.js").toHostReferenceWrapper, * }, * }} */ export const createRuntime = (intrinsics, config) => { const region = createRegion(intrinsics.globalThis, config); registerAranIntrinsicRecord(region, intrinsics); return { library: createLibrary(region), advice: { ...createCustomAdvice(region, {}), toHostReferenceWrapper: (reference, { kind }) => wrapCloneGuestReference(region, kind, reference), }, }; }; /** * @deprecated Use `createRegion`, `createCustomAdvice`, `createLibrary`, and `exposeLibrary` instead. * @type {( * intrinsics: import("aran").IntrinsicRecord, * config: Partial<import("./runtime/config.d.ts").RegionConfig>, * ) => import("./runtime/advice/custom.js").CustomAdvice & { * toHostReferenceWrapper: import("./runtime.js").toHostReferenceWrapper, * }} */ export const setupRuntime = (intrinsics, config) => { const { advice, library } = createRuntime(intrinsics, config); exposeLibrary(library, { global: intrinsics.globalThis }); return advice; };