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.
Files changed (70) hide show
  1. package/dist/angular.d.ts +2 -2
  2. package/dist/angular.js +7 -7
  3. package/dist/auto.js +7 -7
  4. package/dist/{capture-JYFERAPL.js → capture-TT5WBLJ6.js} +1 -1
  5. package/dist/channel-2YPYGX3J.js +95 -0
  6. package/dist/{chunk-AKNNHQ2H.js → chunk-463H6B56.js} +5 -0
  7. package/dist/{chunk-IHTUM6LT.js → chunk-4Z77XNBR.js} +2 -2
  8. package/dist/chunk-54CBIZES.js +105 -0
  9. package/dist/{chunk-TD4S3IHA.js → chunk-5JNV45BB.js} +10 -8
  10. package/dist/{chunk-SDB5AZEI.js → chunk-C3QOBAUE.js} +2 -2
  11. package/dist/chunk-DAESKNQ6.js +207 -0
  12. package/dist/{chunk-3YXI3G34.js → chunk-K6EG7DMO.js} +16 -7
  13. package/dist/{chunk-ZAC6QQI6.js → chunk-KU6HF2EW.js} +4 -4
  14. package/dist/{chunk-I3VSKSAZ.js → chunk-KZBH5MPD.js} +29 -27
  15. package/dist/chunk-NZEQGRBL.js +93 -0
  16. package/dist/chunk-PY7P5BF4.js +404 -0
  17. package/dist/{chunk-GNHCZRQP.js → chunk-TW7KYJQ6.js} +1 -1
  18. package/dist/{chunk-AH7KNMBW.js → chunk-UYOPJ4XQ.js} +1 -1
  19. package/dist/cli.js +1522 -37
  20. package/dist/devtools.d.ts +32 -2
  21. package/dist/devtools.js +27 -12
  22. package/dist/dict.d.ts +69 -0
  23. package/dist/dict.js +8 -0
  24. package/dist/edge.d.ts +118 -0
  25. package/dist/edge.js +398 -0
  26. package/dist/element.d.ts +12 -3
  27. package/dist/element.js +7 -7
  28. package/dist/embed.js +2 -0
  29. package/dist/{events-D5gs7rff.d.ts → events-0rxFlWJJ.d.ts} +1 -1
  30. package/dist/expose-IAKYHJXF.js +15 -0
  31. package/dist/federation.d.ts +89 -0
  32. package/dist/federation.js +101 -0
  33. package/dist/hydrate-YVZDJ2V7.js +168 -0
  34. package/dist/iframe.js +7 -7
  35. package/dist/index.d.ts +4 -4
  36. package/dist/index.js +5 -5
  37. package/dist/otel.d.ts +29 -1
  38. package/dist/otel.js +13 -1
  39. package/dist/overrides-NP754HY7.js +27 -0
  40. package/dist/preact.d.ts +4 -4
  41. package/dist/preact.js +6 -6
  42. package/dist/prefetch.d.ts +25 -0
  43. package/dist/prefetch.js +178 -0
  44. package/dist/react.d.ts +3 -3
  45. package/dist/react.js +6 -6
  46. package/dist/reframe-LQL4DZYP.js +251 -0
  47. package/dist/routes.d.ts +2 -2
  48. package/dist/routes.js +5 -5
  49. package/dist/{shadow-6HELCHCJ.js → shadow-S4SKHTA7.js} +66 -5
  50. package/dist/single-spa.d.ts +40 -0
  51. package/dist/single-spa.js +52 -0
  52. package/dist/{slot-DqXTwGbs.d.ts → slot-D49L1rdU.d.ts} +1 -1
  53. package/dist/solid.d.ts +3 -3
  54. package/dist/solid.js +6 -6
  55. package/dist/{sri-JMX6JLQP.js → sri-576GTDIA.js} +41 -10
  56. package/dist/svelte.d.ts +4 -4
  57. package/dist/svelte.js +6 -6
  58. package/dist/testing.d.ts +171 -3
  59. package/dist/testing.js +193 -6
  60. package/dist/{types-Czvm-siZ.d.ts → types-DUtcF3HO.d.ts} +124 -5
  61. package/dist/vitals.d.ts +29 -0
  62. package/dist/vitals.js +152 -0
  63. package/dist/vite.d.ts +18 -0
  64. package/dist/vite.js +329 -417
  65. package/dist/vue.d.ts +3 -3
  66. package/dist/vue.js +6 -6
  67. package/package.json +170 -21
  68. package/dist/chunk-DXORSF4X.js +0 -42
  69. package/dist/expose-JUOUN5N5.js +0 -15
  70. 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