UNPKG

@persona/layout-editor-remote-module

Version:

Shared manifest format, Vite plugin, and host/iframe bridge for remotely-defined dashboard layout modules in Persona dashboard apps.

58 lines (56 loc) • 2.19 kB
import { n as DEFAULT_MANIFEST_PATH, r as defineLayoutModule, t as remoteModuleRegistrationManifestV1Schema } from "./schema-CESoldIF.mjs"; import { z } from "zod"; //#region src/parse.ts /** * Module keys must be unique within one document — a consumer identifies a * module as `${sourceId}/${key}`, so a duplicate would collide. The plugin * already refuses to build such an app; re-checked here so a hand-written or * tampered manifest can't slip one through. */ const remoteModuleManifestDocumentSchema = z.object({ modules: z.array(remoteModuleRegistrationManifestV1Schema) }).superRefine((document, ctx) => { const seen = /* @__PURE__ */ new Set(); document.modules.forEach((module, index) => { if (seen.has(module.key)) ctx.addIssue({ code: "custom", message: `duplicate module key "${module.key}"`, path: [ "modules", index, "key" ] }); seen.add(module.key); }); }); var RemoteModuleManifestParseError = class extends Error { issues; constructor(error) { super(`Invalid remote layout module manifest:\n${z.prettifyError(error)}`); this.name = "RemoteModuleManifestParseError"; this.issues = error.issues; } }; /** * Validate the raw JSON of a manifest document (e.g. `await response.json()`) * and return it typed. Throws `RemoteModuleManifestParseError` if the document * is malformed; use `safeParseRemoteModuleManifest` to get a result instead. */ function parseRemoteModuleManifest(json) { const result = remoteModuleManifestDocumentSchema.safeParse(json); if (!result.success) throw new RemoteModuleManifestParseError(result.error); return result.data; } /** Non-throwing variant of `parseRemoteModuleManifest`. */ function safeParseRemoteModuleManifest(json) { const result = remoteModuleManifestDocumentSchema.safeParse(json); if (!result.success) return { error: new RemoteModuleManifestParseError(result.error), success: false }; return { data: result.data, success: true }; } //#endregion export { DEFAULT_MANIFEST_PATH, RemoteModuleManifestParseError, defineLayoutModule, parseRemoteModuleManifest, remoteModuleManifestDocumentSchema, remoteModuleRegistrationManifestV1Schema, safeParseRemoteModuleManifest };