@kvman/kvcoder 0.1.0 → 0.1.1

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.
@@ -1,6 +1,6 @@
1
- import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, defineComponent as s, h as c, inject as l, normalizeClass as u, openBlock as d, ref as f, renderList as p, resolveDynamicComponent as m, toDisplayString as h } from "vue";
1
+ import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, defineComponent as s, h as c, inject as l, normalizeClass as u, openBlock as d, ref as f, renderList as p, resolveDynamicComponent as m, toDisplayString as h, unref as g } from "vue";
2
2
  //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/shared/src/build/defaultAttributes.mjs
3
- var g = {
3
+ var _ = {
4
4
  xmlns: "http://www.w3.org/2000/svg",
5
5
  width: 24,
6
6
  height: 24,
@@ -10,25 +10,25 @@ var g = {
10
10
  "stroke-width": 2,
11
11
  "stroke-linecap": "round",
12
12
  "stroke-linejoin": "round"
13
- }, _ = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim();
13
+ }, v = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim();
14
14
  //#endregion
15
15
  //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/shared/src/build/buildLucideIconNode.mjs
16
- function v(e) {
16
+ function y(e) {
17
17
  return e != null;
18
18
  }
19
- function y(e, t = {}) {
20
- let n = t.attributeNames ?? {}, r = (e) => n[e] ?? e, i = e.size ?? e.width ?? g.width, a = e.size ?? e.height ?? g.height, o = e.aliases?.filter((e) => typeof e == "string" && e.trim() !== "").map((e) => `lucide-${e}`) ?? [], s = [...e.name ? [`lucide-${e.name}`] : [], ...o], c = t.className?.split(" ").filter(Boolean) ?? [], l = t.includeDefaultClasses === !1 ? _(...c) : _("lucide", ...s, ...c), u = t.absoluteStrokeWidth ? Number(t.strokeWidth ?? g["stroke-width"]) * Number(e.size ?? e.width ?? g.width) / Number(t.size ?? t.width ?? g.width) : t.strokeWidth ?? g["stroke-width"];
19
+ function b(e, t = {}) {
20
+ let n = t.attributeNames ?? {}, r = (e) => n[e] ?? e, i = e.size ?? e.width ?? _.width, a = e.size ?? e.height ?? _.height, o = e.aliases?.filter((e) => typeof e == "string" && e.trim() !== "").map((e) => `lucide-${e}`) ?? [], s = [...e.name ? [`lucide-${e.name}`] : [], ...o], c = t.className?.split(" ").filter(Boolean) ?? [], l = t.includeDefaultClasses === !1 ? v(...c) : v("lucide", ...s, ...c), u = t.absoluteStrokeWidth ? Number(t.strokeWidth ?? _["stroke-width"]) * Number(e.size ?? e.width ?? _.width) / Number(t.size ?? t.width ?? _.width) : t.strokeWidth ?? _["stroke-width"];
21
21
  return [
22
22
  "svg",
23
23
  {
24
- ...Object.entries(g).reduce((e, [t, n]) => (e[r(t)] = n, e), {}),
24
+ ...Object.entries(_).reduce((e, [t, n]) => (e[r(t)] = n, e), {}),
25
25
  ..."color" in t && t.color && { [r("stroke")]: t.color },
26
- ..."size" in t && v(t.size) && {
26
+ ..."size" in t && y(t.size) && {
27
27
  [r("width")]: t.size,
28
28
  [r("height")]: t.size
29
29
  },
30
- ..."width" in t && v(t.width) && { [r("width")]: t.width },
31
- ..."height" in t && v(t.height) && { [r("height")]: t.height },
30
+ ..."width" in t && y(t.width) && { [r("width")]: t.width },
31
+ ..."height" in t && y(t.height) && { [r("height")]: t.height },
32
32
  [r("stroke-width")]: u,
33
33
  ...l && { [r("class")]: l },
34
34
  [r("viewBox")]: `0 0 ${i} ${a}`,
@@ -50,70 +50,70 @@ function y(e, t = {}) {
50
50
  }
51
51
  //#endregion
52
52
  //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/shared/src/utils/hasA11yProp.mjs
53
- var b = (e) => {
53
+ var x = (e) => {
54
54
  for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
55
55
  return !1;
56
- }, x = (e) => e === "", S = (e) => e?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), C = /* @__PURE__ */ Symbol("lucide-icons");
57
- function w() {
58
- return l(C, {});
56
+ }, S = (e) => e === "", C = (e) => e?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), w = /* @__PURE__ */ Symbol("lucide-icons");
57
+ function T() {
58
+ return l(w, {});
59
59
  }
60
60
  //#endregion
61
61
  //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/Icon.mjs
62
- var T = ({ name: e, iconNode: t, "icon-node": n, icon: r = {
63
- name: e && S(e),
62
+ var E = ({ name: e, iconNode: t, "icon-node": n, icon: r = {
63
+ name: e && C(e),
64
64
  node: t ?? n ?? [],
65
65
  size: 24,
66
66
  aliases: []
67
67
  }, absoluteStrokeWidth: i, "absolute-stroke-width": a, nonScalingStroke: o, "non-scaling-stroke": s, strokeWidth: l, "stroke-width": u, size: d, width: f = d, height: p = d, color: m, ...h }, { slots: g }) => {
68
- let { size: _, color: v, strokeWidth: C = 2, absoluteStrokeWidth: T = !1, nonScalingStroke: E = !1, class: D = "" } = w(), O = x(i) || x(a) || i === !0 || a === !0 || T === !0, k = x(o) || x(s) || o === !0 || s === !0 || E === !0;
68
+ let { size: _, color: v, strokeWidth: y = 2, absoluteStrokeWidth: w = !1, nonScalingStroke: E = !1, class: D = "" } = T(), O = S(i) || S(a) || i === !0 || a === !0 || w === !0, k = S(o) || S(s) || o === !0 || s === !0 || E === !0;
69
69
  delete h.class;
70
- let A = g.default?.(), [, j, M = []] = y(r, {
70
+ let A = g.default?.(), [, j, M = []] = b(r, {
71
71
  color: m ?? v,
72
72
  width: f ?? d ?? _,
73
73
  height: p ?? d ?? _,
74
- strokeWidth: l ?? u ?? C,
74
+ strokeWidth: l ?? u ?? y,
75
75
  absoluteStrokeWidth: O,
76
76
  nonScalingStroke: k,
77
77
  className: D,
78
- hasA11yProp: A != null && A.length > 0 || b(h),
78
+ hasA11yProp: A != null && A.length > 0 || x(h),
79
79
  attributes: h
80
80
  });
81
81
  return c("svg", j, [...M.map(([e, t]) => c(e, t)), ...A ?? []]);
82
82
  };
83
83
  //#endregion
84
84
  //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/createLucideIcon.mjs
85
- function E(e, t = []) {
85
+ function D(e, t = []) {
86
86
  let n = typeof e == "string" ? {
87
87
  name: e,
88
88
  node: t
89
89
  } : e;
90
- return (e, { slots: t }) => c(T, {
90
+ return (e, { slots: t }) => c(E, {
91
91
  ...e,
92
92
  icon: n
93
93
  }, t.default ? { default: t.default } : void 0);
94
94
  }
95
- var D = E({
95
+ var O = D({
96
96
  name: "chevron-down",
97
97
  size: 24,
98
98
  node: [["path", {
99
99
  d: "m6 9 6 6 6-6",
100
100
  key: "qrunsl"
101
101
  }]]
102
- }), O = E({
102
+ }), k = D({
103
103
  name: "chevron-right",
104
104
  size: 24,
105
105
  node: [["path", {
106
106
  d: "m9 18 6-6-6-6",
107
107
  key: "mthhwq"
108
108
  }]]
109
- }), k = 200;
110
- function A(e) {
109
+ }), A = 200;
110
+ function j(e) {
111
111
  let t = e.replace(/\s+/g, " ");
112
- return t.length > k ? `${t.slice(0, k)}…` : t;
112
+ return t.length > A ? `${t.slice(0, A)}…` : t;
113
113
  }
114
114
  //#endregion
115
115
  //#region web/src/durations.ts
116
- function j(e, t) {
116
+ function M(e, t) {
117
117
  if (t < 1e3) return e("kvcoder.ui.milliseconds", { count: Math.round(t) });
118
118
  if (t < 1e4) return e("kvcoder.ui.seconds", { count: (t / 1e3).toFixed(1) });
119
119
  let n = Math.round(t / 1e3);
@@ -124,18 +124,18 @@ function j(e, t) {
124
124
  }
125
125
  //#endregion
126
126
  //#region web/src/kvman.ts
127
- function M() {
127
+ function N() {
128
128
  let e = l("kvman");
129
129
  if (e === void 0) throw Error("kvcoder components run inside kvwebui, which provides kvman.");
130
130
  return e;
131
131
  }
132
132
  //#endregion
133
133
  //#region web/src/output-links.ts
134
- var N = /http:\/\/(?:127\.0\.0\.1|localhost):\d+[^\s"'`<>()[\]{}]*/g, P = /[.,;:!?]+$/;
135
- function F(e) {
134
+ var P = /http:\/\/(?:127\.0\.0\.1|localhost):\d+[^\s"'`<>()[\]{}]*/g, F = /[.,;:!?]+$/;
135
+ function I(e) {
136
136
  let t = [], n = 0;
137
- for (let r of e.matchAll(N)) {
138
- let i = r[0].replace(P, "");
137
+ for (let r of e.matchAll(P)) {
138
+ let i = r[0].replace(F, "");
139
139
  r.index > n && t.push({
140
140
  kind: "text",
141
141
  text: e.slice(n, r.index)
@@ -151,236 +151,140 @@ function F(e) {
151
151
  }
152
152
  //#endregion
153
153
  //#region web/src/CallCard.vue?vue&type=script&setup=true&lang.ts
154
- var I = /*@__PURE__*/ s({
155
- __name: "CallCard",
156
- props: {
157
- description: {
158
- type: null,
159
- required: !1
160
- },
161
- label: {
162
- type: null,
163
- required: !1
164
- },
165
- line: {
166
- type: null,
167
- required: !1
168
- },
169
- payload: {
170
- type: null,
171
- required: !1
172
- },
173
- failed: {
174
- type: Boolean,
175
- required: !1,
176
- skipCheck: !0
177
- },
178
- durationMs: {
179
- type: null,
180
- required: !1
181
- },
182
- writtenMs: {
183
- type: null,
184
- required: !1
185
- },
186
- output: {
187
- type: null,
188
- required: !1
189
- },
190
- running: {
191
- type: Boolean,
192
- required: !1,
193
- skipCheck: !0
194
- },
195
- background: {
196
- type: Boolean,
197
- required: !1,
198
- skipCheck: !0
199
- }
200
- },
201
- setup(e, { expose: n }) {
202
- n();
203
- let r = e, i = M(), a = {
204
- props: r,
205
- kvman: i,
206
- open: f(!1),
207
- parts: t(() => F(r.output ?? "")),
208
- time: t(() => r.durationMs === void 0 ? "" : j(i.t, (r.writtenMs ?? 0) + r.durationMs)),
209
- timeParts: t(() => {
210
- if (r.durationMs === void 0) return "";
211
- let e = j(i.t, r.durationMs);
212
- return r.writtenMs === void 0 ? i.t("kvcoder.ui.callRan", { ran: e }) : i.t("kvcoder.ui.callParts", {
213
- written: j(i.t, r.writtenMs),
214
- ran: e
215
- });
216
- }),
217
- detail: t(() => r.line ?? r.payload),
218
- get ChevronDown() {
219
- return D;
220
- },
221
- get ChevronRight() {
222
- return O;
223
- },
224
- get shortLine() {
225
- return A;
226
- }
227
- };
228
- return Object.defineProperty(a, "__isScriptSetup", {
229
- enumerable: !1,
230
- value: !0
231
- }), a;
232
- }
233
- }), L = (e, t) => {
234
- let n = e.__vccOpts || e;
235
- for (let [e, r] of t) n[e] = r;
236
- return n;
237
- }, R = ["aria-expanded", "disabled"], z = ["aria-label"], B = { class: "kvc-lines" }, V = {
154
+ var L = ["aria-expanded", "disabled"], R = ["aria-label"], z = { class: "kvc-lines" }, B = {
238
155
  key: 0,
239
156
  style: { "font-weight": "600" },
240
157
  "data-test": "call-description"
241
- }, H = {
158
+ }, V = {
242
159
  key: 1,
243
160
  class: "kvc-oneline",
244
161
  "data-test": "call-line"
245
- }, U = { class: "kvc-mono" }, W = {
162
+ }, H = { class: "kvc-mono" }, U = {
246
163
  key: 2,
247
164
  class: "kvc-muted",
248
165
  dir: "ltr",
249
166
  style: { "align-self": "flex-start" },
250
167
  "data-test": "call-label"
251
- }, G = {
168
+ }, W = {
252
169
  key: 2,
253
170
  class: "kvc-chip",
254
171
  "data-test": "call-background"
255
- }, K = {
172
+ }, G = {
256
173
  key: 3,
257
174
  class: "kvc-chip kvc-danger",
258
175
  "data-test": "call-failed"
259
- }, q = {
176
+ }, K = {
260
177
  class: "kvc-muted",
261
178
  "data-test": "call-time"
262
- }, J = {
179
+ }, q = {
263
180
  key: 0,
264
181
  class: "kvc-muted kvc-call-parts",
265
182
  "data-test": "call-parts"
266
- }, Y = ["aria-label"], X = ["aria-label"], Z = ["href"];
267
- function Q(t, s, c, l, f, g) {
268
- return d(), i("div", {
269
- class: u(["kvc-card", { "kvc-failed": l.props.failed }]),
270
- "data-test": "call-card"
271
- }, [a("button", {
272
- type: "button",
273
- class: "kvc-card-row kvc-ghost kvc-button",
274
- style: {
275
- "inline-size": "100%",
276
- "border-radius": "0"
277
- },
278
- "aria-expanded": l.open,
279
- disabled: l.props.output === void 0,
280
- onClick: s[0] ||= (e) => l.open = !l.open
281
- }, [
282
- l.props.running ? (d(), i("span", {
283
- key: 0,
284
- class: "kvc-spin",
285
- "aria-label": l.kvman.t("kvcoder.ui.running")
286
- }, null, 8, z)) : (d(), n(m(l.open ? l.ChevronDown : l.ChevronRight), {
287
- key: 1,
288
- size: 16,
289
- "aria-hidden": "true"
290
- })),
291
- a("span", B, [l.props.description ? (d(), i("span", V, h(l.props.description), 1)) : l.props.line ? (d(), i("span", H, [a("span", U, h(l.shortLine(l.props.line)), 1)])) : r("v-if", !0), l.props.label ? (d(), i("span", W, h(l.props.label), 1)) : r("v-if", !0)]),
292
- l.props.background ? (d(), i("span", G, h(l.kvman.t("kvcoder.ui.jobs.background")), 1)) : r("v-if", !0),
293
- l.props.failed ? (d(), i("span", K, h(l.kvman.t("kvcoder.ui.callFailed")), 1)) : r("v-if", !0),
294
- a("span", q, h(l.time), 1)
295
- ], 8, R), l.open && l.props.output !== void 0 ? (d(), i(e, { key: 0 }, [
296
- l.timeParts === "" ? r("v-if", !0) : (d(), i("p", J, h(l.timeParts), 1)),
297
- l.detail === void 0 ? r("v-if", !0) : (d(), i("pre", {
298
- key: 1,
299
- class: "kvc-output kvc-mono",
300
- dir: "ltr",
301
- "aria-label": l.kvman.t("kvcoder.ui.command"),
302
- "data-test": "call-payload"
303
- }, h(l.detail), 9, Y)),
304
- l.props.output === "" ? r("v-if", !0) : (d(), i("pre", {
305
- key: 2,
306
- class: "kvc-output",
307
- dir: "auto",
308
- "aria-label": l.kvman.t("kvcoder.ui.output"),
309
- "data-test": "call-output"
310
- }, [(d(!0), i(e, null, p(l.parts, (t, n) => (d(), i(e, { key: n }, [t.kind === "link" ? (d(), i("a", {
311
- key: 0,
312
- href: t.href,
313
- target: "_blank",
314
- rel: "noopener noreferrer",
315
- class: "kvc-link"
316
- }, h(t.href), 9, Z)) : (d(), i(e, { key: 1 }, [o(h(t.text), 1)], 64))], 64))), 128))], 8, X))
317
- ], 64)) : r("v-if", !0)], 2);
318
- }
319
- var $ = /*#__PURE__*/ L(I, [["render", Q], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/CallCard.vue"]]), ee = /*@__PURE__*/ s({
183
+ }, J = ["aria-label"], Y = ["aria-label"], X = ["href"], Z = /* @__PURE__ */ s({
184
+ __name: "CallCard",
185
+ props: {
186
+ description: {},
187
+ label: {},
188
+ line: {},
189
+ payload: {},
190
+ failed: { type: Boolean },
191
+ durationMs: {},
192
+ writtenMs: {},
193
+ output: {},
194
+ running: { type: Boolean },
195
+ background: { type: Boolean }
196
+ },
197
+ setup(s) {
198
+ let c = s, l = N(), _ = f(!1), v = t(() => I(c.output ?? "")), y = t(() => c.durationMs === void 0 ? "" : M(l.t, (c.writtenMs ?? 0) + c.durationMs)), b = t(() => {
199
+ if (c.durationMs === void 0) return "";
200
+ let e = M(l.t, c.durationMs);
201
+ return c.writtenMs === void 0 ? l.t("kvcoder.ui.callRan", { ran: e }) : l.t("kvcoder.ui.callParts", {
202
+ written: M(l.t, c.writtenMs),
203
+ ran: e
204
+ });
205
+ }), x = t(() => c.line ?? c.payload);
206
+ return (t, s) => (d(), i("div", {
207
+ class: u(["kvc-card", { "kvc-failed": c.failed }]),
208
+ "data-test": "call-card"
209
+ }, [a("button", {
210
+ type: "button",
211
+ class: "kvc-card-row kvc-ghost kvc-button",
212
+ style: {
213
+ "inline-size": "100%",
214
+ "border-radius": "0"
215
+ },
216
+ "aria-expanded": _.value,
217
+ disabled: c.output === void 0,
218
+ onClick: s[0] ||= (e) => _.value = !_.value
219
+ }, [
220
+ c.running ? (d(), i("span", {
221
+ key: 0,
222
+ class: "kvc-spin",
223
+ "aria-label": g(l).t("kvcoder.ui.running")
224
+ }, null, 8, R)) : (d(), n(m(_.value ? g(O) : g(k)), {
225
+ key: 1,
226
+ size: 16,
227
+ "aria-hidden": "true"
228
+ })),
229
+ a("span", z, [c.description ? (d(), i("span", B, h(c.description), 1)) : c.line ? (d(), i("span", V, [a("span", H, h(g(j)(c.line)), 1)])) : r("v-if", !0), c.label ? (d(), i("span", U, h(c.label), 1)) : r("v-if", !0)]),
230
+ c.background ? (d(), i("span", W, h(g(l).t("kvcoder.ui.jobs.background")), 1)) : r("v-if", !0),
231
+ c.failed ? (d(), i("span", G, h(g(l).t("kvcoder.ui.callFailed")), 1)) : r("v-if", !0),
232
+ a("span", K, h(y.value), 1)
233
+ ], 8, L), _.value && c.output !== void 0 ? (d(), i(e, { key: 0 }, [
234
+ b.value === "" ? r("v-if", !0) : (d(), i("p", q, h(b.value), 1)),
235
+ x.value === void 0 ? r("v-if", !0) : (d(), i("pre", {
236
+ key: 1,
237
+ class: "kvc-output kvc-mono",
238
+ dir: "ltr",
239
+ "aria-label": g(l).t("kvcoder.ui.command"),
240
+ "data-test": "call-payload"
241
+ }, h(x.value), 9, J)),
242
+ c.output === "" ? r("v-if", !0) : (d(), i("pre", {
243
+ key: 2,
244
+ class: "kvc-output",
245
+ dir: "auto",
246
+ "aria-label": g(l).t("kvcoder.ui.output"),
247
+ "data-test": "call-output"
248
+ }, [(d(!0), i(e, null, p(v.value, (t, n) => (d(), i(e, { key: n }, [t.kind === "link" ? (d(), i("a", {
249
+ key: 0,
250
+ href: t.href,
251
+ target: "_blank",
252
+ rel: "noopener noreferrer",
253
+ class: "kvc-link"
254
+ }, h(t.href), 9, X)) : (d(), i(e, { key: 1 }, [o(h(t.text), 1)], 64))], 64))), 128))], 8, Y))
255
+ ], 64)) : r("v-if", !0)], 2));
256
+ }
257
+ }), Q = /* @__PURE__ */ s({
320
258
  __name: "call",
321
259
  props: {
322
- description: {
323
- type: String,
324
- required: !1
325
- },
326
- label: {
327
- type: String,
328
- required: !1
329
- },
330
- line: {
331
- type: String,
332
- required: !1
333
- },
334
- payload: {
335
- type: String,
336
- required: !1
337
- },
338
- failed: {
339
- type: Boolean,
340
- required: !1
341
- },
342
- durationMs: {
343
- type: Number,
344
- required: !1
345
- },
346
- output: {
347
- type: String,
348
- required: !1
349
- }
260
+ description: {},
261
+ label: {},
262
+ line: {},
263
+ payload: {},
264
+ failed: { type: Boolean },
265
+ durationMs: {},
266
+ output: {}
350
267
  },
351
- setup(e, { expose: t }) {
352
- t();
353
- let n = {
354
- props: e,
355
- CallCard: $
356
- };
357
- return Object.defineProperty(n, "__isScriptSetup", {
358
- enumerable: !1,
359
- value: !0
360
- }), n;
268
+ setup(e) {
269
+ let t = e;
270
+ return (e, r) => (d(), n(Z, {
271
+ description: t.description,
272
+ label: t.label,
273
+ line: t.line,
274
+ payload: t.payload,
275
+ failed: t.failed,
276
+ "duration-ms": t.durationMs,
277
+ output: t.output
278
+ }, null, 8, [
279
+ "description",
280
+ "label",
281
+ "line",
282
+ "payload",
283
+ "failed",
284
+ "duration-ms",
285
+ "output"
286
+ ]));
361
287
  }
362
288
  });
363
289
  //#endregion
364
- //#region web/components/call.vue
365
- function te(e, t, r, i, a, o) {
366
- return d(), n(i.CallCard, {
367
- description: i.props.description,
368
- label: i.props.label,
369
- line: i.props.line,
370
- payload: i.props.payload,
371
- failed: i.props.failed,
372
- "duration-ms": i.props.durationMs,
373
- output: i.props.output
374
- }, null, 8, [
375
- "description",
376
- "label",
377
- "line",
378
- "payload",
379
- "failed",
380
- "duration-ms",
381
- "output"
382
- ]);
383
- }
384
- var ne = /*#__PURE__*/ L(ee, [["render", te], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/components/call.vue"]]);
385
- //#endregion
386
- export { ne as default };
290
+ export { Q as default };