@scalar/api-client 2.1.17 → 2.1.18

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 (43) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/CommandPalette/CommandActionForm.vue.d.ts +3 -0
  3. package/dist/components/CommandPalette/CommandActionForm.vue.d.ts.map +1 -1
  4. package/dist/components/CommandPalette/CommandActionForm.vue.js +13 -11
  5. package/dist/components/CommandPalette/CommandActionInput.vue.d.ts +0 -2
  6. package/dist/components/CommandPalette/CommandActionInput.vue.d.ts.map +1 -1
  7. package/dist/components/CommandPalette/CommandActionInput.vue.js +36 -38
  8. package/dist/components/CommandPalette/CommandPaletteImport.vue.d.ts.map +1 -1
  9. package/dist/components/CommandPalette/CommandPaletteImport.vue.js +100 -80
  10. package/dist/components/CommandPalette/TheCommandPalette.vue.js +1 -1
  11. package/dist/components/CommandPalette/TheCommandPalette.vue2.js +24 -24
  12. package/dist/layouts/App/ApiClientApp.vue.d.ts.map +1 -1
  13. package/dist/layouts/App/ApiClientApp.vue.js +1 -4
  14. package/dist/layouts/Web/ApiClientWeb.vue.d.ts.map +1 -1
  15. package/dist/layouts/Web/ApiClientWeb.vue.js +7 -10
  16. package/dist/libs/extractAttachmentFilename.d.ts +2 -0
  17. package/dist/libs/extractAttachmentFilename.d.ts.map +1 -0
  18. package/dist/libs/extractAttachmentFilename.js +20 -0
  19. package/dist/libs/getOpenApiDocumentDetails.d.ts +10 -0
  20. package/dist/libs/getOpenApiDocumentDetails.d.ts.map +1 -0
  21. package/dist/libs/getOpenApiDocumentDetails.js +40 -0
  22. package/dist/libs/index.d.ts +1 -2
  23. package/dist/libs/index.d.ts.map +1 -1
  24. package/dist/libs/index.js +21 -23
  25. package/dist/libs/isUrl.d.ts +1 -1
  26. package/dist/libs/isUrl.d.ts.map +1 -1
  27. package/dist/libs/isUrl.js +4 -3
  28. package/dist/store/import-spec.d.ts.map +1 -1
  29. package/dist/store/import-spec.js +21 -26
  30. package/dist/style.css +1 -1
  31. package/dist/views/Request/ResponseSection/ResponseBody.vue.d.ts.map +1 -1
  32. package/dist/views/Request/ResponseSection/ResponseBody.vue.js +63 -55
  33. package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.d.ts +2 -0
  34. package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.d.ts.map +1 -1
  35. package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.js +14 -14
  36. package/dist/views/Request/ResponseSection/ResponseEmpty.vue2.js +1 -1
  37. package/package.json +4 -4
  38. package/dist/libs/getOpenApiDocumentVersion.d.ts +0 -8
  39. package/dist/libs/getOpenApiDocumentVersion.d.ts.map +0 -1
  40. package/dist/libs/getOpenApiDocumentVersion.js +0 -20
  41. package/dist/libs/isDocument.d.ts +0 -3
  42. package/dist/libs/isDocument.d.ts.map +0 -1
  43. package/dist/libs/isDocument.js +0 -7
@@ -1,4 +1,4 @@
1
- import { defineComponent as p, onMounted as m, watchEffect as v, onBeforeMount as _, onBeforeUnmount as k, computed as h, openBlock as e, createElementBlock as c, Fragment as w, createElementVNode as i, unref as o, createVNode as t, withCtx as y, createBlock as d, KeepAlive as g, resolveDynamicComponent as x, createCommentVNode as C } from "vue";
1
+ import { defineComponent as f, onMounted as m, watchEffect as v, onBeforeMount as _, onBeforeUnmount as h, computed as k, openBlock as e, createElementBlock as c, Fragment as w, createElementVNode as i, unref as o, createVNode as t, withCtx as y, createBlock as d, KeepAlive as g, resolveDynamicComponent as x, createCommentVNode as C } from "vue";
2
2
  import S from "../../components/SideNav/SideNav.vue.js";
