@hyperframes/core 0.8.66 → 0.8.68

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.
@@ -1,18 +1,2 @@
1
- /**
2
- * Sanitize a figma-exported SVG before it touches disk (design spec §5).
3
- *
4
- * Threat model: figma-SHAPED exports, hardened against the cheap adversarial
5
- * variants (nesting, unquoted attrs, scheme smuggling). This is a lexical
6
- * pass, not a general-purpose HTML sanitizer — content from arbitrary
7
- * untrusted sources should go through a real sanitizer (DOMPurify) instead.
8
- * Strips:
9
- * - <script> elements (with content) and <style> blocks (@import exfil)
10
- * - <foreignObject> subtrees (arbitrary embedded HTML)
11
- * - on* event-handler attributes (quoted and unquoted)
12
- * - href/xlink:href values unless local fragment (#id) or data:image/
13
- *
14
- * Keeps local fragment refs (#id) and data:image embeds, which figma uses
15
- * for clip paths and embedded rasters.
16
- */
17
1
  export declare function sanitizeSvg(svg: string): string;
18
2
  //# sourceMappingURL=sanitizeSvg.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeSvg.d.ts","sourceRoot":"","sources":["../../src/figma/sanitizeSvg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAaH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwB/C"}
1
+ {"version":3,"file":"sanitizeSvg.d.ts","sourceRoot":"","sources":["../../src/figma/sanitizeSvg.ts"],"names":[],"mappings":"AAqWA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoB/C"}
@@ -1,52 +1,369 @@
1
- /**
2
- * Sanitize a figma-exported SVG before it touches disk (design spec §5).
3
- *
4
- * Threat model: figma-SHAPED exports, hardened against the cheap adversarial
5
- * variants (nesting, unquoted attrs, scheme smuggling). This is a lexical
6
- * pass, not a general-purpose HTML sanitizer — content from arbitrary
7
- * untrusted sources should go through a real sanitizer (DOMPurify) instead.
8
- * Strips:
9
- * - <script> elements (with content) and <style> blocks (@import exfil)
10
- * - <foreignObject> subtrees (arbitrary embedded HTML)
11
- * - on* event-handler attributes (quoted and unquoted)
12
- * - href/xlink:href values unless local fragment (#id) or data:image/
13
- *
14
- * Keeps local fragment refs (#id) and data:image embeds, which figma uses
15
- * for clip paths and embedded rasters.
1
+ /** Sanitize a figma-exported SVG before it touches disk (design spec §5). DOM-walk allowlist
2
+ * (linkedom): unknown elements and attributes are dropped by default rather than pattern-matched
3
+ * as dangerous, so a new SVG feature can't reopen a class of bug the way regex denylisting did.
16
4
  */
