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.
- package/README.md +1 -1
- package/dist/angular.d.ts +3 -2
- package/dist/angular.js +7 -6
- package/dist/auto.js +7 -6
- package/dist/capture-TT5WBLJ6.js +42 -0
- package/dist/channel-2YPYGX3J.js +95 -0
- package/dist/chunk-463H6B56.js +50 -0
- package/dist/chunk-54CBIZES.js +105 -0
- package/dist/chunk-6EX5KYT5.js +64 -0
- package/dist/{chunk-6Y3VMWHH.js → chunk-BCC25ANK.js} +11 -5
- package/dist/{chunk-2XF5BKV3.js → chunk-EMSB2NVX.js} +26 -13
- package/dist/{chunk-HP6QWU6K.js → chunk-IH3ZT3QU.js} +2 -2
- package/dist/{chunk-PX7PBCCT.js → chunk-TW7KYJQ6.js} +7 -17
- package/dist/{chunk-S5MZT5IT.js → chunk-UYOPJ4XQ.js} +1 -1
- package/dist/{chunk-UTYAX6MU.js → chunk-W6322KGP.js} +2 -2
- package/dist/{chunk-NCONW6WS.js → chunk-WD4CDGDZ.js} +73 -44
- package/dist/cli.js +1196 -31
- package/dist/contract-46EZFQPQ.js +17 -0
- package/dist/{dedupe-IWFIXRWG.js → dedupe-S7BHQMOZ.js} +4 -3
- package/dist/devtools.d.ts +32 -2
- package/dist/devtools.js +27 -12
- package/dist/element.d.ts +13 -4
- package/dist/element.js +7 -6
- package/dist/embed.js +2 -0
- package/dist/{errors-KKB8FGCz.d.ts → errors-kjBv6IH_.d.ts} +7 -1
- package/dist/{events-DUdjhfps.d.ts → events-Dkpkw_Sv.d.ts} +1 -1
- package/dist/expose-OVWTPHH5.js +15 -0
- package/dist/federation.d.ts +89 -0
- package/dist/federation.js +101 -0
- package/dist/iframe.d.ts +1 -1
- package/dist/iframe.js +13 -10
- package/dist/index.d.ts +23 -21
- package/dist/index.js +5 -4
- package/dist/otel.d.ts +44 -0
- package/dist/otel.js +27 -0
- package/dist/overrides-NP754HY7.js +27 -0
- package/dist/preact.d.ts +5 -5
- package/dist/preact.js +6 -5
- package/dist/react.d.ts +12 -4
- package/dist/react.js +11 -6
- package/dist/routes.d.ts +3 -3
- package/dist/routes.js +5 -4
- package/dist/sentry.d.ts +25 -0
- package/dist/sentry.js +11 -0
- package/dist/shadow-PVSETNMZ.js +159 -0
- package/dist/single-spa.d.ts +40 -0
- package/dist/single-spa.js +52 -0
- package/dist/{slot-pB276oPt.d.ts → slot-UPg6ob9v.d.ts} +2 -2
- package/dist/solid.d.ts +4 -4
- package/dist/solid.js +6 -5
- package/dist/{sri-BVKZNX5Q.js → sri-M7ZRU57G.js} +43 -11
- package/dist/svelte.d.ts +5 -5
- package/dist/svelte.js +6 -5
- package/dist/testing.d.ts +2 -1
- package/dist/testing.js +5 -4
- package/dist/{types-BV-hUrms.d.ts → types-CA2p9KHC.d.ts} +174 -4
- package/dist/vite.d.ts +26 -0
- package/dist/vite.js +686 -51
- package/dist/vue.d.ts +11 -4
- package/dist/vue.js +10 -5
- package/package.json +115 -23
- package/dist/chunk-DXORSF4X.js +0 -42
- package/dist/chunk-SFL6LTP3.js +0 -56
- package/dist/expose-53BEJB34.js +0 -14
- package/dist/overrides-NZAIUGK5.js +0 -15
- package/dist/shadow-MYRJQLLY.js +0 -72
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
protocol
|
|
3
|
+
} from "./chunk-GNPFWISJ.js";
|
|
4
|
+
|
|
5
|
+
// src/core/contract.ts
|
|
6
|
+
async function checkContract(c, range = protocol().settings().contract) {
|
|
7
|
+
const { satisfies } = await import("./dedupe-S7BHQMOZ.js");
|
|
8
|
+
if (c.version && !satisfies(c.version, range)) return `o host aceita contrato ${range}, o remote publica ${c.version}`;
|
|
9
|
+
const offered = protocol().settings().offered ?? {};
|
|
10
|
+
for (const dep in c.peers) {
|
|
11
|
+
const have = offered[dep];
|
|
12
|
+
if (have && !satisfies(have, c.peers[dep])) return `o remote espera ${dep} ${c.peers[dep]}, o host oferece ${have}`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
checkContract
|
|
17
|
+
};
|
|
@@ -3,14 +3,13 @@ function satisfies(version, range) {
|
|
|
3
3
|
if (range === "*") return true;
|
|
4
4
|
const [, op = "", want = ""] = /^(\^|~|>=|=)?(.*)$/.exec(range.trim());
|
|
5
5
|
if (!op || op === "=" || version.includes("-")) return version === want;
|
|
6
|
-
const v = version.split(".").map(Number);
|
|
7
|
-
const w = want.split(".").map(Number);
|
|
6
|
+
const [v, w] = [version, want].map((s) => (s + ".0.0").split(".", 3).map(Number));
|
|
8
7
|
for (let i = 0; i < 3; i++) if (v[i] !== w[i]) {
|
|
9
8
|
if (!(v[i] > w[i])) return false;
|
|
10
9
|
break;
|
|
11
10
|
}
|
|
12
11
|
if (op === ">=") return true;
|
|
13
|
-
const fixed = op === "~" ? 2 : w[0] ? 1 : w[1] ? 2 : 3;
|
|
12
|
+
const fixed = Math.min(want.split(".").length, op === "~" ? 2 : w[0] ? 1 : w[1] ? 2 : 3);
|
|
14
13
|
return v.slice(0, fixed).join(".") === w.slice(0, fixed).join(".");
|
|
15
14
|
}
|
|
16
15
|
|
|
@@ -73,9 +72,11 @@ function offer(p, groups) {
|
|
|
73
72
|
for (const name in groups) {
|
|
74
73
|
const { version, modules } = groups[name];
|
|
75
74
|
shared(p)(name, version, { version, load: async () => modules });
|
|
75
|
+
p.configure({ offered: { ...p.settings().offered, [name]: version } });
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
export {
|
|
79
79
|
offer,
|
|
80
|
+
satisfies,
|
|
80
81
|
shared
|
|
81
82
|
};
|
package/dist/devtools.d.ts
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
|
+
/** Remove todos os overrides: os da aba e os do navegador. */
|
|
2
|
+
declare function clearOverrides(): void;
|
|
3
|
+
/** Override ativo. `url` fica vazia quando um apelido não tem modelo para resolver. */
|
|
4
|
+
interface ActiveOverride {
|
|
5
|
+
name: string;
|
|
6
|
+
/** Como foi pedido: URL ou apelido (`pr-123`). */
|
|
7
|
+
value: string;
|
|
8
|
+
url?: string;
|
|
9
|
+
/** `'aba'`: veio de `?vitral=` nesta aba. `'navegador'`: do localStorage. */
|
|
10
|
+
source: 'aba' | 'navegador';
|
|
11
|
+
}
|
|
12
|
+
/** Overrides que valem nesta página. Os da aba têm prioridade sobre os do navegador. */
|
|
13
|
+
declare function activeOverrides(): ActiveOverride[];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Painel de desenvolvimento: troca a URL de um remote por um `vite dev`
|
|
17
|
+
* local (ou pelo preview de um PR) sem mexer no código do host.
|
|
18
|
+
*
|
|
19
|
+
* import { devtools } from 'vitral/devtools'
|
|
20
|
+
* if (import.meta.env.DEV) devtools()
|
|
21
|
+
*
|
|
22
|
+
* O painel lista os overrides ativos: os de `?vitral=` desta aba e os
|
|
23
|
+
* salvos em `localStorage['vitral:overrides']`. Só valem com
|
|
24
|
+
* `configure({ devOverrides })` ou com a página em localhost.
|
|
25
|
+
*/
|
|
26
|
+
|
|
1
27
|
/** Overrides salvos neste navegador: `{ nome: url }`. */
|
|
2
28
|
declare function getOverrides(): Record<string, string>;
|
|
3
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Salva no navegador o override de um remote: URL ou apelido (`pr-123`).
|
|
31
|
+
* `null` remove o override (da aba e do navegador). Vale a partir do próximo
|
|
32
|
+
* carregamento.
|
|
33
|
+
*/
|
|
4
34
|
declare function setOverride(name: string, url: string | null): void;
|
|
5
35
|
interface DevtoolsOptions {
|
|
6
36
|
/** Recarrega a página depois de mudar um override. Padrão: true. */
|
|
@@ -9,4 +39,4 @@ interface DevtoolsOptions {
|
|
|
9
39
|
/** Mostra o painel no canto da página. Devolve uma função que o remove. */
|
|
10
40
|
declare function devtools(options?: DevtoolsOptions): () => void;
|
|
11
41
|
|
|
12
|
-
export { type DevtoolsOptions, devtools, getOverrides, setOverride };
|
|
42
|
+
export { type ActiveOverride, type DevtoolsOptions, activeOverrides, clearOverrides, devtools, getOverrides, setOverride };
|
package/dist/devtools.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
activeOverrides,
|
|
3
|
+
clearOverrides,
|
|
4
|
+
dropOverride,
|
|
4
5
|
overridesEnabled,
|
|
6
|
+
storeOverride,
|
|
5
7
|
storedOverrides
|
|
6
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-54CBIZES.js";
|
|
7
9
|
import "./chunk-GNPFWISJ.js";
|
|
8
10
|
|
|
9
11
|
// src/devtools.ts
|
|
@@ -11,11 +13,8 @@ function getOverrides() {
|
|
|
11
13
|
return storedOverrides();
|
|
12
14
|
}
|
|
13
15
|
function setOverride(name, url) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
else delete all[name];
|
|
17
|
-
if (Object.keys(all).length) localStorage.setItem(OVERRIDES_KEY, JSON.stringify(all));
|
|
18
|
-
else localStorage.removeItem(OVERRIDES_KEY);
|
|
16
|
+
if (url) storeOverride(name, url);
|
|
17
|
+
else dropOverride(name);
|
|
19
18
|
}
|
|
20
19
|
var STYLE = `
|
|
21
20
|
:host { position: fixed; right: 12px; bottom: 12px; z-index: 2147483647; font: 13px/1.4 system-ui, sans-serif; color: #111 }
|
|
@@ -27,6 +26,8 @@ li { display: flex; gap: 6px; align-items: center; margin-bottom: 4px; word-brea
|
|
|
27
26
|
form { display: grid; gap: 4px }
|
|
28
27
|
input { font: inherit; padding: 3px 6px }
|
|
29
28
|
.aviso { color: #a40000; margin: 0 0 8px }
|
|
29
|
+
.ativo { background: #fde68a; border-color: #b45309 }
|
|
30
|
+
.limpar { margin-top: 8px }
|
|
30
31
|
`;
|
|
31
32
|
function devtools(options = {}) {
|
|
32
33
|
const host = document.createElement("div");
|
|
@@ -43,9 +44,16 @@ function devtools(options = {}) {
|
|
|
43
44
|
toggle.textContent = "vitral";
|
|
44
45
|
toggle.onclick = () => panel.hidden = !panel.hidden;
|
|
45
46
|
root.append(style, panel, toggle);
|
|
46
|
-
const changed = () =>
|
|
47
|
+
const changed = () => {
|
|
48
|
+
const q = new URLSearchParams(location.search);
|
|
49
|
+
if (q.has("vitral")) q.delete("vitral"), history.replaceState(history.state, "", `${location.pathname}${q.size ? `?${q}` : ""}${location.hash}`);
|
|
50
|
+
options.reload === false ? draw() : location.reload();
|
|
51
|
+
};
|
|
47
52
|
function draw() {
|
|
48
53
|
panel.replaceChildren();
|
|
54
|
+
const active = activeOverrides();
|
|
55
|
+
toggle.textContent = active.length ? `vitral (${active.length})` : "vitral";
|
|
56
|
+
toggle.classList.toggle("ativo", active.length > 0);
|
|
49
57
|
if (!overridesEnabled()) {
|
|
50
58
|
const p = document.createElement("p");
|
|
51
59
|
p.className = "aviso";
|
|
@@ -53,19 +61,19 @@ function devtools(options = {}) {
|
|
|
53
61
|
panel.append(p);
|
|
54
62
|
}
|
|
55
63
|
const list = document.createElement("ul");
|
|
56
|
-
for (const
|
|
64
|
+
for (const { name: name2, value, url: url2, source } of active) {
|
|
57
65
|
const item = document.createElement("li");
|
|
58
66
|
const remove = document.createElement("button");
|
|
59
67
|
remove.type = "button";
|
|
60
68
|
remove.textContent = "remover";
|
|
61
69
|
remove.setAttribute("aria-label", `remover override de ${name2}`);
|
|
62
70
|
remove.onclick = () => (setOverride(name2, null), changed());
|
|
63
|
-
item.append(`${name2} \u2192 ${url2}`, remove);
|
|
71
|
+
item.append(`${name2} \u2192 ${url2 ?? `${value} (sem devOverrides.preview)`} [${source}]`, remove);
|
|
64
72
|
list.append(item);
|
|
65
73
|
}
|
|
66
74
|
const form = document.createElement("form");
|
|
67
75
|
const name = Object.assign(document.createElement("input"), { placeholder: "nome (ex.: carrinho)", required: true, name: "name" });
|
|
68
|
-
const url = Object.assign(document.createElement("input"), { placeholder: "http://localhost:5174", required: true, name: "url" });
|
|
76
|
+
const url = Object.assign(document.createElement("input"), { placeholder: "http://localhost:5174 ou pr-123", required: true, name: "url" });
|
|
69
77
|
const save = Object.assign(document.createElement("button"), { type: "submit", textContent: "Salvar" });
|
|
70
78
|
form.append(name, url, save);
|
|
71
79
|
form.onsubmit = (e) => {
|
|
@@ -74,12 +82,19 @@ function devtools(options = {}) {
|
|
|
74
82
|
changed();
|
|
75
83
|
};
|
|
76
84
|
panel.append(list, form);
|
|
85
|
+
if (active.length) {
|
|
86
|
+
const clear = Object.assign(document.createElement("button"), { type: "button", textContent: "Limpar todos", className: "limpar" });
|
|
87
|
+
clear.onclick = () => (clearOverrides(), changed());
|
|
88
|
+
panel.append(clear);
|
|
89
|
+
}
|
|
77
90
|
}
|
|
78
91
|
draw();
|
|
79
92
|
document.body.append(host);
|
|
80
93
|
return () => host.remove();
|
|
81
94
|
}
|
|
82
95
|
export {
|
|
96
|
+
activeOverrides,
|
|
97
|
+
clearOverrides,
|
|
83
98
|
devtools,
|
|
84
99
|
getOverrides,
|
|
85
100
|
setOverride
|
package/dist/element.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { P as Props, S as Shared, a as RemoteModule } from './types-
|
|
2
|
-
import { S as SlotStatus } from './slot-
|
|
3
|
-
import './errors-
|
|
1
|
+
import { P as Props, S as Shared, a as RemoteModule } from './types-CA2p9KHC.js';
|
|
2
|
+
import { S as SlotStatus } from './slot-UPg6ob9v.js';
|
|
3
|
+
import './errors-kjBv6IH_.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Host universal: `<vitral-remote>` funciona em qualquer lugar que renderize
|
|
@@ -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,12 +3,13 @@ import {
|
|
|
3
3
|
VitralRemoteElement,
|
|
4
4
|
defineVitralElement,
|
|
5
5
|
elementRemote
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-BCC25ANK.js";
|
|
7
|
+
import "./chunk-W6322KGP.js";
|
|
8
|
+
import "./chunk-WD4CDGDZ.js";
|
|
9
|
+
import "./chunk-EMSB2NVX.js";
|
|
10
|
+
import "./chunk-6EX5KYT5.js";
|
|
11
|
+
import "./chunk-TW7KYJQ6.js";
|
|
12
|
+
import "./chunk-463H6B56.js";
|
|
12
13
|
import "./chunk-GNPFWISJ.js";
|
|
13
14
|
export {
|
|
14
15
|
SharedController,
|
package/dist/embed.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(()=>{var ao=Object.defineProperty;var h=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var o in t)ao(e,o,{get:t[o],enumerable:!0})};var M,W=h(()=>{"use strict";M={}});function Ie(){let e=new Map,t=new Map;return{emit(o,r){t.set(o,r);for(let n of[...e.get(o)??[]])try{n(r)}catch(s){console.error(`[vitral] handler de "${o}" falhou`,s)}},on(o,r){let n=e.get(o);return n||e.set(o,n=new Set),n.add(r),()=>n.delete(r)},last(o){return t.get(o)}}}var $e=h(()=>{"use strict"});function lo(){let e={timeout:15e3,retries:1,isolate:"none",allowedOrigins:null},t=new Map,o=new Map,r=Promise.resolve();return{protocol:He,events:Ie(),settings:()=>e,configure(n){Object.assign(e,n)},register(n,s){t.set(n,s),o.delete(n)},entry:n=>t.get(n),origins:()=>[...t.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 i=o.get(n);if(!i){i=s();let a=i;a.catch(()=>o.get(n)===a&&o.delete(n)),o.set(n,i)}return i}}}function d(){let e=Ue[De];return e&&typeof e.protocol=="number"&&e.protocol>=He?e:Ue[De]=lo()}var He,De,Ue,R=h(()=>{"use strict";$e();He=1,De=Symbol.for("vitral"),Ue=globalThis});function L(e,t){if(w(e)&&!B.has(e)){B.add(e),e.cause instanceof Object&&B.add(e.cause),e.entry??=t?.entry??d().entry(e.remote)?.url,e.version??=t?.version;try{d().settings().onError?.(e)}catch{}M.watch?.(e.remote,e)}return e}var Ne,f,w,$,B,z,b=h(()=>{"use strict";W();R();Ne="https://joaogabriel15.github.io/vitral/erros/",f=class extends Error{constructor(o,r,n,s){super(`[vitral] ${r}: ${n} (${Ne}${o})`);this.code=o;this.remote=r;this.cause=s;this.name="RemoteError",this.docs=`${Ne}${o}`,typeof location<"u"&&(this.route=location.pathname)}},w=e=>e?.name==="RemoteError",$=new Map,B=new WeakSet;z=e=>{throw L(e)}});function _(){return typeof location<"u"?location.origin:null}function S(e,t){return new URL(e,t??(typeof location<"u"?location.href:void 0)).href}async function je(e,t){for(let o=0;;o++)try{return await t()}catch(r){if(!(w(r)&&(r.code==="LOAD_FAILED"||r.code==="TIMEOUT"))||o>=e)throw r;await new Promise(s=>setTimeout(s,200*2**o))}}function V(e,t,o){return new Promise((r,n)=>{let s=setTimeout(()=>n(new f("TIMEOUT",t,`n\xE3o respondeu em ${e}ms`)),e);o.then(r,n).finally(()=>clearTimeout(s))})}function q(e,t,o,r){let n=new AbortController,s=fetch(e,{signal:n.signal,credentials:"omit",...r}).then(i=>{if(!i.ok)throw new f("LOAD_FAILED",o,`HTTP ${i.status} em ${e}`);return i.arrayBuffer()},i=>{throw new f("LOAD_FAILED",o,`falha ao baixar ${e}`,i)});return V(t,o,s).catch(i=>{throw n.abort(),i})}async function X(e,t,o,r){let n=new TextDecoder().decode(await q(e,t,o,r));try{return JSON.parse(n)}catch(s){throw new f("INVALID_MODULE",o,`JSON inv\xE1lido em ${e}`,s)}}function C(e,t,o={},r=document.head){return r.appendChild(Object.assign(document.createElement("link"),{rel:e,crossOrigin:"anonymous",href:t},o))}function D(e,t,o){try{let r=`vitral:${e}:${t}`;performance.clearMeasures(r),performance.measure(r,{start:o}),d().settings().onMetric?.({name:e,stage:t,start:o,duration:performance.now()-o})}catch{}}var k=h(()=>{"use strict";b();R()});var qe={};O(qe,{capture:()=>co,owner:()=>Ve});function co(){Be||typeof addEventListener>"u"||(Be=!0,addEventListener("error",e=>_e(e.error,e.filename)),addEventListener("unhandledrejection",e=>_e(e.reason)))}function Ve(e,t){let o=t||String(e?.stack??"").match(/(?:https?|file):\/\/[^\s)'"]+/)?.[0];if(!o)return;let r=[...document.querySelectorAll("script[src],link[rel=modulepreload]")].map(i=>i.src||i.href),n,s=0;for(let[i,{entry:a}]of $){let l=new URL(".",a).href;l.length>s&&o.startsWith(l)&&!r.some(u=>u.startsWith(l))&&(n=i,s=l.length)}return n}function _e(e,t){if(!d().settings().captureGlobalErrors||w(e)||e instanceof Object&&B.has(e))return;let o=Ve(e,t);o&&L(new f("RENDER_FAILED",o,String(e?.message??e),e),$.get(o))}var Be,Fe=h(()=>{"use strict";b();R();Be=!1});function ce(e,t){if(t==="*")return!0;let[,o="",r=""]=/^(\^|~|>=|=)?(.*)$/.exec(t.trim());if(!o||o==="="||e.includes("-"))return e===r;let[n,s]=[e,r].map(a=>(a+".0.0").split(".",3).map(Number));for(let a=0;a<3;a++)if(n[a]!==s[a]){if(!(n[a]>s[a]))return!1;break}if(o===">=")return!0;let i=Math.min(r.split(".").length,o==="~"?2:s[0]?1:s[1]?2:3);return n.slice(0,i).join(".")===s.slice(0,i).join(".")}var Ke=h(()=>{"use strict"});var Z={};O(Z,{offer:()=>mo,satisfies:()=>ce,shared:()=>Je});function Je(e){if(!e.dedupe){let t=new Map,o=new Map,r=(s,i)=>s.includes(i)&&s.splice(s.indexOf(i),1),n=(s,i,a)=>(a.p||((a.p=a.load()).catch(()=>r(i,a)),a.url&&a.p.then(()=>po(`${s}@${a.version}`,a.url),()=>{})),a.p);e.dedupe=(s,i,a)=>{let l=a,u=t.get(s)??[];t.set(s,u),l?.url&&o.get(s+l.url)?.(l);let p=u.find(c=>ce(c.version,i));if(!p&&l){p=u[u.push(l)-1];let c=l.url&&uo(`${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 e.dedupe}function mo(e,t){for(let o in t){let{version:r,modules:n}=t[o];Je(e)(o,r,{version:r,load:async()=>n}),e.configure({offered:{...e.settings().offered,[o]:r}})}}var Ge,uo,po,Q=h(()=>{"use strict";Ke();Ge="vitral:dedupe:",uo=e=>{try{return localStorage.getItem(Ge+e)}catch{return null}},po=(e,t)=>{try{localStorage.setItem(Ge+e,t)}catch{}}});function ue(e){let t=d(),{remotes:o,dedupe:r,...n}=e;if(t.configure(n),n.captureGlobalErrors&&Promise.resolve().then(()=>(Fe(),qe)).then(s=>s.capture()),r&&t.pending(Promise.resolve().then(()=>(Q(),Z)).then(s=>s.offer(t,r)).catch(()=>{})),typeof o=="string"){let s=S(o);t.pending(X(s,t.settings().timeout,"remotes",{cache:"no-cache"}).then(i=>Ye(i,s))).catch(()=>{})}else o&&Ye(o)}function We(e,t){let o=typeof t=="string"?{url:t}:t;if(!o.url&&!o.module)throw new f("NOT_REGISTERED",e,"informe url ou module");if(!o.url)return d().register(e,o);let r=S(o.url);d().register(e,{...o,url:r});let{origin:n}=new URL(r);typeof document<"u"&&n!==_()&&n!=="null"&&!document.querySelector(`link[href="${n}"]`)&&C("preconnect",n)}function A(e,t,o=!0){let r=d(),n=S(e),s=t||n;r.entry(s)?.url!==n&&r.register(s,{url:n});let i=new URL(n).origin,a=r.settings().trusted??[];return o&&!a.includes(i)&&r.configure({trusted:[...a,i]}),s}function Ye(e,t){for(let[o,r]of Object.entries(e)){let n=typeof r=="string"?{url:r}:r;We(o,n.url?{...n,url:S(n.url,t)}:n)}}function ee(e,t){let o=d(),r=new URL(t).origin,{allowedOrigins:n,trusted:s=[]}=o.settings(),i=[...n??[_(),...o.origins()].filter(Boolean),...s];if(!(i.includes("*")||i.includes(r)||t.startsWith("blob:")))throw new f("ORIGIN_BLOCKED",e,`origem ${r} n\xE3o est\xE1 em allowedOrigins`)}var U=h(()=>{"use strict";b();R();k()});var ge={};O(ge,{attachShadowRoot:()=>vo,prefetch:()=>yo,registryFor:()=>fe});function et({css:e,shadow:t}){let o=n=>new URL(n,e[0]).href,r=t?t.css.map(o):[];return[t?[...(t.imports??[]).map(o),...r,...e.slice(r.length)]:e,r,(t?.global??[]).map(o)]}function yo(e,t){let[o,,r]=et(e);for(let n of o)ye(n,e.sri?.[n],t).catch(fo);F(r,null,e.sri)}async function vo(e,t,o,r={},n={}){let s=t().getAttribute("data-vitral-root"),i=fe(s),a=e.shadowRoot;if(!a&&!Xe(i))try{a=e.attachShadow({mode:"open",customElementRegistry:i})}catch{me=!0,pe.delete(s),i=fe(s)}a??=e.attachShadow({mode:"open"});let l=a.customElementRegistry??i,u=t();if(!Xe(l))try{u=t({customElementRegistry:l})}catch{}return a.appendChild(u),[...await Ro(a,u,o,r,n),a,l,u]}function fe(e){let t=pe.get(e);if(t)return t;let o=customElements;if(!me&&"initialize"in CustomElementRegistry.prototype)try{o=new CustomElementRegistry}catch{me=!0}let r=o===customElements,n=t=r?Object.create(o):o;if(r)for(let i of["get","getName","upgrade","whenDefined"])i in o&&(n[i]=o[i].bind(o));let s=o.define;return n.define=(i,a,l)=>{let u=o.get(i),p=Ze.get(i);if(!u)return r&&Ze.set(i,e),s.call(o,i,a,l);r&&u!==a&&p!==e&&Eo()&&console.warn(`[vitral] ${e}: <${i}> 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.`)},pe.set(e,t),t}function Eo(){try{return process.env.NODE_ENV!=="production"}catch{return!1}}async function Ro(e,t,o,r={},n={}){let s=o.sri??{},[i,a,l]=et(o),u=t.cloneNode();u.setAttribute("data-vitral-portal",""),t.after(u);let p=[...r.inherit??[],...n.inherit??[]].map(m=>new URL(m,document.baseURI).href).concat(i),c=F(l,null,s);if(typeof CSSStyleSheet<"u"&&"replaceSync"in CSSStyleSheet.prototype){let m=await Promise.all(p.map(y=>tt(y,[],s[y],a.includes(y)?!!o.shadow.rebase:void 0)));e.adoptedStyleSheets=[...new Set([...e.adoptedStyleSheets,...m.flat()])]}else await F(p,e,s);await c;let g=(n.mirrorTheme??r.mirrorTheme)===!1?[]:[Qe(t),Qe(u)];return[()=>(g.forEach(m=>m()),u.remove()),u]}function tt(e,t,o,r){let n=de.get(e);return n||(n=ye(e,o).then(s=>{let i=new CSSStyleSheet;if(r!==!1&&(s=s.replace(go,(c,g,m)=>`url(${g}${new URL(m,e).href}${g})`)),r!=null)return i.replaceSync(s),[i];let a=[],l=[],u=s.replace(ho,(c,g,m,y,x)=>{let v=y??x;return v?l.push(new URL(v,e).href):ze.has(g??c)||(ze.add(g??c),a.push(c)),""});if(a.length){let c=document.createElement("style");c.setAttribute("data-vitral-properties",""),c.textContent=a.join(`
|
|
2
|
+
`),document.head.appendChild(c)}i.replaceSync(u);let p=[...t,e];return Promise.all(l.filter(c=>!p.includes(c)).map(c=>tt(c,p))).then(c=>[...c.flat(),i])}).catch(()=>(de.delete(e),[])),de.set(e,n)),n}function Qe(e){let t=document.documentElement,o=[],r=()=>{e.classList.remove(...o),o=[...t.classList].filter(i=>!e.classList.contains(i)),e.classList.add(...o);let s=t.getAttribute("data-theme");s===null?e.removeAttribute("data-theme"):e.setAttribute("data-theme",s)};r();let n=new MutationObserver(r);return n.observe(t,{attributeFilter:["class","data-theme"]}),()=>n.disconnect()}var de,fo,ze,go,ho,pe,me,Xe,Ze,he=h(()=>{"use strict";te();de=new Map,fo=()=>{},ze=new Set,go=/url\(\s*(['"]?)(?![a-z]+:|\/\/|#)([^'")]+)\1\s*\)/gi,ho=/@property\s+(--[\w-]+)\s*\{[^}]*\}|@font-face\s*\{[^}]*\}|@import\s+(?:url\(\s*)?(?:(['"])(.*?)\2|([^'"\s);]+))\s*\)?[^;]*;/gi;pe=new Map,me=!1,Xe=e=>Object.getPrototypeOf(e)===customElements,Ze=new Map});function ye(e,t,o){let r=`${e} ${t??""}`,n=ve.get(r);return n||(n=q(e,d().settings().timeout,e,{integrity:t,priority:o}).then(s=>new TextDecoder().decode(s)),n.catch(()=>ve.delete(r)),ve.set(r,n)),n}function nt(e,t,o="auto"){if(t&&wo())Promise.resolve().then(()=>(he(),ge)).then(r=>r.prefetch(e,o),rt);else for(let r of e.css)document.querySelector(`link[href="${r}"]`)||C("preload",r,{as:"style",integrity:e.sri?.[r]??"",fetchPriority:o})}function st(e,t,o,r){return t?Promise.resolve().then(()=>(he(),ge)).then(n=>n.attachShadowRoot(t,o,e,d().settings().styles,r)):F(e.css,null,e.sri).then(()=>[rt])}function F(e,t,o={}){let r=t??document,n=ot.get(r);n||ot.set(r,n=new Map);let s=t??document.head,i=d().settings().timeout;return Promise.all(e.map(a=>{let l=n.get(a);return l||(l=new Promise(u=>{let p=C("stylesheet",a,{integrity:o[a]??""},s);setTimeout(u,i),p.onload=()=>u(),p.onerror=()=>{p.remove(),n.delete(a),u()}}),n.set(a,l)),l}))}var ot,ve,rt,wo,te=h(()=>{"use strict";R();k();ot=new WeakMap,ve=new Map,rt=()=>{},wo=()=>typeof CSSStyleSheet<"u"&&"replaceSync"in CSSStyleSheet.prototype});var lt={};O(lt,{resolveModule:()=>So,resolveTarget:()=>bo,splitName:()=>it});function it(e){let t=d(),o=e.length;if(!t.entry(e))for(;(o=e.lastIndexOf("/",o-1))>0&&!t.entry(e.slice(0,o)););return o>0&&o<e.length?[e.slice(0,o),"."+e.slice(o)]:[e,null]}function bo(e,t){return at(e,t).then(o=>Ee(e,o))}function at(e,t){let o=d();return o.entry(e)||!e.includes("/")?t(e):o.pending().then(async()=>{let[r,n]=it(e);if(!n)return t(e);let s=await t(r),i=s.exports?.exposes;if(!i?.[n])throw new f("NOT_EXPOSED",e,`${r} n\xE3o exp\xF5e ${n}. Expostos: ${Object.keys(i??{}).join(", ")}`);try{let a=i[n],l=await(typeof a=="function"?a():a);return{...s,module:l?.default??l,exports:l}}catch(a){throw new f("LOAD_FAILED",e,String(a),a)}})}async function So(e,t){let o=await at(e,t);if(!o.exports)throw new f("INVALID_MODULE",e,"o remote foi carregado por uma c\xF3pia antiga da lib, que n\xE3o guarda os exports");return o.exports}var ct=h(()=>{"use strict";b();oe();R()});async function dt(e,t,o){let r=o.split(/\s+/).map(a=>/^sha(256|384|512)-([\w+/=-]+)/.exec(a)).filter(a=>!!a);if(!r.length)throw new f("INTEGRITY",e,`formato de integrity inv\xE1lido: ${o}`);let n=Math.max(...r.map(a=>+a[1])),s=btoa(String.fromCharCode(...new Uint8Array(await crypto.subtle.digest("SHA-"+n,t)))),i=r.filter(a=>+a[1]===n).map(a=>a[2]);if(!i.some(a=>ut(a)===ut(s)))throw new f("INTEGRITY",e,`o hash n\xE3o confere: esperado sha${n}-${i.join(" ou ")}, obtido sha${n}-${s}`)}var ut,pt=h(()=>{"use strict";b();ut=e=>e.replace(/-/g,"+").replace(/_/g,"/").replace(/=/g,"")});var wt={};O(wt,{importVerified:()=>Po,verified:()=>Et});async function Po(e,t,o,r){let{entry:n,integrity:s,priority:i}=t;if(!Re.has(n))try{let p=await V(r,e,(async()=>{let c=await Et(t.split??{entry:n,chunks:[],sri:{[n]:s},priority:i},o);return c&&{ns:await o(c)}})());if(p)return p.ns}catch(u){if(Re.add(n),u instanceof f&&u.code==="TIMEOUT")throw u}let a=await q(n,r,e,Re.has(n)?{priority:i,cache:"reload"}:{priority:i});await dt(e,a,s);let l=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));try{return await o(l)}finally{URL.revokeObjectURL(l)}}async function Oo(e){if(we)return await we&&yt(e,!1);let t=!1;try{t=localStorage[gt]===navigator.userAgent}catch{}let o=await(we=yt(e,!t));if(o&&!t)try{localStorage[gt]=navigator.userAgent}catch{}return o}async function Et(e,t){let{entry:o,chunks:r,sri:n,priority:s="auto",dedupe:i=[]}=e,a=i.flatMap(p=>[...p.chunks??[],p.file]);if(![o,...r,...a].every(p=>xo.test(n[p]??"")))return;let l=globalThis[Symbol.for("vitral")],u=async p=>{if(!t||!i.length)return;let{shared:c}=await Promise.resolve().then(()=>(Q(),Z));for(let g of i)c(l)(g.name,g.range,{version:g.version,url:g.file,load:async()=>(p&&await Promise.all([...g.chunks??[],g.file].map(m=>be(m,n[m],s))),(await t(g.file)).default)})};if(ft!==!1&&(ft=await Oo(n))){await u();for(let p of r)fetch(p,{priority:s}).catch(()=>{});return o}if(await(Lo??=Mo()))return l.sri={...l.sri,...n},await u(!0),await Promise.all([...r,o].map(p=>be(p,n[p],s))),o}async function yt(e,t){if(!HTMLScriptElement.supports?.("importmap"))return!1;let o={};for(let s in e)/\.css([?#]|$)/.test(s)||(o[s]=e[s]);let r=t?["export{}","export{}//"].map(s=>URL.createObjectURL(new Blob([s],{type:"text/javascript"}))):[];for(let s of r)o[s]=vt;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 ht(),await ht(),n&&t&&(n=await Rt(i=>import(i),r[0],r[1]))}catch{n=!1}for(let s of r)URL.revokeObjectURL(s);return n}function be(e,t,o="auto"){return new Promise((r,n)=>{let s=C("modulepreload",e,{integrity:t,fetchPriority:o});s.onload=r,s.onerror=n})}function Mo(){return document.createElement("link").relList.supports("modulepreload")?Rt(e=>be(e,vt),mt,mt+"//"):Promise.resolve(!1)}function Rt(e,t,o){return Promise.race([Promise.all([e(t).then(()=>!0,()=>!1),e(o).then(()=>!1,()=>!0)]).then(([r,n])=>r&&n),new Promise(r=>setTimeout(r,3e3,!1))])}var Re,xo,mt,vt,ft,we,Lo,gt,ht,bt=h(()=>{"use strict";pt();b();k();Re=new Set;xo=/^(sha(256|384|512)-[A-Za-z0-9+/]+={0,2}( +|$))+$/,mt="data:text/javascript,export{}",vt="sha256-d3bjIZdvLjBurwdLwkSVOnEBPFFly+T1SR9r3VVHBGg=",gt="vitral:sri-map";ht=()=>new Promise(e=>{let t=new MessageChannel;t.port1.onmessage=()=>e(),t.port2.postMessage(0)})});var Mt={};O(Mt,{OVERRIDES_KEY:()=>re,activeOverrides:()=>Ot,clearOverrides:()=>xt,dropOverride:()=>Co,isRef:()=>Se,manifestUrl:()=>ne,overrideFor:()=>Ao,overridesEnabled:()=>Pt,resolveOverride:()=>Lt,storeOverride:()=>ko,storedOverrides:()=>xe});function Pt(){return!!d().settings().devOverrides||typeof location<"u"&&/^(localhost|127\.0\.0\.1|\[::1\])$/.test(location.hostname)}function ko(e,t){let o=xe();t?o[e]=Se(t)?t:ne(t):delete o[e],K(ie,o)}function To(){let e=Pe(se),t=new URLSearchParams(location.search).getAll("vitral").join(",").split(",");if(!t.some(Boolean))return e;for(let o of t){let r=o.indexOf("@");o==="off"?(xt(),Object.keys(e).forEach(n=>delete e[n])):r>0&&o.slice(r+1)==="off"?delete e[o.slice(0,r)]:r>0&&(e[o.slice(0,r)]=o.slice(r+1))}return K(se,e),e}function xt(){K(se,{}),K(ie,{})}function Co(e){for(let t of[se,ie]){let o=Pe(t);delete o[e],K(t,o)}}function Lt(e,t){if(!Se(t))return new URL(ne(t),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(e)).replace(/\{ref\}/g,encodeURIComponent(t));return new URL(ne(n),location.href).href}function Ot(){let e=To(),t={};for(let[o,r]of[["navegador",xe()],["aba",e]])for(let[n,s]of Object.entries(r))t[n]={name:n,value:s,url:Lt(n,s),source:o};return Object.values(t)}function Ao(e){if(!Pt())return;let t=Ot().find(i=>i.name===e);if(!t)return;let o=!St.has(e)&&St.add(e);if(!t.url){o&&console.warn(`[vitral] override ${e}@${t.value} ignorado: falta configure({ devOverrides: { preview } })`);return}let r=d(),n=r.settings().trusted??[],s=new URL(t.url).origin;return n.includes(s)||r.configure({trusted:[...n,s]}),o&&console.warn(`[vitral] override ativo: ${e} \u2192 ${t.url} (${t.source}). Para limpar: ?vitral=off`),{url:t.url}}var re,ne,Se,Pe,K,ie,se,xe,St,kt=h(()=>{"use strict";R();re="vitral:overrides";ne=e=>/\.(json|m?js)(\?|$)/.test(e)?e:e.replace(/\/?$/,"/vitral.json"),Se=e=>/^[\w.-]+$/.test(e),Pe=e=>{try{return JSON.parse(e().getItem(re)??"{}")??{}}catch{return{}}},K=(e,t)=>{try{Object.keys(t).length?e().setItem(re,JSON.stringify(t)):e().removeItem(re)}catch{}},ie=()=>localStorage,se=()=>sessionStorage,xe=()=>Pe(ie);St=new Set});var Dt={};O(Dt,{bucket:()=>It,pick:()=>Io,resetChannels:()=>Ho,versionUrl:()=>At});async function Io(e,t,o){if(typeof o.stable!="string")throw new f("INVALID_MODULE",e,`canal inv\xE1lido em ${t.url}: falta "stable"`);M.watch=Do;let r={name:e,bucket:It(e)},{canary:n,stable:s}=o,i=await t.resolve?.(o,r)??(n&&r.bucket<n.percent?n.version:s);return i!==s&&$t()[e]===i&&(i=s),i===s||t.rollback===!1?N.delete(e):N.get(e)?.from!==i&&N.set(e,{from:i,to:s,errors:0,mounts:0,max:{errors:3,mounts:20,...t.rollback}}),{...t,url:At(i,t.url),integrity:void 0,manifest:void 0}}function It(e){let t=d().settings().canaryKey??$o(),o=2166136261;for(let r of`${t}:${e}`)o=Math.imul(o^r.charCodeAt(0),16777619);return(o>>>0)%100}function $o(){try{H??=localStorage.getItem(Tt)??void 0}catch{}if(!H){H=Math.random().toString(36).slice(2);try{localStorage.setItem(Tt,H)}catch{}}return H}function $t(){try{return{...JSON.parse(sessionStorage.getItem(Ct)||"{}"),...G}}catch{return G}}function Do(e,t){for(let[o,r]of N)e!==o&&!e.startsWith(o+"/")||(t?++r.errors>=r.max.errors&&Uo(o,r):++r.mounts>r.max.mounts&&(r.mounts=1,r.errors=0))}function Uo(e,t){N.delete(e),G={...$t(),[e]:t.from};try{sessionStorage.setItem(Ct,JSON.stringify(G))}catch{}console.warn(`[vitral] ${e}: ${t.errors} erros em ${t.mounts} montagens da vers\xE3o ${t.from}; voltando para ${t.to}`);try{d().settings().onRollback?.({name:e,from:t.from,to:t.to,errors:t.errors,mounts:t.mounts})}catch{}let o=d();o.register(e,o.entry(e)),o.events.emit("vitral:refresh",e)}function Ho(){N.clear(),G={},H=void 0}var Ct,Tt,N,G,H,At,Ut=h(()=>{"use strict";b();W();R();k();Ct="vitral:rollback",Tt="vitral:id",N=new Map,G={};At=(e,t)=>S(/[/:]|\.(m?js|json)$/.test(e)?e:`${e}/vitral.json`,t)});var Ht={};O(Ht,{checkContract:()=>No});async function No(e,t=d().settings().contract){let{satisfies:o}=await Promise.resolve().then(()=>(Q(),Z));if(e.version&&!o(e.version,t))return`o host aceita contrato ${t}, o remote publica ${e.version}`;let r=d().settings().offered??{};for(let n in e.peers){let s=r[n];if(s&&!o(s,e.peers[n]))return`o remote espera ${n} ${e.peers[n]}, o host oferece ${s}`}}var Nt=h(()=>{"use strict";R()});function jt(e){Oe(e).catch(()=>{})}function Oe(e,t,o){let r=n=>jo(n,t,o);return(d().entry(e)||!e.includes("/")?r(e).then(n=>Ee(e,n)):Promise.resolve().then(()=>(ct(),lt)).then(n=>n.resolveTarget(e,r))).catch(z)}function jo(e,t,o){let r=d();return r.load(e,async()=>{Bt??=Promise.resolve().then(()=>(bt(),wt)).catch(()=>null);let n;try{await r.pending();let s=await _t(e),i=s?{isolate:r.entry(e)?.isolate,...s}:r.entry(e);if(!i)throw new f("NOT_REGISTERED",e,"remote n\xE3o registrado. Use configure({ remotes }).");if(i.module)return await Bo(e,i);let a=performance.now();n=await Le(e,i,o),D(e,"manifest",a),nt(n,(t??n.isolate??r.settings().isolate)==="shadow",o),a=performance.now();let l=await je(r.settings().retries,()=>_o(e,n));return D(e,"js",a),{...n,module:l?.default??l,exports:l}}catch(s){throw L(w(s)?s:new f("LOAD_FAILED",e,String(s?.message??s),s),n)}})}function _t(e){try{let t="vitral:overrides";if(location.search.includes("vitral")||localStorage[t]||sessionStorage[t])return Promise.resolve().then(()=>(kt(),Mt)).then(o=>o.overrideFor(e))}catch{}}async function Bo(e,t){let o=t.module;return typeof o=="function"&&(o=await o()),{module:o?.default??o,exports:o,entry:typeof location<"u"?location.href:"http://localhost/",css:t.css??[],isolate:t.isolate}}async function Le(e,t,o){ee(e,t.url);let r=t.manifest??(new URL(t.url).pathname.endsWith(".json")?await X(t.url,d().settings().timeout,e,{cache:"no-cache",priority:o}):{name:e,entry:t.url});if(r?.stable)return Le(e,await(await Promise.resolve().then(()=>(Ut(),Dt))).pick(e,t,r),o);if(typeof r?.entry!="string")throw new f("INVALID_MODULE",e,`manifesto inv\xE1lido em ${t.url}`);if(r.contract&&(t.contract||d().settings().contract)){let a=await(await Promise.resolve().then(()=>(Nt(),Ht))).checkContract(r.contract,t.contract);if(a)throw new f("CONTRACT_MISMATCH",e,a)}let n=a=>S(a,t.url),s={};for(let a in r.files??{})s[n(a)]=r.files[a];let i={entry:n(r.entry),css:[...r.css??[],...t.css??[]].map(n),shadow:r.shadow,integrity:t.integrity??r.integrity,isolate:t.isolate,scope:r.scope,version:r.version,sri:s,priority:o,split:r.split&&!t.integrity?{entry:n(r.split.entry),chunks:(r.split.chunks??[]).map(n),sri:s,priority:o,dedupe:r.dedupe?.map(a=>({...a,file:n(a.file),chunks:a.chunks?.map(n)}))}:void 0};ee(e,i.entry);for(let a of[i.split?.entry,...(i.split?.dedupe??[]).map(l=>l.file)])a&&ee(e,a);if(e===t.url&&r.name){let a=await _t(r.name);if(a)return{...await Le(e,a),name:r.name};i.name=r.name,d().entry(r.name)||d().register(r.name,t)}return i}async function _o(e,t){let{timeout:o}=d().settings(),r=s=>V(o,e,import(s)).catch(i=>{throw w(i)?i:new f("LOAD_FAILED",e,`falha ao importar ${t.entry}`,i)});if(!t.integrity)return r(t.entry);let n=await Bt;if(!n)throw new f("LOAD_FAILED",e,"n\xE3o foi poss\xEDvel carregar o verificador de integrity");return n.importVerified(e,t,r,o)}function Ee(e,t){if(typeof t.module?.mount!="function")throw new f("INVALID_MODULE",e,"o m\xF3dulo n\xE3o exporta mount(). Use defineRemote(), ou loadModule() para m\xF3dulo sem UI.");return t}var Bt,oe=h(()=>{"use strict";te();b();U();R();k()});U();te();b();R();var I={emit:(e,t)=>d().events.emit(e,t),on:(e,t)=>d().events.on(e,t),last:e=>d().events.last(e)};function Vt(){let e=new Set,t=o=>{let r=()=>(e.delete(r),o());return e.add(r),r};return{bus:{emit:(o,r)=>I.emit(o,r),last:o=>I.last(o),on:(o,r)=>t(I.on(o,r))},track:t,dispose(){for(let o of[...e])o()}}}W();oe();function qt(e,t={}){let o=new URL(e,location.href);if(o.origin!==location.origin){location.assign(o.href);return}t.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();b();var Ft=new Map,J=new Map;function Jt(e,t){return Ft.set(e,t.entry),$.set(e,t),J.set(e,(J.get(e)??0)+1),()=>{let o=J.get(e)-1;o?J.set(e,o):(J.delete(e),Ft.delete(e),$.delete(e))}}var Kt=null;function Yt(e,t,o,r){let n=0,s=I.on("vitral:refresh",i=>{if(i!==t&&!t.startsWith(i+"/"))return;let a=++n,l=o,u=r(l).then(p=>{if(e.unmount===Gt||a!==n)return p.unmount();let c=e;e=p,c.unmount(),o!==l&&p.update?.(o)});Kt?Kt.push(u):u.catch(console.error)});return{update(i){o=i,e.update?.(i)},unmount(){s(),e.unmount(),e={unmount:Gt}}}}var Gt=()=>{};k();async function Xt(e,t,o,r={}){return Yt(await zt(e,t,o,r),t,o,n=>zt(e,t,n,r))}var Wt;async function zt(e,t,o,r){let n=d();if(await n.pending(),(r.isolate??Vo(t)?.isolate??n.settings().isolate)==="iframe"){if(!Wt)throw L(new f("MOUNT_FAILED",t,'isolate="iframe" precisa de enableIframe(), de vitral/iframe'));return Wt(e,t,o,r).catch(z)}let{module:s,...i}=await Oe(t,r.isolate,r.priority),a=Jt(t,i);M.watch?.(t);let l=r.isolate??i.isolate??d().settings().isolate,u=i.name??t,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=e.appendChild(p())]=await st(i,l==="shadow"&&e,p,r.styles);D(t,"css",c),c=performance.now();let Y=Vt(),Ce=E=>P=>(v.addEventListener(E,P),()=>v.removeEventListener(E,P)),Ae={name:u,baseUrl:new URL(".",i.entry).href,events:Y.bus,shadowRoot:y,portalContainer:m,customElements:x,reportError(E){let P=L(w(E)?E:new f("RENDER_FAILED",u,String(E?.message??E),E),i);r.onError?r.onError(P):console.error(P)},navigate:qt,protocol:d().protocol,onActivate:Ce("vitral:activate"),onDeactivate:Ce("vitral:deactivate")};M.shared&&(Ae.shared=M.shared(t,Y.track));let ae;try{ae=await s.mount(v,o,Ae),D(t,"mount",c)}catch(E){throw a(),Y.dispose(),g(),v.remove(),L(new f("MOUNT_FAILED",u,"erro ao montar",E),i)}let le=!0;return{update(E){le&&ae.update?.(E)},unmount(){if(le){le=!1;try{ae.unmount()}finally{a(),Y.dispose(),g(),v.remove()}}}}}function Vo(e){let t=d(),o=e;for(;o&&!t.entry(o);)o=o.slice(0,Math.max(0,o.lastIndexOf("/")));return o?t.entry(o):void 0}b();U();function Zt(e,t){let{isolate:o}=t,r=m=>m.src?A(m.src,m.name):m.name??"",n=r(t),s=t.props??{},i=null,a=null,l=0,u="loading",p=(m,y=null)=>{u=m,a&&(a.style.display=m==="error"?"none":""),t.onStatus?.(m,y)},c=()=>{i?.unmount(),i=null,a?.remove(),a=null},g=()=>{let m=++l;c(),a=document.createElement("div"),a.setAttribute("data-vitral-slot",n),e.appendChild(a),p("loading");let y=v=>{m===l&&p("error",w(v)?v:new f("MOUNT_FAILED",n,String(v),v))},x=s;Xt(a,n,s,{isolate:o,priority:t.priority,styles:t.styles,onError:y}).then(v=>{if(m!==l)return v.unmount();i=v,s!==x&&v.update?.(s),p("ready")},y)};return g(),{update(m){s=m,i?.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}}}oe();U();var Me=()=>{};function eo(e){let t={};if(typeof performance>"u"||!performance.getEntriesByName)return t;for(let o of["manifest","js","css","mount"]){let r=performance.getEntriesByName(`vitral:${e}:${o}`,"measure").pop();r&&(t[o]=Math.round(r.duration*10)/10)}return t}function Qt(e,t,o){if(t==="lazy"||t==="visible"){if(typeof IntersectionObserver>"u")return o(),Me;let r=new IntersectionObserver(n=>{n.some(s=>s.isIntersecting)&&(r.disconnect(),o())},{rootMargin:"200px"});return r.observe(e),()=>r.disconnect()}if(t==="idle"){if(typeof requestIdleCallback>"u"){let n=setTimeout(o,1);return()=>clearTimeout(n)}let r=requestIdleCallback(o,{timeout:2e3});return()=>cancelIdleCallback(r)}if(t==="hover"){let r=()=>(n(),o()),n=()=>{e.removeEventListener("pointerenter",r),e.removeEventListener("focusin",r)};return e.addEventListener("pointerenter",r),e.addEventListener("focusin",r),n}return o(),Me}var T=new Map,j=null;function to(e,t){try{e.moveBefore(t,null)}catch{e.appendChild(t)}}function ke(e,t){for(let o of e.querySelectorAll("*"))o.hasAttribute("data-vitral-root")&&o.dispatchEvent(new Event(t)),o.shadowRoot&&ke(o.shadowRoot,t)}function qo(e,t,o){T.get(e)?.slot.destroy(),T.delete(e),j?.isConnected||(j=document.createElement("div"),j.hidden=!0,j.setAttribute("data-vitral-keep-alive",""),document.body.appendChild(j)),to(j,t.box),ke(t.box,"vitral:deactivate"),T.set(e,t);for(let[r,n]of T){if(T.size<=o)break;T.delete(r),n.slot.destroy(),n.box.remove()}}function oo(e,t){let{props:o={},keepAlive:r}=t,n=c=>c.src?A(c.src,c.name):c.name??"",s=n(t),i="loading",a=null,l=(c,g)=>{i=c,t.onStatus?.(c,g)},u=t.prefetch?Qt(e,t.prefetch,()=>jt(s)):Me,p=Qt(e,t.loading,()=>{u();let c=r?T.get(s):void 0;if(c){T.delete(s),a=c,a.on=l,to(e,a.box),a.slot.update(o),ke(a.box,"vitral:activate"),l(a.slot.status,null);return}let g=e;r&&(g=e.appendChild(document.createElement("div")),g.style.display="contents");let m={box:g,on:l,slot:null};m.slot=Zt(g,{...t,name:s,src:void 0,props:o,onStatus:(y,x)=>m.on(y,x)}),a=m});return{update(c){o=c,a?.slot.update(c)},set(c){(c.src||c.name!==void 0)&&(s=n(c)),a?.slot.set({...c,src:void 0,name:s})},retry:()=>a?.slot.retry(),destroy(){p(),u(),a&&(r&&i==="ready"?qo(s,a,r===!0?5:r):(a.slot.destroy(),a.box!==e&&a.box.remove()),a=null)},get status(){return i}}}U();var Fo=typeof HTMLElement>"u"?class{}:HTMLElement,Te=class extends Fo{static{this.observedAttributes=["name","src","props","isolate"]}#e=null;#t={};get props(){return this.#t}set props(t){this.#t=t??{},this.#e?.update(this.#t)}get status(){return this.#e?.status??"loading"}retry(){this.#e?.retry()}connectedCallback(){if(this.#e)return;let t=this.#r();if(!t)return;this.hasAttribute("props")&&!Object.keys(this.#t).length&&(this.#t=ro(this.getAttribute("props")));let o=this.getAttribute("keep-alive");this.#e=oo(this,{name:t,props:this.#t,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:(r,n)=>{this.setAttribute("data-vitral-status",r),r==="loading"?this.setAttribute("aria-busy","true"):this.removeAttribute("aria-busy");let s=i=>{let a=this.querySelectorAll(`:scope > [slot="${i}"]`);for(let l of a)l.hidden=r!==(i==="fallback"?"loading":"error");return a.length>0};queueMicrotask(()=>{if(this.#e?.status!==r)return;let i={loading:s("fallback"),error:s("error"),ready:!0};this.#n(i[r]?null:r)}),r==="ready"&&this.dispatchEvent(new CustomEvent("vitral-ready",{bubbles:!0,detail:{timings:eo(t)}})),r==="error"&&this.dispatchEvent(new CustomEvent("vitral-error",{bubbles:!0,detail:{error:n}}))}})}#r(){let t=this.getAttribute("src"),o=this.getAttribute("name");return t?A(t,o??void 0,!1):o}#o=null;#n(t){if(this.#o?.remove(),this.#o=null,!t)return;let o=document.createElement("div");if(o.setAttribute("data-vitral-default",t),t==="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.#e?.destroy(),this.#e=null,this.#n(null))})}attributeChangedCallback(t,o,r){if(t==="props")return void(this.props=ro(r));if(!this.#e)return void(this.isConnected&&this.connectedCallback());if(t==="name"||t==="src"){let n=this.#r();n&&this.#e.set({name:n})}t==="isolate"&&this.#e.set({isolate:r||void 0})}};function ro(e){if(!e)return{};try{return JSON.parse(e)}catch{return console.error("[vitral] atributo props n\xE3o \xE9 JSON v\xE1lido:",e),{}}}function no(e="vitral-remote"){typeof customElements<"u"&&!customElements.get(e)&&customElements.define(e,class extends Te{})}R();k();var so="data-vitral-embed";function io(e){let t=e.dataset;if(!t.remote||e.hasAttribute(so))return null;let o=t.target?document.querySelector(t.target):e.closest("body")?e:document.body;if(!o)return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>io(e),{once:!0}):console.error(`[vitral] data-target n\xE3o encontrado: ${t.target}`),null;e.setAttribute(so,"");let r=S(t.remote);Ko([new URL(r).origin,...t.origins?.split(/\s+/).filter(Boolean)??[]]),no();let n=document.createElement("vitral-remote");return n.setAttribute("isolate",t.isolate||"shadow"),t.loading&&n.setAttribute("loading",t.loading),t.props&&n.setAttribute("props",t.props),t.name&&n.setAttribute("name",t.name),n.setAttribute("src",r),o===e?e.after(n):o.appendChild(n),n}function Ko(e){let t=d(),o=t.settings().allowedOrigins??[_(),...t.origins()].filter(Boolean);ue({allowedOrigins:[...new Set([...o,...e])]})}var Go=Symbol.for("vitral:embed"),Jo=globalThis[Go]??=io;typeof document<"u"&&document.currentScript instanceof HTMLScriptElement&&Jo(document.currentScript);})();
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
type RemoteErrorCode = 'NOT_REGISTERED' | 'NOT_EXPOSED' | 'ORIGIN_BLOCKED' | 'TIMEOUT' | 'INTEGRITY' | 'INVALID_MODULE' | 'LOAD_FAILED' | 'MOUNT_FAILED' | 'RENDER_FAILED' | 'SHARED_READONLY';
|
|
1
|
+
type RemoteErrorCode = 'NOT_REGISTERED' | 'NOT_EXPOSED' | 'ORIGIN_BLOCKED' | 'TIMEOUT' | 'INTEGRITY' | 'INVALID_MODULE' | 'LOAD_FAILED' | 'MOUNT_FAILED' | 'RENDER_FAILED' | 'SHARED_READONLY' | 'CONTRACT_MISMATCH';
|
|
2
2
|
declare class RemoteError extends Error {
|
|
3
3
|
code: RemoteErrorCode;
|
|
4
4
|
remote: string;
|
|
5
5
|
cause?: unknown | undefined;
|
|
6
6
|
/** Link da página deste erro na documentação. */
|
|
7
7
|
docs: string;
|
|
8
|
+
/** URL do JS do remote (ou a registrada, se o erro veio antes do manifesto). */
|
|
9
|
+
entry?: string;
|
|
10
|
+
/** Versão do remote, do campo `version` do `vitral.json`. */
|
|
11
|
+
version?: string;
|
|
12
|
+
/** `location.pathname` no momento do erro. */
|
|
13
|
+
route?: string;
|
|
8
14
|
constructor(code: RemoteErrorCode, remote: string, message: string, cause?: unknown | undefined);
|
|
9
15
|
}
|
|
10
16
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveModule,
|
|
3
|
+
resolveTarget,
|
|
4
|
+
splitName
|
|
5
|
+
} from "./chunk-IH3ZT3QU.js";
|
|
6
|
+
import "./chunk-EMSB2NVX.js";
|
|
7
|
+
import "./chunk-6EX5KYT5.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-CA2p9KHC.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 };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// src/federation.ts
|
|
2
|
+
var containers = /* @__PURE__ */ new Map();
|
|
3
|
+
var fail = (msg) => new Error(`[vitral] ${msg}`);
|
|
4
|
+
var key = (k) => "./" + k.replace(/^\.?\/?/, "");
|
|
5
|
+
function federationRemote(url, options = {}) {
|
|
6
|
+
return { module: () => namespace(url, options) };
|
|
7
|
+
}
|
|
8
|
+
async function namespace(url, options) {
|
|
9
|
+
const { container, keys } = await loadContainer(new URL(url, document.baseURI).href, options);
|
|
10
|
+
const parts = /* @__PURE__ */ new Map();
|
|
11
|
+
const part = (k) => {
|
|
12
|
+
let p = parts.get(k);
|
|
13
|
+
if (!p) {
|
|
14
|
+
p = Promise.resolve(container.get(k)).then((factory) => adapted(factory(), k, options));
|
|
15
|
+
p.catch(() => parts.delete(k));
|
|
16
|
+
parts.set(k, p);
|
|
17
|
+
}
|
|
18
|
+
return p;
|
|
19
|
+
};
|
|
20
|
+
const exposes = keys ? Object.fromEntries(keys.map((k) => [k, () => part(k)])) : new Proxy({}, { get: (_, k) => typeof k == "string" && k.startsWith("./") ? () => part(k) : void 0 });
|
|
21
|
+
const main = options.expose ? key(options.expose) : keys?.length === 1 ? keys[0] : void 0;
|
|
22
|
+
const remote = {
|
|
23
|
+
async mount(el, props, ctx) {
|
|
24
|
+
if (!main) throw fail(`${ctx.name}: o manifesto exp\xF5e ${keys?.join(", ") || "v\xE1rias partes"}. Use ${ctx.name}/<parte> ou a op\xE7\xE3o expose.`);
|
|
25
|
+
const ns = await part(main);
|
|
26
|
+
const target = typeof ns?.mount == "function" ? ns : ns?.default;
|
|
27
|
+
if (typeof target?.mount != "function") throw fail(`${ctx.name}: ${main} n\xE3o exporta mount(). Use a op\xE7\xE3o adapt de federationRemote.`);
|
|
28
|
+
return target.mount(el, props, ctx);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
return { default: remote, exposes };
|
|
32
|
+
}
|
|
33
|
+
function adapted(ns, k, options) {
|
|
34
|
+
if (typeof ns?.mount == "function" || typeof ns?.default?.mount == "function" || !options.adapt) return ns;
|
|
35
|
+
const remote = options.adapt(ns, k);
|
|
36
|
+
return typeof remote?.mount == "function" ? { ...ns, default: remote } : ns;
|
|
37
|
+
}
|
|
38
|
+
function loadContainer(url, options = {}) {
|
|
39
|
+
let job = containers.get(url);
|
|
40
|
+
if (!job) {
|
|
41
|
+
job = start(url, options);
|
|
42
|
+
job.catch(() => containers.delete(url));
|
|
43
|
+
containers.set(url, job);
|
|
44
|
+
}
|
|
45
|
+
return job;
|
|
46
|
+
}
|
|
47
|
+
async function start(url, options) {
|
|
48
|
+
let entry = url;
|
|
49
|
+
let global = options.global;
|
|
50
|
+
let keys = null;
|
|
51
|
+
if (new URL(url).pathname.endsWith(".json")) {
|
|
52
|
+
const res = await fetch(url, { cache: "no-cache" });
|
|
53
|
+
if (!res.ok) throw fail(`HTTP ${res.status} ao baixar ${url}`);
|
|
54
|
+
const m = await res.json();
|
|
55
|
+
const re = m.metaData?.remoteEntry;
|
|
56
|
+
if (!re?.name) throw fail(`${url} n\xE3o \xE9 um mf-manifest.json (falta metaData.remoteEntry)`);
|
|
57
|
+
const pub = m.metaData.publicPath;
|
|
58
|
+
if ((!pub || pub === "auto") && m.metaData.getPublicPath) throw fail(`${url}: getPublicPath n\xE3o \xE9 suportado. Use publicPath.`);
|
|
59
|
+
const base = pub && pub !== "auto" ? new URL(pub, url).href : url;
|
|
60
|
+
entry = new URL((re.path ? re.path.replace(/\/?$/, "/") : "") + re.name, base).href;
|
|
61
|
+
global = re.type === "module" || re.type === "esm" ? void 0 : m.metaData.globalName ?? m.name;
|
|
62
|
+
if (re.type !== "module" && re.type !== "esm" && !global) throw fail(`${url}: falta metaData.globalName`);
|
|
63
|
+
keys = (m.exposes ?? []).map((e) => key(e.path));
|
|
64
|
+
}
|
|
65
|
+
const origin = new URL(entry).origin;
|
|
66
|
+
const allowed = [new URL(url).origin, ...options.allowedOrigins ?? []];
|
|
67
|
+
if (!allowed.includes("*") && !allowed.includes(origin)) throw fail(`remoteEntry em ${origin} n\xE3o est\xE1 em allowedOrigins`);
|
|
68
|
+
const container = global ? await script(entry, global) : await import(
|
|
69
|
+
/* @vite-ignore */
|
|
70
|
+
/* webpackIgnore: true */
|
|
71
|
+
entry
|
|
72
|
+
);
|
|
73
|
+
if (typeof container?.get != "function" || typeof container.init != "function") throw fail(`${entry} n\xE3o \xE9 um container do Module Federation (sem get/init)`);
|
|
74
|
+
await container.init(shareScope(options.shared));
|
|
75
|
+
return { container, keys };
|
|
76
|
+
}
|
|
77
|
+
function shareScope(shared = {}) {
|
|
78
|
+
const out = {};
|
|
79
|
+
for (const { version, modules } of Object.values(shared)) {
|
|
80
|
+
for (const [spec, mod] of Object.entries(modules)) (out[spec] ??= {})[version] = { get: () => Promise.resolve(() => mod), loaded: 1, from: "vitral" };
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
function script(src, global) {
|
|
85
|
+
const w = window;
|
|
86
|
+
if (w[global]) return Promise.resolve(w[global]);
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const s = document.createElement("script");
|
|
89
|
+
s.src = src;
|
|
90
|
+
s.onload = () => w[global] ? resolve(w[global]) : reject(fail(`${src} n\xE3o criou window.${global}`));
|
|
91
|
+
s.onerror = () => {
|
|
92
|
+
s.remove();
|
|
93
|
+
reject(fail(`falha ao carregar ${src}`));
|
|
94
|
+
};
|
|
95
|
+
document.head.appendChild(s);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
federationRemote,
|
|
100
|
+
shareScope
|
|
101
|
+
};
|
package/dist/iframe.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Script inline do iframe. Libere o hash dele no CSP (`script-src 'sha256-…'`). */
|
|
2
|
-
declare const FRAME_SCRIPT = "(function (w, load) {\n var parent = w.parent, doc = w.document, handlers = {}, last = {}, channel = {}, mounted = null, stage = 'LOAD_FAILED'\n function post(type, data) { parent.postMessage({ vitral: 1, type: type, data: data }, '*') }\n function call(fn, arg) { try { fn(arg) } catch (e) { w.console.error(e) } }\n var events = {\n emit: function (type, payload) { post('emit', { type: type, payload: payload }) },\n on: function (type, fn) {\n if (!handlers[type]) { handlers[type] = []; post('on', { type: type }) }\n handlers[type].push(fn)\n return function () { handlers[type] = handlers[type].filter(function (h) { return h !== fn }) }\n },\n last: function (type) { return last[type] }\n }\n function start(d) {\n var root = doc.createElement('div')\n root.setAttribute('data-vitral-root', d.name)\n if (d.scope) root.setAttribute('data-vitral-scope', d.scope)\n doc.body.appendChild(root)\n // Ponto de extens\u00E3o: uma ponte nova registra handlers em channel[tipo] e\n // acrescenta campos aqui (a Fase 2 acrescenta ctx.shared).\n var ctx = {\n name: d.name, baseUrl: d.baseUrl, events: events, shadowRoot: null, protocol: 1,\n reportError: function (e) { post('report', { message: String((e && e.message) || e) }) },\n navigate: function (url, o) { post('navigate', { url: String(url), replace: !!(o && o.replace) }) }\n }\n Promise.all(d.css.map(function (href) {\n return new Promise(function (done) {\n var link = doc.createElement('link')\n link.rel = 'stylesheet'; link.href = href; link.crossOrigin = 'anonymous'\n link.onload = link.onerror = done\n doc.head.appendChild(link)\n })\n })).then(function () {\n return load(d.code ? w.URL.createObjectURL(new w.Blob([d.code], { type: 'text/javascript' })) : d.url)\n }).then(function (ns) {\n if (!d.key) return ns\n var table = ns.exposes, part = table && table[d.key]\n if (!part) { stage = 'NOT_EXPOSED'; throw new Error(d.name + ' n\u00E3o exp\u00F5e ' + d.key) }\n return typeof part === 'function' ? part() : part\n }).then(function (ns) {\n var mod = (ns && ns.default) || ns\n if (!mod || typeof mod.mount !== 'function') { stage = 'INVALID_MODULE'; throw new Error('o m\u00F3dulo n\u00E3o exporta mount()') }\n stage = 'MOUNT_FAILED'\n return mod.mount(root, d.props, ctx)\n }).then(function (handle) {\n mounted = handle\n post('mounted')\n var size = function () { post('size', { height: Math.ceil(doc.body.getBoundingClientRect().height) }) }\n size()\n if (w.ResizeObserver) new w.ResizeObserver(size).observe(doc.body)\n }, function (e) {\n post('error', { code: stage, message: String((e && e.message) || e) })\n })\n }\n w.addEventListener('message', function (e) {\n var m = e.data\n if (e.source !== parent || !m || m.vitral !== 1) return\n var d = m.data\n if (m.type === 'mount') start(d)\n else if (m.type === 'update') { if (mounted && mounted.update) mounted.update(d) }\n else if (m.type === 'unmount') { if (mounted) mounted.unmount(); mounted = null }\n else if (m.type === 'last') last[d.type] = d.payload\n else if (m.type === 'event') {\n last[d.type] = d.payload\n ;(handlers[d.type] || []).slice().forEach(function (h) { call(h, d.payload) })\n } else (channel[m.type] || []).forEach(function (h) { call(h, d) })\n })\n post('ready')\n})(window, function (u) { return import(u) })";
|
|
2
|
+
declare const FRAME_SCRIPT = "(function (w, load) {\n var parent = w.parent, doc = w.document, handlers = {}, last = {}, channel = {}, mounted = null, stage = 'LOAD_FAILED'\n function post(type, data) { parent.postMessage({ vitral: 1, type: type, data: data }, '*') }\n function call(fn, arg) { try { fn(arg) } catch (e) { w.console.error(e) } }\n var events = {\n emit: function (type, payload) { post('emit', { type: type, payload: payload }) },\n on: function (type, fn) {\n if (!handlers[type]) { handlers[type] = []; post('on', { type: type }) }\n handlers[type].push(fn)\n return function () { handlers[type] = handlers[type].filter(function (h) { return h !== fn }) }\n },\n last: function (type) { return last[type] }\n }\n function start(d) {\n var root = doc.createElement('div')\n root.setAttribute('data-vitral-root', d.name)\n if (d.scope) root.setAttribute('data-vitral-scope', d.scope)\n doc.body.appendChild(root)\n // Ponto de extens\u00E3o: uma ponte nova registra handlers em channel[tipo] e\n // acrescenta campos aqui (a Fase 2 acrescenta ctx.shared).\n var ctx = {\n name: d.name, baseUrl: d.baseUrl, events: events, shadowRoot: null, portalContainer: doc.body, protocol: 1,\n reportError: function (e) { post('report', { message: String((e && e.message) || e) }) },\n navigate: function (url, o) { post('navigate', { url: String(url), replace: !!(o && o.replace) }) }\n }\n Promise.all(d.css.map(function (href) {\n return new Promise(function (done) {\n var link = doc.createElement('link')\n link.rel = 'stylesheet'; link.href = href; link.crossOrigin = 'anonymous'\n link.onload = link.onerror = done\n doc.head.appendChild(link)\n })\n })).then(function () {\n return load(d.code ? w.URL.createObjectURL(new w.Blob([d.code], { type: 'text/javascript' })) : d.url)\n }).then(function (ns) {\n if (!d.key) return ns\n var table = ns.exposes, part = table && table[d.key]\n if (!part) { stage = 'NOT_EXPOSED'; throw new Error(d.name + ' n\u00E3o exp\u00F5e ' + d.key) }\n return typeof part === 'function' ? part() : part\n }).then(function (ns) {\n var mod = (ns && ns.default) || ns\n if (!mod || typeof mod.mount !== 'function') { stage = 'INVALID_MODULE'; throw new Error('o m\u00F3dulo n\u00E3o exporta mount()') }\n stage = 'MOUNT_FAILED'\n return mod.mount(root, d.props, ctx)\n }).then(function (handle) {\n mounted = handle\n post('mounted')\n var size = function () { post('size', { height: Math.ceil(doc.body.getBoundingClientRect().height) }) }\n size()\n if (w.ResizeObserver) new w.ResizeObserver(size).observe(doc.body)\n }, function (e) {\n post('error', { code: stage, message: String((e && e.message) || e) })\n })\n }\n w.addEventListener('message', function (e) {\n var m = e.data\n if (e.source !== parent || !m || m.vitral !== 1) return\n var d = m.data\n if (m.type === 'mount') start(d)\n else if (m.type === 'update') { if (mounted && mounted.update) mounted.update(d) }\n else if (m.type === 'unmount') { if (mounted) mounted.unmount(); mounted = null }\n else if (m.type === 'last') last[d.type] = d.payload\n else if (m.type === 'event') {\n last[d.type] = d.payload\n ;(handlers[d.type] || []).slice().forEach(function (h) { call(h, d.payload) })\n } else (channel[m.type] || []).forEach(function (h) { call(h, d) })\n })\n post('ready')\n})(window, function (u) { return import(u) })";
|
|
3
3
|
|
|
4
4
|
/** Canal com um iframe montado, para pontes novas (ex.: estado compartilhado). */
|
|
5
5
|
interface FramePort {
|