3
3
  import { addScalarClassesToHeadless as T } from "@scalar/components";
4
4
  import { getThemeStyles as L } from "@scalar/themes";
@@ -11,7 +11,7 @@ import { handleHotKeyDown as W } from "../../libs/event-busses/hot-keys-bus.js";
11
11
  const H = ["innerHTML"], N = {
12
12
  key: 0,
13
13
  class: "flex min-h-0 flex-1 z-0"
14
- }, V = { class: "flex flex-1 flex-col min-w-0 border-l-1/2 border-t-1/2" }, J = /* @__PURE__ */ p({
14
+ }, V = { class: "flex flex-1 flex-col min-w-0 border-l-1/2 border-t-1/2" }, J = /* @__PURE__ */ f({
15
15
  __name: "ApiClientWeb",
16
16
  setup(K) {
17
17
  m(() => {
@@ -22,12 +22,9 @@ const H = ["innerHTML"], N = {
22
22
  const { isDark: r } = E(), n = M();
23
23
  _(() => T());
24
24
  const a = (l) => W(l);
25
- m(() => window.addEventListener("keydown", a)), k(() => window.removeEventListener("keydown", a));
26
- const u = h(
27
- () => n.activeWorkspace.value && `<style>
28
- ${L(n.activeWorkspace.value.themeId, {
29
- fonts: !0
30
- })}</style>`
25
+ m(() => window.addEventListener("keydown", a)), h(() => window.removeEventListener("keydown", a));
26
+ const u = k(
27
+ () => n.activeWorkspace.value && `<style>${L(n.activeWorkspace.value.themeId)}</style>`
31
28
  );
32
29
  return (l, A) => {
33
30
  var s;
@@ -38,9 +35,9 @@ const H = ["innerHTML"], N = {
38
35
  t(o(D)),
39
36
  i("div", V, [
40
37
  t(o(B), null, {
41
- default: y(({ Component: f }) => [
38
+ default: y(({ Component: p }) => [
42
39
  (e(), d(g, null, [
43
- (e(), d(x(f)))
40
+ (e(), d(x(p)))
44
41
  ], 1024))
45
42
  ]),
46
43
  _: 1
@@ -0,0 +1,2 @@
1
+ export declare function extractFilename(contentDisposition: string): string;
2
+ //# sourceMappingURL=extractAttachmentFilename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractAttachmentFilename.d.ts","sourceRoot":"","sources":["../../src/libs/extractAttachmentFilename.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,kBAAkB,EAAE,MAAM,UAezD"}
@@ -0,0 +1,20 @@
1
+ const a = (e) => {
2
+ try {
3
+ return decodeURIComponent(e);
4
+ } catch {
5
+ return e;
6
+ }
7
+ };
8
+ function c(e) {
9
+ let t = "";
10
+ if (e) {
11
+ const n = e.match(
12
+ /filename\s*=\s*"?([^";]+)"?/
13
+ );
14
+ n && n.length === 2 && (t = a(n[1].trim()));
15
+ }
16
+ return t;
17
+ }
18
+ export {
19
+ c as extractFilename
20
+ };
@@ -0,0 +1,10 @@
1
+ export type OpenApiDocumentDetails = {
2
+ version: string;
3
+ type: 'json' | 'yaml';
4
+ title?: string;
5
+ };
6
+ /**
7
+ * Get the base Swagger/OpenAPI details from the given string
8
+ */
9
+ export declare function getOpenApiDocumentDetails(input: string | null): OpenApiDocumentDetails | undefined;
10
+ //# sourceMappingURL=getOpenApiDocumentDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getOpenApiDocumentDetails.d.ts","sourceRoot":"","sources":["../../src/libs/getOpenApiDocumentDetails.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AASD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,sBAAsB,GAAG,SAAS,CAoDpC"}
@@ -0,0 +1,40 @@
1
+ import { json as n, yaml as o } from "@scalar/oas-utils/helpers";
2
+ import { isUrl as i } from "./isUrl.js";
3
+ function t(r) {
4
+ return {
5
+ title: typeof (r == null ? void 0 : r.title) == "string" ? `${r == null ? void 0 : r.title}` : void 0
6
+ };
7
+ }
8
+ function g(r) {
9
+ if (!(!r || i(r))) {
10
+ try {
11
+ const e = n.parse(r ?? "");
12
+ return typeof (e == null ? void 0 : e.openapi) == "string" ? {
13
+ version: `OpenAPI ${e.openapi}`,
14
+ type: "json",
15
+ ...t(e.info)
16
+ } : typeof (e == null ? void 0 : e.swagger) == "string" ? {
17
+ version: `Swagger ${e.swagger}`,
18
+ type: "json",
19
+ ...t(e.info)
20
+ } : void 0;
21
+ } catch {
22
+ }
23
+ try {
24
+ const e = o.parse(r ?? "");
25
+ return typeof (e == null ? void 0 : e.openapi) == "string" ? {
26
+ version: `OpenAPI ${e.openapi}`,
27
+ type: "yaml",
28
+ ...t(e.info)
29
+ } : typeof (e == null ? void 0 : e.swagger) == "string" ? {
30
+ version: `Swagger ${e.swagger}`,
31
+ type: "yaml",
32
+ ...t(e.info)
33
+ } : void 0;
34
+ } catch {
35
+ }
36
+ }
37
+ }
38
+ export {
39
+ g as getOpenApiDocumentDetails
40
+ };
@@ -7,7 +7,6 @@ export * from './normalize-headers.js';
7
7
  export * from './local-storage.js';
8
8
  export * from './environment-parser.js';
9
9
  export * from './isUrl.js';
10
- export * from './isDocument.js';
11
- export * from './getOpenApiDocumentVersion.js';
10
+ export * from './getOpenApiDocumentDetails.js';
12
11
  export { createRequestOperation } from './send-request.js';
13
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/libs/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/libs/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA;AACvB,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -1,39 +1,37 @@
1
1
  import { createApiClient as o } from "./create-client.js";
2
2
  import { formatBytes as m, formatMs as s } from "./formatters.js";
3
- import { ERRORS as a, normalizeError as f, prettyErrorMessage as x } from "./errors.js";
4
- import { formatHeaderKey as n, normalizeHeaders as i } from "./normalize-headers.js";
3
+ import { ERRORS as p, normalizeError as f, prettyErrorMessage as x } from "./errors.js";
4
+ import { formatHeaderKey as l, normalizeHeaders as i } from "./normalize-headers.js";
5
5
  import { loadAllResources as c } from "./local-storage.js";
6
6
  import { parseEnvVariables as d } from "./environment-parser.js";
7
7
  import { isUrl as E } from "./isUrl.js";
8
- import { isDocument as q } from "./isDocument.js";
9
- import { getOpenApiDocumentVersion as D } from "./getOpenApiDocumentVersion.js";
10
- import { createRequestOperation as K } from "./send-request.js";
11
- import { commandPaletteBus as g } from "./event-busses/command-palette-bus.js";
12
- import { DEFAULT_HOTKEYS as S, getModifiers as h, handleHotKeyDown as z, hotKeyBus as T } from "./event-busses/hot-keys-bus.js";
13
- import { executeRequestBus as V } from "./event-busses/execute-request-bus.js";
14
- import { cancelRequestBus as v } from "./event-busses/cancel-request-bus.js";
15
- import { requestStatusBus as C } from "./event-busses/request-status-bus.js";
8
+ import { getOpenApiDocumentDetails as q } from "./getOpenApiDocumentDetails.js";
9
+ import { createRequestOperation as D } from "./send-request.js";
10
+ import { commandPaletteBus as K } from "./event-busses/command-palette-bus.js";
11
+ import { DEFAULT_HOTKEYS as g, getModifiers as M, handleHotKeyDown as S, hotKeyBus as h } from "./event-busses/hot-keys-bus.js";
12
+ import { executeRequestBus as T } from "./event-busses/execute-request-bus.js";
13
+ import { cancelRequestBus as b } from "./event-busses/cancel-request-bus.js";
14
+ import { requestStatusBus as w } from "./event-busses/request-status-bus.js";
16
15
  export {
17
- S as DEFAULT_HOTKEYS,
18
- a as ERRORS,
19
- v as cancelRequestBus,
20
- g as commandPaletteBus,
16
+ g as DEFAULT_HOTKEYS,
17
+ p as ERRORS,
18
+ b as cancelRequestBus,
19
+ K as commandPaletteBus,
21
20
  o as createApiClient,
22
- K as createRequestOperation,
23
- V as executeRequestBus,
21
+ D as createRequestOperation,
22
+ T as executeRequestBus,
24
23
  m as formatBytes,
25
- n as formatHeaderKey,
24
+ l as formatHeaderKey,
26
25
  s as formatMs,
27
- h as getModifiers,
28
- D as getOpenApiDocumentVersion,
29
- z as handleHotKeyDown,
30
- T as hotKeyBus,
31
- q as isDocument,
26
+ M as getModifiers,
27
+ q as getOpenApiDocumentDetails,
28
+ S as handleHotKeyDown,
29
+ h as hotKeyBus,
32
30
  E as isUrl,
33
31
  c as loadAllResources,
34
32
  f as normalizeError,
35
33
  i as normalizeHeaders,
36
34
  d as parseEnvVariables,
37
35
  x as prettyErrorMessage,
38
- C as requestStatusBus
36
+ w as requestStatusBus
39
37
  };
@@ -1,3 +1,3 @@
1
1
  /** Checks whether the given string is an URL */
2
- export declare function isUrl(input: string | null): boolean | "" | null;
2
+ export declare function isUrl(input: string | null): boolean;
3
3
  //# sourceMappingURL=isUrl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isUrl.d.ts","sourceRoot":"","sources":["../../src/libs/isUrl.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,uBAEzC"}
1
+ {"version":3,"file":"isUrl.d.ts","sourceRoot":"","sources":["../../src/libs/isUrl.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,WAMzC"}
@@ -1,6 +1,7 @@
1
- function r(t) {
2
- return t && (t.startsWith("http://") || t.startsWith("https://"));
1
+ import { isValidUrl as t } from "@scalar/oas-utils/helpers";
2
+ function e(r) {
3
+ return !r || !(r.startsWith("http://") || r.startsWith("https://")) ? !1 : t(r);
3
4
  }
4
5
  export {
5
- r as isUrl
6
+ e as isUrl
6
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"import-spec.d.ts","sourceRoot":"","sources":["../../src/store/import-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAGzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAGhD,yDAAyD;AACzD,wBAAgB,qBAAqB,CAAC,EACpC,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,GACX,EAAE,YAAY;4BAEJ,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,2CAQjB,IAAI,CAAC,SAAS,CAAC,4BACP,mBAAmB,CAAC,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAsE81W,CAAC;;;;;;uBAAqK,CAAC;mBAAqC,CAAC;0BAA4C,CAAC;mBAAqC,CAAC;oBAAoB,CAAC;mBAAqC,CAAC;qBAAuC,CAAC;;mBAA4D,CAAC;;0BAAoD,CAAC;mBAAqC,CAAC;;;;;;6BA3B57X,MAAM,UACH,MAAM,oBACI,IAAI,CAAC,SAAS,CAAC,4BACP,mBAAmB,CAAC,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAwB81W,CAAC;;;;;;uBAAqK,CAAC;mBAAqC,CAAC;0BAA4C,CAAC;mBAAqC,CAAC;oBAAoB,CAAC;mBAAqC,CAAC;qBAAuC,CAAC;;mBAA4D,CAAC;;0BAAoD,CAAC;mBAAqC,CAAC;;;;;;EADp8X"}
1
+ {"version":3,"file":"import-spec.d.ts","sourceRoot":"","sources":["../../src/store/import-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAGzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAGhD,yDAAyD;AACzD,wBAAgB,qBAAqB,CAAC,EACpC,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,GACX,EAAE,YAAY;4BAEJ,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,2CAQjB,IAAI,CAAC,SAAS,CAAC,4BACP,mBAAmB,CAAC,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmE09W,CAAC;;;;;;uBAAqK,CAAC;mBAAqC,CAAC;0BAA4C,CAAC;mBAAqC,CAAC;oBAAoB,CAAC;mBAAqC,CAAC;qBAAuC,CAAC;;mBAA4D,CAAC;;0BAAoD,CAAC;mBAAqC,CAAC;;;;;;6BAtBxjY,MAAM,UACH,MAAM,oBACI,IAAI,CAAC,SAAS,CAAC,4BACP,mBAAmB,CAAC,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmB09W,CAAC;;;;;;uBAAqK,CAAC;mBAAqC,CAAC;0BAA4C,CAAC;mBAAqC,CAAC;oBAAoB,CAAC;mBAAqC,CAAC;qBAAuC,CAAC;;mBAA4D,CAAC;;0BAAoD,CAAC;mBAAqC,CAAC;;;;;;EADhkY"}
@@ -1,21 +1,21 @@
1
- import { fetchSpecFromUrl as F } from "@scalar/oas-utils/helpers";
2
- import { importSpecToWorkspace as R } from "@scalar/oas-utils/transforms";
3
- import { toRaw as g } from "vue";
1
+ import { fetchSpecFromUrl as w } from "@scalar/oas-utils/helpers";
2
+ import { importSpecToWorkspace as y } from "@scalar/oas-utils/transforms";
3
+ import { toRaw as F } from "vue";
4
4
  function S({
5
- requestMutators: p,
5
+ requestMutators: s,
6
6
  collectionMutators: f,
7
7
  serverMutators: l,
8
8
  tagMutators: m,
9
- securitySchemeMutators: d,
10
- requestExampleMutators: u,
9
+ securitySchemeMutators: u,
10
+ requestExampleMutators: d,
11
11
  workspaceMutators: h,
12
12
  workspaces: E
13
13
  }) {
14
14
  const a = async (i, e = "default", c, n) => {
15
- var s;
16
- const r = g(i);
15
+ var p;
16
+ const r = F(i);
17
17
  c != null && c.length && typeof r == "object" && (r.servers = c);
18
- const o = await R(
18
+ const o = await y(
19
19
  r,
20
20
  n
21
21
  );
@@ -23,30 +23,25 @@ function S({
23
23
  console.group("IMPORT ERRORS"), o.importWarnings.forEach((t) => console.warn(t)), console.groupEnd();
24
24
  return;
25
25
  }
26
- return o.examples.forEach((t) => u.add(t)), o.requests.forEach((t) => p.add(t)), o.tags.forEach((t) => m.add(t)), o.servers.forEach((t) => l.add(t)), o.securitySchemes.forEach(
27
- (t) => d.add(t)
26
+ return o.examples.forEach((t) => d.add(t)), o.requests.forEach((t) => s.add(t)), o.tags.forEach((t) => m.add(t)), o.servers.forEach((t) => l.add(t)), o.securitySchemes.forEach(
27
+ (t) => u.add(t)
28
28
  ), f.add(o.collection), h.edit(e, "collections", [
29
- ...((s = E[e]) == null ? void 0 : s.collections) ?? [],
29
+ ...((p = E[e]) == null ? void 0 : p.collections) ?? [],
30
30
  o.collection.uid
31
31
  ]), o.collection;
32
32
  };
33
- async function y(i, e, c, n, r = "default") {
34
- try {
35
- const o = await F(i, e);
36
- return await a(
37
- o,
38
- r,
39
- c,
40
- n
41
- );
42
- } catch (o) {
43
- console.error("Failed to fetch spec from URL:", o);
44
- return;
45
- }
33
+ async function g(i, e, c, n, r = "default") {
34
+ const o = await w(i, e);
35
+ return await a(
36
+ o,
37
+ r,
38
+ c,
39
+ n
40
+ );
46
41
  }
47
42
  return {
48
43
  importSpecFile: a,
49
- importSpecFromUrl: y
44
+ importSpecFromUrl: g
50
45
  };
51
46
  }
52
47
  export {