vitral 0.2.0 → 0.3.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 (53) hide show
  1. package/README.md +1 -1
  2. package/dist/angular.d.ts +3 -2
  3. package/dist/angular.js +7 -6
  4. package/dist/auto.js +7 -6
  5. package/dist/capture-JYFERAPL.js +42 -0
  6. package/dist/{chunk-6Y3VMWHH.js → chunk-3YXI3G34.js} +3 -3
  7. package/dist/{chunk-S5MZT5IT.js → chunk-AH7KNMBW.js} +1 -1
  8. package/dist/chunk-AKNNHQ2H.js +45 -0
  9. package/dist/{chunk-PX7PBCCT.js → chunk-GNHCZRQP.js} +7 -17
  10. package/dist/{chunk-NCONW6WS.js → chunk-I3VSKSAZ.js} +58 -30
  11. package/dist/{chunk-UTYAX6MU.js → chunk-IHTUM6LT.js} +2 -2
  12. package/dist/{chunk-HP6QWU6K.js → chunk-SDB5AZEI.js} +2 -2
  13. package/dist/{chunk-2XF5BKV3.js → chunk-TD4S3IHA.js} +23 -12
  14. package/dist/chunk-ZAC6QQI6.js +64 -0
  15. package/dist/cli.js +59 -9
  16. package/dist/contract-46EZFQPQ.js +17 -0
  17. package/dist/{dedupe-IWFIXRWG.js → dedupe-S7BHQMOZ.js} +4 -3
  18. package/dist/element.d.ts +3 -3
  19. package/dist/element.js +7 -6
  20. package/dist/{errors-KKB8FGCz.d.ts → errors-kjBv6IH_.d.ts} +7 -1
  21. package/dist/{events-DUdjhfps.d.ts → events-D5gs7rff.d.ts} +1 -1
  22. package/dist/expose-JUOUN5N5.js +15 -0
  23. package/dist/iframe.d.ts +1 -1
  24. package/dist/iframe.js +13 -10
  25. package/dist/index.d.ts +23 -21
  26. package/dist/index.js +5 -4
  27. package/dist/otel.d.ts +44 -0
  28. package/dist/otel.js +27 -0
  29. package/dist/preact.d.ts +5 -5
  30. package/dist/preact.js +6 -5
  31. package/dist/react.d.ts +12 -4
  32. package/dist/react.js +11 -6
  33. package/dist/routes.d.ts +3 -3
  34. package/dist/routes.js +5 -4
  35. package/dist/sentry.d.ts +25 -0
  36. package/dist/sentry.js +11 -0
  37. package/dist/{shadow-MYRJQLLY.js → shadow-6HELCHCJ.js} +37 -11
  38. package/dist/{slot-pB276oPt.d.ts → slot-DqXTwGbs.d.ts} +2 -2
  39. package/dist/solid.d.ts +4 -4
  40. package/dist/solid.js +6 -5
  41. package/dist/{sri-BVKZNX5Q.js → sri-JMX6JLQP.js} +6 -4
  42. package/dist/svelte.d.ts +5 -5
  43. package/dist/svelte.js +6 -5
  44. package/dist/testing.d.ts +2 -1
  45. package/dist/testing.js +5 -4
  46. package/dist/{types-BV-hUrms.d.ts → types-Czvm-siZ.d.ts} +63 -1
  47. package/dist/vite.d.ts +8 -0
  48. package/dist/vite.js +364 -35
  49. package/dist/vue.d.ts +10 -3
  50. package/dist/vue.js +10 -5
  51. package/package.json +54 -20
  52. package/dist/chunk-SFL6LTP3.js +0 -56
  53. package/dist/expose-53BEJB34.js +0 -14
