@riebeckite/diagram 0.0.41 → 0.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export type { DiagramClientContext, DiagramClientRenderer, } from "./src/client.js";
2
- export { detectDiagramTheme, renderPendingDiagrams } from "./src/client.js";
2
+ export { detectDiagramTheme, renderPendingDiagrams, setDiagramSvg, } from "./src/client.js";
package/dist/client.js CHANGED
@@ -1,4 +1,27 @@
1
1
  // src/client.ts
2
+ var UNSAFE_SVG_ELEMENTS = "script,iframe,object,embed,animate,animateMotion,animateTransform,set,form,button,input,select,textarea,video,audio,canvas,base,link,meta";
3
+ var UNSAFE_STYLE = /@import|expression\s*\(|behavior\s*:|url\(\s*['"]?\s*(?!#)/i;
4
+ function setDiagramSvg(canvas, source) {
5
+ const parsed = new DOMParser().parseFromString(source, "text/html");
6
+ const svg = parsed.body.firstElementChild;
7
+ if (svg?.localName !== "svg") return false;
8
+ for (const element of svg.querySelectorAll(UNSAFE_SVG_ELEMENTS)) {
9
+ element.remove();
10
+ }
11
+ for (const element of [svg, ...svg.querySelectorAll("*")]) {
12
+ for (const attribute of Array.from(element.attributes)) {
13
+ const name = attribute.name.toLowerCase();
14
+ if (name.startsWith("on") || name === "src" || (name === "href" || name === "xlink:href") && !attribute.value.trim().startsWith("#") || name === "style" && UNSAFE_STYLE.test(attribute.value)) {
15
+ element.removeAttribute(attribute.name);
16
+ }
17
+ }
18
+ }
19
+ for (const style of svg.querySelectorAll("style")) {
20
+ if (UNSAFE_STYLE.test(style.textContent ?? "")) style.remove();
21
+ }
22
+ canvas.replaceChildren(svg);
23
+ return true;
24
+ }
2
25
  async function renderPendingDiagrams(kind, renderer, context = {}) {
3
26
  const root = context.root ?? document;
4
27
  const selector = `[data-diagram="${CSS.escape(kind)}"][data-diagram-status="pending"]`;
@@ -33,5 +56,6 @@ function detectDiagramTheme() {
33
56
  }
34
57
  export {
35
58
  detectDiagramTheme,
36
- renderPendingDiagrams
59
+ renderPendingDiagrams,
60
+ setDiagramSvg
37
61
  };
@@ -3,5 +3,6 @@ export type DiagramClientContext = {
3
3
  signal?: AbortSignal;
4
4
  };
5
5
  export type DiagramClientRenderer = (figure: HTMLElement, context: DiagramClientContext) => Promise<undefined | (() => void)> | undefined | (() => void);
6
+ export declare function setDiagramSvg(canvas: HTMLElement, source: string): boolean;
6
7
  export declare function renderPendingDiagrams(kind: string, renderer: DiagramClientRenderer, context?: DiagramClientContext): Promise<() => void>;
7
8
  export declare function detectDiagramTheme(): "light" | "dark";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riebeckite/diagram",
3
- "version": "0.0.41",
3
+ "version": "0.0.42",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,11 +30,11 @@
30
30
  "access": "public"
31
31
  },
32
32
  "dependencies": {
33
- "@riebeckite/core": "0.0.41"
33
+ "@riebeckite/core": "0.0.42"
34
34
  },
35
35
  "devDependencies": {
36
- "@riebeckite/test": "0.0.41",
37
- "tsx": "^4.22.4"
36
+ "tsx": "^4.22.4",
37
+ "@riebeckite/test": "0.0.42"
38
38
  },
39
39
  "repository": {
40
40
  "type": "git",