vitral 0.2.0 → 0.4.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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/angular.d.ts +3 -2
  3. package/dist/angular.js +7 -6
  4. package/dist/auto.js +7 -6
  5. package/dist/capture-TT5WBLJ6.js +42 -0
  6. package/dist/channel-2YPYGX3J.js +95 -0
  7. package/dist/chunk-463H6B56.js +50 -0
  8. package/dist/chunk-54CBIZES.js +105 -0
  9. package/dist/chunk-6EX5KYT5.js +64 -0
  10. package/dist/{chunk-6Y3VMWHH.js → chunk-BCC25ANK.js} +11 -5
  11. package/dist/{chunk-2XF5BKV3.js → chunk-EMSB2NVX.js} +26 -13
  12. package/dist/{chunk-HP6QWU6K.js → chunk-IH3ZT3QU.js} +2 -2
  13. package/dist/{chunk-PX7PBCCT.js → chunk-TW7KYJQ6.js} +7 -17
  14. package/dist/{chunk-S5MZT5IT.js → chunk-UYOPJ4XQ.js} +1 -1
  15. package/dist/{chunk-UTYAX6MU.js → chunk-W6322KGP.js} +2 -2
  16. package/dist/{chunk-NCONW6WS.js → chunk-WD4CDGDZ.js} +73 -44
  17. package/dist/cli.js +1196 -31
  18. package/dist/contract-46EZFQPQ.js +17 -0
  19. package/dist/{dedupe-IWFIXRWG.js → dedupe-S7BHQMOZ.js} +4 -3
  20. package/dist/devtools.d.ts +32 -2
  21. package/dist/devtools.js +27 -12
  22. package/dist/element.d.ts +13 -4
  23. package/dist/element.js +7 -6
  24. package/dist/embed.js +2 -0
  25. package/dist/{errors-KKB8FGCz.d.ts → errors-kjBv6IH_.d.ts} +7 -1
  26. package/dist/{events-DUdjhfps.d.ts → events-Dkpkw_Sv.d.ts} +1 -1
  27. package/dist/expose-OVWTPHH5.js +15 -0
  28. package/dist/federation.d.ts +89 -0
  29. package/dist/federation.js +101 -0
  30. package/dist/iframe.d.ts +1 -1
  31. package/dist/iframe.js +13 -10
  32. package/dist/index.d.ts +23 -21
  33. package/dist/index.js +5 -4
  34. package/dist/otel.d.ts +44 -0
  35. package/dist/otel.js +27 -0
  36. package/dist/overrides-NP754HY7.js +27 -0
  37. package/dist/preact.d.ts +5 -5
  38. package/dist/preact.js +6 -5
  39. package/dist/react.d.ts +12 -4
  40. package/dist/react.js +11 -6
  41. package/dist/routes.d.ts +3 -3
  42. package/dist/routes.js +5 -4
  43. package/dist/sentry.d.ts +25 -0
  44. package/dist/sentry.js +11 -0
  45. package/dist/shadow-PVSETNMZ.js +159 -0
  46. package/dist/single-spa.d.ts +40 -0
  47. package/dist/single-spa.js +52 -0
  48. package/dist/{slot-pB276oPt.d.ts → slot-UPg6ob9v.d.ts} +2 -2
  49. package/dist/solid.d.ts +4 -4
  50. package/dist/solid.js +6 -5
  51. package/dist/{sri-BVKZNX5Q.js → sri-M7ZRU57G.js} +43 -11
  52. package/dist/svelte.d.ts +5 -5
  53. package/dist/svelte.js +6 -5
  54. package/dist/testing.d.ts +2 -1
  55. package/dist/testing.js +5 -4
  56. package/dist/{types-BV-hUrms.d.ts → types-CA2p9KHC.d.ts} +174 -4
  57. package/dist/vite.d.ts +26 -0
  58. package/dist/vite.js +686 -51
  59. package/dist/vue.d.ts +11 -4
  60. package/dist/vue.js +10 -5
  61. package/package.json +115 -23
  62. package/dist/chunk-DXORSF4X.js +0 -42
  63. package/dist/chunk-SFL6LTP3.js +0 -56
  64. package/dist/expose-53BEJB34.js +0 -14
  65. package/dist/overrides-NZAIUGK5.js +0 -15
  66. package/dist/shadow-MYRJQLLY.js +0 -72