@@ -0,0 +1,25 @@
1
+ import { R as RemoteError } from './errors-kjBv6IH_.js';
2
+
3
+ /**
4
+ * Erros dos remotes no Sentry, sem depender do SDK:
5
+ *
6
+ * import * as Sentry from '@sentry/browser'
7
+ * import { sentryOnError } from 'vitral/sentry'
8
+ *
9
+ * configure({ onError: sentryOnError(Sentry) })
10
+ *
11
+ * Cada `RemoteError` vira um `captureException` com as tags `vitral.remote`,
12
+ * `vitral.version` e `vitral.code`, e com `entry`, `route` e `docs` no `extra`.
13
+ */
14
+
15
+ /** A parte do SDK do Sentry que o adaptador usa (`@sentry/browser`, `@sentry/react`…). */
16
+ interface SentryLike {
17
+ captureException(exception: unknown, hint?: {
18
+ tags?: Record<string, string>;
19
+ extra?: Record<string, unknown>;
20
+ }): unknown;
21
+ }
22
+ /** `onError` para o `configure` que manda cada `RemoteError` ao Sentry. */
23
+ declare function sentryOnError(sentry: SentryLike): (error: RemoteError) => void;
24
+
25
+ export { type SentryLike, sentryOnError };
package/dist/sentry.js ADDED
@@ -0,0 +1,11 @@
1
+ // src/sentry.ts
2
+ function sentryOnError(sentry) {
3
+ return (error) => {
4
+ const tags = { "vitral.remote": error.remote, "vitral.code": error.code };
5
+ if (error.version) tags["vitral.version"] = error.version;
6
+ sentry.captureException(error, { tags, extra: { entry: error.entry, route: error.route, docs: error.docs } });
7
+ };
8
+ }
9
+ export {
10
+ sentryOnError
11
+ };
@@ -1,33 +1,56 @@
1
1
  import {
2
2
  fetchCssText,
3
3
  injectCss
4
- } from "./chunk-SFL6LTP3.js";
5
- import "./chunk-PX7PBCCT.js";
4
+ } from "./chunk-ZAC6QQI6.js";
5
+ import "./chunk-GNHCZRQP.js";
6
+ import "./chunk-AKNNHQ2H.js";
6
7
  import "./chunk-GNPFWISJ.js";
7
8
 
8
9
  // src/core/shadow.ts
9
10
  var sheets = /* @__PURE__ */ new Map();
11
+ var noop = () => {
12
+ };
10
13
  var hoisted = /* @__PURE__ */ new Set();
