@nvent-addon/app 0.5.15 → 1.0.0-alpha.10
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/dist/module.json +1 -1
- package/dist/module.mjs +3 -2
- package/dist/runtime/app/components/DashboardCard.d.vue.ts +1 -1
- package/dist/runtime/app/components/DashboardCard.vue.d.ts +1 -1
- package/dist/runtime/app/composables/useWorkers.d.ts +57 -0
- package/dist/runtime/app/composables/useWorkers.js +42 -0
- package/dist/runtime/app/pages/dashboard.vue +1 -654
- package/dist/runtime/app/pages/index.vue +25 -41
- package/dist/runtime/app/pages/workers.vue +458 -0
- package/dist/runtime/server/api/_workers/index.get.d.ts +8 -0
- package/dist/runtime/server/api/_workers/index.get.js +14 -0
- package/package.json +13 -12
- package/dist/runtime/app/components/ComponentRouter.d.vue.ts +0 -46
- package/dist/runtime/app/components/ComponentRouter.vue +0 -26
- package/dist/runtime/app/components/ComponentRouter.vue.d.ts +0 -46
- package/dist/runtime/app/components/ComponentShell.d.vue.ts +0 -23
- package/dist/runtime/app/components/ComponentShell.vue +0 -97
- package/dist/runtime/app/components/ComponentShell.vue.d.ts +0 -23
- package/dist/runtime/app/components/ConfirmDialog.d.vue.ts +0 -33
- package/dist/runtime/app/components/ConfirmDialog.vue +0 -120
- package/dist/runtime/app/components/ConfirmDialog.vue.d.ts +0 -33
- package/dist/runtime/app/composables/useComponentRouter.d.ts +0 -46
- package/dist/runtime/app/composables/useComponentRouter.js +0 -248
- package/dist/runtime/app/pages/flows/[name].vue +0 -750
- package/dist/runtime/app/pages/flows/index.d.vue.ts +0 -3
- package/dist/runtime/app/pages/flows/index.vue +0 -381
- package/dist/runtime/app/pages/flows/index.vue.d.ts +0 -3
- package/dist/runtime/app/pages/queues/index.d.vue.ts +0 -3
- package/dist/runtime/app/pages/queues/index.vue +0 -236
- package/dist/runtime/app/pages/queues/index.vue.d.ts +0 -3
- package/dist/runtime/app/pages/queues/job.d.vue.ts +0 -3
- package/dist/runtime/app/pages/queues/job.vue +0 -261
- package/dist/runtime/app/pages/queues/job.vue.d.ts +0 -3
- package/dist/runtime/app/pages/queues/jobs.d.vue.ts +0 -3
- package/dist/runtime/app/pages/queues/jobs.vue +0 -595
- package/dist/runtime/app/pages/queues/jobs.vue.d.ts +0 -3
- package/dist/runtime/app/pages/settings/scheduler.d.vue.ts +0 -3
- package/dist/runtime/app/pages/settings/scheduler.vue +0 -310
- package/dist/runtime/app/pages/settings/scheduler.vue.d.ts +0 -3
- package/dist/runtime/app/pages/triggers/[name]/edit.d.vue.ts +0 -3
- package/dist/runtime/app/pages/triggers/[name]/edit.vue +0 -429
- package/dist/runtime/app/pages/triggers/[name]/edit.vue.d.ts +0 -3
- package/dist/runtime/app/pages/triggers/[name].d.vue.ts +0 -3
- package/dist/runtime/app/pages/triggers/[name].vue +0 -870
- package/dist/runtime/app/pages/triggers/[name].vue.d.ts +0 -3
- package/dist/runtime/app/pages/triggers/index.d.vue.ts +0 -3
- package/dist/runtime/app/pages/triggers/index.vue +0 -525
- package/dist/runtime/app/pages/triggers/index.vue.d.ts +0 -3
- package/dist/runtime/app/pages/triggers/new.d.vue.ts +0 -3
- package/dist/runtime/app/pages/triggers/new.vue +0 -610
- package/dist/runtime/app/pages/triggers/new.vue.d.ts +0 -3
- package/dist/runtime/server/api/_flows/[name]/clear-history.delete.d.ts +0 -10
- package/dist/runtime/server/api/_flows/[name]/clear-history.delete.js +0 -49
- package/dist/runtime/server/api/_flows/[name]/runs/[runId]/cancel.post.d.ts +0 -2
- package/dist/runtime/server/api/_flows/[name]/runs/[runId]/cancel.post.js +0 -21
- package/dist/runtime/server/api/_flows/[name]/runs/[runId]/restart.post.d.ts +0 -2
- package/dist/runtime/server/api/_flows/[name]/runs/[runId]/restart.post.js +0 -21
- package/dist/runtime/server/api/_flows/[name]/runs.get.d.ts +0 -17
- package/dist/runtime/server/api/_flows/[name]/runs.get.js +0 -64
- package/dist/runtime/server/api/_flows/[name]/start.post.d.ts +0 -2
- package/dist/runtime/server/api/_flows/[name]/start.post.js +0 -9
- package/dist/runtime/server/api/_flows/index.get.d.ts +0 -7
- package/dist/runtime/server/api/_flows/index.get.js +0 -5
- package/dist/runtime/server/api/_flows/recent-runs.get.d.ts +0 -15
- package/dist/runtime/server/api/_flows/recent-runs.get.js +0 -67
- package/dist/runtime/server/api/_flows/ws.d.ts +0 -80
- package/dist/runtime/server/api/_flows/ws.js +0 -309
- package/dist/runtime/server/api/_queues/[name]/job/[id].get.d.ts +0 -2
- package/dist/runtime/server/api/_queues/[name]/job/[id].get.js +0 -14
- package/dist/runtime/server/api/_queues/[name]/job/index.get.d.ts +0 -2
- package/dist/runtime/server/api/_queues/[name]/job/index.get.js +0 -39
- package/dist/runtime/server/api/_queues/index.get.d.ts +0 -2
- package/dist/runtime/server/api/_queues/index.get.js +0 -106
- package/dist/runtime/server/api/_queues/ws.d.ts +0 -48
- package/dist/runtime/server/api/_queues/ws.js +0 -215
- package/dist/runtime/server/api/_scheduler/jobs.get.d.ts +0 -19
- package/dist/runtime/server/api/_scheduler/jobs.get.js +0 -36
- package/dist/runtime/server/api/_triggers/[name]/events.get.d.ts +0 -6
- package/dist/runtime/server/api/_triggers/[name]/events.get.js +0 -43
- package/dist/runtime/server/api/_triggers/[name]/index.get.d.ts +0 -6
- package/dist/runtime/server/api/_triggers/[name]/index.get.js +0 -76
- package/dist/runtime/server/api/_triggers/[name].delete.d.ts +0 -7
- package/dist/runtime/server/api/_triggers/[name].delete.js +0 -37
- package/dist/runtime/server/api/_triggers/[name].patch.d.ts +0 -7
- package/dist/runtime/server/api/_triggers/[name].patch.js +0 -117
- package/dist/runtime/server/api/_triggers/index.get.d.ts +0 -6
- package/dist/runtime/server/api/_triggers/index.get.js +0 -44
- package/dist/runtime/server/api/_triggers/index.post.d.ts +0 -7
- package/dist/runtime/server/api/_triggers/index.post.js +0 -124
- package/dist/runtime/server/api/_triggers/stats.get.d.ts +0 -6
- package/dist/runtime/server/api/_triggers/stats.get.js +0 -41
- package/dist/runtime/server/api/_triggers/ws.d.ts +0 -74
- package/dist/runtime/server/api/_triggers/ws.js +0 -315
- /package/dist/runtime/app/pages/{flows/[name].d.vue.ts → workers.d.vue.ts} +0 -0
- /package/dist/runtime/app/pages/{flows/[name].vue.d.ts → workers.vue.d.ts} +0 -0
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="h-full flex flex-col overflow-hidden">
|
|
3
|
-
<!-- Header -->
|
|
4
|
-
<div class="border-b border-gray-200 dark:border-gray-800 px-6 py-3 shrink-0">
|
|
5
|
-
<div class="flex items-center justify-between">
|
|
6
|
-
<div class="flex items-center gap-4">
|
|
7
|
-
<h1 class="text-lg font-semibold">
|
|
8
|
-
Scheduler
|
|
9
|
-
</h1>
|
|
10
|
-
</div>
|
|
11
|
-
</div>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<!-- Main Content -->
|
|
15
|
-
<div class="flex-1 min-h-0 overflow-y-auto">
|
|
16
|
-
<div class="max-w-7xl mx-auto p-6">
|
|
17
|
-
<!-- Stats Overview -->
|
|
18
|
-
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
|
|
19
|
-
<StatCard
|
|
20
|
-
icon="i-lucide-briefcase"
|
|
21
|
-
:count="stats.total"
|
|
22
|
-
label="Total Jobs"
|
|
23
|
-
variant="blue"
|
|
24
|
-
/>
|
|
25
|
-
<StatCard
|
|
26
|
-
icon="i-lucide-play-circle"
|
|
27
|
-
:count="stats.active"
|
|
28
|
-
label="Active Jobs"
|
|
29
|
-
variant="emerald"
|
|
30
|
-
/>
|
|
31
|
-
<StatCard
|
|
32
|
-
icon="i-lucide-timer"
|
|
33
|
-
:count="lastRunText"
|
|
34
|
-
label="Last Run"
|
|
35
|
-
variant="purple"
|
|
36
|
-
/>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<!-- Jobs List -->
|
|
40
|
-
<UCard>
|
|
41
|
-
<template #header>
|
|
42
|
-
<div class="flex items-center justify-between">
|
|
43
|
-
<div class="flex items-center gap-3">
|
|
44
|
-
<UIcon
|
|
45
|
-
name="i-lucide-list"
|
|
46
|
-
class="text-gray-500"
|
|
47
|
-
/>
|
|
48
|
-
<h3 class="text-lg font-semibold">
|
|
49
|
-
Scheduled Jobs
|
|
50
|
-
</h3>
|
|
51
|
-
</div>
|
|
52
|
-
<UButton
|
|
53
|
-
icon="i-lucide-refresh-cw"
|
|
54
|
-
size="sm"
|
|
55
|
-
color="gray"
|
|
56
|
-
variant="ghost"
|
|
57
|
-
:loading="loading"
|
|
58
|
-
@click="loadJobs"
|
|
59
|
-
>
|
|
60
|
-
Refresh
|
|
61
|
-
</UButton>
|
|
62
|
-
</div>
|
|
63
|
-
</template>
|
|
64
|
-
|
|
65
|
-
<div
|
|
66
|
-
v-if="loading && jobs.length === 0"
|
|
67
|
-
class="text-center py-8"
|
|
68
|
-
>
|
|
69
|
-
<UIcon
|
|
70
|
-
name="i-lucide-loader-2"
|
|
71
|
-
class="w-8 h-8 animate-spin text-gray-400 mx-auto mb-2"
|
|
72
|
-
/>
|
|
73
|
-
<p class="text-gray-600 dark:text-gray-400">
|
|
74
|
-
Loading jobs...
|
|
75
|
-
</p>
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
<div
|
|
79
|
-
v-else-if="jobs.length === 0"
|
|
80
|
-
class="text-center py-8"
|
|
81
|
-
>
|
|
82
|
-
<UIcon
|
|
83
|
-
name="i-lucide-inbox"
|
|
84
|
-
class="w-12 h-12 text-gray-400 mx-auto mb-2"
|
|
85
|
-
/>
|
|
86
|
-
<p class="text-gray-600 dark:text-gray-400">
|
|
87
|
-
No scheduled jobs found
|
|
88
|
-
</p>
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
<div
|
|
92
|
-
v-else
|
|
93
|
-
class="space-y-2"
|
|
94
|
-
>
|
|
95
|
-
<div
|
|
96
|
-
v-for="job in jobs"
|
|
97
|
-
:key="job.id"
|
|
98
|
-
class="p-4 rounded-lg border border-gray-200 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"
|
|
99
|
-
>
|
|
100
|
-
<div class="flex items-start justify-between">
|
|
101
|
-
<div class="flex-1">
|
|
102
|
-
<div class="flex items-center gap-3 mb-2">
|
|
103
|
-
<UBadge
|
|
104
|
-
:color="getJobTypeColor(job.type)"
|
|
105
|
-
variant="subtle"
|
|
106
|
-
size="xs"
|
|
107
|
-
>
|
|
108
|
-
{{ job.type }}
|
|
109
|
-
</UBadge>
|
|
110
|
-
<UBadge
|
|
111
|
-
v-if="isJobActive(job)"
|
|
112
|
-
color="emerald"
|
|
113
|
-
variant="subtle"
|
|
114
|
-
size="xs"
|
|
115
|
-
>
|
|
116
|
-
<div class="flex items-center gap-1">
|
|
117
|
-
<div class="w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse" />
|
|
118
|
-
<span>Active</span>
|
|
119
|
-
</div>
|
|
120
|
-
</UBadge>
|
|
121
|
-
<UBadge
|
|
122
|
-
v-else-if="job.enabled === false"
|
|
123
|
-
color="gray"
|
|
124
|
-
variant="subtle"
|
|
125
|
-
size="xs"
|
|
126
|
-
>
|
|
127
|
-
Disabled
|
|
128
|
-
</UBadge>
|
|
129
|
-
<h4 class="font-semibold text-gray-900 dark:text-white">
|
|
130
|
-
{{ job.name || job.id }}
|
|
131
|
-
</h4>
|
|
132
|
-
</div>
|
|
133
|
-
|
|
134
|
-
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-sm">
|
|
135
|
-
<div>
|
|
136
|
-
<span class="text-gray-500 dark:text-gray-400">ID:</span>
|
|
137
|
-
<span class="ml-1 font-mono text-xs text-gray-700 dark:text-gray-300">
|
|
138
|
-
{{ job.id }}
|
|
139
|
-
</span>
|
|
140
|
-
</div>
|
|
141
|
-
|
|
142
|
-
<div v-if="job.interval">
|
|
143
|
-
<span class="text-gray-500 dark:text-gray-400">Interval:</span>
|
|
144
|
-
<span class="ml-1 font-medium text-gray-700 dark:text-gray-300">
|
|
145
|
-
{{ formatInterval(job.interval) }}
|
|
146
|
-
</span>
|
|
147
|
-
</div>
|
|
148
|
-
|
|
149
|
-
<div v-if="job.cron">
|
|
150
|
-
<span class="text-gray-500 dark:text-gray-400">Cron:</span>
|
|
151
|
-
<span class="ml-1 font-mono text-xs text-gray-700 dark:text-gray-300">
|
|
152
|
-
{{ job.cron }}
|
|
153
|
-
</span>
|
|
154
|
-
</div>
|
|
155
|
-
|
|
156
|
-
<div v-if="job.executeAt">
|
|
157
|
-
<span class="text-gray-500 dark:text-gray-400">Execute At:</span>
|
|
158
|
-
<span class="ml-1 text-gray-700 dark:text-gray-300">
|
|
159
|
-
{{ formatDate(job.executeAt) }}
|
|
160
|
-
</span>
|
|
161
|
-
</div>
|
|
162
|
-
|
|
163
|
-
<div v-if="job.lastRun">
|
|
164
|
-
<span class="text-gray-500 dark:text-gray-400">Last Run:</span>
|
|
165
|
-
<span
|
|
166
|
-
class="ml-1 text-gray-700 dark:text-gray-300"
|
|
167
|
-
:title="formatDate(job.lastRun)"
|
|
168
|
-
>
|
|
169
|
-
{{ formatRelativeTime(job.lastRun) }}
|
|
170
|
-
</span>
|
|
171
|
-
</div>
|
|
172
|
-
|
|
173
|
-
<div v-if="job.nextRun">
|
|
174
|
-
<span class="text-gray-500 dark:text-gray-400">Next Run:</span>
|
|
175
|
-
<span
|
|
176
|
-
class="ml-1 text-gray-700 dark:text-gray-300"
|
|
177
|
-
:class="{ 'text-emerald-600 dark:text-emerald-400 font-medium': isJobDueSoon(job) }"
|
|
178
|
-
:title="formatDate(job.nextRun)"
|
|
179
|
-
>
|
|
180
|
-
{{ formatRelativeTime(job.nextRun, true) }}
|
|
181
|
-
</span>
|
|
182
|
-
</div>
|
|
183
|
-
|
|
184
|
-
<div v-if="job.runCount !== void 0">
|
|
185
|
-
<span class="text-gray-500 dark:text-gray-400">Executions:</span>
|
|
186
|
-
<span class="ml-1 text-gray-700 dark:text-gray-300">
|
|
187
|
-
{{ job.runCount }}
|
|
188
|
-
</span>
|
|
189
|
-
</div>
|
|
190
|
-
|
|
191
|
-
<div v-if="job.failCount">
|
|
192
|
-
<span class="text-gray-500 dark:text-gray-400">Failures:</span>
|
|
193
|
-
<span class="ml-1 text-red-600 dark:text-red-400 font-medium">
|
|
194
|
-
{{ job.failCount }}
|
|
195
|
-
</span>
|
|
196
|
-
</div>
|
|
197
|
-
</div>
|
|
198
|
-
|
|
199
|
-
<div
|
|
200
|
-
v-if="job.metadata"
|
|
201
|
-
class="mt-3 pt-3 border-t border-gray-200 dark:border-gray-800"
|
|
202
|
-
>
|
|
203
|
-
<details class="text-xs">
|
|
204
|
-
<summary class="cursor-pointer text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">
|
|
205
|
-
Metadata
|
|
206
|
-
</summary>
|
|
207
|
-
<pre class="mt-2 p-2 bg-gray-100 dark:bg-gray-900 rounded text-xs overflow-auto">{{ JSON.stringify(job.metadata, null, 2) }}</pre>
|
|
208
|
-
</details>
|
|
209
|
-
</div>
|
|
210
|
-
</div>
|
|
211
|
-
</div>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
</UCard>
|
|
215
|
-
</div>
|
|
216
|
-
</div>
|
|
217
|
-
</div>
|
|
218
|
-
</template>
|
|
219
|
-
|
|
220
|
-
<script setup>
|
|
221
|
-
import { ref, computed, onMounted, onUnmounted } from "#imports";
|
|
222
|
-
import StatCard from "../../components/StatCard.vue";
|
|
223
|
-
const jobs = ref([]);
|
|
224
|
-
const stats = ref({
|
|
225
|
-
total: 0,
|
|
226
|
-
active: 0
|
|
227
|
-
});
|
|
228
|
-
const loading = ref(false);
|
|
229
|
-
const lastRunText = computed(() => {
|
|
230
|
-
if (!stats.value.lastRun) return "Never";
|
|
231
|
-
return formatRelativeTime(stats.value.lastRun);
|
|
232
|
-
});
|
|
233
|
-
async function loadJobs() {
|
|
234
|
-
loading.value = true;
|
|
235
|
-
try {
|
|
236
|
-
const response = await $fetch("/api/_scheduler/jobs");
|
|
237
|
-
jobs.value = response.jobs || [];
|
|
238
|
-
stats.value = response.stats || { total: 0, active: 0 };
|
|
239
|
-
} catch (error) {
|
|
240
|
-
console.error("Failed to load scheduler jobs:", error);
|
|
241
|
-
} finally {
|
|
242
|
-
loading.value = false;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
function getJobTypeColor(type) {
|
|
246
|
-
switch (type) {
|
|
247
|
-
case "interval":
|
|
248
|
-
return "blue";
|
|
249
|
-
case "cron":
|
|
250
|
-
return "purple";
|
|
251
|
-
case "one-time":
|
|
252
|
-
return "green";
|
|
253
|
-
default:
|
|
254
|
-
return "gray";
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
function formatInterval(ms) {
|
|
258
|
-
const seconds = Math.floor(ms / 1e3);
|
|
259
|
-
const minutes = Math.floor(seconds / 60);
|
|
260
|
-
const hours = Math.floor(minutes / 60);
|
|
261
|
-
const days = Math.floor(hours / 24);
|
|
262
|
-
if (days > 0) return `${days}d`;
|
|
263
|
-
if (hours > 0) return `${hours}h`;
|
|
264
|
-
if (minutes > 0) return `${minutes}m`;
|
|
265
|
-
return `${seconds}s`;
|
|
266
|
-
}
|
|
267
|
-
function formatDate(timestamp) {
|
|
268
|
-
return new Date(timestamp).toLocaleString();
|
|
269
|
-
}
|
|
270
|
-
function formatRelativeTime(timestamp, future = false) {
|
|
271
|
-
const now = Date.now();
|
|
272
|
-
const diff = future ? timestamp - now : now - timestamp;
|
|
273
|
-
const seconds = Math.floor(Math.abs(diff) / 1e3);
|
|
274
|
-
const minutes = Math.floor(seconds / 60);
|
|
275
|
-
const hours = Math.floor(minutes / 60);
|
|
276
|
-
const days = Math.floor(hours / 24);
|
|
277
|
-
if (future) {
|
|
278
|
-
if (diff < 0) return "Overdue";
|
|
279
|
-
if (seconds < 60) return "Now";
|
|
280
|
-
if (minutes < 60) return `in ${minutes}m`;
|
|
281
|
-
if (hours < 24) return `in ${hours}h`;
|
|
282
|
-
return `in ${days}d`;
|
|
283
|
-
}
|
|
284
|
-
if (seconds < 60) return "Just now";
|
|
285
|
-
if (minutes < 60) return `${minutes}m ago`;
|
|
286
|
-
if (hours < 24) return `${hours}h ago`;
|
|
287
|
-
return `${days}d ago`;
|
|
288
|
-
}
|
|
289
|
-
function isJobActive(job) {
|
|
290
|
-
if (job.enabled === false) return false;
|
|
291
|
-
if (job.type === "one-time") {
|
|
292
|
-
return job.executeAt ? job.executeAt > Date.now() : false;
|
|
293
|
-
}
|
|
294
|
-
return true;
|
|
295
|
-
}
|
|
296
|
-
function isJobDueSoon(job) {
|
|
297
|
-
if (!job.nextRun) return false;
|
|
298
|
-
const diff = job.nextRun - Date.now();
|
|
299
|
-
return diff > 0 && diff < 5 * 60 * 1e3;
|
|
300
|
-
}
|
|
301
|
-
onMounted(() => {
|
|
302
|
-
loadJobs();
|
|
303
|
-
});
|
|
304
|
-
const refreshInterval = setInterval(() => {
|
|
305
|
-
loadJobs();
|
|
306
|
-
}, 3e4);
|
|
307
|
-
onUnmounted(() => {
|
|
308
|
-
clearInterval(refreshInterval);
|
|
309
|
-
});
|
|
310
|
-
</script>
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
-
declare const _default: typeof __VLS_export;
|
|
3
|
-
export default _default;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
-
declare const _default: typeof __VLS_export;
|
|
3
|
-
export default _default;
|