@@ -3,15 +3,21 @@ import {
3
3
  loadFile,
4
4
  registerSrc,
5
5
  resolveEntry
6
- } from "./chunk-2XF5BKV3.js";
6
+ } from "./chunk-EMSB2NVX.js";
7
7
  import {
8
8
  injectStyles
9
- } from "./chunk-SFL6LTP3.js";
9
+ } from "./chunk-6EX5KYT5.js";
10
+ import {
11
+ metric
12
+ } from "./chunk-TW7KYJQ6.js";
10
13
  import {
11
14
  RemoteError,
15
+ ctxHooks,
16
+ fail,
12
17
  isRemoteError,
13
- metric
14
- } from "./chunk-PX7PBCCT.js";
18
+ mounted,
19
+ report
20
+ } from "./chunk-463H6B56.js";
15
21
  import {
16
22
  protocol
17
23
  } from "./chunk-GNPFWISJ.js";
@@ -42,9 +48,6 @@ function scopedEvents() {
42
48
  };
43
49
  }
44
50
 
45
- // src/core/hooks.ts
46
- var ctxHooks = {};
47
-
48
51
  // src/core/navigate.ts
49
52
  function navigate(url, options = {}) {
50
53
  const target = new URL(url, location.href);
@@ -60,27 +63,44 @@ function navigate(url, options = {}) {
60
63
 
61
64
  // src/core/updates.ts
62
65
  var versions = /* @__PURE__ */ new Map();
63
- function track(name, entry) {
64
- versions.set(name, entry);
66
+ var live = /* @__PURE__ */ new Map();
67
+ function track(name, loaded) {
68
+ versions.set(name, loaded.entry);
69
+ mounted.set(name, loaded);
70
+ live.set(name, (live.get(name) ?? 0) + 1);
71
+ return () => {
72
+ const n = live.get(name) - 1;
73
+ if (n) live.set(name, n);
74
+ else live.delete(name), versions.delete(name), mounted.delete(name);
75
+ };
65
76
  }
77
+ var swaps = null;
66
78
  async function refresh(name) {
67
79
  const p = protocol();
68
80
  await p.pending();
69
81
  const entry = p.entry(name);
70
82
  if (entry) p.register(name, entry);
71
83
  await loadFile(name);
84
+ const started = swaps = [];
72
85
  events.emit("vitral:refresh", name);
86
+ swaps = null;
87
+ await Promise.all(started);
73
88
  }
74
89
  function refreshable(current, name, props, remount) {
90
+ let gen = 0;
75
91
  const off = events.on("vitral:refresh", (n) => {
76
- if (n === name || name.startsWith(n + "/")) {
77
- remount(props).then((next) => {
78
- const old = current;
79
- if (old.unmount === noop) return next.unmount();
80
- current = next;
81
- old.unmount();
82
- }, console.error);
83
- }
92
+ if (n !== name && !name.startsWith(n + "/")) return;
93
+ const mine = ++gen;
94
+ const used = props;
95
+ const swap = remount(used).then((next) => {
96
+ if (current.unmount === noop || mine !== gen) return next.unmount();
97
+ const old = current;
98
+ current = next;
99
+ old.unmount();
100
+ if (props !== used) next.update?.(props);
101
+ });
102
+ if (swaps) swaps.push(swap);
103
+ else swap.catch(console.error);
84
104
  });
85
105
  return {
86
106
  update(next) {
@@ -99,10 +119,13 @@ var noop = () => {
99
119
  async function checkUpdates() {
100
120
  const p = protocol();
101
121
  const found = [];
102
- const { splitName } = await import("./expose-53BEJB34.js");
122
+ const { splitName } = await import("./expose-OVWTPHH5.js");
103
123
  const remotes = /* @__PURE__ */ new Map();
104
- for (const [name, entry] of versions) remotes.set(splitName(name)[0], entry);
105
- versions.clear();
124
+ for (const name of live.keys()) {
125
+ const root = splitName(name)[0];
126
+ const entry = versions.get(root) ?? versions.get(name);
127
+ if (entry) remotes.set(root, entry);
128
+ }
106
129
  for (const [name, entry] of remotes) versions.set(name, entry);
107
130
  await Promise.all(
108
131
  [...remotes].map(
@@ -141,26 +164,28 @@ async function mountOnce(target, name, props, options) {
141
164
  const p = protocol();
142
165
  await p.pending();
143
166
  if ((options.isolate ?? registered(name)?.isolate ?? p.settings().isolate) === "iframe") {
144
- if (!frames) throw new RemoteError("MOUNT_FAILED", name, 'isolate="iframe" precisa de enableIframe(), de vitral/iframe');
145
- return frames(target, name, props, options);
167
+ if (!frames) throw report(new RemoteError("MOUNT_FAILED", name, 'isolate="iframe" precisa de enableIframe(), de vitral/iframe'));
168
+ return frames(target, name, props, options).catch(fail);
146
169
  }
147
170
  const { module: mod, ...resolved } = await load(name, options.isolate, options.priority);
148
- track(name, resolved.entry);
171
+ const untrack = track(name, resolved);
172
+ ctxHooks.watch?.(name);
149
173
  const isolate = options.isolate ?? resolved.isolate ?? protocol().settings().isolate;
150
174
  const label = resolved.name ?? name;
151
- let shadowRoot = null;
152
- const el = document.createElement("div");
153
- el.setAttribute("data-vitral-root", label);
154
- if (resolved.scope) el.setAttribute("data-vitral-scope", resolved.scope);
155
- el.style.display = "contents";
156
- if (isolate === "shadow") {
157
- shadowRoot = target.shadowRoot ?? target.attachShadow({ mode: "open" });
158
- shadowRoot.appendChild(el);
159
- } else {
160
- target.appendChild(el);
161
- }
175
+ const make = (options2) => {
176
+ const el2 = document.createElement("div", options2);
177
+ el2.setAttribute("data-vitral-root", label);
178
+ if (resolved.scope) el2.setAttribute("data-vitral-scope", resolved.scope);
179
+ el2.style.display = "contents";
180
+ return el2;
181
+ };
162
182
  let t = performance.now();
163
- const release = await injectStyles(resolved.css, shadowRoot, el, options.styles, resolved.sri);
183
+ const [release, portal = document.body, shadowRoot = null, registry = customElements, el = target.appendChild(make())] = await injectStyles(
184
+ resolved,
185
+ isolate === "shadow" && target,
186
+ make,
187
+ options.styles
188
+ );
164
189
  metric(name, "css", t);
165
190
  t = performance.now();
166
191
  const scoped = scopedEvents();
@@ -170,8 +195,10 @@ async function mountOnce(target, name, props, options) {
170
195
  baseUrl: new URL(".", resolved.entry).href,
171
196
  events: scoped.bus,
172
197
  shadowRoot,
198
+ portalContainer: portal,
199
+ customElements: registry,
173
200
  reportError(e) {
174
- const err = isRemoteError(e) ? e : new RemoteError("RENDER_FAILED", label, String(e?.message ?? e), e);
201
+ const err = report(isRemoteError(e) ? e : new RemoteError("RENDER_FAILED", label, String(e?.message ?? e), e), resolved);
175
202
  if (options.onError) options.onError(err);
176
203
  else console.error(err);
177
204
  },
@@ -181,27 +208,29 @@ async function mountOnce(target, name, props, options) {
181
208
  onDeactivate: on("vitral:deactivate")
182
209
  };
183
210
  if (ctxHooks.shared) ctx.shared = ctxHooks.shared(name, scoped.track);
184
- let mounted;
211
+ let mounted2;
185
212
  try {
186
- mounted = await mod.mount(el, props, ctx);
213
+ mounted2 = await mod.mount(el, props, ctx);
187
214
  metric(name, "mount", t);
188
215
  } catch (e) {
216
+ untrack();
189
217
  scoped.dispose();
190
218
  release();
191
219
  el.remove();
192
- throw new RemoteError("MOUNT_FAILED", label, "erro ao montar", e);
220
+ throw report(new RemoteError("MOUNT_FAILED", label, "erro ao montar", e), resolved);
193
221
  }
194
222
  let alive = true;
195
223
  return {
196
224
  update(next) {
197
- if (alive) mounted.update?.(next);
225
+ if (alive) mounted2.update?.(next);
198
226
  },
199
227
  unmount() {
200
228
  if (!alive) return;
201
229
  alive = false;
202
230
  try {
203
- mounted.unmount();
231
+ mounted2.unmount();
204
232
  } finally {
233
+ untrack();
205
234
  scoped.dispose();
206
235
  release();
207
236
  el.remove();
@@ -244,17 +273,17 @@ function createSlot(target, options) {
244
273
  holder.setAttribute("data-vitral-slot", name);
245
274
  target.appendChild(holder);
246
275
  setStatus("loading");
247
- const fail = (e) => {
276
+ const fail2 = (e) => {
248
277
  if (my !== token) return;
249
278
  setStatus("error", isRemoteError(e) ? e : new RemoteError("MOUNT_FAILED", name, String(e), e));
250
279
  };
251
280
  const initial = props;
252
- mountRemote(holder, name, props, { isolate, priority: options.priority, styles: options.styles, onError: fail }).then((h) => {
281
+ mountRemote(holder, name, props, { isolate, priority: options.priority, styles: options.styles, onError: fail2 }).then((h) => {
253
282
  if (my !== token) return h.unmount();
254
283
  handle2 = h;
255
284
  if (props !== initial) h.update?.(props);
256
285
  setStatus("ready");
257
- }, fail);
286
+ }, fail2);
258
287
  };
259
288
  mount();
260
289
  return {