From 50ae94bd87e62a90efe6f67c60e8545e114a3e85 Mon Sep 17 00:00:00 2001 From: Parth Bhatt Date: Wed, 5 Aug 2026 08:29:05 -0700 Subject: [PATCH 1/2] Copied @digitalbazaar/vc-html-renderer lib files into vendor/vc-html-renderer. --- vendor/vc-html-renderer/constants.js | 49 ++++ vendor/vc-html-renderer/detect.js | 85 ++++++ vendor/vc-html-renderer/documents.js | 229 +++++++++++++++++ vendor/vc-html-renderer/htmlRenderer.js | 328 ++++++++++++++++++++++++ vendor/vc-html-renderer/index.js | 15 ++ vendor/vc-html-renderer/pointer.js | 36 +++ vendor/vc-html-renderer/select.js | 111 ++++++++ 7 files changed, 853 insertions(+) create mode 100644 vendor/vc-html-renderer/constants.js create mode 100644 vendor/vc-html-renderer/detect.js create mode 100644 vendor/vc-html-renderer/documents.js create mode 100644 vendor/vc-html-renderer/htmlRenderer.js create mode 100644 vendor/vc-html-renderer/index.js create mode 100644 vendor/vc-html-renderer/pointer.js create mode 100644 vendor/vc-html-renderer/select.js diff --git a/vendor/vc-html-renderer/constants.js b/vendor/vc-html-renderer/constants.js new file mode 100644 index 0000000..431ea5e --- /dev/null +++ b/vendor/vc-html-renderer/constants.js @@ -0,0 +1,49 @@ +/*! + * Copyright (c) 2026 Digital Bazaar, Inc. + */ + +// HTML Render Suite constants. Tags: [spec] = mandated by +// https://w3c.github.io/vc-render-method/#the-html-render-suite ; +// [lib] = library-defined (not spec-mandated). + +// [spec] HTML suite = `TemplateRenderMethod` with `renderSuite: "html"`. +export const RENDER_METHOD_TYPE = 'TemplateRenderMethod'; +export const HTML_RENDER_SUITE = 'html'; + +// [spec] wrapper/template-frame CSP: inline + `data:` only, no network. +export const TEMPLATE_CSP = `default-src data: 'unsafe-inline'`; + +// [spec] host-frame CSP requires `frame-src 'none'` (allows `srcdoc`, blocks +// ` + + + +
@@ -108,7 +117,10 @@
-
+ + + +
diff --git a/viewers/html.js b/viewers/html.js index ae01a50..fd87c77 100644 --- a/viewers/html.js +++ b/viewers/html.js @@ -1,11 +1,16 @@ -// Copyright 2025 Digital Bazaar, Inc. +// Copyright 2025-2026 Digital Bazaar, Inc. // // SPDX-License-Identifier: BSD-3-Clause import { reactive } from 'https://unpkg.com/petite-vue?module' -import { selectJsonLd } from '../select.js'; +import {HtmlRenderer, filterCredential} from '@digitalbazaar/vc-html-renderer'; -export function HTMLViewer({template, credential, pointers}) { +export function HTMLViewer({renderMethod, credential}) { + // un-proxy the petite-vue reactive credential into a plain object + const plainCredential = JSON.parse(JSON.stringify(credential)); + + // decode the data: template for the "HTML Template Code" display tab + const template = renderMethod?.template || ''; let code = template; if(template.startsWith('data:text/html;base64,')) { code = atob(template.replace('data:text/html;base64,', '')); @@ -13,34 +18,75 @@ export function HTMLViewer({template, credential, pointers}) { code = template.replace('data:text/html,', ''); } + // the library performs this same filtering internally when it renders; here + // it only feeds the read-only "Filtered Credential" display tab const store = reactive({ code, - filteredCredential: JSON.stringify(selectJsonLd({ - // credential must be un-Proxy-object'd - document: JSON.parse(JSON.stringify(credential)), - // TODO: ...which renderMethod do we have renderProperties from? Pass - // that into HTML Viewer? - pointers - }), null, 2) + filteredCredential: JSON.stringify( + filterCredential({credential: plainCredential, renderMethod}), null, 2) }); + let handle = null; + return { $template: '#html-viewer', - // local state - currentTab: 'rendered', // rendered or codei + currentTab: 'rendered', store, - // methods - shimCode() { - const {renderMethod, ...partialCredential} = credential; - return ` - - - - - - ${store.code} - - `; + // render the HTML Render Method into `mount` via the library (nested, + // sandboxed host + template iframes; the app's own CSP is untouched) + renderInto(mount) { + if(handle) { + handle.destroy(); + handle = null; + } + handle = new HtmlRenderer().render({ + mount, + credential: plainCredential, + renderMethod + }); + handle.ready.catch(error => { + console.error('HTML render method failed:', error); + }); } }; } + +// export function HTMLViewer({template, credential, pointers}) { +// let code = template; +// if(template.startsWith('data:text/html;base64,')) { +// code = atob(template.replace('data:text/html;base64,', '')); +// } else if(template.startsWith('data:text/html,')) { +// code = template.replace('data:text/html,', ''); +// } + +// const store = reactive({ +// code, +// filteredCredential: JSON.stringify(selectJsonLd({ +// // credential must be un-Proxy-object'd +// document: JSON.parse(JSON.stringify(credential)), +// // TODO: ...which renderMethod do we have renderProperties from? Pass +// // that into HTML Viewer? +// pointers +// }), null, 2) +// }); + +// return { +// $template: '#html-viewer', +// // local state +// currentTab: 'rendered', // rendered or codei +// store, +// // methods +// shimCode() { +// const {renderMethod, ...partialCredential} = credential; +// return ` +// +// +// +// +// +// ${store.code} +// +// `; +// } +// }; +// }