@getforma/core 1.0.9 → 1.1.0
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/README.md +1 -1
- package/dist/chunk-263HW3KN.cjs +35 -0
- package/dist/chunk-263HW3KN.cjs.map +1 -0
- package/dist/chunk-2QQBKQIF.js +30 -0
- package/dist/chunk-2QQBKQIF.js.map +1 -0
- package/dist/{chunk-6FW5E54W.cjs → chunk-2Y5US35K.cjs} +127 -103
- package/dist/chunk-2Y5US35K.cjs.map +1 -0
- package/dist/{chunk-3G7ET4O5.js → chunk-INNOI6TG.js} +121 -94
- package/dist/chunk-INNOI6TG.js.map +1 -0
- package/dist/{chunk-T33QUD2Y.cjs → chunk-JRQNDXX7.cjs} +43 -43
- package/dist/{chunk-T33QUD2Y.cjs.map → chunk-JRQNDXX7.cjs.map} +1 -1
- package/dist/{chunk-AFRFF7XL.js → chunk-MIOMT2CB.js} +4 -4
- package/dist/{chunk-AFRFF7XL.js.map → chunk-MIOMT2CB.js.map} +1 -1
- package/dist/chunk-W7OUWVRA.cjs +106 -0
- package/dist/chunk-W7OUWVRA.cjs.map +1 -0
- package/dist/chunk-XLVBYXOU.js +100 -0
- package/dist/chunk-XLVBYXOU.js.map +1 -0
- package/dist/forma-runtime-csp.js +92 -6
- package/dist/forma-runtime.js +138 -12
- package/dist/formajs-runtime-hardened.global.js +92 -6
- package/dist/formajs-runtime-hardened.global.js.map +1 -1
- package/dist/formajs-runtime.global.js +138 -12
- package/dist/formajs-runtime.global.js.map +1 -1
- package/dist/formajs.global.js +192 -95
- package/dist/formajs.global.js.map +1 -1
- package/dist/http.cjs +11 -11
- package/dist/http.js +2 -2
- package/dist/index.cjs +66 -66
- package/dist/index.d.cts +11 -25
- package/dist/index.d.ts +11 -25
- package/dist/index.js +6 -6
- package/dist/{resource-DeEzxUz6.d.cts → resource-D6HfVgiA.d.cts} +7 -2
- package/dist/{resource-BHsgURy0.d.ts → resource-ljs2X5NM.d.ts} +7 -2
- package/dist/runtime-hardened.cjs +93 -5
- package/dist/runtime-hardened.cjs.map +1 -1
- package/dist/runtime-hardened.js +93 -5
- package/dist/runtime-hardened.js.map +1 -1
- package/dist/runtime.cjs +47 -31
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +21 -5
- package/dist/runtime.js.map +1 -1
- package/dist/server.cjs +7 -7
- package/dist/server.d.cts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/{signal-C9v4akyJ.d.cts → signal-CRBJYQ6B.d.cts} +0 -8
- package/dist/{signal-C9v4akyJ.d.ts → signal-CRBJYQ6B.d.ts} +0 -8
- package/dist/ssr/index.cjs +23 -42
- package/dist/ssr/index.cjs.map +1 -1
- package/dist/ssr/index.js +23 -42
- package/dist/ssr/index.js.map +1 -1
- package/dist/tc39-compat.cjs +3 -6
- package/dist/tc39-compat.cjs.map +1 -1
- package/dist/tc39-compat.d.cts +1 -1
- package/dist/tc39-compat.d.ts +1 -1
- package/dist/tc39-compat.js +1 -4
- package/dist/tc39-compat.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-3G7ET4O5.js.map +0 -1
- package/dist/chunk-6FW5E54W.cjs.map +0 -1
- package/dist/chunk-HLM5BZZQ.js +0 -35
- package/dist/chunk-HLM5BZZQ.js.map +0 -1
- package/dist/chunk-QLPCVK7C.cjs +0 -38
- package/dist/chunk-QLPCVK7C.cjs.map +0 -1
package/dist/runtime-hardened.js
CHANGED
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
import { signal, computed, effect, setActiveSub, startBatch, endBatch } from 'alien-signals';
|
|
2
2
|
|
|
3
3
|
// src/reactive/signal.ts
|
|
4
|
+
|
|
5
|
+
// src/reactive/dev.ts
|
|
6
|
+
function isDev() {
|
|
7
|
+
if (typeof process !== "undefined") {
|
|
8
|
+
return process.env?.NODE_ENV !== "production";
|
|
9
|
+
}
|
|
10
|
+
return typeof __FORMA_DEV__ !== "undefined" ? !!__FORMA_DEV__ : false;
|
|
11
|
+
}
|
|
12
|
+
isDev();
|
|
13
|
+
var _errorHandlers = /* @__PURE__ */ new Set();
|
|
14
|
+
function reportError(error, source) {
|
|
15
|
+
for (const handler of _errorHandlers) {
|
|
16
|
+
try {
|
|
17
|
+
handler(error, source ? { source } : {});
|
|
18
|
+
} catch {
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (isDev()) {
|
|
22
|
+
console.error(`[forma] ${source} error:`, error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
4
25
|
function applySignalSet(s, v, equals) {
|
|
5
26
|
if (typeof v !== "function") {
|
|
6
|
-
|
|
7
|
-
|
|
27
|
+
{
|
|
28
|
+
s(v);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
8
31
|
}
|
|
9
32
|
const prevSub = setActiveSub(void 0);
|
|
10
33
|
const prev = s();
|
|
@@ -22,8 +45,35 @@ function internalEffect(fn) {
|
|
|
22
45
|
const dispose = effect(fn);
|
|
23
46
|
return dispose;
|
|
24
47
|
}
|
|
48
|
+
var ERR = /* @__PURE__ */ Symbol("formaComputedError");
|
|
49
|
+
function isErrBox(v) {
|
|
50
|
+
return typeof v === "object" && v !== null && ERR in v;
|
|
51
|
+
}
|
|
25
52
|
function createComputed(fn) {
|
|
26
|
-
|
|
53
|
+
let errored = false;
|
|
54
|
+
let error;
|
|
55
|
+
let lastGood;
|
|
56
|
+
const raw = computed(() => {
|
|
57
|
+
try {
|
|
58
|
+
const v = fn(lastGood);
|
|
59
|
+
errored = false;
|
|
60
|
+
error = void 0;
|
|
61
|
+
lastGood = v;
|
|
62
|
+
return v;
|
|
63
|
+
} catch (e) {
|
|
64
|
+
errored = true;
|
|
65
|
+
error = e;
|
|
66
|
+
reportError(e, "computed");
|
|
67
|
+
return { [ERR]: e };
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const reader = () => {
|
|
71
|
+
const v = raw();
|
|
72
|
+
if (errored || isErrBox(v)) throw error;
|
|
73
|
+
return v;
|
|
74
|
+
};
|
|
75
|
+
Object.defineProperty(reader, "name", { value: raw.name, configurable: true });
|
|
76
|
+
return reader;
|
|
27
77
|
}
|
|
28
78
|
function batch(fn) {
|
|
29
79
|
startBatch();
|
|
@@ -605,7 +655,35 @@ function createReconciler(config) {
|
|
|
605
655
|
};
|
|
606
656
|
}
|
|
607
657
|
|
|
658
|
+
// src/security/url-safety.ts
|
|
659
|
+
var URL_IGNORED_CHARS_RE = /[\u0000-\u0020\u007F-\u009F]/g;
|
|
660
|
+
var DANGEROUS_SCHEME_RE = /^(?:javascript|vbscript|data:text\/html)/i;
|
|
661
|
+
var URL_ATTRS = /* @__PURE__ */ new Set([
|
|
662
|
+
"href",
|
|
663
|
+
"src",
|
|
664
|
+
"action",
|
|
665
|
+
"formaction",
|
|
666
|
+
"xlink:href",
|
|
667
|
+
"poster",
|
|
668
|
+
"background"
|
|
669
|
+
]);
|
|
670
|
+
function isUrlAttr(name) {
|
|
671
|
+
return URL_ATTRS.has(name.toLowerCase());
|
|
672
|
+
}
|
|
673
|
+
function isDangerousUrl(value2) {
|
|
674
|
+
const normalized = value2.replace(URL_IGNORED_CHARS_RE, "");
|
|
675
|
+
return DANGEROUS_SCHEME_RE.test(normalized);
|
|
676
|
+
}
|
|
677
|
+
function isEventHandlerAttr(name) {
|
|
678
|
+
return /^on/i.test(name);
|
|
679
|
+
}
|
|
680
|
+
|
|
608
681
|
// src/runtime.ts
|
|
682
|
+
function isUnsafeAttrBinding(name, value2) {
|
|
683
|
+
if (isEventHandlerAttr(name)) return true;
|
|
684
|
+
if (isUrlAttr(name) && isDangerousUrl(value2)) return true;
|
|
685
|
+
return false;
|
|
686
|
+
}
|
|
609
687
|
var _refetchRegistry = /* @__PURE__ */ new Map();
|
|
610
688
|
function $refetch(id) {
|
|
611
689
|
const fn = _refetchRegistry.get(id);
|
|
@@ -1570,7 +1648,12 @@ function cloneAttributeTemplates(el, item) {
|
|
|
1570
1648
|
if (attr.value.includes("{item")) {
|
|
1571
1649
|
const compiled = compileTemplate(attr.value);
|
|
1572
1650
|
entries.push({ attr: attr.name, compiled });
|
|
1573
|
-
|
|
1651
|
+
const value2 = evaluateCompiledTemplate(compiled, item);
|
|
1652
|
+
if (isUnsafeAttrBinding(attr.name, value2)) {
|
|
1653
|
+
node.removeAttribute(attr.name);
|
|
1654
|
+
} else {
|
|
1655
|
+
node.setAttribute(attr.name, value2);
|
|
1656
|
+
}
|
|
1574
1657
|
}
|
|
1575
1658
|
}
|
|
1576
1659
|
if (entries.length > 0) {
|
|
@@ -2342,7 +2425,12 @@ function bindElement(el, scope, disposers) {
|
|
|
2342
2425
|
if (val == null || val === false) {
|
|
2343
2426
|
el.removeAttribute(attrName);
|
|
2344
2427
|
} else {
|
|
2345
|
-
|
|
2428
|
+
const str = String(val);
|
|
2429
|
+
if (isUnsafeAttrBinding(attrName, str)) {
|
|
2430
|
+
el.removeAttribute(attrName);
|
|
2431
|
+
} else {
|
|
2432
|
+
el.setAttribute(attrName, str);
|
|
2433
|
+
}
|
|
2346
2434
|
}
|
|
2347
2435
|
});
|
|
2348
2436
|
disposers.push(dispose);
|