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/edge.js ADDED
@@ -0,0 +1,398 @@
1
+ // src/edge/rewriter.ts
2
+ var RAW = /* @__PURE__ */ new Set(["script", "style", "textarea", "title"]);
3
+ var VOID = /* @__PURE__ */ new Set(["area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "source", "track", "wbr"]);
4
+ var ATTR = /([^\s"'<>/=]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/g;
5
+ function decodeEntities(s) {
6
+ return s.replace(/&(#x[\da-f]+|#\d+|quot|amp|lt|gt|apos|#39);/gi, (_, e) => {
7
+ const k = e.toLowerCase();
8
+ if (k[0] === "#") return String.fromCodePoint(k[1] === "x" ? parseInt(k.slice(2), 16) : Number(k.slice(1)));
9
+ return { quot: '"', amp: "&", lt: "<", gt: ">", apos: "'" }[k];
10
+ });
11
+ }
12
+ var escapeAttr = (s) => s.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
13
+ var Tag = class {
14
+ constructor(tagName, raw) {
15
+ this.tagName = tagName;
16
+ this.raw = raw;
17
+ const inner = raw.slice(1 + tagName.length, raw.endsWith("/>") ? -2 : -1);
18
+ for (const m of inner.matchAll(ATTR)) this.#attrs.push([m[1].toLowerCase(), m[2] ?? m[3] ?? m[4] ?? null]);
19
+ }
20
+ // Valor cru (como veio, igual ao `HTMLRewriter`) e se foi trocado.
21
+ #attrs = [];
22
+ #changed = false;
23
+ #after = "";
24
+ getAttribute(name) {
25
+ const a = this.#attrs.find(([k]) => k === name);
26
+ return a ? a[1] ?? "" : null;
27
+ }
28
+ hasAttribute(name) {
29
+ return this.getAttribute(name) !== null;
30
+ }
31
+ setAttribute(name, value) {
32
+ this.#changed = true;
33
+ const a = this.#attrs.find(([k]) => k === name);
34
+ if (a) a[1] = value, a[2] = true;
35
+ else this.#attrs.push([name, value, true]);
36
+ }
37
+ prepend(content, options) {
38
+ this.#after = (options?.html ? content : escapeAttr(content).replace(/>/g, "&gt;")) + this.#after;
39
+ }
40
+ toString() {
41
+ const tag = this.#changed ? `<${this.tagName}${this.#attrs.map(([k, v, set]) => v === null ? ` ${k}` : ` ${k}="${set ? escapeAttr(v) : v.replace(/"/g, "&quot;")}"`).join("")}${this.raw.endsWith("/>") ? " /" : ""}>` : this.raw;
42
+ return tag + this.#after;
43
+ }
44
+ };
45
+ function rewrite(body, tag, handlers) {
46
+ const decoder = new TextDecoder();
47
+ const encoder = new TextEncoder();
48
+ let buf = "";
49
+ let raw = null;
50
+ let depth = -1;
51
+ async function process(out, end) {
52
+ let text = "";
53
+ let i = 0;
54
+ const flush = () => text && (out.enqueue(encoder.encode(text)), text = "");
55
+ for (; ; ) {
56
+ const lt = buf.indexOf("<", i);
57
+ if (lt < 0) {
58
+ text += buf.slice(i);
59
+ i = buf.length;
60
+ break;
61
+ }
62
+ text += buf.slice(i, lt);
63
+ i = lt;
64
+ if (raw) {
65
+ const close2 = buf.slice(lt, lt + raw.length + 2).toLowerCase();
66
+ if (close2.length < raw.length + 2 && !end) break;
67
+ if (close2 === `</${raw}`) raw = null;
68
+ else {
69
+ text += "<";
70
+ i = lt + 1;
71
+ continue;
72
+ }
73
+ }
74
+ if (!end && buf.length - lt < 4 && "<!--".startsWith(buf.slice(lt))) break;
75
+ if (buf.startsWith("<!--", lt)) {
76
+ const stop = buf.indexOf("-->", lt + 4);
77
+ if (stop < 0) {
78
+ if (!end) break;
79
+ text += buf.slice(lt);
80
+ i = buf.length;
81
+ break;
82
+ }
83
+ text += buf.slice(lt, stop + 3);
84
+ i = stop + 3;
85
+ continue;
86
+ }
87
+ const m = /^<(\/?)([a-zA-Z][^\s/>]*)/.exec(buf.slice(lt, lt + 64));
88
+ if (!m) {
89
+ if (buf.length - lt < 3 && !end) break;
90
+ text += "<";
91
+ i = lt + 1;
92
+ continue;
93
+ }
94
+ const close = findTagEnd(buf, lt);
95
+ if (close < 0) {
96
+ if (!end) break;
97
+ text += buf.slice(lt);
98
+ i = buf.length;
99
+ break;
100
+ }
101
+ const source = buf.slice(lt, close + 1);
102
+ i = close + 1;
103
+ const name = m[2].toLowerCase();
104
+ if (m[1]) {
105
+ if (depth > 0 && !VOID.has(name)) depth--;
106
+ else if (depth === 0 && name === tag) depth = -1;
107
+ text += source;
108
+ continue;
109
+ }
110
+ if (RAW.has(name)) raw = name;
111
+ const selfClosing = source.endsWith("/>") || VOID.has(name);
112
+ if (name === tag && depth < 0) {
113
+ const el = new Tag(name, source);
114
+ const r = handlers.element(el);
115
+ if (r) flush(), await r;
116
+ text += el;
117
+ if (!selfClosing) depth = 0;
118
+ continue;
119
+ }
120
+ if (depth === 0 && handlers.child) {
121
+ const el = new Tag(name, source);
122
+ handlers.child(el);
123
+ text += el;
124
+ } else text += source;
125
+ if (depth >= 0 && !selfClosing) depth++;
126
+ }
127
+ buf = buf.slice(i);
128
+ flush();
129
+ }
130
+ return body.pipeThrough(
131
+ new TransformStream({
132
+ async transform(chunk, out) {
133
+ buf += decoder.decode(chunk, { stream: true });
134
+ await process(out, false);
135
+ },
136
+ async flush(out) {
137
+ buf += decoder.decode();
138
+ await process(out, true);
139
+ if (buf) out.enqueue(encoder.encode(buf));
140
+ }
141
+ })
142
+ );
143
+ }
144
+ function findTagEnd(s, start) {
145
+ let quote = "";
146
+ for (let i = start + 1; i < s.length; i++) {
147
+ const c = s[i];
148
+ if (quote) {
149
+ if (c === quote) quote = "";
150
+ } else if (c === '"' || c === "'") quote = c;
151
+ else if (c === ">") return i;
152
+ }
153
+ return -1;
154
+ }
155
+
156
+ // src/edge.ts
157
+ var STALE = ["content-encoding", "content-length", "transfer-encoding", "connection", "keep-alive"];
158
+ var MAX_PAGES = 1e3;
159
+ function gateway(options) {
160
+ const prefix = options.prefix ?? "/_vitral/";
161
+ const origin = new URL(options.origin);
162
+ const send = options.fetch ?? ((r) => fetch(r));
163
+ const ttl = options.ttl ?? 6e4;
164
+ const onError = options.onError ?? ((e, name) => console.error(`[vitral] SSR de ${name} falhou:`, e));
165
+ const remotes = /* @__PURE__ */ new Map();
166
+ for (const [name, value] of Object.entries(options.remotes)) {
167
+ const r = typeof value === "string" ? { url: value } : value;
168
+ const url = new URL(r.url).href;
169
+ remotes.set(name, { ...r, name, url, base: new URL(".", url).href });
170
+ }
171
+ const local = (r, abs) => abs.startsWith(r.base) ? `${prefix}${encodeURIComponent(r.name)}/${abs.slice(r.base.length)}` : abs;
172
+ const cache = /* @__PURE__ */ new Map();
173
+ function cached(key, load) {
174
+ const hit = cache.get(key);
175
+ if (hit && Date.now() - hit.at < ttl) return hit.value;
176
+ const value = load();
177
+ value.catch(() => cache.get(key)?.value === value && cache.delete(key));
178
+ cache.set(key, { at: Date.now(), value });
179
+ return value;
180
+ }
181
+ const get = async (url) => {
182
+ const res = await send(new Request(url));
183
+ if (!res.ok) throw new Error(`HTTP ${res.status} em ${url}`);
184
+ return res;
185
+ };
186
+ const manifest = (r) => cached(`m ${r.url}`, async () => {
187
+ if (!new URL(r.url).pathname.endsWith(".json")) return { name: r.name, entry: r.url };
188
+ const m = await (await get(r.url)).json();
189
+ return m.stable || typeof m.entry !== "string" ? null : m;
190
+ });
191
+ const cssText = (url, integrity) => cached(`c ${url} ${integrity ?? ""}`, async () => {
192
+ const bytes = await (await get(url)).arrayBuffer();
193
+ if (integrity && !await matches(bytes, integrity)) throw new Error(`integrity n\xE3o confere em ${url}`);
194
+ return new TextDecoder().decode(bytes);
195
+ });
196
+ const seen = /* @__PURE__ */ new Map();
197
+ const remember = (path, found) => {
198
+ seen.delete(path);
199
+ seen.set(path, found);
200
+ if (seen.size > MAX_PAGES) seen.delete(seen.keys().next().value);
201
+ };
202
+ async function hints(request) {
203
+ const url = new URL(request.url);
204
+ if (url.pathname.startsWith(prefix)) return [];
205
+ const names = new Map(seen.get(url.pathname));
206
+ for (const name of options.preload?.(url) ?? []) if (!names.has(name)) names.set(name, remotes.get(name)?.isolate ?? options.isolate ?? "none");
207
+ const links = await Promise.all([...names].map(([name, isolate]) => linksFor(name, isolate)));
208
+ return links.flat();
209
+ }
210
+ async function linksFor(name, isolate) {
211
+ const r = remotes.get(name);
212
+ const m = r && await manifest(r).catch(() => null);
213
+ if (!r || !m) return [];
214
+ const { abs } = paths(r, m);
215
+ const js = m.split ? [m.split.entry, ...m.split.chunks ?? []] : [m.entry];
216
+ const hashed = !!m.integrity || Object.keys(m.files ?? {}).length > 0;
217
+ const out = js.map((u) => `<${local(r, abs(u))}>; ${hashed ? "rel=preload; as=fetch; crossorigin=anonymous" : "rel=modulepreload"}`);
218
+ for (const u of m.css ?? []) out.push(`<${local(r, abs(u))}>; rel=preload; as=${isolate === "shadow" ? "fetch" : "style"}; crossorigin=anonymous`);
219
+ return out;
220
+ }
221
+ async function asset(request, url) {
222
+ const rest = url.pathname.slice(prefix.length);
223
+ const slash = rest.indexOf("/");
224
+ const r = slash > 0 ? remotes.get(decodeURIComponent(rest.slice(0, slash))) : void 0;
225
+ const target = r && new URL(rest.slice(slash + 1) + url.search, r.base);
226
+ if (!r || !target.href.startsWith(r.base)) return new Response("remote n\xE3o encontrado", { status: 404 });
227
+ const res = await send(forward(request, target));
228
+ if (res.status !== 200 || !target.pathname.endsWith(".json")) return pass(res);
229
+ const text = await res.text();
230
+ const headers = clean(res.headers);
231
+ let json;
232
+ try {
233
+ json = relocate(JSON.parse(text), (s) => /^https?:\/\//.test(s) ? local(r, s) : s);
234
+ } catch {
235
+ return new Response(text, { status: 200, headers });
236
+ }
237
+ headers.set("content-type", "application/json");
238
+ headers.delete("etag");
239
+ return new Response(JSON.stringify(json), { status: 200, headers });
240
+ }
241
+ async function page(request, url, res) {
242
+ const headers = clean(res.headers);
243
+ for (const link of await hints(request).catch(() => [])) headers.append("link", link);
244
+ const found = /* @__PURE__ */ new Map();
245
+ let ssr = false;
246
+ const element = async (el) => {
247
+ ssr = false;
248
+ const src = el.getAttribute("src");
249
+ let r;
250
+ if (src) {
251
+ const abs = new URL(decodeEntities(src), url).href;
252
+ for (const x of remotes.values()) if (x.url === abs || abs === new URL(local(x, x.url), url).href) r = x;
253
+ if (r && abs === r.url) el.setAttribute("src", local(r, r.url));
254
+ } else r = remotes.get(el.getAttribute("name") ?? "");
255
+ if (!r) return;
256
+ const isolate = el.getAttribute("isolate") || r.isolate || options.isolate || "none";
257
+ if (isolate === "iframe") return;
258
+ found.set(r.name, isolate);
259
+ if (!r.render) return;
260
+ try {
261
+ const m = await manifest(r);
262
+ if (!m) return;
263
+ const props = parseProps(decodeEntities(el.getAttribute("props") ?? ""));
264
+ const label = src ? m.name : r.name;
265
+ el.prepend(await markup(r, m, label, await r.render(props), isolate), { html: true });
266
+ ssr = true;
267
+ } catch (e) {
268
+ onError(e, r.name);
269
+ }
270
+ };
271
+ const child = (el) => {
272
+ if (ssr && el.getAttribute("slot") === "fallback") el.setAttribute("hidden", "");
273
+ };
274
+ const body = transform(res.body, element, child).pipeThrough(
275
+ new TransformStream({
276
+ flush: () => remember(url.pathname, found)
277
+ })
278
+ );
279
+ return new Response(body, { status: res.status, statusText: res.statusText, headers });
280
+ }
281
+ async function markup(r, m, label, html, isolate) {
282
+ const { abs, sri } = paths(r, m);
283
+ const name = escapeAttr(label);
284
+ const scope = m.scope ? ` data-vitral-scope="${escapeAttr(m.scope)}"` : "";
285
+ const root = `<div data-vitral-root="${name}"${scope} style="display:contents">${html}</div>`;
286
+ const css = (m.css ?? []).map(abs);
287
+ const link = (u) => `<link rel="stylesheet" href="${escapeAttr(local(r, u))}" crossorigin="anonymous"${sri[u] ? ` integrity="${escapeAttr(sri[u])}"` : ""}>`;
288
+ if (isolate === "none") return `<div data-vitral-ssr data-vitral-slot="${name}">${css.map(link).join("")}${root}</div>`;
289
+ const s = m.shadow;
290
+ const files = s && css[0] ? s.css.map((u) => new URL(u, css[0]).href) : css;
291
+ const global = s && css[0] ? (s.global ?? []).map((u) => new URL(u, css[0]).href) : [];
292
+ const texts = await Promise.all(
293
+ files.map(async (u) => {
294
+ const text = await cssText(u, sri[u]);
295
+ return s && !s.rebase ? text : text.replace(RELATIVE_URL, (_, q, p) => `url(${q}${local(r, new URL(p, u).href)}${q})`);
296
+ })
297
+ );
298
+ const style = texts.length ? `<style data-vitral-ssr>${texts.join("\n").replace(/<\/style/gi, "<\\/style")}</style>` : "";
299
+ return `<div data-vitral-ssr data-vitral-slot="${name}">${global.map(link).join("")}<template shadowrootmode="open">${style}${root}</template></div>`;
300
+ }
301
+ const handler = (async (request) => {
302
+ const url = new URL(request.url);
303
+ if (url.pathname.startsWith(prefix)) return asset(request, url);
304
+ const res = await send(forward(request, new URL(url.pathname + url.search, origin)));
305
+ if (!res.body || !/text\/html/i.test(res.headers.get("content-type") ?? "")) return pass(res);
306
+ return page(request, url, res);
307
+ });
308
+ handler.hints = hints;
309
+ return handler;
310
+ }
311
+ var RELATIVE_URL = /url\(\s*(['"]?)(?![a-z]+:|\/\/|#)([^'")]+)\1\s*\)/gi;
312
+ function paths(r, m) {
313
+ const abs = (u) => new URL(u, r.url).href;
314
+ const sri = {};
315
+ for (const file in m.files ?? {}) sri[abs(file)] = m.files[file];
316
+ if (m.integrity) sri[abs(m.entry)] ??= m.integrity;
317
+ return { abs, sri };
318
+ }
319
+ function relocate(value, fn) {
320
+ if (typeof value === "string") return fn(value);
321
+ if (Array.isArray(value)) return value.map((v) => relocate(v, fn));
322
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([k, v]) => [fn(k), relocate(v, fn)]));
323
+ return value;
324
+ }
325
+ function parseProps(text) {
326
+ try {
327
+ return text ? JSON.parse(text) : {};
328
+ } catch {
329
+ return {};
330
+ }
331
+ }
332
+ function forward(request, target) {
333
+ const headers = new Headers(request.headers);
334
+ headers.delete("host");
335
+ const from = new URL(request.url);
336
+ headers.set("x-forwarded-host", from.host);
337
+ headers.set("x-forwarded-proto", from.protocol.slice(0, -1));
338
+ const body = request.method === "GET" || request.method === "HEAD" ? void 0 : request.body;
339
+ return new Request(target, { method: request.method, headers, body, redirect: "manual", ...body ? { duplex: "half" } : {} });
340
+ }
341
+ function clean(from) {
342
+ const headers = new Headers(from);
343
+ for (const h of STALE) headers.delete(h);
344
+ return headers;
345
+ }
346
+ var pass = (res) => new Response(res.body, { status: res.status, statusText: res.statusText, headers: clean(res.headers) });
347
+ function transform(body, element, child) {
348
+ if (typeof HTMLRewriter !== "undefined")
349
+ return new HTMLRewriter().on("vitral-remote", { element }).on('vitral-remote > [slot="fallback"]', { element: child }).transform(new Response(body, { headers: { "content-type": "text/html" } })).body;
350
+ return rewrite(body, "vitral-remote", { element, child });
351
+ }
352
+ async function matches(bytes, integrity) {
353
+ for (const token of integrity.trim().split(/\s+/)) {
354
+ const [, alg, hash] = /^sha(256|384|512)-(.+)$/.exec(token) ?? [];
355
+ if (!alg) continue;
356
+ const digest = new Uint8Array(await crypto.subtle.digest(`SHA-${alg}`, bytes));
357
+ if (btoa(String.fromCharCode(...digest)) === hash) return true;
358
+ }
359
+ return false;
360
+ }
361
+ function toNodeListener(handler) {
362
+ return async (req, res) => {
363
+ try {
364
+ const proto = req.headers["x-forwarded-proto"] ?? (req.socket?.encrypted ? "https" : "http");
365
+ const url = new URL(req.url ?? "/", `${proto}://${req.headers.host ?? "localhost"}`);
366
+ const headers = new Headers();
367
+ for (const [k, v] of Object.entries(req.headers)) if (v !== void 0 && !k.startsWith(":")) for (const x of [v].flat()) headers.append(k, x);
368
+ const method = req.method ?? "GET";
369
+ const body = method === "GET" || method === "HEAD" ? void 0 : new ReadableStream({
370
+ async start(c) {
371
+ for await (const chunk of req) c.enqueue(chunk);
372
+ c.close();
373
+ }
374
+ });
375
+ const request = new Request(url, { method, headers, body, ...body ? { duplex: "half" } : {} });
376
+ if ("hints" in handler && res.writeEarlyHints) {
377
+ const link = await handler.hints(request).catch(() => []);
378
+ if (link.length) res.writeEarlyHints({ link });
379
+ }
380
+ const response = await handler(request);
381
+ const out = {};
382
+ response.headers.forEach((v, k) => out[k] = v);
383
+ const cookies = response.headers.getSetCookie?.() ?? [];
384
+ if (cookies.length) out["set-cookie"] = cookies;
385
+ res.writeHead(response.status, out);
386
+ if (response.body && method !== "HEAD") for await (const chunk of response.body) res.write(chunk);
387
+ res.end();
388
+ } catch (e) {
389
+ console.error("[vitral] gateway:", e);
390
+ if (!res.headersSent) res.writeHead(502, { "content-type": "text/plain; charset=utf-8" });
391
+ res.end("gateway: falha ao buscar a resposta");
392
+ }
393
+ };
394
+ }
395
+ export {
396
+ gateway,
397
+ toNodeListener
398
+ };
package/dist/element.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as Props, S as Shared, a as RemoteModule } from './types-Czvm-siZ.js';
2
- import { S as SlotStatus } from './slot-DqXTwGbs.js';
1
+ import { P as Props, S as Shared, a as RemoteModule } from './types-DUtcF3HO.js';
2
+ import { S as SlotStatus } from './slot-D49L1rdU.js';
3
3
  import './errors-kjBv6IH_.js';
4
4
 
5
5
  /**
@@ -53,8 +53,17 @@ declare function defineVitralElement(tag?: string): void;
53
53
  * elemento; o contexto fica em `element.vitral`.
54
54
  *
55
55
  * export default elementRemote('meu-widget')
56
+ *
57
+ * `setup` recebe o registro de custom elements do remote (`ctx.customElements`,
58
+ * próprio dele no Shadow DOM quando o navegador suporta) e pode devolver outra
59
+ * tag para o elemento. O elemento é criado com esse registro:
60
+ *
61
+ * export default elementRemote('meu-widget', (registry) => {
62
+ * registry.get('meu-widget') || registry.define('meu-widget', MeuWidget)
63
+ * registry.get('ds-button') || registry.define('ds-button', DsButton)
64
+ * })
56
65
  */
57
- declare function elementRemote<P extends Props = Props>(tag: string, setup?: () => void): RemoteModule<P>;
66
+ declare function elementRemote<P extends Props = Props>(tag: string, setup?: (registry: CustomElementRegistry) => string | void): RemoteModule<P>;
58
67
  /** O que o `SharedController` precisa do elemento (o `ReactiveControllerHost` do Lit). */
59
68
  interface SharedControllerHost {
60
69
  addController(controller: {
package/dist/element.js CHANGED
@@ -3,13 +3,13 @@ import {
3
3
  VitralRemoteElement,
4
4
  defineVitralElement,
5
5
  elementRemote
6
- } from "./chunk-3YXI3G34.js";
7
- import "./chunk-IHTUM6LT.js";
8
- import "./chunk-I3VSKSAZ.js";
9
- import "./chunk-TD4S3IHA.js";
10
- import "./chunk-ZAC6QQI6.js";
11
- import "./chunk-GNHCZRQP.js";
12
- import "./chunk-AKNNHQ2H.js";
6
+ } from "./chunk-K6EG7DMO.js";
7
+ import "./chunk-4Z77XNBR.js";
8
+ import "./chunk-KZBH5MPD.js";
9
+ import "./chunk-5JNV45BB.js";
10
+ import "./chunk-KU6HF2EW.js";
11
+ import "./chunk-TW7KYJQ6.js";
12
+ import "./chunk-463H6B56.js";
13
13
  import "./chunk-GNPFWISJ.js";
14
14
  export {
15
15
  SharedController,
package/dist/embed.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";(()=>{var uo=Object.defineProperty;var h=(t,e)=>()=>(t&&(e=t(t=0)),e);var L=(t,e)=>{for(var o in e)uo(t,o,{get:e[o],enumerable:!0})};var O,W=h(()=>{"use strict";O={}});function Dt(){let t=new Map,e=new Map;return{emit(o,r){e.set(o,r);for(let n of[...t.get(o)??[]])try{n(r)}catch(s){console.error(`[vitral] handler de "${o}" falhou`,s)}},on(o,r){let n=t.get(o);return n||t.set(o,n=new Set),n.add(r),()=>n.delete(r)},last(o){return e.get(o)}}}var Ht=h(()=>{"use strict"});function po(){let t={timeout:15e3,retries:1,isolate:"none",allowedOrigins:null},e=new Map,o=new Map,r=Promise.resolve();return{protocol:Nt,events:Dt(),settings:()=>t,configure(n){Object.assign(t,n)},register(n,s){e.set(n,s),o.delete(n)},entry:n=>e.get(n),origins:()=>[...e.values()].filter(n=>n.url).map(n=>new URL(n.url).origin),pending(n){return n&&(r=Promise.all([r,n])),r.then(()=>{})},load(n,s){let a=o.get(n);if(!a){a=s();let i=a;i.catch(()=>o.get(n)===i&&o.delete(n)),o.set(n,a)}return a}}}function d(){let t=Ut[_t];return t&&typeof t.protocol=="number"&&t.protocol>=Nt?t:Ut[_t]=po()}var Nt,_t,Ut,R=h(()=>{"use strict";Ht();Nt=1,_t=Symbol.for("vitral"),Ut=globalThis});function M(t,e){if(b(t)&&!j.has(t)){j.add(t),t.cause instanceof Object&&j.add(t.cause),t.entry??=e?.entry??d().entry(t.remote)?.url,t.version??=e?.version;try{d().settings().onError?.(t)}catch{}O.watch?.(t.remote,t)}return t}var jt,f,b,$,j,z,w=h(()=>{"use strict";W();R();jt="https://joaogabriel15.github.io/vitral/erros/",f=class extends Error{constructor(o,r,n,s){super(`[vitral] ${r}: ${n} (${jt}${o})`);this.code=o;this.remote=r;this.cause=s;this.name="RemoteError",this.docs=`${jt}${o}`,typeof location<"u"&&(this.route=location.pathname)}},b=t=>t?.name==="RemoteError",$=new Map,j=new WeakSet;z=t=>{throw M(t)}});function B(){return typeof location<"u"?location.origin:null}function S(t,e){return new URL(t,e??(typeof location<"u"?location.href:void 0)).href}async function Bt(t,e){for(let o=0;;o++)try{return await e()}catch(r){if(!(b(r)&&(r.code==="LOAD_FAILED"||r.code==="TIMEOUT"))||o>=t)throw r;await new Promise(s=>setTimeout(s,200*2**o))}}function V(t,e,o){return new Promise((r,n)=>{let s=setTimeout(()=>n(new f("TIMEOUT",e,`n\xE3o respondeu em ${t}ms`)),t);o.then(r,n).finally(()=>clearTimeout(s))})}function q(t,e,o,r){let n=new AbortController,s=fetch(t,{signal:n.signal,credentials:"omit",...r}).then(a=>{if(!a.ok)throw new f("LOAD_FAILED",o,`HTTP ${a.status} em ${t}`);return a.arrayBuffer()},a=>{throw new f("LOAD_FAILED",o,`falha ao baixar ${t}`,a)});return V(e,o,s).catch(a=>{throw n.abort(),a})}async function X(t,e,o,r){let n=new TextDecoder().decode(await q(t,e,o,r));try{return JSON.parse(n)}catch(s){throw new f("INVALID_MODULE",o,`JSON inv\xE1lido em ${t}`,s)}}function C(t,e,o={},r=document.head){return r.appendChild(Object.assign(document.createElement("link"),{rel:t,crossOrigin:"anonymous",href:e},o))}function D(t,e,o){try{let r=`vitral:${t}:${e}`;performance.clearMeasures(r),performance.measure(r,{start:o}),d().settings().onMetric?.({name:t,stage:e,start:o,duration:performance.now()-o})}catch{}}var k=h(()=>{"use strict";w();R()});var Kt={};L(Kt,{capture:()=>mo,owner:()=>Ft});function mo(){Vt||typeof addEventListener>"u"||(Vt=!0,addEventListener("error",t=>qt(t.error,t.filename)),addEventListener("unhandledrejection",t=>qt(t.reason)))}function Ft(t,e){let o=e||String(t?.stack??"").match(/(?:https?|file):\/\/[^\s)'"]+/)?.[0];if(!o)return;let r=[...document.querySelectorAll("script[src],link[rel=modulepreload]")].map(a=>a.src||a.href),n,s=0;for(let[a,{entry:i}]of $){let l=new URL(".",i).href;l.length>s&&o.startsWith(l)&&!r.some(u=>u.startsWith(l))&&(n=a,s=l.length)}return n}function qt(t,e){if(!d().settings().captureGlobalErrors||b(t)||t instanceof Object&&j.has(t))return;let o=Ft(t,e);o&&M(new f("RENDER_FAILED",o,String(t?.message??t),t),$.get(o))}var Vt,Gt=h(()=>{"use strict";w();R();Vt=!1});function ct(t,e){if(e==="*")return!0;let[,o="",r=""]=/^(\^|~|>=|=)?(.*)$/.exec(e.trim());if(!o||o==="="||t.includes("-"))return t===r;let[n,s]=[t,r].map(i=>(i+".0.0").split(".",3).map(Number));for(let i=0;i<3;i++)if(n[i]!==s[i]){if(!(n[i]>s[i]))return!1;break}if(o===">=")return!0;let a=Math.min(r.split(".").length,o==="~"?2:s[0]?1:s[1]?2:3);return n.slice(0,a).join(".")===s.slice(0,a).join(".")}var Jt=h(()=>{"use strict"});var Z={};L(Z,{offer:()=>ho,satisfies:()=>ct,shared:()=>Wt});function Wt(t){if(!t.dedupe){let e=new Map,o=new Map,r=(s,a)=>s.includes(a)&&s.splice(s.indexOf(a),1),n=(s,a,i)=>(i.p||((i.p=i.load()).catch(()=>r(a,i)),i.url&&i.p.then(()=>go(`${s}@${i.version}`,i.url),()=>{})),i.p);t.dedupe=(s,a,i)=>{let l=i,u=e.get(s)??[];e.set(s,u),l?.url&&o.get(s+l.url)?.(l);let p=u.find(c=>ct(c.version,a));if(!p&&l){p=u[u.push(l)-1];let c=l.url&&fo(`${s}@${l.version}`);c&&c!==l.url&&(l.p=new Promise(g=>{o.set(s+c,g),setTimeout(g,300,l)}).then(g=>(o.delete(s+c),g===l&&(l.p=void 0),n(s,u,g))),l.p.catch(()=>r(u,l)))}return p&&n(s,u,p)}}return t.dedupe}function ho(t,e){for(let o in e){let{version:r,modules:n}=e[o];Wt(t)(o,r,{version:r,load:async()=>n}),t.configure({offered:{...t.settings().offered,[o]:r}})}}var Yt,fo,go,Q=h(()=>{"use strict";Jt();Yt="vitral:dedupe:",fo=t=>{try{return localStorage.getItem(Yt+t)}catch{return null}},go=(t,e)=>{try{localStorage.setItem(Yt+t,e)}catch{}}});function ut(t){let e=d(),{remotes:o,dedupe:r,...n}=t;if(e.configure(n),n.captureGlobalErrors&&Promise.resolve().then(()=>(Gt(),Kt)).then(s=>s.capture()),r&&e.pending(Promise.resolve().then(()=>(Q(),Z)).then(s=>s.offer(e,r)).catch(()=>{})),typeof o=="string"){let s=S(o);e.pending(X(s,e.settings().timeout,"remotes",{cache:"no-cache"}).then(a=>zt(a,s))).catch(()=>{})}else o&&zt(o)}function Xt(t,e){let o=typeof e=="string"?{url:e}:e;if(!o.url&&!o.module)throw new f("NOT_REGISTERED",t,"informe url ou module");if(!o.url)return d().register(t,o);let r=S(o.url);d().register(t,{...o,url:r});let{origin:n}=new URL(r);typeof document<"u"&&n!==B()&&n!=="null"&&!document.querySelector(`link[href="${n}"]`)&&C("preconnect",n)}function A(t,e,o=!0){let r=d(),n=S(t),s=e||n;r.entry(s)?.url!==n&&r.register(s,{url:n});let a=new URL(n).origin,i=r.settings().trusted??[];return o&&!i.includes(a)&&r.configure({trusted:[...i,a]}),s}function zt(t,e){for(let[o,r]of Object.entries(t)){let n=typeof r=="string"?{url:r}:r;Xt(o,n.url?{...n,url:S(n.url,e)}:n)}}function tt(t,e){let o=d(),r=new URL(e).origin,{allowedOrigins:n,trusted:s=[]}=o.settings(),a=[...n??[B(),...o.origins()].filter(Boolean),...s];if(!(a.includes("*")||a.includes(r)||e.startsWith("blob:")))throw new f("ORIGIN_BLOCKED",t,`origem ${r} n\xE3o est\xE1 em allowedOrigins`)}var H=h(()=>{"use strict";w();R();k()});var gt={};L(gt,{attachShadowRoot:()=>wo,prefetch:()=>Ro,registryFor:()=>ft});function oe({css:t,shadow:e}){let o=n=>new URL(n,t[0]).href,r=e?e.css.map(o):[];return[e?[...(e.imports??[]).map(o),...r,...t.slice(r.length)]:t,r,(e?.global??[]).map(o)]}function Ro(t,e){let[o,,r]=oe(t);for(let n of o)yt(n,t.sri?.[n],e).catch(yo);F(r,null,t.sri)}async function wo(t,e,o,r={},n={}){let s=e().getAttribute("data-vitral-root"),a=ft(s),i=t.shadowRoot;if(!i&&!Qt(a))try{i=t.attachShadow({mode:"open",customElementRegistry:a})}catch{mt=!0,pt.delete(s),a=ft(s)}i??=t.attachShadow({mode:"open"});let l=i.customElementRegistry??a,u=e();if(!Qt(l))try{u=e({customElementRegistry:l})}catch{}return u.isConnected||i.appendChild(u),[...await So(i,u,o,r,n),i,l,u]}function ft(t){let e=pt.get(t);if(e)return e;let o=customElements;if(!mt&&"initialize"in CustomElementRegistry.prototype)try{o=new CustomElementRegistry}catch{mt=!0}let r=o===customElements,n=e=r?Object.create(o):o;if(r)for(let a of["get","getName","upgrade","whenDefined"])a in o&&(n[a]=o[a].bind(o));let s=o.define;return n.define=(a,i,l)=>{let u=o.get(a),p=te.get(a);if(!u)return r&&te.set(a,t),s.call(o,a,i,l);r&&u!==i&&p!==t&&bo()&&console.warn(`[vitral] ${t}: <${a}> j\xE1 foi definido por ${p??"outro c\xF3digo"}; fica essa defini\xE7\xE3o. Sem Scoped Custom Element Registries, os remotes dividem o registro global.`)},pt.set(t,e),e}function bo(){try{return process.env.NODE_ENV!=="production"}catch{return!1}}async function So(t,e,o,r={},n={}){let s=o.sri??{},[a,i,l]=oe(o),u=e.cloneNode();u.setAttribute("data-vitral-portal",""),e.after(u);let p=[...r.inherit??[],...n.inherit??[]].map(m=>new URL(m,document.baseURI).href).concat(a),c=F(l,null,s);if(typeof CSSStyleSheet<"u"&&"replaceSync"in CSSStyleSheet.prototype){let m=await Promise.all(p.map(y=>re(y,[],s[y],i.includes(y)?!!o.shadow.rebase:void 0)));t.adoptedStyleSheets=[...new Set([...t.adoptedStyleSheets,...m.flat()])]}else await F(p,t,s);await c;let g=(n.mirrorTheme??r.mirrorTheme)===!1?[]:[ee(e),ee(u)];return[()=>(g.forEach(m=>m()),u.remove()),u]}function re(t,e,o,r){let n=dt.get(t);return n||(n=yt(t,o).then(s=>{let a=new CSSStyleSheet;if(r!==!1&&(s=s.replace(vo,(c,g,m)=>`url(${g}${new URL(m,t).href}${g})`)),r!=null)return a.replaceSync(s),[a];let i=[],l=[],u=s.replace(Eo,(c,g,m,y,x)=>{let v=y??x;return v?l.push(new URL(v,t).href):Zt.has(g??c)||(Zt.add(g??c),i.push(c)),""});if(i.length){let c=document.createElement("style");c.setAttribute("data-vitral-properties",""),c.textContent=i.join(`
2
+ `),document.head.appendChild(c)}a.replaceSync(u);let p=[...e,t];return Promise.all(l.filter(c=>!p.includes(c)).map(c=>re(c,p))).then(c=>[...c.flat(),a])}).catch(()=>(dt.delete(t),[])),dt.set(t,n)),n}function ee(t){let e=document.documentElement,o=[],r=()=>{t.classList.remove(...o),o=[...e.classList].filter(a=>!t.classList.contains(a)),t.classList.add(...o);let s=e.getAttribute("data-theme");s===null?t.removeAttribute("data-theme"):t.setAttribute("data-theme",s)};r();let n=new MutationObserver(r);return n.observe(e,{attributeFilter:["class","data-theme"]}),()=>n.disconnect()}var dt,yo,Zt,vo,Eo,pt,mt,Qt,te,ht=h(()=>{"use strict";et();dt=new Map,yo=()=>{},Zt=new Set,vo=/url\(\s*(['"]?)(?![a-z]+:|\/\/|#)([^'")]+)\1\s*\)/gi,Eo=/@property\s+(--[\w-]+)\s*\{[^}]*\}|@font-face\s*\{[^}]*\}|@import\s+(?:url\(\s*)?(?:(['"])(.*?)\2|([^'"\s);]+))\s*\)?[^;]*;/gi;pt=new Map,mt=!1,Qt=t=>Object.getPrototypeOf(t)===customElements,te=new Map});function yt(t,e,o){let r=`${t} ${e??""}`,n=vt.get(r);return n||(n=q(t,d().settings().timeout,t,{integrity:e,priority:o}).then(s=>new TextDecoder().decode(s)),n.catch(()=>vt.delete(r)),vt.set(r,n)),n}function ie(t,e,o="auto"){if(e&&Po())Promise.resolve().then(()=>(ht(),gt)).then(r=>r.prefetch(t,o),se);else for(let r of t.css)document.querySelector(`link[href="${r}"]`)||C("preload",r,{as:"style",integrity:t.sri?.[r]??"",fetchPriority:o})}function ae(t,e,o,r){return e?Promise.resolve().then(()=>(ht(),gt)).then(n=>n.attachShadowRoot(e,o,t,d().settings().styles,r)):F(t.css,null,t.sri).then(()=>[se])}function F(t,e,o={}){let r=e??document,n=ne.get(r);n||ne.set(r,n=new Map);let s=e??document.head,a=d().settings().timeout;return Promise.all(t.map(i=>{let l=n.get(i);return l||(l=new Promise(u=>{let p=C("stylesheet",i,{integrity:o[i]??""},s);setTimeout(u,a),p.onload=()=>u(),p.onerror=()=>{p.remove(),n.delete(i),u()}}),n.set(i,l)),l}))}var ne,vt,se,Po,et=h(()=>{"use strict";R();k();ne=new WeakMap,vt=new Map,se=()=>{},Po=()=>typeof CSSStyleSheet<"u"&&"replaceSync"in CSSStyleSheet.prototype});var ue={};L(ue,{resolveModule:()=>Lo,resolveTarget:()=>xo,splitName:()=>le});function le(t){let e=d(),o=t.length;if(!e.entry(t))for(;(o=t.lastIndexOf("/",o-1))>0&&!e.entry(t.slice(0,o)););return o>0&&o<t.length?[t.slice(0,o),"."+t.slice(o)]:[t,null]}function xo(t,e){return ce(t,e).then(o=>Et(t,o))}function ce(t,e){let o=d();return o.entry(t)||!t.includes("/")?e(t):o.pending().then(async()=>{let[r,n]=le(t);if(!n)return e(t);let s=await e(r),a=s.exports?.exposes;if(!a?.[n])throw new f("NOT_EXPOSED",t,`${r} n\xE3o exp\xF5e ${n}. Expostos: ${Object.keys(a??{}).join(", ")}`);try{let i=a[n],l=await(typeof i=="function"?i():i);return{...s,module:l?.default??l,exports:l}}catch(i){throw new f("LOAD_FAILED",t,String(i),i)}})}async function Lo(t,e){let o=await ce(t,e);if(!o.exports)throw new f("INVALID_MODULE",t,"o remote foi carregado por uma c\xF3pia antiga da lib, que n\xE3o guarda os exports");return o.exports}var de=h(()=>{"use strict";w();ot();R()});async function me(t,e,o){let r=o.split(/\s+/).map(i=>/^sha(256|384|512)-([\w+/=-]+)/.exec(i)).filter(i=>!!i);if(!r.length)throw new f("INTEGRITY",t,`formato de integrity inv\xE1lido: ${o}`);let n=Math.max(...r.map(i=>+i[1])),s=btoa(String.fromCharCode(...new Uint8Array(await crypto.subtle.digest("SHA-"+n,e)))),a=r.filter(i=>+i[1]===n).map(i=>i[2]);if(!a.some(i=>pe(i)===pe(s)))throw new f("INTEGRITY",t,`o hash n\xE3o confere: esperado sha${n}-${a.join(" ou ")}, obtido sha${n}-${s}`)}var pe,fe=h(()=>{"use strict";w();pe=t=>t.replace(/-/g,"+").replace(/_/g,"/").replace(/=/g,"")});var Pe={};L(Pe,{importVerified:()=>Oo,verified:()=>be});async function Oo(t,e,o,r){let{entry:n,integrity:s,priority:a}=e;if(!Rt.has(n))try{let p=await V(r,t,(async()=>{let c=await be(e.split??{entry:n,chunks:[],sri:{[n]:s},priority:a},o);return c&&{ns:await o(c)}})());if(p)return p.ns}catch(u){if(Rt.add(n),u instanceof f&&u.code==="TIMEOUT")throw u}let i=await q(n,r,t,Rt.has(n)?{priority:a,cache:"reload"}:{priority:a});await me(t,i,s);let l=URL.createObjectURL(new Blob([i],{type:"text/javascript"}));try{return await o(l)}finally{URL.revokeObjectURL(l)}}async function To(t){if(wt)return await wt&&Re(t,!1);let e=!1;try{e=localStorage[ve]===navigator.userAgent}catch{}let o=await(wt=Re(t,!e));if(o&&!e)try{localStorage[ve]=navigator.userAgent}catch{}return o}async function be(t,e){let{entry:o,chunks:r,sri:n,priority:s="auto",dedupe:a=[]}=t,i=a.flatMap(p=>[...p.chunks??[],p.file]);if(![o,...r,...i].every(p=>Mo.test(n[p]??"")))return;let l=globalThis[Symbol.for("vitral")],u=async p=>{if(!e||!a.length)return;let{shared:c}=await Promise.resolve().then(()=>(Q(),Z));for(let g of a)c(l)(g.name,g.range,{version:g.version,url:g.file,load:async()=>(p&&await Promise.all([...g.chunks??[],g.file].map(m=>bt(m,n[m],s))),(await e(g.file)).default)})};if(he!==!1&&(he=await To(n))){await u();for(let p of r)fetch(p,{priority:s}).catch(()=>{});return o}if(await(ko??=Co()))return l.sri={...l.sri,...n},await u(!0),await Promise.all([...r,o].map(p=>bt(p,n[p],s))),o}async function Re(t,e){if(!HTMLScriptElement.supports?.("importmap"))return!1;let o={};for(let s in t)!/\.css([?#]|$)/.test(s)&&!ye.has(s)&&(ye.add(s),o[s]=t[s]);let r=e?["export{}","export{}//"].map(s=>URL.createObjectURL(new Blob([s],{type:"text/javascript"}))):[];for(let s of r)o[s]=we;let n=!0;try{let s=document.createElement("script");s.type="importmap",s.nonce=document.querySelector("script[nonce]")?.nonce??"",s.onerror=()=>n=!1,s.addEventListener("securitypolicyviolation",()=>n=!1),s.textContent=JSON.stringify({integrity:o}),document.head.append(s),await Ee(),await Ee(),n&&e&&(n=await Se(a=>import(a),r[0],r[1]))}catch{n=!1}for(let s of r)URL.revokeObjectURL(s);return n}function bt(t,e,o="auto"){return new Promise((r,n)=>{let s=C("modulepreload",t,{integrity:e,fetchPriority:o});s.onload=r,s.onerror=n})}function Co(){return document.createElement("link").relList.supports("modulepreload")?Se(t=>bt(t,we),ge,ge+"//"):Promise.resolve(!1)}function Se(t,e,o){return Promise.race([Promise.all([t(e).then(()=>!0,()=>!1),t(o).then(()=>!1,()=>!0)]).then(([r,n])=>r&&n),new Promise(r=>setTimeout(r,3e3,!1))])}var Rt,Mo,ge,we,he,ye,wt,ko,ve,Ee,xe=h(()=>{"use strict";fe();w();k();Rt=new Set;Mo=/^(sha(256|384|512)-[A-Za-z0-9+/]+={0,2}( +|$))+$/,ge="data:text/javascript,export{}",we="sha256-d3bjIZdvLjBurwdLwkSVOnEBPFFly+T1SR9r3VVHBGg=",ye=new Set,ve="vitral:sri-map";Ee=()=>new Promise(t=>{let e=new MessageChannel;e.port1.onmessage=()=>t(),e.port2.postMessage(0)})});var Ce={};L(Ce,{OVERRIDES_KEY:()=>rt,activeOverrides:()=>Te,clearOverrides:()=>Me,dropOverride:()=>$o,isRef:()=>St,manifestUrl:()=>nt,overrideFor:()=>Do,overridesEnabled:()=>Oe,resolveOverride:()=>ke,storeOverride:()=>Ao,storedOverrides:()=>xt});function Oe(){return!!d().settings().devOverrides||typeof location<"u"&&/^(localhost|127\.0\.0\.1|\[::1\])$/.test(location.hostname)}function Ao(t,e){let o=xt();e?o[t]=St(e)?e:nt(e):delete o[t],K(it,o)}function Io(){let t=Pt(st),e=new URLSearchParams(location.search).getAll("vitral").join(",").split(",");if(!e.some(Boolean))return t;for(let o of e){let r=o.indexOf("@");o==="off"?(Me(),Object.keys(t).forEach(n=>delete t[n])):r>0&&o.slice(r+1)==="off"?delete t[o.slice(0,r)]:r>0&&(t[o.slice(0,r)]=o.slice(r+1))}return K(st,t),t}function Me(){K(st,{}),K(it,{})}function $o(t){for(let e of[st,it]){let o=Pt(e);delete o[t],K(e,o)}}function ke(t,e){if(!St(e))return new URL(nt(e),location.href).href;let o=d().settings().devOverrides,r=typeof o=="object"?o.preview:void 0;if(!r)return;let n=r.replace(/\{name\}/g,encodeURIComponent(t)).replace(/\{ref\}/g,encodeURIComponent(e));return new URL(nt(n),location.href).href}function Te(){let t=Io(),e={};for(let[o,r]of[["navegador",xt()],["aba",t]])for(let[n,s]of Object.entries(r))e[n]={name:n,value:s,url:ke(n,s),source:o};return Object.values(e)}function Do(t){if(!Oe())return;let e=Te().find(a=>a.name===t);if(!e)return;let o=!Le.has(t)&&Le.add(t);if(!e.url){o&&console.warn(`[vitral] override ${t}@${e.value} ignorado: falta configure({ devOverrides: { preview } })`);return}let r=d(),n=r.settings().trusted??[],s=new URL(e.url).origin;return n.includes(s)||r.configure({trusted:[...n,s]}),o&&console.warn(`[vitral] override ativo: ${t} \u2192 ${e.url} (${e.source}). Para limpar: ?vitral=off`),{url:e.url}}var rt,nt,St,Pt,K,it,st,xt,Le,Ae=h(()=>{"use strict";R();rt="vitral:overrides";nt=t=>/\.(json|m?js)(\?|$)/.test(t)?t:t.replace(/\/?$/,"/vitral.json"),St=t=>/^[\w.-]+$/.test(t),Pt=t=>{try{return JSON.parse(t().getItem(rt)??"{}")??{}}catch{return{}}},K=(t,e)=>{try{Object.keys(e).length?t().setItem(rt,JSON.stringify(e)):t().removeItem(rt)}catch{}},it=()=>localStorage,st=()=>sessionStorage,xt=()=>Pt(it);Le=new Set});var Ue={};L(Ue,{bucket:()=>He,pick:()=>Ho,resetChannels:()=>jo,versionUrl:()=>De});async function Ho(t,e,o){if(typeof o.stable!="string")throw new f("INVALID_MODULE",t,`canal inv\xE1lido em ${e.url}: falta "stable"`);O.watch=Uo;let r={name:t,bucket:He(t)},{canary:n,stable:s}=o,a=await e.resolve?.(o,r)??(n&&r.bucket<n.percent?n.version:s);return a!==s&&_e()[t]===a&&(a=s),a===s||e.rollback===!1?U.delete(t):U.get(t)?.from!==a&&U.set(t,{from:a,to:s,errors:0,mounts:0,max:{errors:3,mounts:20,...e.rollback}}),{...e,url:De(a,e.url),integrity:void 0,manifest:void 0}}function He(t){let e=d().settings().canaryKey??_o(),o=2166136261;for(let r of`${e}:${t}`)o=Math.imul(o^r.charCodeAt(0),16777619);return(o>>>0)%100}function _o(){try{_??=localStorage.getItem(Ie)??void 0}catch{}if(!_){_=Math.random().toString(36).slice(2);try{localStorage.setItem(Ie,_)}catch{}}return _}function _e(){try{return{...JSON.parse(sessionStorage.getItem($e)||"{}"),...G}}catch{return G}}function Uo(t,e){for(let[o,r]of U)t!==o&&!t.startsWith(o+"/")||(e?++r.errors>=r.max.errors&&No(o,r):++r.mounts>r.max.mounts&&(r.mounts=1,r.errors=0))}function No(t,e){U.delete(t),G={..._e(),[t]:e.from};try{sessionStorage.setItem($e,JSON.stringify(G))}catch{}console.warn(`[vitral] ${t}: ${e.errors} erros em ${e.mounts} montagens da vers\xE3o ${e.from}; voltando para ${e.to}`);try{d().settings().onRollback?.({name:t,from:e.from,to:e.to,errors:e.errors,mounts:e.mounts})}catch{}let o=d();o.register(t,o.entry(t)),o.events.emit("vitral:refresh",t)}function jo(){U.clear(),G={},_=void 0}var $e,Ie,U,G,_,De,Ne=h(()=>{"use strict";w();W();R();k();$e="vitral:rollback",Ie="vitral:id",U=new Map,G={};De=(t,e)=>S(/[/:]|\.(m?js|json)$/.test(t)?t:`${t}/vitral.json`,e)});var je={};L(je,{checkContract:()=>Bo});async function Bo(t,e=d().settings().contract){let{satisfies:o}=await Promise.resolve().then(()=>(Q(),Z));if(t.version&&!o(t.version,e))return`o host aceita contrato ${e}, o remote publica ${t.version}`;let r=d().settings().offered??{};for(let n in t.peers){let s=r[n];if(s&&!o(s,t.peers[n]))return`o remote espera ${n} ${t.peers[n]}, o host oferece ${s}`}}var Be=h(()=>{"use strict";R()});function Ve(t){Ot(t).catch(()=>{})}function Ot(t,e,o){let r=n=>Vo(n,e,o);return(d().entry(t)||!t.includes("/")?r(t).then(n=>Et(t,n)):Promise.resolve().then(()=>(de(),ue)).then(n=>n.resolveTarget(t,r))).catch(z)}function Vo(t,e,o){let r=d();return r.load(t,async()=>{qe??=Promise.resolve().then(()=>(xe(),Pe)).catch(()=>null);let n;try{await r.pending();let s=await Fe(t),a=s?{isolate:r.entry(t)?.isolate,...s}:r.entry(t);if(!a)throw new f("NOT_REGISTERED",t,"remote n\xE3o registrado. Use configure({ remotes }).");if(a.module)return await qo(t,a);let i=performance.now();n=await Lt(t,a,o),D(t,"manifest",i),ie(n,(e??n.isolate??r.settings().isolate)==="shadow",o),i=performance.now();let l=await Bt(r.settings().retries,()=>Fo(t,n));return D(t,"js",i),{...n,module:l?.default??l,exports:l}}catch(s){throw M(b(s)?s:new f("LOAD_FAILED",t,String(s?.message??s),s),n)}})}function Fe(t){try{let e="vitral:overrides";if(location.search.includes("vitral")||localStorage[e]||sessionStorage[e])return Promise.resolve().then(()=>(Ae(),Ce)).then(o=>o.overrideFor(t))}catch{}}async function qo(t,e){let o=e.module;return typeof o=="function"&&(o=await o()),{module:o?.default??o,exports:o,entry:typeof location<"u"?location.href:"http://localhost/",css:e.css??[],isolate:e.isolate}}async function Lt(t,e,o){tt(t,e.url);let r=e.manifest??(new URL(e.url).pathname.endsWith(".json")?await X(e.url,d().settings().timeout,t,{cache:"no-cache",priority:o}):{name:t,entry:e.url});if(r?.stable)return Lt(t,await(await Promise.resolve().then(()=>(Ne(),Ue))).pick(t,e,r),o);if(typeof r?.entry!="string")throw new f("INVALID_MODULE",t,`manifesto inv\xE1lido em ${e.url}`);if(r.contract&&(e.contract||d().settings().contract)){let i=await(await Promise.resolve().then(()=>(Be(),je))).checkContract(r.contract,e.contract);if(i)throw new f("CONTRACT_MISMATCH",t,i)}let n=i=>S(i,e.url),s={};for(let i in r.files??{})s[n(i)]=r.files[i];let a={entry:n(r.entry),css:[...r.css??[],...e.css??[]].map(n),shadow:r.shadow,integrity:e.integrity??r.integrity,isolate:e.isolate,scope:r.scope,version:r.version,sri:s,priority:o,split:r.split&&!e.integrity?{entry:n(r.split.entry),chunks:(r.split.chunks??[]).map(n),sri:s,priority:o,dedupe:r.dedupe?.map(i=>({...i,file:n(i.file),chunks:i.chunks?.map(n)}))}:void 0};tt(t,a.entry);for(let i of[a.split?.entry,...(a.split?.dedupe??[]).map(l=>l.file)])i&&tt(t,i);if(t===e.url&&r.name){let i=await Fe(r.name);if(i)return{...await Lt(t,i),name:r.name};a.name=r.name,d().entry(r.name)||d().register(r.name,e)}return a}async function Fo(t,e){let{timeout:o}=d().settings(),r=s=>V(o,t,import(s)).catch(a=>{throw b(a)?a:new f("LOAD_FAILED",t,`falha ao importar ${e.entry}`,a)});if(!e.integrity)return r(e.entry);let n=await qe;if(!n)throw new f("LOAD_FAILED",t,"n\xE3o foi poss\xEDvel carregar o verificador de integrity");return n.importVerified(t,e,r,o)}function Et(t,e){if(typeof e.module?.mount!="function")throw new f("INVALID_MODULE",t,"o m\xF3dulo n\xE3o exporta mount(). Use defineRemote(), ou loadModule() para m\xF3dulo sem UI.");return e}var qe,ot=h(()=>{"use strict";et();w();H();R();k()});var Mt={};L(Mt,{load:()=>Ze,noFrames:()=>Ko});function Ze(t){throw new f("MOUNT_FAILED",t,"isolate sem suporte no embed.js")}var Ko,kt=h(()=>{"use strict";w();Ko=(t,e)=>Ze(e)});H();et();w();R();var I={emit:(t,e)=>d().events.emit(t,e),on:(t,e)=>d().events.on(t,e),last:t=>d().events.last(t)};function Ke(){let t=new Set,e=o=>{let r=()=>(t.delete(r),o());return t.add(r),r};return{bus:{emit:(o,r)=>I.emit(o,r),last:o=>I.last(o),on:(o,r)=>e(I.on(o,r))},track:e,dispose(){for(let o of[...t])o()}}}W();ot();function Ge(t,e={}){let o=new URL(t,location.href);if(o.origin!==location.origin){location.assign(o.href);return}e.replace?history.replaceState(history.state,"",o.href):history.pushState(history.state,"",o.href),dispatchEvent(new PopStateEvent("popstate",{state:history.state})),I.emit("vitral:navigate",o.pathname+o.search+o.hash)}R();w();var Je=new Map,J=new Map;function ze(t,e){return Je.set(t,e.entry),$.set(t,e),J.set(t,(J.get(t)??0)+1),()=>{let o=J.get(t)-1;o?J.set(t,o):(J.delete(t),Je.delete(t),$.delete(t))}}var Ye=null;function Xe(t,e,o,r){let n=0,s=I.on("vitral:refresh",a=>{if(a!==e&&!e.startsWith(a+"/"))return;let i=++n,l=o,u=r(l).then(p=>{if(t.unmount===We||i!==n)return p.unmount();let c=t;t=p,c.unmount(),o!==l&&p.update?.(o)});Ye?Ye.push(u):u.catch(console.error)});return{update(a){o=a,t.update?.(a)},unmount(){s(),t.unmount(),t={unmount:We}}}}var We=()=>{};k();async function to(t,e,o,r={}){return Xe(await Qe(t,e,o,r),e,o,n=>Qe(t,e,n,r))}var Go;async function Qe(t,e,o,r){let n=d();await n.pending();let s=r.isolate??Jo(e)?.isolate??n.settings().isolate;if(s==="iframe")return(Go??(await Promise.resolve().then(()=>(kt(),Mt))).noFrames)(t,e,o,r).catch(z);let{module:a,...i}=await(s=="reframe"?(await Promise.resolve().then(()=>(kt(),Mt))).load:Ot)(e,s,r.priority),l=ze(e,i);O.watch?.(e);let u=i.name??e,p=E=>{let P=document.createElement("div",E);return P.setAttribute("data-vitral-root",u),i.scope&&P.setAttribute("data-vitral-scope",i.scope),P.style.display="contents",P},c=performance.now(),[g,m=document.body,y=null,x=customElements,v=t.appendChild(p())]=await ae(i,s>"q"&&t,p,r.styles);D(e,"css",c),c=performance.now();let Y=Ke(),It=E=>P=>(v.addEventListener(E,P),()=>v.removeEventListener(E,P)),$t={name:u,baseUrl:new URL(".",i.entry).href,events:Y.bus,shadowRoot:y,portalContainer:m,customElements:x,reportError(E){let P=M(b(E)?E:new f("RENDER_FAILED",u,String(E?.message??E),E),i);r.onError?r.onError(P):console.error(P)},navigate:Ge,protocol:n.protocol,onActivate:It("vitral:activate"),onDeactivate:It("vitral:deactivate")};O.shared&&($t.shared=O.shared(e,Y.track));let at;try{at=await a.mount(v,o,$t),D(e,"mount",c)}catch(E){throw l(),Y.dispose(),g(),v.remove(),M(new f("MOUNT_FAILED",u,"erro ao montar",E),i)}let lt=!0;return{update(E){lt&&at.update?.(E)},unmount(){if(lt){lt=!1;try{at.unmount()}finally{l(),Y.dispose(),g(),v.remove()}}}}}function Jo(t){let e=d(),o=t;for(;o&&!e.entry(o);)o=o.slice(0,Math.max(0,o.lastIndexOf("/")));return o?e.entry(o):void 0}w();H();function eo(t,e){let{isolate:o}=e,r=m=>m.src?A(m.src,m.name):m.name??"",n=r(e),s=e.props??{},a=null,i=null,l=0,u="loading",p=(m,y=null)=>{u=m,i&&(i.style.display=m==="error"?"none":""),e.onStatus?.(m,y)},c=()=>{a?.unmount(),a=null,i?.remove(),i=null},g=()=>{let m=++l;c(),i=document.createElement("div"),i.setAttribute("data-vitral-slot",n),t.appendChild(i),p("loading");let y=v=>{m===l&&p("error",b(v)?v:new f("MOUNT_FAILED",n,String(v),v))},x=s;to(i,n,s,{isolate:o,priority:e.priority,styles:e.styles,onError:y}).then(v=>{if(m!==l)return v.unmount();a=v,s!==x&&v.update?.(s),p("ready")},y)};return g(),{update(m){s=m,a?.update?.(m)},set(m){let y=m.src||m.name!==void 0?r(m):n,x=y!==n||"isolate"in m&&m.isolate!==o;n=y,"isolate"in m&&(o=m.isolate),x&&g()},retry:g,destroy(){l++,c()},get status(){return u}}}ot();H();var Tt=()=>{};function ro(t){let e={};if(typeof performance>"u"||!performance.getEntriesByName)return e;for(let o of["manifest","js","css","mount"]){let r=performance.getEntriesByName(`vitral:${t}:${o}`,"measure").pop();r&&(e[o]=Math.round(r.duration*10)/10)}return e}function oo(t,e,o){if(e==="lazy"||e==="visible"){if(typeof IntersectionObserver>"u")return o(),Tt;let r=new IntersectionObserver(n=>{n.some(s=>s.isIntersecting)&&(r.disconnect(),o())},{rootMargin:"200px"});return r.observe(t),()=>r.disconnect()}if(e==="idle"){if(typeof requestIdleCallback>"u"){let n=setTimeout(o,1);return()=>clearTimeout(n)}let r=requestIdleCallback(o,{timeout:2e3});return()=>cancelIdleCallback(r)}if(e==="hover"){let r=()=>(n(),o()),n=()=>{t.removeEventListener("pointerenter",r),t.removeEventListener("focusin",r)};return t.addEventListener("pointerenter",r),t.addEventListener("focusin",r),n}return o(),Tt}var T=new Map,N=null;function no(t,e){try{t.moveBefore(e,null)}catch{t.appendChild(e)}}function Ct(t,e){for(let o of t.querySelectorAll("*"))o.hasAttribute("data-vitral-root")&&o.dispatchEvent(new Event(e)),o.shadowRoot&&Ct(o.shadowRoot,e)}function Yo(t,e,o){T.get(t)?.slot.destroy(),T.delete(t),N?.isConnected||(N=document.createElement("div"),N.hidden=!0,N.setAttribute("data-vitral-keep-alive",""),document.body.appendChild(N)),no(N,e.box),Ct(e.box,"vitral:deactivate"),T.set(t,e);for(let[r,n]of T){if(T.size<=o)break;T.delete(r),n.slot.destroy(),n.box.remove()}}function so(t,e){let{props:o={},keepAlive:r}=e,n=c=>c.src?A(c.src,c.name):c.name??"",s=n(e),a="loading",i=null,l=(c,g)=>{a=c,e.onStatus?.(c,g)},u=e.prefetch?oo(t,e.prefetch,()=>Ve(s)):Tt,p=oo(t,e.loading,()=>{u();let c=r?T.get(s):void 0;if(c){T.delete(s),i=c,i.on=l,no(t,i.box),i.slot.update(o),Ct(i.box,"vitral:activate"),l(i.slot.status,null);return}let g=t;r&&(g=t.appendChild(document.createElement("div")),g.style.display="contents");let m={box:g,on:l,slot:null};m.slot=eo(g,{...e,name:s,src:void 0,props:o,onStatus:(y,x)=>m.on(y,x)}),i=m});return{update(c){o=c,i?.slot.update(c)},set(c){(c.src||c.name!==void 0)&&(s=n(c)),i?.slot.set({...c,src:void 0,name:s})},retry:()=>i?.slot.retry(),destroy(){p(),u(),i&&(r&&a==="ready"?Yo(s,i,r===!0?5:r):(i.slot.destroy(),i.box!==t&&i.box.remove()),i=null)},get status(){return a}}}H();var Wo=typeof HTMLElement>"u"?class{}:HTMLElement,At=class extends Wo{static{this.observedAttributes=["name","src","props","isolate"]}#t=null;#e={};get props(){return this.#e}set props(e){this.#e=e??{},this.#t?.update(this.#e)}get status(){return this.#t?.status??"loading"}retry(){this.#t?.retry()}connectedCallback(){if(this.#t)return;let e=this.#r();if(!e)return;this.hasAttribute("props")&&!Object.keys(this.#e).length&&(this.#e=io(this.getAttribute("props")));let o=this.getAttribute("keep-alive"),r={name:e,props:this.#e,isolate:this.getAttribute("isolate")||void 0,loading:this.getAttribute("loading"),prefetch:this.getAttribute("prefetch"),priority:this.getAttribute("priority")||void 0,keepAlive:o===null?!1:Number(o)||!0,styles:{inherit:this.getAttribute("inherit-styles")?.split(/\s+/).filter(Boolean)},onStatus:(s,a)=>{this.setAttribute("data-vitral-status",s),s==="loading"?this.setAttribute("aria-busy","true"):this.removeAttribute("aria-busy");let i=l=>{let u=this.querySelectorAll(`:scope > [slot="${l}"]`);for(let p of u)p.hidden=s!==(l==="fallback"?"loading":"error");return u.length>0};queueMicrotask(()=>{if(this.#t?.status!==s)return;let l={loading:i("fallback"),error:i("error"),ready:!0};this.#n(l[s]?null:s)}),s==="ready"&&this.dispatchEvent(new CustomEvent("vitral-ready",{bubbles:!0,detail:{timings:ro(e)}})),s==="error"&&this.dispatchEvent(new CustomEvent("vitral-error",{bubbles:!0,detail:{error:a}}))}},n=null;this.#t=so(this,r)}#r(){let e=this.getAttribute("src"),o=this.getAttribute("name");return e?A(e,o??void 0,!1):o}#o=null;#n(e){if(this.#o?.remove(),this.#o=null,!e)return;let o=document.createElement("div");if(o.setAttribute("data-vitral-default",e),e==="loading")o.setAttribute("role","status"),o.textContent="Carregando\u2026";else{o.setAttribute("role","alert");let r=document.createElement("button");r.type="button",r.textContent="Tentar de novo",r.onclick=()=>this.retry(),o.append("N\xE3o foi poss\xEDvel carregar. ",r)}this.prepend(this.#o=o)}disconnectedCallback(){queueMicrotask(()=>{this.isConnected||(this.#t?.destroy(),this.#t=null,this.#n(null))})}attributeChangedCallback(e,o,r){if(e==="props")return void(this.props=io(r));if(!this.#t)return void(this.isConnected&&this.connectedCallback());if(e==="name"||e==="src"){let n=this.#r();n&&this.#t.set({name:n})}e==="isolate"&&this.#t.set({isolate:r||void 0})}};function io(t){if(!t)return{};try{return JSON.parse(t)}catch{return console.error("[vitral] atributo props n\xE3o \xE9 JSON v\xE1lido:",t),{}}}function ao(t="vitral-remote"){typeof customElements<"u"&&!customElements.get(t)&&customElements.define(t,class extends At{})}R();k();var lo="data-vitral-embed";function co(t){let e=t.dataset;if(!e.remote||t.hasAttribute(lo))return null;let o=e.target?document.querySelector(e.target):t.closest("body")?t:document.body;if(!o)return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>co(t),{once:!0}):console.error(`[vitral] data-target n\xE3o encontrado: ${e.target}`),null;t.setAttribute(lo,"");let r=S(e.remote);zo([new URL(r).origin,...e.origins?.split(/\s+/).filter(Boolean)??[]]),ao();let n=document.createElement("vitral-remote");return n.setAttribute("isolate",e.isolate||"shadow"),e.loading&&n.setAttribute("loading",e.loading),e.props&&n.setAttribute("props",e.props),e.name&&n.setAttribute("name",e.name),n.setAttribute("src",r),o===t?t.after(n):o.appendChild(n),n}function zo(t){let e=d(),o=e.settings().allowedOrigins??[B(),...e.origins()].filter(Boolean);ut({allowedOrigins:[...new Set([...o,...t])]})}var Xo=Symbol.for("vitral:embed"),Zo=globalThis[Xo]??=co;typeof document<"u"&&document.currentScript instanceof HTMLScriptElement&&Zo(document.currentScript);})();
@@ -1,4 +1,4 @@
1
- import { E as EventBus } from './types-Czvm-siZ.js';
1
+ import { E as EventBus } from './types-DUtcF3HO.js';
2
2
 
3
3
  /** Barramento global. É o mesmo objeto que os remotes recebem em `ctx.events`. */
4
4
  declare const events: EventBus;
@@ -0,0 +1,15 @@
1
+ import {
2
+ resolveModule,
3
+ resolveTarget,
4
+ splitName
5
+ } from "./chunk-C3QOBAUE.js";
6
+ import "./chunk-5JNV45BB.js";
7
+ import "./chunk-KU6HF2EW.js";
8
+ import "./chunk-TW7KYJQ6.js";
9
+ import "./chunk-463H6B56.js";
10
+ import "./chunk-GNPFWISJ.js";
11
+ export {
12
+ resolveModule,
13
+ resolveTarget,
14
+ splitName
15
+ };
@@ -0,0 +1,89 @@
1
+ import { a as RemoteModule, b as SharedModules, c as RemoteEntry } from './types-DUtcF3HO.js';
2
+ import './errors-kjBv6IH_.js';
3
+
4
+ /**
5
+ * Remotes do Module Federation no host vitral, para migrar um remote por vez:
6
+ *
7
+ * import { federationRemote } from 'vitral/federation'
8
+ * import { reactRemote } from 'vitral/react'
9
+ *
10
+ * configure({
11
+ * remotes: {
12
+ * carrinho: federationRemote('https://cdn.empresa.com/carrinho/mf-manifest.json', {
13
+ * adapt: (m) => reactRemote(m.default),
14
+ * }),
15
+ * },
16
+ * })
17
+ *
18
+ * <Remote name="carrinho/Carrinho" props={{ userId: 42 }} />
19
+ *
20
+ * Lê o `mf-manifest.json`, carrega o `remoteEntry.js` (global ou ES module),
21
+ * chama `init` com as dependências que o host oferece e `get` de cada parte
22
+ * exposta. Fica fora do host mínimo: só entra no bundle de quem importa.
23
+ */
24
+
25
+ interface FederationOptions {
26
+ /**
27
+ * Parte montada por `<Remote name="carrinho">` (sem `/`), como `'./Carrinho'`.
28
+ * Padrão: a única parte do manifesto. As outras são `carrinho/Parte`.
29
+ */
30
+ expose?: string;
31
+ /**
32
+ * Transforma o módulo exposto num remote com `mount`, ex.:
33
+ * `(m) => reactRemote(m.default)`. Recebe também a chave (`'./Carrinho'`).
34
+ * Devolver `undefined` deixa o módulo como está (módulo sem UI). Sem
35
+ * `adapt`, a parte precisa exportar `mount` (ou um `default` com `mount`).
36
+ */
37
+ adapt?: (module: any, key: string) => RemoteModule<any> | undefined;
38
+ /**
39
+ * Dependências que o host oferece ao remote, no mesmo formato do `dedupe`
40
+ * do `configure`: `{ react: { version: React.version, modules: { react: React, 'react-dom': ReactDOM } } }`.
41
+ * Cada especificador entra no share scope do Module Federation com a
42
+ * versão do grupo. O remote usa a do host se servir; senão, a própria cópia.
43
+ */
44
+ shared?: Record<string, {
45
+ version: string;
46
+ modules: SharedModules;
47
+ }>;
48
+ /**
49
+ * Sem manifesto (URL de um `remoteEntry.js`): nome da variável global que o
50
+ * container cria (`library.type: 'var'`). Sem esta opção, a URL é importada
51
+ * como ES module.
52
+ */
53
+ global?: string;
54
+ /**
55
+ * Origens de onde o `remoteEntry.js` pode vir, além da origem do manifesto
56
+ * (o `publicPath` do manifesto pode apontar para outro CDN). `['*']` libera tudo.
57
+ */
58
+ allowedOrigins?: string[];
59
+ }
60
+ /** A parte do `mf-manifest.json` que o adaptador lê. */
61
+ interface FederationManifest {
62
+ name?: string;
63
+ metaData?: {
64
+ globalName?: string;
65
+ publicPath?: string;
66
+ getPublicPath?: string;
67
+ remoteEntry?: {
68
+ name: string;
69
+ path?: string;
70
+ type?: string;
71
+ };
72
+ };
73
+ exposes?: {
74
+ name?: string;
75
+ path: string;
76
+ }[];
77
+ }
78
+ /**
79
+ * Entrada de `configure({ remotes })` para um remote do Module Federation.
80
+ * `url` é o `mf-manifest.json` (ou, sem manifesto, o `remoteEntry.js`).
81
+ */
82
+ declare function federationRemote(url: string, options?: FederationOptions): RemoteEntry;
83
+ /**
84
+ * Share scope no formato do webpack (`{ react: { '19.1.0': { get, loaded, from } } }`)
85
+ * a partir das dependências do host. É o que `federationRemote` passa para `init`.
86
+ */
87
+ declare function shareScope(shared?: FederationOptions['shared']): Record<string, Record<string, unknown>>;
88
+
89
+ export { type FederationManifest, type FederationOptions, federationRemote, shareScope };