11
14
  var RELATIVE_URL = /url\(\s*(['"]?)(?![a-z]+:|\/\/|#)([^'")]+)\1\s*\)/gi;
12
15
  var GLOBAL_RULES = /@property\s+(--[\w-]+)\s*\{[^}]*\}|@font-face\s*\{[^}]*\}|@import\s+(?:url\(\s*)?(?:(['"])(.*?)\2|([^'"\s);]+))\s*\)?[^;]*;/gi;
13
- async function attachStyles(root, el, css, global = {}, local = {}, sri = {}) {
16
+ function plan({ css, shadow: s }) {
17
+ const at = (u) => new URL(u, css[0]).href;
18
+ const ready = s ? s.css.map(at) : [];
19
+ return [s ? [...(s.imports ?? []).map(at), ...ready, ...css.slice(ready.length)] : css, ready, (s?.global ?? []).map(at)];
20
+ }
21
+ function prefetch(r, priority) {
22
+ const [urls, , global] = plan(r);
23
+ for (const u of urls) fetchCssText(u, r.sri?.[u], priority).catch(noop);
24
+ injectCss(global, null, r.sri);
25
+ }
26
+ async function attachStyles(root, el, r, global = {}, local = {}) {
27
+ const sri = r.sri ?? {};
28
+ const [css, ready, up] = plan(r);
29
+ const portal = el.cloneNode();
30
+ portal.setAttribute("data-vitral-portal", "");
31
+ el.after(portal);
14
32
  const urls = [...global.inherit ?? [], ...local.inherit ?? []].map((u) => new URL(u, document.baseURI).href).concat(css);
33
+ const props = injectCss(up, null, sri);
15
34
  if (typeof CSSStyleSheet !== "undefined" && "replaceSync" in CSSStyleSheet.prototype) {
16
- const loaded = await Promise.all(urls.map((u) => loadSheet(u, [], sri[u])));
35
+ const loaded = await Promise.all(urls.map((u) => loadSheet(u, [], sri[u], ready.includes(u) ? !!r.shadow.rebase : void 0)));
17
36
  root.adoptedStyleSheets = [.../* @__PURE__ */ new Set([...root.adoptedStyleSheets, ...loaded.flat()])];
18
37
  } else {
19
38
  await injectCss(urls, root, sri);
20
39
  }
21
- return (local.mirrorTheme ?? global.mirrorTheme) === false ? () => {
22
- } : mirrorTheme(el);
40
+ await props;
41
+ const stop = (local.mirrorTheme ?? global.mirrorTheme) === false ? [] : [mirrorTheme(el), mirrorTheme(portal)];
42
+ return [() => (stop.forEach((fn) => fn()), portal.remove()), portal];
23
43
  }
24
- function loadSheet(href, chain, integrity) {
44
+ function loadSheet(href, chain, integrity, ready) {
25
45
  let p = sheets.get(href);
26
46
  if (!p) {
27
47
  p = fetchCssText(href, integrity).then((text) => {
48
+ const sheet = new CSSStyleSheet();
49
+ if (ready !== false) text = text.replace(RELATIVE_URL, (_, q, u) => `url(${q}${new URL(u, href).href}${q})`);
50
+ if (ready != null) return sheet.replaceSync(text), [sheet];
28
51
  const up = [];
29
52
  const imports = [];
30
- const rest = text.replace(RELATIVE_URL, (_, q, u) => `url(${q}${new URL(u, href).href}${q})`).replace(GLOBAL_RULES, (rule, prop, _q, quoted, bare) => {
53
+ const rest = text.replace(GLOBAL_RULES, (rule, prop, _q, quoted, bare) => {
31
54
  const url = quoted ?? bare;
32
55
  if (url) imports.push(new URL(url, href).href);
33
56
  else if (!hoisted.has(prop ?? rule)) {
@@ -42,11 +65,13 @@ function loadSheet(href, chain, integrity) {
42
65
  style.textContent = up.join("\n");
43
66
  document.head.appendChild(style);
44
67
  }
45
- const sheet = new CSSStyleSheet();
46
68
  sheet.replaceSync(rest);
47
69
  const next = [...chain, href];
48
70
  return Promise.all(imports.filter((u) => !next.includes(u)).map((u) => loadSheet(u, next))).then((found) => [...found.flat(), sheet]);
49
- }).catch(() => []);
71
+ }).catch(() => {
72
+ sheets.delete(href);
73
+ return [];
74
+ });
50
75
  sheets.set(href, p);
51
76
  }
52
77
  return p;
@@ -68,5 +93,6 @@ function mirrorTheme(el) {
68
93
  return () => observer.disconnect();
69
94
  }
70
95
  export {
71
- attachStyles
96
+ attachStyles,
97
+ prefetch
72
98
  };
@@ -1,5 +1,5 @@
1
- import { R as RemoteError } from './errors-KKB8FGCz.js';
2
- import { P as Props, I as Isolation, b as StyleOptions } from './types-BV-hUrms.js';
1
+ import { R as RemoteError } from './errors-kjBv6IH_.js';
2
+ import { P as Props, I as Isolation, b as StyleOptions } from './types-Czvm-siZ.js';
3
3
 
4
4
  type SlotStatus = 'loading' | 'ready' | 'error';
5
5
  interface SlotOptions<P extends Props = Props> {
package/dist/solid.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { JSX, Component, Accessor } from 'solid-js';
2
- import { P as Props, I as Isolation, C as CheckedProps, a as RemoteModule, S as Shared } from './types-BV-hUrms.js';
3
- export { R as RemoteContext } from './types-BV-hUrms.js';
4
- import { R as RemoteError } from './errors-KKB8FGCz.js';
5
- export { e as events } from './events-DUdjhfps.js';
2
+ import { P as Props, I as Isolation, C as CheckedProps, a as RemoteModule, S as Shared } from './types-Czvm-siZ.js';
3
+ export { R as RemoteContext } from './types-Czvm-siZ.js';
4
+ import { R as RemoteError } from './errors-kjBv6IH_.js';
5
+ export { e as events } from './events-D5gs7rff.js';
6
6
  export { n as navigate } from './navigate-BRG1WJUM.js';
7
7
  import { L as Loading, P as Prefetch } from './host-slot-Cz6EiGsB.js';
8
8
 
package/dist/solid.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hostSlot
3
- } from "./chunk-UTYAX6MU.js";
3
+ } from "./chunk-IHTUM6LT.js";
4
4
  import {
5
5
  defineRemote,
6
6
  events,
@@ -8,10 +8,11 @@ import {
8
8
  navigate,
9
9
  same,
10
10
  shared
11
- } from "./chunk-NCONW6WS.js";
12
- import "./chunk-2XF5BKV3.js";
13
- import "./chunk-SFL6LTP3.js";
14
- import "./chunk-PX7PBCCT.js";
11
+ } from "./chunk-I3VSKSAZ.js";
12
+ import "./chunk-TD4S3IHA.js";
13
+ import "./chunk-ZAC6QQI6.js";
14
+ import "./chunk-GNHCZRQP.js";
15
+ import "./chunk-AKNNHQ2H.js";
15
16
  import "./chunk-GNPFWISJ.js";
16
17
 
17
18
  // src/solid.ts
@@ -1,12 +1,14 @@
1
1
  import {
2
2
  verifyIntegrity
3
- } from "./chunk-S5MZT5IT.js";
3
+ } from "./chunk-AH7KNMBW.js";
4
4
  import {
5
- RemoteError,
6
5
  addLink,
7
6
  fetchBytes,
8
7
  withTimeout
9
- } from "./chunk-PX7PBCCT.js";
8
+ } from "./chunk-GNHCZRQP.js";
9
+ import {
10
+ RemoteError
11
+ } from "./chunk-AKNNHQ2H.js";
10
12
  import "./chunk-GNPFWISJ.js";
11
13
 
12
14
  // src/core/sri.ts
@@ -52,7 +54,7 @@ async function verified(build, run) {
52
54
  const p = globalThis[/* @__PURE__ */ Symbol.for("vitral")];
53
55
  const share = async (pre) => {
54
56
  if (!run || !dedupe.length) return;
55
- const { shared } = await import("./dedupe-IWFIXRWG.js");
57
+ const { shared } = await import("./dedupe-S7BHQMOZ.js");
56
58
  for (const d of dedupe)
57
59
  shared(p)(d.name, d.range, {
58
60
  version: d.version,
package/dist/svelte.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { Component } from 'svelte';
2
- import { P as Props, I as Isolation, a as RemoteModule } from './types-BV-hUrms.js';
3
- export { R as RemoteContext } from './types-BV-hUrms.js';
4
- import { R as RemoteError } from './errors-KKB8FGCz.js';
5
- import { S as SlotStatus } from './slot-pB276oPt.js';
6
- export { e as events } from './events-DUdjhfps.js';
2
+ import { P as Props, I as Isolation, a as RemoteModule } from './types-Czvm-siZ.js';
3
+ export { R as RemoteContext } from './types-Czvm-siZ.js';
4
+ import { R as RemoteError } from './errors-kjBv6IH_.js';
5
+ import { S as SlotStatus } from './slot-DqXTwGbs.js';
6
+ export { e as events } from './events-D5gs7rff.js';
7
7
  export { n as navigate } from './navigate-BRG1WJUM.js';
8
8
  import { L as Loading, P as Prefetch } from './host-slot-Cz6EiGsB.js';
9
9
 
package/dist/svelte.js CHANGED
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  hostSlot
3
- } from "./chunk-UTYAX6MU.js";
3
+ } from "./chunk-IHTUM6LT.js";
4
4
  import {
5
5
  defineRemote,
6
6
  events,
7
7
  navigate
8
- } from "./chunk-NCONW6WS.js";
9
- import "./chunk-2XF5BKV3.js";
10
- import "./chunk-SFL6LTP3.js";
11
- import "./chunk-PX7PBCCT.js";
8
+ } from "./chunk-I3VSKSAZ.js";
9
+ import "./chunk-TD4S3IHA.js";
10
+ import "./chunk-ZAC6QQI6.js";
11
+ import "./chunk-GNHCZRQP.js";
12
+ import "./chunk-AKNNHQ2H.js";
12
13
  import "./chunk-GNPFWISJ.js";
13
14
 
14
15
  // src/svelte.ts
package/dist/testing.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { P as Props, R as RemoteContext } from './types-BV-hUrms.js';
1
+ import { P as Props, R as RemoteContext } from './types-Czvm-siZ.js';
2
2
  export { r as resetVitral } from './state-BDdCwc21.js';
3
+ import './errors-kjBv6IH_.js';
3
4
 
4
5
  /**
5
6
  * Utilidades de teste: monte o host sem subir nenhum remote de verdade.
package/dist/testing.js CHANGED
@@ -1,9 +1,10 @@
1
- import "./chunk-NCONW6WS.js";
1
+ import "./chunk-I3VSKSAZ.js";
2
2
  import {
3
3
  register
4
- } from "./chunk-2XF5BKV3.js";
5
- import "./chunk-SFL6LTP3.js";
6
- import "./chunk-PX7PBCCT.js";
4
+ } from "./chunk-TD4S3IHA.js";
5
+ import "./chunk-ZAC6QQI6.js";
6
+ import "./chunk-GNHCZRQP.js";
7
+ import "./chunk-AKNNHQ2H.js";
7
8
  import {
8
9
  resetProtocol
9
10
  } from "./chunk-GNPFWISJ.js";
@@ -1,3 +1,5 @@
1
+ import { R as RemoteError } from './errors-kjBv6IH_.js';
2
+
1
3
  /**
2
4
  * Tipos das chaves compartilhadas. Declare uma vez no projeto:
3
5
  *
@@ -90,6 +92,13 @@ interface RemoteContext {
90
92
  events: EventBus;
91
93
  /** Shadow root quando o host pediu isolamento, senão `null`. */
92
94
  shadowRoot: ShadowRoot | null;
95
+ /**
96
+ * Onde popovers, menus e dialogs devem ser renderizados (`container` do
97
+ * Radix e do MUI, `Teleport` do Vue). No Shadow DOM é um elemento dentro do
98
+ * shadow root, com os estilos e o tema do remote; senão, `document.body`.
99
+ * Hosts antigos não mandam este campo.
100
+ */
101
+ portalContainer?: HTMLElement;
93
102
  /** Avisa o host de um erro em tempo de execução (os adaptadores já chamam). */
94
103
  reportError(error: unknown): void;
95
104
  /** Navega a página inteira (host e todos os roteadores) para `url`. */
@@ -145,6 +154,11 @@ interface RemoteEntry {
145
154
  * no host.
146
155
  */
147
156
  manifest?: RemoteManifest;
157
+ /**
158
+ * Faixa de versão do contrato do remote que o host aceita (ex.: `'^2'`).
159
+ * Vence a de `configure`. Veja `VitralConfig.contract`.
160
+ */
161
+ contract?: string;
148
162
  }
149
163
  /**
150
164
  * `none`: CSS com escopo. `shadow`: Shadow DOM. `iframe`: iframe com
@@ -189,6 +203,18 @@ interface VitralConfig {
189
203
  styles?: StyleOptions;
190
204
  /** Recebe o tempo de cada etapa do carregamento (para RUM). */
191
205
  onMetric?: (metric: RemoteMetric) => void;
206
+ /**
207
+ * Recebe cada `RemoteError` de qualquer remote (falha de download, de
208
+ * `mount`, erro de render), uma vez só por erro, além do `onError` de cada
209
+ * montagem. Use para mandar os erros ao seu monitoramento.
210
+ */
211
+ onError?: (error: RemoteError) => void;
212
+ /**
213
+ * Atribui a um remote os erros sem tratamento (`error` e
214
+ * `unhandledrejection` da janela) cujo topo da pilha é um arquivo dele, e
215
+ * entrega como `RENDER_FAILED` ao `onError`. Padrão `false`.
216
+ */
217
+ captureGlobalErrors?: boolean;
192
218
  /**
193
219
  * Dependências que o host oferece aos remotes com `dedupe`, por grupo:
194
220
  * `{ vue: { version: Vue.version, modules: { vue: Vue } } }`. O remote usa
@@ -198,6 +224,14 @@ interface VitralConfig {
198
224
  version: string;
199
225
  modules: SharedModules;
200
226
  }>;
227
+ /**
228
+ * Faixa de versão do contrato que o host aceita dos remotes (ex.: `'^2'`).
229
+ * Antes de executar o remote, o host confere a versão do `contract` do
230
+ * manifesto e as dependências que ele espera do host; se não servir, o
231
+ * remote não monta (`CONTRACT_MISMATCH`). Sem contrato no manifesto, nada é
232
+ * conferido. `'*'` confere só as dependências.
233
+ */
234
+ contract?: string;
201
235
  }
202
236
  /** Módulos de um grupo de `dedupe`, por especificador (`'react-dom/client'`). */
203
237
  type SharedModules = Record<string, unknown>;
@@ -253,6 +287,34 @@ interface RemoteManifest {
253
287
  file: string;
254
288
  chunks?: string[];
255
289
  }[];
290
+ /** O que o remote declara para o host conferir antes de montar. */
291
+ contract?: RemoteContract;
292
+ /**
293
+ * CSS já preparado no build para o Shadow DOM. Sem este campo (manifestos
294
+ * antigos), o runtime faz esse trabalho em cada página.
295
+ */
296
+ shadow?: ShadowCss;
297
+ }
298
+ /** Contrato do remote no `vitral.json`. */
299
+ interface RemoteContract {
300
+ /** Versão do contrato (opção `contract.version` do plugin). */
301
+ version?: string;
302
+ /** Faixa aceita de cada dependência de `dedupe`, por grupo (`{ react: '^19.0.0' }`). */
303
+ peers?: Record<string, string>;
304
+ }
305
+ /**
306
+ * CSS do remote preparado no build para `isolate: 'shadow'`. Os caminhos são
307
+ * relativos ao primeiro arquivo de `css` (o plugin grava tudo na mesma pasta).
308
+ */
309
+ interface ShadowCss {
310
+ /** Cada arquivo de `css`, na mesma ordem, sem `@import`, `@property` e `@font-face`. */
311
+ css: string[];
312
+ /** `@property` e `@font-face`, que só valem no documento (vão num `<link>`). */
313
+ global?: string[];
314
+ /** `@import` que o build não embutiu (outra origem), adotados antes de `css`. */
315
+ imports?: string[];
316
+ /** O CSS ainda tem `url()` relativa, que precisa apontar para o remote. */
317
+ rebase?: boolean;
256
318
  }
257
319
  type Handler<T = unknown> = (payload: T) => void;
258
320
  interface EventBus {
@@ -262,4 +324,4 @@ interface EventBus {
262
324
  last<T = unknown>(type: string): T | undefined;
263
325
  }
264
326
 
265
- export { type CheckedProps as C, type EventBus as E, type Handler as H, type Isolation as I, type MountedRemote as M, type Props as P, type RemoteContext as R, type Shared as S, type VitralConfig as V, type RemoteModule as a, type StyleOptions as b, type RemoteEntry as c, type SharedValue as d, type PropsOf as e, type ProvideOptions as f, type ProvidedValue as g, type RemoteManifest as h, type RemoteMetric as i, type Remotes as j, type SharedApi as k, type SharedModules as l, type SharedType as m, batch as n, provide as p, shared as s };
327
+ export { type CheckedProps as C, type EventBus as E, type Handler as H, type Isolation as I, type MountedRemote as M, type Props as P, type RemoteContext as R, type Shared as S, type VitralConfig as V, type RemoteModule as a, type StyleOptions as b, type RemoteEntry as c, type SharedValue as d, type PropsOf as e, type ProvideOptions as f, type ProvidedValue as g, type RemoteContract as h, type RemoteManifest as i, type RemoteMetric as j, type Remotes as k, type SharedApi as l, type SharedModules as m, type SharedType as n, batch as o, provide as p, shared as s };
package/dist/vite.d.ts CHANGED
@@ -72,6 +72,14 @@ interface VitralViteOptions extends CssBuildOptions {
72
72
  * projeto e de entrada .ts/.tsx/.js/.jsx. Padrão: true.
73
73
  */
74
74
  types?: boolean;
75
+ /**
76
+ * Contrato publicado no `vitral.json`. O host que declara
77
+ * `contract: '^2'` só monta o remote se `version` estiver na faixa. As
78
+ * faixas de `dedupe` entram sozinhas, em `peers`. Padrão: sem versão.
79
+ */
80
+ contract?: {
81
+ version?: string;
82
+ };
75
83
  }
76
84
  declare function vitral(options?: VitralViteOptions): Plugin;
77
85