diff --git a/messages/en.json b/messages/en.json
index 1a828873..3d95de2e 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -792,5 +792,7 @@
"license_adjust_nodes_fifo_hint": "FIFO mode: nodes are authorized in the order they joined the cluster.",
"license_adjust_nodes_readonly": "This license has expired or is invalid. Node adjustments are not allowed.",
"license_adjust_nodes_last_accepted": "Last accepted: ",
+ "alerting": "Alerting",
+ "alerting_description": "Email platform alerts through an SMTP server.",
"containers_without_limit": "{uncapped} of {containers} containers declare no limit"
}
diff --git a/messages/zh-hant.json b/messages/zh-hant.json
index 905e468a..126de47c 100644
--- a/messages/zh-hant.json
+++ b/messages/zh-hant.json
@@ -792,5 +792,7 @@
"license_adjust_nodes_fifo_hint": "FIFO 模式:節點依加入叢集的順序自動授權。",
"license_adjust_nodes_readonly": "此授權已過期或無效,無法調整節點設定。",
"license_adjust_nodes_last_accepted": "上次接受:",
+ "alerting": "告警",
+ "alerting_description": "透過 SMTP 郵件伺服器寄送平台告警。",
"containers_without_limit": "{containers} 個容器中有 {uncapped} 個未宣告 Limit"
}
diff --git a/package.json b/package.json
index 991f776c..02178439 100644
--- a/package.json
+++ b/package.json
@@ -139,7 +139,10 @@
"brace-expansion@<5.0.12": "5.0.12",
"marked": "^18.0.7",
"devalue@<5.9.3": "5.9.3",
- "postcss@<8.5.28": "8.5.28"
+ "postcss@<8.5.28": "8.5.28",
+ "source-map-js@<1.2.2": "1.2.2",
+ "postcss-selector-parser@<7.1.6": "7.1.6",
+ "vite-plugin-static-copy>chokidar": "^4.0.3"
},
"onlyBuiltDependencies": [
"esbuild",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 91f5fbb5..66115e0a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,6 +18,9 @@ overrides:
marked: ^18.0.7
devalue@<5.9.3: 5.9.3
postcss@<8.5.28: 8.5.28
+ source-map-js@<1.2.2: 1.2.2
+ postcss-selector-parser@<7.1.6: 7.1.6
+ vite-plugin-static-copy>chokidar: ^4.0.3
importers:
@@ -1503,10 +1506,6 @@ packages:
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
arctic@3.7.0:
resolution: {integrity: sha512-ZMQ+f6VazDgUJOd+qNV+H7GohNSYal1mVjm5kEaZfE2Ifb7Ss70w+Q7xpJC87qZDkMZIXYf0pTIYZA0OPasSbw==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
@@ -1545,10 +1544,6 @@ packages:
bidi-js@1.0.3:
resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
- binary-extensions@2.3.0:
- resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
- engines: {node: '>=8'}
-
bits-ui@2.18.1:
resolution: {integrity: sha512-KkemzKFH4T3gt3H+P86JcnAWExjByv/6vlwjm/BoCwTPHu03yiCdxbghdJLvFReQTe0acCAiRcKfmixxD6XvlA==}
engines: {node: '>=20'}
@@ -1560,10 +1555,6 @@ packages:
resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==}
engines: {node: 20 || >=22}
- braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
- engines: {node: '>=8'}
-
call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
@@ -1584,10 +1575,6 @@ packages:
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
- chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
-
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
@@ -2036,10 +2023,6 @@ packages:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
- fill-range@7.1.1:
- resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
- engines: {node: '>=8'}
-
find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
@@ -2085,10 +2068,6 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
- glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
-
glob-parent@6.0.2:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
@@ -2181,10 +2160,6 @@ packages:
resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==}
engines: {node: '>=12.22.0'}
- is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
-
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
@@ -2200,10 +2175,6 @@ packages:
is-module@1.0.0:
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
- is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
@@ -2606,10 +2577,6 @@ packages:
resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
hasBin: true
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
obug@2.1.1:
resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
@@ -2660,10 +2627,6 @@ packages:
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@2.3.2:
- resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
- engines: {node: '>=8.6'}
-
picomatch@4.0.4:
resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
@@ -2710,8 +2673,8 @@ packages:
peerDependencies:
postcss: 8.5.28
- postcss-selector-parser@7.1.4:
- resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==}
+ postcss-selector-parser@7.1.6:
+ resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==}
engines: {node: '>=4'}
postcss@8.5.28:
@@ -2817,10 +2780,6 @@ packages:
resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==}
engines: {node: '>=0.12'}
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
-
readdirp@4.1.2:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
@@ -2960,8 +2919,8 @@ packages:
resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
engines: {node: '>=18'}
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ source-map-js@1.2.2:
+ resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==}
engines: {node: '>=0.10.0'}
space-separated-tokens@2.0.2:
@@ -3104,10 +3063,6 @@ packages:
resolution: {integrity: sha512-JIXCerhudr/N6OWLwLF1HVsTTUo7ry6qHa5eWZEkiMuxsIiAACL55tGLfqfHfoH7QaMQUW8fngD7u7TxWexYQg==}
hasBin: true
- to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
-
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
@@ -4056,7 +4011,7 @@ snapshots:
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
tailwindcss: 4.3.3
'@tailwindcss/oxide-android-arm64@4.3.3':
@@ -4446,11 +4401,6 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.2
-
arctic@3.7.0:
dependencies:
'@oslojs/crypto': 1.0.1
@@ -4487,8 +4437,6 @@ snapshots:
dependencies:
require-from-string: 2.0.2
- binary-extensions@2.3.0: {}
-
bits-ui@2.18.1(@internationalized/date@3.12.2)(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.4(@typescript-eslint/types@8.62.0))(vite@7.3.5(@types/node@24.13.4)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.62.0))(typescript@5.9.3)(vite@7.3.5(@types/node@24.13.4)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.62.0)):
dependencies:
'@floating-ui/core': 1.7.5
@@ -4506,10 +4454,6 @@ snapshots:
dependencies:
balanced-match: 4.0.4
- braces@3.0.3:
- dependencies:
- fill-range: 7.1.1
-
call-bind-apply-helpers@1.0.2:
dependencies:
es-errors: 1.3.0
@@ -4525,18 +4469,6 @@ snapshots:
character-entities@2.0.2: {}
- chokidar@3.6.0:
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
-
chokidar@4.0.3:
dependencies:
readdirp: 4.1.2
@@ -4581,7 +4513,7 @@ snapshots:
css-tree@3.2.1:
dependencies:
mdn-data: 2.27.1
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
cssesc@3.0.0: {}
@@ -4978,10 +4910,6 @@ snapshots:
dependencies:
flat-cache: 4.0.1
- fill-range@7.1.1:
- dependencies:
- to-regex-range: 5.0.1
-
find-up@5.0.0:
dependencies:
locate-path: 6.0.0
@@ -5030,10 +4958,6 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
- glob-parent@5.1.2:
- dependencies:
- is-glob: 4.0.3
-
glob-parent@6.0.2:
dependencies:
is-glob: 4.0.3
@@ -5132,10 +5056,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- is-binary-path@2.1.0:
- dependencies:
- binary-extensions: 2.3.0
-
is-core-module@2.16.1:
dependencies:
hasown: 2.0.4
@@ -5148,8 +5068,6 @@ snapshots:
is-module@1.0.0: {}
- is-number@7.0.0: {}
-
is-plain-obj@4.1.0: {}
is-potential-custom-element-name@1.0.1: {}
@@ -5731,8 +5649,6 @@ snapshots:
railroad-diagrams: 1.0.0
randexp: 0.4.6
- normalize-path@3.0.0: {}
-
obug@2.1.1: {}
oniguruma-parser@0.12.2: {}
@@ -5782,8 +5698,6 @@ snapshots:
picocolors@1.1.1: {}
- picomatch@2.3.2: {}
-
picomatch@4.0.4: {}
playwright-core@1.61.1: {}
@@ -5813,7 +5727,7 @@ snapshots:
dependencies:
postcss: 8.5.28
- postcss-selector-parser@7.1.4:
+ postcss-selector-parser@7.1.6:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
@@ -5822,7 +5736,7 @@ snapshots:
dependencies:
nanoid: 3.3.19
picocolors: 1.1.1
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
prelude-ls@1.2.1: {}
@@ -5863,10 +5777,6 @@ snapshots:
discontinuous-range: 1.0.0
ret: 0.1.15
- readdirp@3.6.0:
- dependencies:
- picomatch: 2.3.2
-
readdirp@4.1.2: {}
redis-errors@1.2.0: {}
@@ -6050,7 +5960,7 @@ snapshots:
mrmime: 2.0.1
totalist: 3.0.1
- source-map-js@1.2.1: {}
+ source-map-js@1.2.2: {}
space-separated-tokens@2.0.2: {}
@@ -6098,7 +6008,7 @@ snapshots:
espree: 10.4.0
postcss: 8.5.28
postcss-scss: 4.0.9(postcss@8.5.28)
- postcss-selector-parser: 7.1.4
+ postcss-selector-parser: 7.1.6
semver: 7.8.5
optionalDependencies:
svelte: 5.56.4(@typescript-eslint/types@8.62.0)
@@ -6209,10 +6119,6 @@ snapshots:
dependencies:
tldts-core: 7.0.29
- to-regex-range@5.0.1:
- dependencies:
- is-number: 7.0.0
-
totalist@3.0.1: {}
tough-cookie@6.0.1:
@@ -6354,7 +6260,7 @@ snapshots:
vite-plugin-static-copy@3.4.0(vite@7.3.5(@types/node@24.13.4)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)):
dependencies:
- chokidar: 3.6.0
+ chokidar: 4.0.3
p-map: 7.0.4
picocolors: 1.1.1
tinyglobby: 0.2.16
diff --git a/src/lib/components/alerting/alerting-settings.svelte b/src/lib/components/alerting/alerting-settings.svelte
new file mode 100644
index 00000000..091993dc
--- /dev/null
+++ b/src/lib/components/alerting/alerting-settings.svelte
@@ -0,0 +1,18 @@
+
diff --git a/src/lib/components/dynamic-form/form.svelte b/src/lib/components/dynamic-form/form.svelte
index a15e3d33..dcd6473f 100644
--- a/src/lib/components/dynamic-form/form.svelte
+++ b/src/lib/components/dynamic-form/form.svelte
@@ -112,12 +112,11 @@
objectTemplate: ObjectTemplate
});
- let validationResult: ValidationResult | null = $state(null);
function validator(options: ValidatorFactoryOptions) {
const validator = defaults.validator(options);
return {
...validator,
- validateFormValue(schema: Schema, formValue: FormValue) {
+ validateFormValue(schema: Schema, formValue: FormValue): ValidationResult {
let value = {} as FormValue;
switch (mode) {
case 'yaml':
@@ -127,18 +126,7 @@
value = formValue;
break;
}
- const transferredValue = transfer(value);
- validationResult = validator.validateFormValue(schema, transferredValue);
- if (validationResult && validationResult.errors && validationResult.errors.length > 0) {
- validationResult.errors.forEach((error) => {
- toast.error(error.message, {
- description: `[${error.path.join('.')}]`,
- duration: Number.POSITIVE_INFINITY,
- closeButton: true
- });
- });
- }
- return validationResult;
+ return validator.validateFormValue(schema, transfer(value));
}
} satisfies FormValueValidator;
}
diff --git a/src/lib/components/kind-viewer/kind-viewer-columns/virtualmachine.ts b/src/lib/components/kind-viewer/kind-viewer-columns/virtualmachine.ts
index eb3fa2be..ac1c3876 100644
--- a/src/lib/components/kind-viewer/kind-viewer-columns/virtualmachine.ts
+++ b/src/lib/components/kind-viewer/kind-viewer-columns/virtualmachine.ts
@@ -23,7 +23,6 @@ type VirtualMachineAttribute =
| 'Namespace'
| 'Status'
| 'Ready'
- | 'Running'
| 'Instance Type'
| 'Age'
| 'Volumes'
@@ -36,7 +35,6 @@ function getVirtualMachineDataSchemas(): Record {
+ void args;
+ return null;
+}
+
+export async function saveAlerting(...args: any[]): Promise {
+ void args;
+ return {};
+}
+
+export async function disableAlerting(...args: any[]): Promise {
+ void args;
+}
+
+export async function sendTestEmail(...args: any[]): Promise {
+ void args;
+}
diff --git a/src/routes/(auth)/[cluster]/[workspace]/alerting/+page.svelte b/src/routes/(auth)/[cluster]/[workspace]/alerting/+page.svelte
new file mode 100644
index 00000000..e69de29b
diff --git a/vite.config.ts b/vite.config.ts
index 61ead973..feeaf1c4 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -48,7 +48,7 @@ export default defineConfig({
test: {
name: 'server',
environment: 'node',
- include: ['src/**/*.{test,spec}.{js,ts}'],
+ include: ['src/**/*.{test,spec}.{js,ts}', 'ee/src/**/*.{test,spec}.{js,ts}'],
exclude: ['src/**/*.svelte.{test,spec}.{js,ts}']
}
}