@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
JavaScript
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 };