vitral 0.3.0 → 0.5.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/dist/angular.d.ts +2 -2
- package/dist/angular.js +7 -7
- package/dist/auto.js +7 -7
- package/dist/{capture-JYFERAPL.js → capture-TT5WBLJ6.js} +1 -1
- package/dist/channel-2YPYGX3J.js +95 -0
- package/dist/{chunk-AKNNHQ2H.js → chunk-463H6B56.js} +5 -0
- package/dist/{chunk-IHTUM6LT.js → chunk-4Z77XNBR.js} +2 -2
- package/dist/chunk-54CBIZES.js +105 -0
- package/dist/{chunk-TD4S3IHA.js → chunk-5JNV45BB.js} +10 -8
- package/dist/{chunk-SDB5AZEI.js → chunk-C3QOBAUE.js} +2 -2
- package/dist/chunk-DAESKNQ6.js +207 -0
- package/dist/{chunk-3YXI3G34.js → chunk-K6EG7DMO.js} +16 -7
- package/dist/{chunk-ZAC6QQI6.js → chunk-KU6HF2EW.js} +4 -4
- package/dist/{chunk-I3VSKSAZ.js → chunk-KZBH5MPD.js} +29 -27
- package/dist/chunk-NZEQGRBL.js +93 -0
- package/dist/chunk-PY7P5BF4.js +404 -0
- package/dist/{chunk-GNHCZRQP.js → chunk-TW7KYJQ6.js} +1 -1
- package/dist/{chunk-AH7KNMBW.js → chunk-UYOPJ4XQ.js} +1 -1
- package/dist/cli.js +1522 -37
- package/dist/devtools.d.ts +32 -2
- package/dist/devtools.js +27 -12
- package/dist/dict.d.ts +69 -0
- package/dist/dict.js +8 -0
- package/dist/edge.d.ts +118 -0
- package/dist/edge.js +398 -0
- package/dist/element.d.ts +12 -3
- package/dist/element.js +7 -7
- package/dist/embed.js +2 -0
- package/dist/{events-D5gs7rff.d.ts → events-0rxFlWJJ.d.ts} +1 -1
- package/dist/expose-IAKYHJXF.js +15 -0
- package/dist/federation.d.ts +89 -0
- package/dist/federation.js +101 -0
- package/dist/hydrate-YVZDJ2V7.js +168 -0
- package/dist/iframe.js +7 -7
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/otel.d.ts +29 -1
- package/dist/otel.js +13 -1
- package/dist/overrides-NP754HY7.js +27 -0
- package/dist/preact.d.ts +4 -4
- package/dist/preact.js +6 -6
- package/dist/prefetch.d.ts +25 -0
- package/dist/prefetch.js +178 -0
- package/dist/react.d.ts +3 -3
- package/dist/react.js +6 -6
- package/dist/reframe-LQL4DZYP.js +251 -0
- package/dist/routes.d.ts +2 -2
- package/dist/routes.js +5 -5
- package/dist/{shadow-6HELCHCJ.js → shadow-S4SKHTA7.js} +66 -5
- package/dist/single-spa.d.ts +40 -0
- package/dist/single-spa.js +52 -0
- package/dist/{slot-DqXTwGbs.d.ts → slot-D49L1rdU.d.ts} +1 -1
- package/dist/solid.d.ts +3 -3
- package/dist/solid.js +6 -6
- package/dist/{sri-JMX6JLQP.js → sri-576GTDIA.js} +41 -10
- package/dist/svelte.d.ts +4 -4
- package/dist/svelte.js +6 -6
- package/dist/testing.d.ts +171 -3
- package/dist/testing.js +193 -6
- package/dist/{types-Czvm-siZ.d.ts → types-DUtcF3HO.d.ts} +124 -5
- package/dist/vitals.d.ts +29 -0
- package/dist/vitals.js +152 -0
- package/dist/vite.d.ts +18 -0
- package/dist/vite.js +329 -417
- package/dist/vue.d.ts +3 -3
- package/dist/vue.js +6 -6
- package/package.json +170 -21
- package/dist/chunk-DXORSF4X.js +0 -42
- package/dist/expose-JUOUN5N5.js +0 -15
- package/dist/overrides-NZAIUGK5.js +0 -15
package/dist/vitals.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
mounted
|
|
3
|
+
} from "./chunk-463H6B56.js";
|
|
4
|
+
import "./chunk-GNPFWISJ.js";
|
|
5
|
+
|
|
6
|
+
// src/vitals.ts
|
|
7
|
+
var LIMITS = {
|
|
8
|
+
LCP: [2500, 4e3],
|
|
9
|
+
CLS: [0.1, 0.25],
|
|
10
|
+
INP: [200, 500],
|
|
11
|
+
FCP: [1800, 3e3],
|
|
12
|
+
TTFB: [800, 1800]
|
|
13
|
+
};
|
|
14
|
+
var rating = (name, value) => value <= LIMITS[name][0] ? "good" : value <= LIMITS[name][1] ? "needs-improvement" : "poor";
|
|
15
|
+
function owner(node) {
|
|
16
|
+
while (node) {
|
|
17
|
+
const el = node.nodeType === 1 ? node : node.parentElement;
|
|
18
|
+
const root = el?.closest("[data-vitral-root]");
|
|
19
|
+
if (root) return root.getAttribute("data-vitral-root");
|
|
20
|
+
node = (el ?? node).getRootNode().host;
|
|
21
|
+
}
|
|
22
|
+
return "";
|
|
23
|
+
}
|
|
24
|
+
function vitals({ onReport }) {
|
|
25
|
+
if (typeof PerformanceObserver == "undefined") return () => {
|
|
26
|
+
};
|
|
27
|
+
const types = PerformanceObserver.supportedEntryTypes ?? [];
|
|
28
|
+
const soft = types.includes("soft-navigation");
|
|
29
|
+
const navs = /* @__PURE__ */ new Map();
|
|
30
|
+
const done = /* @__PURE__ */ new Set();
|
|
31
|
+
const routes = /* @__PURE__ */ new Map();
|
|
32
|
+
const versions = /* @__PURE__ */ new Map();
|
|
33
|
+
const observers = [];
|
|
34
|
+
const send = (name, value, nav, who2 = "") => {
|
|
35
|
+
const key = name + "|" + who2;
|
|
36
|
+
if (nav.sent.get(key) === value) return;
|
|
37
|
+
nav.sent.set(key, value);
|
|
38
|
+
const report = { name, route: routes.get(nav.id)?.[0] ?? nav.route, value, rating: rating(name, value) };
|
|
39
|
+
if (who2) report.remote = who2, report.version = versions.get(who2);
|
|
40
|
+
if (nav.id !== void 0) report.navigationId = nav.id;
|
|
41
|
+
if (report.version === void 0) delete report.version;
|
|
42
|
+
try {
|
|
43
|
+
onReport(report);
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const flush = (nav) => {
|
|
48
|
+
const start = routes.get(nav.id)?.[1] ?? nav.start;
|
|
49
|
+
if (nav.lcp) send("LCP", Math.max(0, nav.lcp[0] - start), nav, nav.lcp[1]);
|
|
50
|
+
for (const [who2, s] of nav.cls) send("CLS", s.max, nav, who2);
|
|
51
|
+
for (const [who2, list] of nav.inp) {
|
|
52
|
+
const all2 = [...list.values()].sort((a, b) => b - a);
|
|
53
|
+
send("INP", all2[Math.min(all2.length - 1, Math.floor(all2.length / 50))], nav, who2);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const navOf = (e) => {
|
|
57
|
+
const id = soft && e.navigationId != null ? String(e.navigationId) : void 0;
|
|
58
|
+
const key = id ?? "r:" + location.pathname;
|
|
59
|
+
if (done.has(key)) return;
|
|
60
|
+
let nav = navs.get(key);
|
|
61
|
+
if (!nav) {
|
|
62
|
+
for (const [k, old] of navs) flush(old), navs.delete(k), old.id !== void 0 && done.add(k);
|
|
63
|
+
navs.set(key, nav = { id, route: location.pathname, start: 0, cls: /* @__PURE__ */ new Map(), inp: /* @__PURE__ */ new Map(), sent: /* @__PURE__ */ new Map() });
|
|
64
|
+
}
|
|
65
|
+
return nav;
|
|
66
|
+
};
|
|
67
|
+
const who = (node) => {
|
|
68
|
+
const name = owner(node);
|
|
69
|
+
if (name && !versions.has(name)) versions.set(name, mounted.get(name)?.version);
|
|
70
|
+
return name;
|
|
71
|
+
};
|
|
72
|
+
const handle = (e) => {
|
|
73
|
+
switch (e.entryType) {
|
|
74
|
+
case "soft-navigation": {
|
|
75
|
+
routes.set(String(e.navigationId), [new URL(e.name, location.href).pathname, e.startTime]);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
case "navigation": {
|
|
79
|
+
if (e.navigationId != null && soft) routes.set(String(e.navigationId), [new URL(e.name, location.href).pathname, 0]);
|
|
80
|
+
const nav = navOf(e);
|
|
81
|
+
if (nav && e.responseStart > 0) send("TTFB", Math.max(0, e.responseStart - (e.activationStart ?? 0)), nav);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
case "paint": {
|
|
85
|
+
const nav = e.name == "first-contentful-paint" && navOf(e);
|
|
86
|
+
if (nav) send("FCP", Math.max(0, e.startTime - (activation() ?? 0)), nav);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
case "largest-contentful-paint": {
|
|
90
|
+
const nav = navOf(e);
|
|
91
|
+
if (nav) nav.lcp = [e.startTime, who(e.element)];
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
case "layout-shift": {
|
|
95
|
+
if (e.hadRecentInput) return;
|
|
96
|
+
const nav = navOf(e);
|
|
97
|
+
if (!nav) return;
|
|
98
|
+
let big;
|
|
99
|
+
let area = -1;
|
|
100
|
+
for (const s2 of e.sources ?? []) {
|
|
101
|
+
const r = s2.currentRect ?? s2.previousRect;
|
|
102
|
+
const a = r ? r.width * r.height : 0;
|
|
103
|
+
if (a > area) area = a, big = s2.node;
|
|
104
|
+
}
|
|
105
|
+
const name = who(big);
|
|
106
|
+
const t = e.startTime;
|
|
107
|
+
const s = nav.cls.get(name);
|
|
108
|
+
if (s && t - s.last < 1e3 && t - s.first < 5e3) s.current += e.value;
|
|
109
|
+
else if (s) s.current = e.value, s.first = t;
|
|
110
|
+
if (s) s.last = t, s.max = Math.max(s.max, s.current);
|
|
111
|
+
else nav.cls.set(name, { first: t, last: t, current: e.value, max: e.value });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
case "event": {
|
|
115
|
+
if (!e.interactionId) return;
|
|
116
|
+
const nav = navOf(e);
|
|
117
|
+
if (!nav) return;
|
|
118
|
+
const name = who(e.target);
|
|
119
|
+
const list = nav.inp.get(name) ?? /* @__PURE__ */ new Map();
|
|
120
|
+
nav.inp.set(name, list);
|
|
121
|
+
list.set(e.interactionId, Math.max(list.get(e.interactionId) ?? 0, e.duration));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const activation = () => performance.getEntriesByType?.("navigation")[0]?.activationStart;
|
|
126
|
+
for (const type of ["soft-navigation", "navigation", "paint", "largest-contentful-paint", "layout-shift", "event"]) {
|
|
127
|
+
if (!types.includes(type)) continue;
|
|
128
|
+
try {
|
|
129
|
+
const o = new PerformanceObserver((list) => list.getEntries().forEach((e) => handle(e)));
|
|
130
|
+
o.observe({ type, buffered: true, durationThreshold: 40, includeSoftNavigationObservations: true });
|
|
131
|
+
observers.push(o);
|
|
132
|
+
} catch {
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const all = () => {
|
|
136
|
+
for (const o of observers) o.takeRecords().forEach((e) => handle(e));
|
|
137
|
+
navs.forEach(flush);
|
|
138
|
+
};
|
|
139
|
+
const hidden = () => document.visibilityState == "hidden" && all();
|
|
140
|
+
document.addEventListener("visibilitychange", hidden);
|
|
141
|
+
return () => {
|
|
142
|
+
document.removeEventListener("visibilitychange", hidden);
|
|
143
|
+
all();
|
|
144
|
+
observers.forEach((o) => o.disconnect());
|
|
145
|
+
observers.length = 0;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export {
|
|
149
|
+
owner,
|
|
150
|
+
rating,
|
|
151
|
+
vitals
|
|
152
|
+
};
|
package/dist/vite.d.ts
CHANGED
|
@@ -80,6 +80,24 @@ interface VitralViteOptions extends CssBuildOptions {
|
|
|
80
80
|
contract?: {
|
|
81
81
|
version?: string;
|
|
82
82
|
};
|
|
83
|
+
/**
|
|
84
|
+
* Gera `sbom.cdx.json` (CycloneDX 1.6) com os pacotes npm que entraram no
|
|
85
|
+
* bundle, e o `vitral.json` aponta para ele em `sbom`. Padrão: false.
|
|
86
|
+
*/
|
|
87
|
+
sbom?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* `'mcp-app'`: o build gera só `mcp-app.html`, um HTML único com o JS e o
|
|
90
|
+
* CSS inline, para um servidor MCP servir como recurso `ui://` (MCP Apps).
|
|
91
|
+
* As notificações do host viram props e `ctx.events.emit` vira mensagem
|
|
92
|
+
* para o host. Não combina com `exposes`, `dedupe` nem `shared`.
|
|
93
|
+
*/
|
|
94
|
+
target?: 'mcp-app';
|
|
95
|
+
/**
|
|
96
|
+
* Grava o build em uma pasta por versão (`dist/1.5.0/`), para publicar
|
|
97
|
+
* cada versão sem apagar as anteriores e escolher qual vale num canal
|
|
98
|
+
* (`canal.json`). Usa `version` (ou a do package.json). Padrão: false.
|
|
99
|
+
*/
|
|
100
|
+
versionDir?: boolean;
|
|
83
101
|
}
|
|
84
102
|
declare function vitral(options?: VitralViteOptions): Plugin;
|
|
85
103
|
|