17
- /** Apply a replacement until the output stops changing (defeats nesting). */
18
- function replaceStable(input, pattern, replacement) {
19
- let out = input;
20
- let prev;
21
- do {
22
- prev = out;
23
- out = out.replace(pattern, replacement);
24
- } while (out !== prev);
25
- return out;
5
+ import { DOMParser } from "linkedom";
6
+ const SAFE_ELEMENTS = new Set([
7
+ "svg",
8
+ "g",
9
+ "defs",
10
+ "symbol",
11
+ "use",
12
+ "image",
13
+ "a",
14
+ "switch",
15
+ "rect",
16
+ "circle",
17
+ "ellipse",
18
+ "line",
19
+ "polyline",
20
+ "polygon",
21
+ "path",
22
+ "text",
23
+ "tspan",
24
+ "textPath",
25
+ "linearGradient",
26
+ "radialGradient",
27
+ "stop",
28
+ "pattern",
29
+ "mask",
30
+ "clipPath",
31
+ "marker",
32
+ "filter",
33
+ "feBlend",
34
+ "feColorMatrix",
35
+ "feComponentTransfer",
36
+ "feComposite",
37
+ "feConvolveMatrix",
38
+ "feDiffuseLighting",
39
+ "feDisplacementMap",
40
+ "feDistantLight",
41
+ "feDropShadow",
42
+ "feFlood",
43
+ "feFuncA",
44
+ "feFuncB",
45
+ "feFuncG",
46
+ "feFuncR",
47
+ "feGaussianBlur",
48
+ "feImage",
49
+ "feMerge",
50
+ "feMergeNode",
51
+ "feMorphology",
52
+ "feOffset",
53
+ "fePointLight",
54
+ "feSpecularLighting",
55
+ "feSpotLight",
56
+ "feTile",
57
+ "feTurbulence",
58
+ "title",
59
+ "desc",
60
+ "metadata",
61
+ "style",
62
+ ]);
63
+ // Local names only — a namespace prefix (xlink:href, x:href, ...) is stripped before this
64
+ // lookup, so it doesn't matter which prefix an attacker aliases onto a real or fake namespace.
65
+ const SAFE_ATTRIBUTES = new Set([
66
+ "id",
67
+ "class",
68
+ "style",
69
+ "transform",
70
+ "viewBox",
71
+ "width",
72
+ "height",
73
+ "x",
74
+ "y",
75
+ "x1",
76
+ "y1",
77
+ "x2",
78
+ "y2",
79
+ "cx",
80
+ "cy",
81
+ "r",
82
+ "rx",
83
+ "ry",
84
+ "fx",
85
+ "fy",
86
+ "points",
87
+ "d",
88
+ "offset",
89
+ "enable-background",
90
+ "gradientUnits",
91
+ "gradientTransform",
92
+ "spreadMethod",
93
+ "patternUnits",
94
+ "patternContentUnits",
95
+ "patternTransform",
96
+ "maskUnits",
97
+ "maskContentUnits",
98
+ "clipPathUnits",
99
+ "clip-rule",
100
+ "filterUnits",
101
+ "primitiveUnits",
102
+ "preserveAspectRatio",
103
+ "space",
104
+ "lang",
105
+ "role",
106
+ "focusable",
107
+ "tabindex",
108
+ "version",
109
+ "baseProfile",
110
+ "fill",
111
+ "fill-opacity",
112
+ "fill-rule",
113
+ "stroke",
114
+ "stroke-width",
115
+ "stroke-opacity",
116
+ "stroke-linecap",
117
+ "stroke-linejoin",
118
+ "stroke-miterlimit",
119
+ "stroke-dasharray",
120
+ "stroke-dashoffset",
121
+ "opacity",
122
+ "color",
123
+ "stop-color",
124
+ "stop-opacity",
125
+ "font-family",
126
+ "font-size",
127
+ "font-weight",
128
+ "font-style",
129
+ "text-anchor",
130
+ "dominant-baseline",
131
+ "alignment-baseline",
132
+ "letter-spacing",
133
+ "word-spacing",
134
+ "text-decoration",
135
+ "clip-path",
136
+ "mask",
137
+ "filter",
138
+ "marker-start",
139
+ "marker-mid",
140
+ "marker-end",
141
+ "marker",
142
+ "cursor",
143
+ "pointer-events",
144
+ "visibility",
145
+ "display",
146
+ "overflow",
147
+ "vector-effect",
148
+ "paint-order",
149
+ "color-interpolation",
150
+ "color-interpolation-filters",
151
+ "isolation",
152
+ "mix-blend-mode",
153
+ "startOffset",
154
+ "method",
155
+ "spacing",
156
+ "side",
157
+ "textLength",
158
+ "lengthAdjust",
159
+ "in",
160
+ "in2",
161
+ "result",
162
+ "mode",
163
+ "type",
164
+ "values",
165
+ "dx",
166
+ "dy",
167
+ "stdDeviation",
168
+ "edgeMode",
169
+ "k1",
170
+ "k2",
171
+ "k3",
172
+ "k4",
173
+ "operator",
174
+ "radius",
175
+ "scale",
176
+ "xChannelSelector",
177
+ "yChannelSelector",
178
+ "baseFrequency",
179
+ "numOctaves",
180
+ "seed",
181
+ "stitchTiles",
182
+ "tableValues",
183
+ "slope",
184
+ "intercept",
185
+ "amplitude",
186
+ "exponent",
187
+ "order",
188
+ "divisor",
189
+ "bias",
190
+ "targetX",
191
+ "targetY",
192
+ "kernelMatrix",
193
+ "preserveAlpha",
194
+ "kernelUnitLength",
195
+ "surfaceScale",
196
+ "diffuseConstant",
197
+ "specularConstant",
198
+ "specularExponent",
199
+ "lighting-color",
200
+ "flood-color",
201
+ "flood-opacity",
202
+ "azimuth",
203
+ "elevation",
204
+ "pointsAtX",
205
+ "pointsAtY",
206
+ "pointsAtZ",
207
+ "limitingConeAngle",
208
+ ]);
209
+ function localName(name) {
210
+ const i = name.lastIndexOf(":");
211
+ return i === -1 ? name : name.slice(i + 1);
212
+ }
213
+ /** href/xlink:href (any prefix): a same-document fragment always, `data:image/` only off `<a>`
214
+ * (an `<a>` navigates the top-level document on click; `<use>`/`<image>`/`<feImage>` only fetch
215
+ * it as an inert image resource). */
216
+ function isAllowedHref(value, tagLocalName) {
217
+ const v = value.trim();
218
+ if (v.startsWith("#"))
219
+ return true;
220
+ return /^data:image\//i.test(v) && tagLocalName.toLowerCase() !== "a";
221
+ }
222
+ /** CSS loads a resource only through a function (`url()`, `image-set()`, `src()`, ...) or
223
+ * `@import`, so CSS text passes only if every function is on this compute-only list, every
224
+ * `url()` is a same-document fragment, and there is no `@import`. `""` is a bare `(...)` group. */
225
+ const SAFE_CSS_FUNCTIONS = new Set([
226
+ "",
227
+ "url",
228
+ "rgb",
229
+ "rgba",
230
+ "hsl",
231
+ "hsla",
232
+ "hwb",
233
+ "lab",
234
+ "lch",
235
+ "oklab",
236
+ "oklch",
237
+ "color",
238
+ "color-mix",
239
+ "var",
240
+ "calc",
241
+ "min",
242
+ "max",
243
+ "clamp",
244
+ "matrix",
245
+ "matrix3d",
246
+ "translate",
247
+ "translatex",
248
+ "translatey",
249
+ "translatez",
250
+ "translate3d",
251
+ "scale",
252
+ "scalex",
253
+ "scaley",
254
+ "scalez",
255
+ "scale3d",
256
+ "rotate",
257
+ "rotatex",
258
+ "rotatey",
259
+ "rotatez",
260
+ "rotate3d",
261
+ "skew",
262
+ "skewx",
263
+ "skewy",
264
+ "perspective",
265
+ "cubic-bezier",
266
+ "steps",
267
+ "blur",
268
+ "brightness",
269
+ "contrast",
270
+ "drop-shadow",
271
+ "grayscale",
272
+ "hue-rotate",
273
+ "invert",
274
+ "opacity",
275
+ "saturate",
276
+ "sepia",
277
+ ]);
278
+ function decodeCssEscape(hex, char) {
279
+ if (hex === undefined)
280
+ return char ?? "";
281
+ const cp = parseInt(hex, 16);
282
+ const invalid = cp === 0 || cp > 0x10ffff || (cp >= 0xd800 && cp <= 0xdfff);
283
+ return invalid ? "�" : String.fromCodePoint(cp);
284
+ }
285
+ // A browser reads `\75 rl(` as `url(`, so every check runs on escape-decoded, lowercased text.
286
+ // Comments stay in: CSS never lets one join a function name or `@import`, only split tokens.
287
+ function canonicalCss(text) {
288
+ return text
289
+ .replace(/\\([0-9a-f]{1,6})[ \t\n\r\f]?|\\([\s\S])/gi, (_, hex, char) => decodeCssEscape(hex, char))
290
+ .toLowerCase();
291
+ }
292
+ // The scans below are single-pass indexOf loops, not regexes: the input is attacker-controlled
293
+ // and a backtracking regex here stalled the CLI for seconds on a few KB of padding.
294
+ function isCssNameChar(c) {
295
+ return c !== undefined && /[-\w]/.test(c);
296
+ }
297
+ function functionNameBefore(css, paren) {
298
+ let start = paren;
299
+ while (isCssNameChar(css[start - 1]))
300
+ start--;
301
+ return css.slice(start, paren);
302
+ }
303
+ function everyFunctionIsSafe(css) {
304
+ for (let at = css.indexOf("("); at !== -1; at = css.indexOf("(", at + 1)) {
305
+ if (!SAFE_CSS_FUNCTIONS.has(functionNameBefore(css, at)))
306
+ return false;
307
+ }
308
+ return true;
309
+ }
310
+ // A value holding "(" is rejected, so no second url( can hide inside the one being checked.
311
+ function isLocalUrlValue(raw) {
312
+ const value = raw.trim().replace(/^['"]/, "");
313
+ return value.startsWith("#") && !value.includes("(");
314
+ }
315
+ function everyUrlIsLocalFragment(css) {
316
+ for (let at = css.indexOf("url("); at !== -1;) {
317
+ const close = css.indexOf(")", at + 4);
318
+ if (close === -1 || !isLocalUrlValue(css.slice(at + 4, close)))
319
+ return false;
320
+ at = css.indexOf("url(", close + 1);
321
+ }
322
+ return true;
323
+ }
324
+ function isSafeCss(text) {
325
+ const css = canonicalCss(text);
326
+ return !css.includes("@import") && everyFunctionIsSafe(css) && everyUrlIsLocalFragment(css);
327
+ }
328
+ function isXmlnsAttribute(name) {
329
+ return name === "xmlns" || name.startsWith("xmlns:");
330
+ }
331
+ // aria-*/data-* are inert key/value pairs everywhere else; still CSS-checked below,
332
+ // defensively, rather than trusted just because no browser reads CSS from them today.
333
+ function isKnownAttribute(local) {
334
+ return SAFE_ATTRIBUTES.has(local) || local.startsWith("aria-") || local.startsWith("data-");
335
+ }
336
+ // Every kept value goes through isSafeCss (style= and presentation attributes are CSS); a
337
+ // non-CSS value that merely looks like a call, e.g. id="XRP-(XRP)", is dropped: fails closed.
338
+ function isSafeAttribute(tagLocalName, name, value) {
339
+ if (isXmlnsAttribute(name))
340
+ return true;
341
+ const local = localName(name);
342
+ if (local === "href")
343
+ return isAllowedHref(value, tagLocalName);
344
+ return isKnownAttribute(local) && isSafeCss(value);
26
345
  }
27
346
  export function sanitizeSvg(svg) {
28
- let out = svg;
29
- out = replaceStable(out, /<script\b[\s\S]*?<\/script\b[^>]*>/gi, "");
30
- out = replaceStable(out, /<script\b[^>]*\/>/gi, "");
31
- out = replaceStable(out, /<style\b[\s\S]*?<\/style\b[^>]*>/gi, "");
32
- out = replaceStable(out, /<foreignObject\b[\s\S]*?<\/foreignObject\b[^>]*>/gi, "");
33
- out = replaceStable(out, /<foreignObject\b[^>]*\/>/gi, "");
34
- // Nesting leaves inert orphan close tags after the stable pass — drop them.
35
- out = out.replace(/<\/(?:script|style|foreignObject)\b[^>]*>/gi, "");
36
- // on* handler attributes: quoted and unquoted forms.
37
- out = replaceStable(out, /\son[a-z]+\s*=\s*"[^"]*"/gi, "");
38
- out = replaceStable(out, /\son[a-z]+\s*=\s*'[^']*'/gi, "");
39
- out = replaceStable(out, /\son[a-z]+\s*=\s*[^\s>'"]+/gi, "");
40
- // href-like attributes: POSITIVE allowlist — keep only local fragments and
41
- // data:image embeds; drop everything else (javascript:, https?:, blob:,
42
- // vbscript:, data:text/html, protocol-relative, …).
43
- // xmlns declarations are attribute *names*, not href values — untouched.
44
- out = out.replace(/\s(href|xlink:href)\s*=\s*"([^"]*)"/gi, (m, attr, value) => isAllowedHref(value) ? m : "");
45
- out = out.replace(/\s(href|xlink:href)\s*=\s*'([^']*)'/gi, (m, attr, value) => isAllowedHref(value) ? m : "");
46
- return out;
47
- }
48
- function isAllowedHref(value) {
49
- const v = value.trim().toLowerCase();
50
- return v.startsWith("#") || v.startsWith("data:image/");
347
+ const doc = new DOMParser().parseFromString(svg, "image/svg+xml");
348
+ const root = doc.documentElement;
349
+ if (!root)
350
+ return "";
351
+ for (const el of [...doc.querySelectorAll("*")]) {
352
+ if (!el.isConnected)
353
+ continue;
354
+ if (!SAFE_ELEMENTS.has(el.tagName)) {
355
+ el.remove();
356
+ continue;
357
+ }
358
+ if (el.tagName === "style" && !isSafeCss(el.textContent)) {
359
+ el.remove();
360
+ continue;
361
+ }
362
+ for (const attr of [...el.attributes]) {
363
+ if (!isSafeAttribute(el.tagName, attr.name, attr.value))
364
+ el.removeAttribute(attr.name);
365
+ }
366
+ }
367
+ return root.isConnected ? root.outerHTML : "";
51
368
  }
52
369
  //# sourceMappingURL=sanitizeSvg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeSvg.js","sourceRoot":"","sources":["../../src/figma/sanitizeSvg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,6EAA6E;AAC7E,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,WAAmB;IACxE,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,IAAI,CAAC;IACT,GAAG,CAAC;QACF,IAAI,GAAG,GAAG,CAAC;QACX,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC,QAAQ,GAAG,KAAK,IAAI,EAAE;IACvB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,sCAAsC,EAAE,EAAE,CAAC,CAAC;IACrE,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACpD,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,oCAAoC,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,oDAAoD,EAAE,EAAE,CAAC,CAAC;IACnF,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAC3D,4EAA4E;IAC5E,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC;IACrE,qDAAqD;IACrD,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAC3D,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAC3D,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,8BAA8B,EAAE,EAAE,CAAC,CAAC;IAC7D,2EAA2E;IAC3E,wEAAwE;IACxE,oDAAoD;IACpD,yEAAyE;IACzE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,KAAa,EAAE,EAAE,CAC5F,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC;IACF,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,KAAa,EAAE,EAAE,CAC5F,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"sanitizeSvg.js","sourceRoot":"","sources":["../../src/figma/sanitizeSvg.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/core",
3
- "version": "0.8.66",
3
+ "version": "0.8.68",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -306,9 +306,9 @@
306
306
  "bpm-detective": "^2.0.5",
307
307
  "linkedom": "^0.18.12",
308
308
  "postcss": "^8.5.8",
309
- "@hyperframes/lint": "0.8.66",
310
- "@hyperframes/parsers": "0.8.66",
311
- "@hyperframes/studio-server": "0.8.66"
309
+ "@hyperframes/lint": "0.8.68",
310
+ "@hyperframes/parsers": "0.8.68",
311
+ "@hyperframes/studio-server": "0.8.68"
312
312
  },
313
313
  "devDependencies": {
314
314
  "@types/jsdom": "^28.0.0",