feat(UI): terminate instance confirmation (#199)

This commit is contained in:
Julian Sommer
2026-05-07 09:21:33 +10:00
committed by GitHub
parent a8591380cb
commit 5e70ebd63f
15 changed files with 377 additions and 255 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{n as e,t}from"./compiler-runtime.js";import{a as n,i as r,l as i,n as a,o,r as s,s as c,t as l}from"./alert-dialog.js";var u=t(),d=e();function f(e){let t=(0,u.c)(19),{open:f,onOpenChange:p,title:m,description:h,isPending:g,onConfirm:_}=e,v;t[0]===m?v=t[1]:(v=(0,d.jsx)(i,{children:m}),t[0]=m,t[1]=v);let y;t[2]===h?y=t[3]:(y=(0,d.jsx)(n,{children:h}),t[2]=h,t[3]=y);let b;t[4]!==v||t[5]!==y?(b=(0,d.jsxs)(c,{children:[v,y]}),t[4]=v,t[5]=y,t[6]=b):b=t[6];let x;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(x=(0,d.jsx)(s,{children:`Cancel`}),t[7]=x):x=t[7];let S=g?`Deleting…`:`Delete`,C;t[8]!==g||t[9]!==_||t[10]!==S?(C=(0,d.jsxs)(o,{children:[x,(0,d.jsx)(a,{disabled:g,onClick:_,children:S})]}),t[8]=g,t[9]=_,t[10]=S,t[11]=C):C=t[11];let w;t[12]!==b||t[13]!==C?(w=(0,d.jsxs)(r,{children:[b,C]}),t[12]=b,t[13]=C,t[14]=w):w=t[14];let T;return t[15]!==p||t[16]!==f||t[17]!==w?(T=(0,d.jsx)(l,{onOpenChange:p,open:f,children:w}),t[15]=p,t[16]=f,t[17]=w,t[18]=T):T=t[18],T}export{f as t};
import{n as e,t}from"./compiler-runtime.js";import{a as n,i as r,l as i,n as a,o,r as s,s as c,t as l}from"./alert-dialog.js";var u=t(),d=e();function f(e){let t=(0,u.c)(19),{open:f,onOpenChange:p,title:m,description:h,isPending:g,onConfirm:_,confirmLabel:v,pendingLabel:y}=e,b=v===void 0?`Delete`:v,x=y===void 0?`Deleting…`:y,S;t[0]===m?S=t[1]:(S=(0,d.jsx)(i,{children:m}),t[0]=m,t[1]=S);let C;t[2]===h?C=t[3]:(C=(0,d.jsx)(n,{children:h}),t[2]=h,t[3]=C);let w;t[4]!==S||t[5]!==C?(w=(0,d.jsxs)(c,{children:[S,C]}),t[4]=S,t[5]=C,t[6]=w):w=t[6];let T;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(T=(0,d.jsx)(s,{children:`Cancel`}),t[7]=T):T=t[7];let E=g?x:b,D;t[8]!==g||t[9]!==_||t[10]!==E?(D=(0,d.jsxs)(o,{children:[T,(0,d.jsx)(a,{disabled:g,onClick:_,children:E})]}),t[8]=g,t[9]=_,t[10]=E,t[11]=D):D=t[11];let O;t[12]!==w||t[13]!==D?(O=(0,d.jsxs)(r,{children:[w,D]}),t[12]=w,t[13]=D,t[14]=O):O=t[14];let k;return t[15]!==p||t[16]!==f||t[17]!==O?(k=(0,d.jsx)(l,{onOpenChange:p,open:f,children:O}),t[15]=p,t[16]=f,t[17]=O,t[18]=k):k=t[18],k}export{f as t};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -34,7 +34,6 @@ export default defineConfig({
"eslint/no-plusplus": ["error", { allowForLoopAfterthoughts: true }],
"eslint/no-use-before-define": "off",
"eslint/prefer-destructuring": "off",
"eslint/sort-imports": "off",
"eslint/sort-keys": "off",
"eslint/sort-vars": "off",
"import/consistent-type-specifier-style": "off",
@@ -51,7 +50,6 @@ export default defineConfig({
"error",
{ cases: { kebabCase: true, camelCase: true } },
],
"unicorn/number-literal-case": "off",
},
overrides: [
{
@@ -55,11 +55,11 @@
"@vitest/coverage-v8": "^4.1.5",
"babel-plugin-react-compiler": "^1.0.0",
"happy-dom": "^20.9.0",
"oxfmt": "^0.47.0",
"oxlint": "^1.62.0",
"oxfmt": "^0.48.0",
"oxlint": "^1.63.0",
"oxlint-tsgolint": "^0.22.1",
"typescript": "^6.0.3",
"ultracite": "7.6.2",
"ultracite": "7.6.3",
"vite": "^8.0.10",
"vitest": "^4.1.5"
},
+224 -222
View File
@@ -80,10 +80,10 @@ importers:
devDependencies:
'@rolldown/plugin-babel':
specifier: ^0.2.3
version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@tailwindcss/vite':
specifier: ^4.2.4
version: 4.2.4(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 4.2.4(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@tanstack/eslint-plugin-query':
specifier: ^5.100.8
version: 5.100.8(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3)
@@ -92,7 +92,7 @@ importers:
version: 1.161.6(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3)
'@tanstack/router-plugin':
specifier: ^1.167.32
version: 1.167.32(@tanstack/react-router@1.169.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 1.167.32(@tanstack/react-router@1.169.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@testing-library/jest-dom':
specifier: ^6.9.1
version: 6.9.1
@@ -116,10 +116,10 @@ importers:
version: 7.0.0-dev.20260502.1
'@vitejs/plugin-basic-ssl':
specifier: ^2.3.0
version: 2.3.0(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 2.3.0(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@vitejs/plugin-react':
specifier: ^6.0.1
version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@vitest/coverage-v8':
specifier: ^4.1.5
version: 4.1.5(vitest@4.1.5)
@@ -130,11 +130,11 @@ importers:
specifier: ^20.9.0
version: 20.9.0
oxfmt:
specifier: ^0.47.0
version: 0.47.0
specifier: ^0.48.0
version: 0.48.0
oxlint:
specifier: ^1.62.0
version: 1.62.0(oxlint-tsgolint@0.22.1)
specifier: ^1.63.0
version: 1.63.0(oxlint-tsgolint@0.22.1)
oxlint-tsgolint:
specifier: ^0.22.1
version: 0.22.1
@@ -142,14 +142,14 @@ importers:
specifier: ^6.0.3
version: 6.0.3
ultracite:
specifier: 7.6.2
version: 7.6.2(oxfmt@0.47.0)(oxlint@1.62.0(oxlint-tsgolint@0.22.1))
specifier: 7.6.3
version: 7.6.3(oxfmt@0.48.0)(oxlint@1.63.0(oxlint-tsgolint@0.22.1))
vite:
specifier: ^8.0.10
version: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
version: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
vitest:
specifier: ^4.1.5
version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
packages:
@@ -489,11 +489,13 @@ packages:
resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
hasBin: true
'@clack/core@1.2.0':
resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==}
'@clack/core@1.3.0':
resolution: {integrity: sha512-xJPHpAmEQUBrXSLx0gF+q5K/IyihXpsHZcha+jB+tyahsKRK3Dxo4D0coZDewHo12NhiuzC3dTtMPbm53GEAAA==}
engines: {node: '>= 20.12.0'}
'@clack/prompts@1.2.0':
resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==}
'@clack/prompts@1.3.0':
resolution: {integrity: sha512-GgcWwRCs/xPtaqlMy8qRhPnZf9vlWcWZNHAitnVQ3yk7JmSralSiq5q07yaffYE8SogtDm7zFeKccx1QNVARpw==}
engines: {node: '>= 20.12.0'}
'@csstools/color-helpers@6.0.2':
resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==}
@@ -820,124 +822,124 @@ packages:
'@oxc-project/types@0.127.0':
resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==}
'@oxfmt/binding-android-arm-eabi@0.47.0':
resolution: {integrity: sha512-KrMQRdMi/upr81qT4ijK6X6BNp6jqpMY7FwILQnwIy9QLc3qpnhUx5rsCLGzn4ewsCQ0CNAspN2ogmP1GXLyLw==}
'@oxfmt/binding-android-arm-eabi@0.48.0':
resolution: {integrity: sha512-uwqk+/KhQvBIpULD8SMM/zAafMRC/+DV/xsEQjkkIsJ/kLmEI/2bxonVowcYTiXqqZ/a0FEW8DPkZY3VvwELDA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
'@oxfmt/binding-android-arm64@0.47.0':
resolution: {integrity: sha512-r4ixS/PeUpAFKgrpDoZ5pSkthjZzVzKd95525Aazj+aOv9H4ulK5zYHGb7wFY5n5kZxHK8TbOJUZgoEb1ohddQ==}
'@oxfmt/binding-android-arm64@0.48.0':
resolution: {integrity: sha512-VUCiKuXK5+McVssgHEJdrcGK7hRJzrRb36zm9/jwzMholyYt4BgXhw5Nm1V1DX6Ce717Zi/1jk432b/tgmQgtQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
'@oxfmt/binding-darwin-arm64@0.47.0':
resolution: {integrity: sha512-CLWxiKpMl+195cm09CuaWEhJK0CirRkoMa07aR9+9AFPat2LfIKtwx1JqxZM0MTvcMe6+adlJNdVL6jdInvq3g==}
'@oxfmt/binding-darwin-arm64@0.48.0':
resolution: {integrity: sha512-IkKp8rnIyQLW6Jt+6jragCbUVYSayk55lapiprLjIVvt4NczLyO/nwX2GgefLQ5iaBdfS8UEAFgCs/pLO6Cl0w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
'@oxfmt/binding-darwin-x64@0.47.0':
resolution: {integrity: sha512-Xq5fjTYDC50faUeLSm0rZdBqoTgleXEdD7NpJdARtQIczkCJn3xNjMUSQQkUmh4CtxkKTNL68lytcOK3e/osgg==}
'@oxfmt/binding-darwin-x64@0.48.0':
resolution: {integrity: sha512-+aFuhsGIuvnoOjXyKVHMhPKJZR1kQkAl8QyrKoMlA7yJsSTC3N0Asl53La8TChSHhW8epToQ/Q0nvLmEmfNmLg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
'@oxfmt/binding-freebsd-x64@0.47.0':
resolution: {integrity: sha512-QOU9ZIJ52p5askcEC0QJvvr8trHAWoonul8bgISo6gYUL3s50zkqafBYcNAr9LJZQbsZtPfIWHk9+5+nUp1qJQ==}
'@oxfmt/binding-freebsd-x64@0.48.0':
resolution: {integrity: sha512-fbqzQL8FjI9gGnktI7RIo0dksDziTAYBy7xlI7jU7eID5fxLF/25fS4Xj6GydD8Y5oWHL83U4NK160QaOAxtyg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
'@oxfmt/binding-linux-arm-gnueabihf@0.47.0':
resolution: {integrity: sha512-oJxDM1aBhPvz9gmElBv8UpxyiqhwfjcbrSxT5F0xtuUzY6dQI27/AQPIt3eu3Z5Yvn0kQl5R7MA3Z+MbnRvCBw==}
'@oxfmt/binding-linux-arm-gnueabihf@0.48.0':
resolution: {integrity: sha512-hn4i0zhAyTiB3ZHjQfYUZkDvrbVkohw1S7pySWxWUoZ87HnkDoTFThj7QTxk40hNPOTUP0vHbPRNamFIv1HBJQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@oxfmt/binding-linux-arm-musleabihf@0.47.0':
resolution: {integrity: sha512-g8Lh50VS4ibGz2q6v7r9UZY4D0dM16SdrFYOMzhqIoCwGcai8VMIRUAcqn1/jlCsOOzUXJ741+kCeJt0cofakQ==}
'@oxfmt/binding-linux-arm-musleabihf@0.48.0':
resolution: {integrity: sha512-R4WBD9qF3QM9hqgdAa+fBGXmquTvDUujrPQ36t2Sjk8RPOSKGHDeN7l/khr10hqbQaOq9KCgPHG9ubNET/X/RQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@oxfmt/binding-linux-arm64-gnu@0.47.0':
resolution: {integrity: sha512-YrNT1vQ0asaXoRbrvYENPqmBfOQ9Xr8enPNOULeYfg44VjCcrUowFy5QZr+WawE0zyP8cH9e9Gxxg0fDEFzhcg==}
'@oxfmt/binding-linux-arm64-gnu@0.48.0':
resolution: {integrity: sha512-5bVdwSwlm1M8wbYCorLOxWxUBw/8tBvHYyQNIfwWVPwOJaj5vg1APSGJQVpwJfV5VNE9PSrR91UKEpoNwHhqUA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@oxfmt/binding-linux-arm64-musl@0.47.0':
resolution: {integrity: sha512-IxtQC/sbBi4ubbY+MdwdanRWrG9InQJVZqyMsBa5IUaQcnSg86gQme574HxXMC1p4bo4YhV99zQ+wNnGCvEgzw==}
'@oxfmt/binding-linux-arm64-musl@0.48.0':
resolution: {integrity: sha512-vCS3Fk7gFslTqE1lUE2IlroyVV7u/9SmMA/uBqDoshuck2psGWcjW0ePyPZI3rM3+qtf2pDaMVIKMHozraifuw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@oxfmt/binding-linux-ppc64-gnu@0.47.0':
resolution: {integrity: sha512-EWXEhOMbWO0q6eJSbu0QLkU8cKi0ljlYLngeDs2Ocu/pm1rrLwyQiYzlFbdnMRURI4w9ndr1sI9rSbhlJ5o23Q==}
'@oxfmt/binding-linux-ppc64-gnu@0.48.0':
resolution: {integrity: sha512-gKtfFfueUClXDumyoHUbymqRf7prHejOOyzJK0eIJn93GF9JBdFHdo60TM1ZBHxkEwZvjuOgHmKtneKbEOc/Eg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@oxfmt/binding-linux-riscv64-gnu@0.47.0':
resolution: {integrity: sha512-tZrjS11TUiDuEpRaqdk8K9F9xETRyKXfuZKmdeW+Gj7coBnm7+8sBEfyt033EAFEQSlkniAXvBLh+Qja2ioGBQ==}
'@oxfmt/binding-linux-riscv64-gnu@0.48.0':
resolution: {integrity: sha512-SYt0UhOvZD/UwZz9sXq6J2uAw8o24f5VZpLB2DH01f6MevshmlgakQlZe2lwek2sZJkd07eLu7mZa0g7yeiw7Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@oxfmt/binding-linux-riscv64-musl@0.47.0':
resolution: {integrity: sha512-KBFy+2CFKUCZzYwX2ZOPQKck1vjQbz+hextuc19G4r0WRJwadfAeuQMQRQvB+Ivc8brlbOVg7et8K7E467440g==}
'@oxfmt/binding-linux-riscv64-musl@0.48.0':
resolution: {integrity: sha512-JLbrwck2AopG4ud/XklZO5N+qxGC7cS7ROvXZVNfx0MCLDDL2kGOLvzuWORkVjnjAM0CMAfIMU2zNBtQbM+4dw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@oxfmt/binding-linux-s390x-gnu@0.47.0':
resolution: {integrity: sha512-REUPFKVGSiK99B+9eaPhluEVglzaoj/SMykNC5SUiV2RSsBfV5lWN7Y0iCIc251Wz3GaeAGZsJ/zj3gjarxdFg==}
'@oxfmt/binding-linux-s390x-gnu@0.48.0':
resolution: {integrity: sha512-mdxt5L8OQLxkQH+JVpdC/lknZNe0lX4hlO3d8+xvw2wToo+iDrid9tiGOd5bmHfUVd5wVhrUry0qlu5vq66NkQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@oxfmt/binding-linux-x64-gnu@0.47.0':
resolution: {integrity: sha512-KVftVSVEDeIfRW3TIeLe3aNI/iY4m1fu5mDwHcisKMZSCMKLkrhFsjowC7o9RoqNPxbbglm2+/6KAKBIts2t0Q==}
'@oxfmt/binding-linux-x64-gnu@0.48.0':
resolution: {integrity: sha512-oEz1BQwMrV7OMEFx/3VPDU3n9TM0AnxpktDYXjEg5i6nTX87wo18wSfBvkl4tzAICdKtoAQAdBIl7Y7hsPlx5w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@oxfmt/binding-linux-x64-musl@0.47.0':
resolution: {integrity: sha512-DTsmGEaA2860Aq5VUyDO8/MT9NFxwVL93RnRYmpMwK6DsSkThmvEpqoUDDljziEpAedMRG19SCogrNbINSbLUQ==}
'@oxfmt/binding-linux-x64-musl@0.48.0':
resolution: {integrity: sha512-g2SKTTurP5mWjd8Ecait0erYqmltL4IqW1EwttM25BxM6NiTt4ubobJYMR1uox1V2QgG4UfHH10CGRvWlUixjw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@oxfmt/binding-openharmony-arm64@0.47.0':
resolution: {integrity: sha512-8r5BDro7fLOBoq1JXHLVSs55OlrxQhEso4HVo0TcY7OXJUPYfjPoOaYL5us+yIwqyP9rQwN+rxuiNFSmaxSuOQ==}
'@oxfmt/binding-openharmony-arm64@0.48.0':
resolution: {integrity: sha512-CIg24VgheEpvolHL2gQuax5qcQ602bRMHrJ9g8XsQr3iVj9aSPgopigBKuMqrXsupwkrU+RQCn5cG8PgFntR6w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
'@oxfmt/binding-win32-arm64-msvc@0.47.0':
resolution: {integrity: sha512-qtz/gzm8IjSPUlseZ0ofW8zyHLoZsuP5HTfcGGkWkUblB89JT8GNYH3ICqjbDsqsGqXum0/ZndXTFplSdXFIcg==}
'@oxfmt/binding-win32-arm64-msvc@0.48.0':
resolution: {integrity: sha512-zeaWkcxcEULwkGF3I/HgEvcDPN8buYDrxibBUa/IFh5Vmwyge+KpLO+hEwSovW349H0O/C0Z2kaFmEzEDm00/Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
'@oxfmt/binding-win32-ia32-msvc@0.47.0':
resolution: {integrity: sha512-5vIcdcIDE7nCx+MXN6sm8kbC4zajDB31E86rez4i45iHNH/2NjdKlJ720xcHTr3eeiMcttCGPHPhE1TjtBDGZw==}
'@oxfmt/binding-win32-ia32-msvc@0.48.0':
resolution: {integrity: sha512-yiEKnIAGvx5CyZQOlMaNlZkAbwT7/Quk0j3WLt+PR5hK+qYjPTRRJYDfD77wCBPLvEYAG41v4KG3iL0H+uxoxg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
'@oxfmt/binding-win32-x64-msvc@0.47.0':
resolution: {integrity: sha512-Sr59Y5ms54ONBjxFeWhVlGyQcHXxcl9DxC23f6yXlRkcos7LXBLoO+KDfxexjHIOZh7cWqrWduzvUjJ+pHp8cQ==}
'@oxfmt/binding-win32-x64-msvc@0.48.0':
resolution: {integrity: sha512-GSD2+7t2UoVMV2NgxXypa4bKewflPMAjYnF0Xw9/ht82ZfafAHhb8STwrEd7wlH2PFogt5zw3WVCxYJaHUdbeQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -972,124 +974,124 @@ packages:
cpu: [x64]
os: [win32]
'@oxlint/binding-android-arm-eabi@1.62.0':
resolution: {integrity: sha512-pKsthNECyvJh8lPTICz6VcwVy2jOqdhhsp1rlxCkhgZR47aKvXPmaRWQDv+zlXpRae4qm1MaaTnutkaOk5aofg==}
'@oxlint/binding-android-arm-eabi@1.63.0':
resolution: {integrity: sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
'@oxlint/binding-android-arm64@1.62.0':
resolution: {integrity: sha512-b1AUNViByvgmR2xJDubvLIr+dSuu3uraG7bsAoKo+xrpspPvu6RIn6Fhr2JUhobfep3jwUTy18Huco6GkwdvGQ==}
'@oxlint/binding-android-arm64@1.63.0':
resolution: {integrity: sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
'@oxlint/binding-darwin-arm64@1.62.0':
resolution: {integrity: sha512-iG+Tvf70UJ6otfwFYIHk36Sjq9cpPP5YLxkoggANNRtzgi3Tj3g8q6Ybqi6AtkU3+yg9QwF7bDCkCS6bbL4PCg==}
'@oxlint/binding-darwin-arm64@1.63.0':
resolution: {integrity: sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
'@oxlint/binding-darwin-x64@1.62.0':
resolution: {integrity: sha512-oOWI6YPPr5AJUx+yIDlxmuUbQjS5gZX3OH3QisawYvsZgLiQVvZtR0rPBcJTxLWqt2ClrWg0DlSrlUiG5SQNHg==}
'@oxlint/binding-darwin-x64@1.63.0':
resolution: {integrity: sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
'@oxlint/binding-freebsd-x64@1.62.0':
resolution: {integrity: sha512-dLP33T7VLCmLVv4cvjkVX+rmkcwNk2UfxmsZPNur/7BQHoQR60zJ7XLiRvNUawlzn0u8ngCa3itjEG73MAMa/w==}
'@oxlint/binding-freebsd-x64@1.63.0':
resolution: {integrity: sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
'@oxlint/binding-linux-arm-gnueabihf@1.62.0':
resolution: {integrity: sha512-fl//LWNks6qo9chNY60UDYyIwtp7a5cEx4Y/rHPjaarhuwqx6jtbzEpD5V5AqmdL4a6Y5D8zeXg5HF2Cr0QmSQ==}
'@oxlint/binding-linux-arm-gnueabihf@1.63.0':
resolution: {integrity: sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@oxlint/binding-linux-arm-musleabihf@1.62.0':
resolution: {integrity: sha512-i5vkAuxvueTODV3J2dL61/TXewDHhMFKvtD156cIsk7GsdfiAu7zW7kY0NJXhKeFHeiMZIh7eFNjkPYH6J47HQ==}
'@oxlint/binding-linux-arm-musleabihf@1.63.0':
resolution: {integrity: sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@oxlint/binding-linux-arm64-gnu@1.62.0':
resolution: {integrity: sha512-QwN19LLuIGuOjEflSeJkZmOTfBdBMlTmW8xbMf8TZhjd//cxVNYQPq75q7oKZBJc6hRx3gY7sX0Egc8cEIFZYg==}
'@oxlint/binding-linux-arm64-gnu@1.63.0':
resolution: {integrity: sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@oxlint/binding-linux-arm64-musl@1.62.0':
resolution: {integrity: sha512-8eCy3FCDuWUM5hWujAv6heMvfZPbcCOU3SdQUAkixZLu5bSzOkNfirJiLGoQFO943xceOKkiQRMQNzH++jM3WA==}
'@oxlint/binding-linux-arm64-musl@1.63.0':
resolution: {integrity: sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@oxlint/binding-linux-ppc64-gnu@1.62.0':
resolution: {integrity: sha512-NjQ7K7tpTPDe9J+yq8p/s/J0E7lRCkK2uDBDqvT4XIT6f4Z0tlnr59OBg/WcrmVHER1AbrcfyxhGTXgcG8ytWg==}
'@oxlint/binding-linux-ppc64-gnu@1.63.0':
resolution: {integrity: sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@oxlint/binding-linux-riscv64-gnu@1.62.0':
resolution: {integrity: sha512-oKZed9gmSwze29dEt3/Wnsv6l/Ygw/FUst+8Kfpv2SGeS/glEoTGZAMQw37SVyzFV76UTHJN2snGgxK2t2+8ow==}
'@oxlint/binding-linux-riscv64-gnu@1.63.0':
resolution: {integrity: sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@oxlint/binding-linux-riscv64-musl@1.62.0':
resolution: {integrity: sha512-gBjBxQ+9lGpAYq+ELqw0w8QXsBnkZclFc7GRX2r0LnEVn3ZTEqeIKpKcGjucmp76Q53bvJD0i4qBWBhcfhSfGA==}
'@oxlint/binding-linux-riscv64-musl@1.63.0':
resolution: {integrity: sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@oxlint/binding-linux-s390x-gnu@1.62.0':
resolution: {integrity: sha512-Ew2Kxs9EQ9/mbAIJ2hvocMC0wsOu6YKzStI2eFBDt+Td5O8seVC/oxgRIHqCcl5sf5ratA1nozQBAuv7tphkHg==}
'@oxlint/binding-linux-s390x-gnu@1.63.0':
resolution: {integrity: sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@oxlint/binding-linux-x64-gnu@1.62.0':
resolution: {integrity: sha512-5z25jcAA0gfKyVwz71A0VXgaPlocPoTAxhlv/hgoK6tlCrfoNuw7haWbDHvGMfjXhdic4EqVXGRv5XsTqFnbRQ==}
'@oxlint/binding-linux-x64-gnu@1.63.0':
resolution: {integrity: sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@oxlint/binding-linux-x64-musl@1.62.0':
resolution: {integrity: sha512-IWpHmMB6ZDllPvqWDkG6AmXrN7JF5e/c4g/0PuURsmlK+vHoYZPB70rr4u1bn3I4LsKCSpqqfveyx6UCOC8wdg==}
'@oxlint/binding-linux-x64-musl@1.63.0':
resolution: {integrity: sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@oxlint/binding-openharmony-arm64@1.62.0':
resolution: {integrity: sha512-fjlSxxrD5pA594vkyikCS9MnPRjQawW6/BLgyTYkO+73wwPlYjkcZ7LSd974l0Q2zkHQmu4DPvJFLYA7o8xrxQ==}
'@oxlint/binding-openharmony-arm64@1.63.0':
resolution: {integrity: sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
'@oxlint/binding-win32-arm64-msvc@1.62.0':
resolution: {integrity: sha512-EiFXr8loNS0Ul3Gu80+9nr1T8jRmnKocqmHHg16tj5ZqTgUXyb97l2rrspVHdDluyFn9JfR4PoJFdNzw4paHww==}
'@oxlint/binding-win32-arm64-msvc@1.63.0':
resolution: {integrity: sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
'@oxlint/binding-win32-ia32-msvc@1.62.0':
resolution: {integrity: sha512-IgOFvL73li1bFgab+hThXYA0N2Xms2kV2MvZN95cebV+fmrZ9AVui1JSxfeeqRLo3CpPxKZlzhyq4G0cnaAvIw==}
'@oxlint/binding-win32-ia32-msvc@1.63.0':
resolution: {integrity: sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
'@oxlint/binding-win32-x64-msvc@1.62.0':
resolution: {integrity: sha512-6hMpyDWQ2zGA1OXFKBrdYMUveUCO8UJhkO6JdwZPd78xIdHZNhjx+pib+4fC2Cljuhjyl0QwA2F3df/bs4Bp6A==}
'@oxlint/binding-win32-x64-msvc@1.63.0':
resolution: {integrity: sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -2160,14 +2162,14 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fast-string-truncated-width@1.2.1:
resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==}
fast-string-truncated-width@3.0.3:
resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==}
fast-string-width@1.1.0:
resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==}
fast-string-width@3.0.2:
resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==}
fast-wrap-ansi@0.1.6:
resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==}
fast-wrap-ansi@0.2.0:
resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==}
fast-xml-builder@1.1.5:
resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==}
@@ -2525,8 +2527,8 @@ packages:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
oxfmt@0.47.0:
resolution: {integrity: sha512-OFbkbzxKCpooQEnRmpTDnuwTX8KHXzZTQ4Df/hz85fpS67Pl+lxPEFvUtin56HIIS0B1k4X8oIzTXRZPufA2CA==}
oxfmt@0.48.0:
resolution: {integrity: sha512-AVaLh+7XeGx+R1zfFV+f6VV61nT2MWVJXVUDhbTm5LBWGyNt64xAyh3NYYyjeY2WykNt9AvqSQLPHcbWquYF9g==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -2534,12 +2536,12 @@ packages:
resolution: {integrity: sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg==}
hasBin: true
oxlint@1.62.0:
resolution: {integrity: sha512-1uFkg6HakjsGIpW9wNdeW4/2LOHW9MEkoWjZUTUfQtIHyLIZPYt00w3Sg+H3lH+206FgBPHBbW5dVE5l2ExECQ==}
oxlint@1.63.0:
resolution: {integrity: sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
oxlint-tsgolint: '>=0.18.0'
oxlint-tsgolint: '>=0.22.1'
peerDependenciesMeta:
oxlint-tsgolint:
optional: true
@@ -2807,8 +2809,8 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
ultracite@7.6.2:
resolution: {integrity: sha512-HonD+l9o8bFEUcVLlefpg5JuvaZH/UTB0jpCVtKAZ6xV1LGZj/hq4nGlz/eezIMmFfd6fe43LMxn1CaY/N/LaA==}
ultracite@7.6.3:
resolution: {integrity: sha512-QhIg4qLaWaugLCMdHsxO+nzRljgOQVdCFs2kgJad3uXpl1IeKu2sT6puNcNpOAr9yHOWcT5smZ0l4F1WU1N7YA==}
hasBin: true
peerDependencies:
oxfmt: '>=0.1.0'
@@ -2990,8 +2992,8 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yaml@2.8.3:
resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==}
yaml@2.8.4:
resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==}
engines: {node: '>= 14.6'}
hasBin: true
@@ -3804,16 +3806,16 @@ snapshots:
css-tree: 3.2.1
optional: true
'@clack/core@1.2.0':
'@clack/core@1.3.0':
dependencies:
fast-wrap-ansi: 0.1.6
fast-wrap-ansi: 0.2.0
sisteransi: 1.0.5
'@clack/prompts@1.2.0':
'@clack/prompts@1.3.0':
dependencies:
'@clack/core': 1.2.0
fast-string-width: 1.1.0
fast-wrap-ansi: 0.1.6
'@clack/core': 1.3.0
fast-string-width: 3.0.2
fast-wrap-ansi: 0.2.0
sisteransi: 1.0.5
'@csstools/color-helpers@6.0.2':
@@ -4064,61 +4066,61 @@ snapshots:
'@oxc-project/types@0.127.0': {}
'@oxfmt/binding-android-arm-eabi@0.47.0':
'@oxfmt/binding-android-arm-eabi@0.48.0':
optional: true
'@oxfmt/binding-android-arm64@0.47.0':
'@oxfmt/binding-android-arm64@0.48.0':
optional: true
'@oxfmt/binding-darwin-arm64@0.47.0':
'@oxfmt/binding-darwin-arm64@0.48.0':
optional: true
'@oxfmt/binding-darwin-x64@0.47.0':
'@oxfmt/binding-darwin-x64@0.48.0':
optional: true
'@oxfmt/binding-freebsd-x64@0.47.0':
'@oxfmt/binding-freebsd-x64@0.48.0':
optional: true
'@oxfmt/binding-linux-arm-gnueabihf@0.47.0':
'@oxfmt/binding-linux-arm-gnueabihf@0.48.0':
optional: true
'@oxfmt/binding-linux-arm-musleabihf@0.47.0':
'@oxfmt/binding-linux-arm-musleabihf@0.48.0':
optional: true
'@oxfmt/binding-linux-arm64-gnu@0.47.0':
'@oxfmt/binding-linux-arm64-gnu@0.48.0':
optional: true
'@oxfmt/binding-linux-arm64-musl@0.47.0':
'@oxfmt/binding-linux-arm64-musl@0.48.0':
optional: true
'@oxfmt/binding-linux-ppc64-gnu@0.47.0':
'@oxfmt/binding-linux-ppc64-gnu@0.48.0':
optional: true
'@oxfmt/binding-linux-riscv64-gnu@0.47.0':
'@oxfmt/binding-linux-riscv64-gnu@0.48.0':
optional: true
'@oxfmt/binding-linux-riscv64-musl@0.47.0':
'@oxfmt/binding-linux-riscv64-musl@0.48.0':
optional: true
'@oxfmt/binding-linux-s390x-gnu@0.47.0':
'@oxfmt/binding-linux-s390x-gnu@0.48.0':
optional: true
'@oxfmt/binding-linux-x64-gnu@0.47.0':
'@oxfmt/binding-linux-x64-gnu@0.48.0':
optional: true
'@oxfmt/binding-linux-x64-musl@0.47.0':
'@oxfmt/binding-linux-x64-musl@0.48.0':
optional: true
'@oxfmt/binding-openharmony-arm64@0.47.0':
'@oxfmt/binding-openharmony-arm64@0.48.0':
optional: true
'@oxfmt/binding-win32-arm64-msvc@0.47.0':
'@oxfmt/binding-win32-arm64-msvc@0.48.0':
optional: true
'@oxfmt/binding-win32-ia32-msvc@0.47.0':
'@oxfmt/binding-win32-ia32-msvc@0.48.0':
optional: true
'@oxfmt/binding-win32-x64-msvc@0.47.0':
'@oxfmt/binding-win32-x64-msvc@0.48.0':
optional: true
'@oxlint-tsgolint/darwin-arm64@0.22.1':
@@ -4139,61 +4141,61 @@ snapshots:
'@oxlint-tsgolint/win32-x64@0.22.1':
optional: true
'@oxlint/binding-android-arm-eabi@1.62.0':
'@oxlint/binding-android-arm-eabi@1.63.0':
optional: true
'@oxlint/binding-android-arm64@1.62.0':
'@oxlint/binding-android-arm64@1.63.0':
optional: true
'@oxlint/binding-darwin-arm64@1.62.0':
'@oxlint/binding-darwin-arm64@1.63.0':
optional: true
'@oxlint/binding-darwin-x64@1.62.0':
'@oxlint/binding-darwin-x64@1.63.0':
optional: true
'@oxlint/binding-freebsd-x64@1.62.0':
'@oxlint/binding-freebsd-x64@1.63.0':
optional: true
'@oxlint/binding-linux-arm-gnueabihf@1.62.0':
'@oxlint/binding-linux-arm-gnueabihf@1.63.0':
optional: true
'@oxlint/binding-linux-arm-musleabihf@1.62.0':
'@oxlint/binding-linux-arm-musleabihf@1.63.0':
optional: true
'@oxlint/binding-linux-arm64-gnu@1.62.0':
'@oxlint/binding-linux-arm64-gnu@1.63.0':
optional: true
'@oxlint/binding-linux-arm64-musl@1.62.0':
'@oxlint/binding-linux-arm64-musl@1.63.0':
optional: true
'@oxlint/binding-linux-ppc64-gnu@1.62.0':
'@oxlint/binding-linux-ppc64-gnu@1.63.0':
optional: true
'@oxlint/binding-linux-riscv64-gnu@1.62.0':
'@oxlint/binding-linux-riscv64-gnu@1.63.0':
optional: true
'@oxlint/binding-linux-riscv64-musl@1.62.0':
'@oxlint/binding-linux-riscv64-musl@1.63.0':
optional: true
'@oxlint/binding-linux-s390x-gnu@1.62.0':
'@oxlint/binding-linux-s390x-gnu@1.63.0':
optional: true
'@oxlint/binding-linux-x64-gnu@1.62.0':
'@oxlint/binding-linux-x64-gnu@1.63.0':
optional: true
'@oxlint/binding-linux-x64-musl@1.62.0':
'@oxlint/binding-linux-x64-musl@1.63.0':
optional: true
'@oxlint/binding-openharmony-arm64@1.62.0':
'@oxlint/binding-openharmony-arm64@1.63.0':
optional: true
'@oxlint/binding-win32-arm64-msvc@1.62.0':
'@oxlint/binding-win32-arm64-msvc@1.63.0':
optional: true
'@oxlint/binding-win32-ia32-msvc@1.62.0':
'@oxlint/binding-win32-ia32-msvc@1.63.0':
optional: true
'@oxlint/binding-win32-x64-msvc@1.62.0':
'@oxlint/binding-win32-x64-msvc@1.63.0':
optional: true
'@rolldown/binding-android-arm64@1.0.0-rc.17':
@@ -4245,14 +4247,14 @@ snapshots:
'@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
optional: true
'@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))':
dependencies:
'@babel/core': 7.29.0
picomatch: 4.0.4
rolldown: 1.0.0-rc.17
optionalDependencies:
'@babel/runtime': 7.29.2
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
'@rolldown/pluginutils@1.0.0-rc.17': {}
@@ -4656,12 +4658,12 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.2.4
'@tailwindcss/oxide-win32-x64-msvc': 4.2.4
'@tailwindcss/vite@4.2.4(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@tailwindcss/vite@4.2.4(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))':
dependencies:
'@tailwindcss/node': 4.2.4
'@tailwindcss/oxide': 4.2.4
tailwindcss: 4.2.4
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
'@tanstack/eslint-plugin-query@5.100.8(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3)':
dependencies:
@@ -4725,7 +4727,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-plugin@1.167.32(@tanstack/react-router@1.169.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@tanstack/router-plugin@1.167.32(@tanstack/react-router@1.169.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
@@ -4742,7 +4744,7 @@ snapshots:
zod: 3.25.76
optionalDependencies:
'@tanstack/react-router': 1.169.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
transitivePeerDependencies:
- supports-color
@@ -4967,16 +4969,16 @@ snapshots:
'@typescript/native-preview-win32-arm64': 7.0.0-dev.20260502.1
'@typescript/native-preview-win32-x64': 7.0.0-dev.20260502.1
'@vitejs/plugin-basic-ssl@2.3.0(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@vitejs/plugin-basic-ssl@2.3.0(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))':
dependencies:
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
'@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.7
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
optionalDependencies:
'@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.17)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
babel-plugin-react-compiler: 1.0.0
'@vitest/coverage-v8@4.1.5(vitest@4.1.5)':
@@ -4991,7 +4993,7 @@ snapshots:
obug: 2.1.1
std-env: 4.1.0
tinyrainbow: 3.1.0
vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@vitest/expect@4.1.5':
dependencies:
@@ -5002,13 +5004,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
'@vitest/mocker@4.1.5(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@vitest/mocker@4.1.5(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))':
dependencies:
'@vitest/spy': 4.1.5
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
'@vitest/pretty-format@4.1.5':
dependencies:
@@ -5370,15 +5372,15 @@ snapshots:
fast-levenshtein@2.0.6: {}
fast-string-truncated-width@1.2.1: {}
fast-string-truncated-width@3.0.3: {}
fast-string-width@1.1.0:
fast-string-width@3.0.2:
dependencies:
fast-string-truncated-width: 1.2.1
fast-string-truncated-width: 3.0.3
fast-wrap-ansi@0.1.6:
fast-wrap-ansi@0.2.0:
dependencies:
fast-string-width: 1.1.0
fast-string-width: 3.0.2
fast-xml-builder@1.1.5:
dependencies:
@@ -5711,29 +5713,29 @@ snapshots:
type-check: 0.4.0
word-wrap: 1.2.5
oxfmt@0.47.0:
oxfmt@0.48.0:
dependencies:
tinypool: 2.1.0
optionalDependencies:
'@oxfmt/binding-android-arm-eabi': 0.47.0
'@oxfmt/binding-android-arm64': 0.47.0
'@oxfmt/binding-darwin-arm64': 0.47.0
'@oxfmt/binding-darwin-x64': 0.47.0
'@oxfmt/binding-freebsd-x64': 0.47.0
'@oxfmt/binding-linux-arm-gnueabihf': 0.47.0
'@oxfmt/binding-linux-arm-musleabihf': 0.47.0
'@oxfmt/binding-linux-arm64-gnu': 0.47.0
'@oxfmt/binding-linux-arm64-musl': 0.47.0
'@oxfmt/binding-linux-ppc64-gnu': 0.47.0
'@oxfmt/binding-linux-riscv64-gnu': 0.47.0
'@oxfmt/binding-linux-riscv64-musl': 0.47.0
'@oxfmt/binding-linux-s390x-gnu': 0.47.0
'@oxfmt/binding-linux-x64-gnu': 0.47.0
'@oxfmt/binding-linux-x64-musl': 0.47.0
'@oxfmt/binding-openharmony-arm64': 0.47.0
'@oxfmt/binding-win32-arm64-msvc': 0.47.0
'@oxfmt/binding-win32-ia32-msvc': 0.47.0
'@oxfmt/binding-win32-x64-msvc': 0.47.0
'@oxfmt/binding-android-arm-eabi': 0.48.0
'@oxfmt/binding-android-arm64': 0.48.0
'@oxfmt/binding-darwin-arm64': 0.48.0
'@oxfmt/binding-darwin-x64': 0.48.0
'@oxfmt/binding-freebsd-x64': 0.48.0
'@oxfmt/binding-linux-arm-gnueabihf': 0.48.0
'@oxfmt/binding-linux-arm-musleabihf': 0.48.0
'@oxfmt/binding-linux-arm64-gnu': 0.48.0
'@oxfmt/binding-linux-arm64-musl': 0.48.0
'@oxfmt/binding-linux-ppc64-gnu': 0.48.0
'@oxfmt/binding-linux-riscv64-gnu': 0.48.0
'@oxfmt/binding-linux-riscv64-musl': 0.48.0
'@oxfmt/binding-linux-s390x-gnu': 0.48.0
'@oxfmt/binding-linux-x64-gnu': 0.48.0
'@oxfmt/binding-linux-x64-musl': 0.48.0
'@oxfmt/binding-openharmony-arm64': 0.48.0
'@oxfmt/binding-win32-arm64-msvc': 0.48.0
'@oxfmt/binding-win32-ia32-msvc': 0.48.0
'@oxfmt/binding-win32-x64-msvc': 0.48.0
oxlint-tsgolint@0.22.1:
optionalDependencies:
@@ -5744,27 +5746,27 @@ snapshots:
'@oxlint-tsgolint/win32-arm64': 0.22.1
'@oxlint-tsgolint/win32-x64': 0.22.1
oxlint@1.62.0(oxlint-tsgolint@0.22.1):
oxlint@1.63.0(oxlint-tsgolint@0.22.1):
optionalDependencies:
'@oxlint/binding-android-arm-eabi': 1.62.0
'@oxlint/binding-android-arm64': 1.62.0
'@oxlint/binding-darwin-arm64': 1.62.0
'@oxlint/binding-darwin-x64': 1.62.0
'@oxlint/binding-freebsd-x64': 1.62.0
'@oxlint/binding-linux-arm-gnueabihf': 1.62.0
'@oxlint/binding-linux-arm-musleabihf': 1.62.0
'@oxlint/binding-linux-arm64-gnu': 1.62.0
'@oxlint/binding-linux-arm64-musl': 1.62.0
'@oxlint/binding-linux-ppc64-gnu': 1.62.0
'@oxlint/binding-linux-riscv64-gnu': 1.62.0
'@oxlint/binding-linux-riscv64-musl': 1.62.0
'@oxlint/binding-linux-s390x-gnu': 1.62.0
'@oxlint/binding-linux-x64-gnu': 1.62.0
'@oxlint/binding-linux-x64-musl': 1.62.0
'@oxlint/binding-openharmony-arm64': 1.62.0
'@oxlint/binding-win32-arm64-msvc': 1.62.0
'@oxlint/binding-win32-ia32-msvc': 1.62.0
'@oxlint/binding-win32-x64-msvc': 1.62.0
'@oxlint/binding-android-arm-eabi': 1.63.0
'@oxlint/binding-android-arm64': 1.63.0
'@oxlint/binding-darwin-arm64': 1.63.0
'@oxlint/binding-darwin-x64': 1.63.0
'@oxlint/binding-freebsd-x64': 1.63.0
'@oxlint/binding-linux-arm-gnueabihf': 1.63.0
'@oxlint/binding-linux-arm-musleabihf': 1.63.0
'@oxlint/binding-linux-arm64-gnu': 1.63.0
'@oxlint/binding-linux-arm64-musl': 1.63.0
'@oxlint/binding-linux-ppc64-gnu': 1.63.0
'@oxlint/binding-linux-riscv64-gnu': 1.63.0
'@oxlint/binding-linux-riscv64-musl': 1.63.0
'@oxlint/binding-linux-s390x-gnu': 1.63.0
'@oxlint/binding-linux-x64-gnu': 1.63.0
'@oxlint/binding-linux-x64-musl': 1.63.0
'@oxlint/binding-openharmony-arm64': 1.63.0
'@oxlint/binding-win32-arm64-msvc': 1.63.0
'@oxlint/binding-win32-ia32-msvc': 1.63.0
'@oxlint/binding-win32-x64-msvc': 1.63.0
oxlint-tsgolint: 0.22.1
p-limit@3.1.0:
@@ -6000,20 +6002,20 @@ snapshots:
typescript@6.0.3: {}
ultracite@7.6.2(oxfmt@0.47.0)(oxlint@1.62.0(oxlint-tsgolint@0.22.1)):
ultracite@7.6.3(oxfmt@0.48.0)(oxlint@1.63.0(oxlint-tsgolint@0.22.1)):
dependencies:
'@clack/prompts': 1.2.0
'@clack/prompts': 1.3.0
commander: 14.0.3
cross-spawn: 7.0.6
deepmerge: 4.3.1
glob: 13.0.6
jsonc-parser: 3.3.1
nypm: 0.6.6
yaml: 2.8.3
yaml: 2.8.4
zod: 4.4.2
optionalDependencies:
oxfmt: 0.47.0
oxlint: 1.62.0(oxlint-tsgolint@0.22.1)
oxfmt: 0.48.0
oxlint: 1.63.0(oxlint-tsgolint@0.22.1)
undici-types@7.16.0: {}
@@ -6042,7 +6044,7 @@ snapshots:
util-deprecate@1.0.2: {}
vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3):
vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
@@ -6055,12 +6057,12 @@ snapshots:
fsevents: 2.3.3
jiti: 2.6.1
tsx: 4.21.0
yaml: 2.8.3
yaml: 2.8.4
vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)):
vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)):
dependencies:
'@vitest/expect': 4.1.5
'@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4))
'@vitest/pretty-format': 4.1.5
'@vitest/runner': 4.1.5
'@vitest/snapshot': 4.1.5
@@ -6077,7 +6079,7 @@ snapshots:
tinyexec: 1.1.1
tinyglobby: 0.2.16
tinyrainbow: 3.1.0
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.4)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 24.12.2
@@ -6132,7 +6134,7 @@ snapshots:
yallist@3.1.1: {}
yaml@2.8.3: {}
yaml@2.8.4: {}
yocto-queue@0.1.0: {}
@@ -47,6 +47,27 @@ describe("DeleteConfirmationDialog", () => {
expect(onConfirm).toHaveBeenCalledOnce()
})
it("renders custom confirmLabel and pendingLabel when provided", () => {
const { rerender } = render(
<DeleteConfirmationDialog
{...defaultProps}
confirmLabel="Terminate"
pendingLabel="Terminating…"
/>,
)
expect(screen.getByText("Terminate")).toBeInTheDocument()
expect(screen.queryByText("Delete")).not.toBeInTheDocument()
rerender(
<DeleteConfirmationDialog
{...defaultProps}
confirmLabel="Terminate"
isPending={true}
pendingLabel="Terminating…"
/>,
)
expect(screen.getByText("Terminating…")).toBeInTheDocument()
})
it("renders ReactNode description", () => {
render(
<DeleteConfirmationDialog
@@ -18,6 +18,8 @@ interface DeleteConfirmationDialogProps {
description: ReactNode
isPending: boolean
onConfirm: () => void
confirmLabel?: string
pendingLabel?: string
}
export function DeleteConfirmationDialog({
@@ -27,6 +29,8 @@ export function DeleteConfirmationDialog({
description,
isPending,
onConfirm,
confirmLabel = "Delete",
pendingLabel = "Deleting\u2026",
}: DeleteConfirmationDialogProps) {
return (
<AlertDialog onOpenChange={onOpenChange} open={open}>
@@ -38,7 +42,7 @@ export function DeleteConfirmationDialog({
<AlertDialogFooter>
<AlertDialogCancel>Cancel</AlertDialogCancel>
<AlertDialogAction disabled={isPending} onClick={onConfirm}>
{isPending ? "Deleting\u2026" : "Delete"}
{isPending ? pendingLabel : confirmLabel}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
@@ -1,6 +1,6 @@
import { screen } from "@testing-library/react"
import { screen, within } from "@testing-library/react"
import userEvent from "@testing-library/user-event"
import { describe, expect, it, vi } from "vitest"
import { beforeEach, describe, expect, it, vi } from "vitest"
import { renderWithProviders } from "@/test/utils"
@@ -8,6 +8,7 @@ import { InstanceActions } from "./instance-actions"
const TRANSITIONING_RE = /Actions will be available/
const TERMINATED_RE = /terminated and cannot be managed/
const TERMINATE_CONFIRM_RE = /Are you sure you want to terminate the instance/
// Mock mutation hooks
const mockMutate = vi.fn()
@@ -20,6 +21,10 @@ vi.mock("@/mutations/ec2", () => ({
useTerminateInstance: () => ({ ...defaultMutation }),
}))
beforeEach(() => {
mockMutate.mockReset()
})
describe("InstanceActions", () => {
describe("running instance", () => {
it("shows Stop, Reboot, and Terminate buttons", () => {
@@ -76,4 +81,52 @@ describe("InstanceActions", () => {
expect(screen.getByText(TERMINATED_RE)).toBeInTheDocument()
})
})
describe("terminate confirmation", () => {
it("does not call mutation when Terminate button is clicked", async () => {
const user = userEvent.setup()
renderWithProviders(
<InstanceActions instanceId="i-123" state="running" />,
)
await user.click(screen.getByText("Terminate"))
expect(mockMutate).not.toHaveBeenCalled()
})
it("opens confirmation dialog showing instance ID on Terminate click", async () => {
const user = userEvent.setup()
renderWithProviders(
<InstanceActions instanceId="i-123" state="running" />,
)
await user.click(screen.getByText("Terminate"))
expect(screen.getByText(TERMINATE_CONFIRM_RE)).toBeInTheDocument()
expect(screen.getByText(/i-123/)).toBeInTheDocument()
})
it("calls terminate mutation only after confirming", async () => {
const user = userEvent.setup()
renderWithProviders(
<InstanceActions instanceId="i-123" state="running" />,
)
await user.click(screen.getByText("Terminate"))
const dialog = screen.getByRole("alertdialog")
await user.click(
within(dialog).getByRole("button", { name: "Terminate" }),
)
expect(mockMutate).toHaveBeenCalledWith(
"i-123",
expect.objectContaining({ onSettled: expect.any(Function) }),
)
})
it("closes dialog without calling mutation when Cancel clicked", async () => {
const user = userEvent.setup()
renderWithProviders(
<InstanceActions instanceId="i-123" state="running" />,
)
await user.click(screen.getByText("Terminate"))
await user.click(screen.getByText("Cancel"))
expect(mockMutate).not.toHaveBeenCalled()
expect(screen.queryByText(TERMINATE_CONFIRM_RE)).not.toBeInTheDocument()
})
})
})
@@ -1,5 +1,7 @@
import { Pause, Play, RotateCw, Trash2 } from "lucide-react"
import { useState } from "react"
import { DeleteConfirmationDialog } from "@/components/delete-confirmation-dialog"
import { ErrorBanner } from "@/components/error-banner"
import { Button } from "@/components/ui/button"
import {
@@ -26,9 +28,16 @@ export function InstanceActions({ instanceId, state }: InstanceActionsProps) {
const stopMutation = useStopInstance()
const rebootMutation = useRebootInstance()
const terminateMutation = useTerminateInstance()
const [showTerminateDialog, setShowTerminateDialog] = useState(false)
const isTransitioning = TRANSITIONING_STATES.has(state ?? "")
const handleTerminate = () => {
terminateMutation.mutate(instanceId, {
onSettled: () => setShowTerminateDialog(false),
})
}
if (isTransitioning && state !== "terminated") {
return (
<div className="rounded-lg border bg-muted/50 p-4">
@@ -111,7 +120,7 @@ export function InstanceActions({ instanceId, state }: InstanceActionsProps) {
{(state === "stopped" || state === "running") && (
<Button
disabled={terminateMutation.isPending}
onClick={() => terminateMutation.mutate(instanceId)}
onClick={() => setShowTerminateDialog(true)}
size="sm"
variant="destructive"
>
@@ -120,6 +129,16 @@ export function InstanceActions({ instanceId, state }: InstanceActionsProps) {
</Button>
)}
</div>
<DeleteConfirmationDialog
confirmLabel="Terminate"
description={`Are you sure you want to terminate the instance "${instanceId}"? This action cannot be undone.`}
isPending={terminateMutation.isPending}
onConfirm={handleTerminate}
onOpenChange={setShowTerminateDialog}
open={showTerminateDialog}
pendingLabel="Terminating…"
title="Terminate Instance"
/>
</div>
)
}