From 30b08ca984c5fe83eabffbc4fee37e04b69c29b9 Mon Sep 17 00:00:00 2001
From: Julian Sommer <115516918+juliansommer@users.noreply.github.com>
Date: Tue, 24 Mar 2026 10:20:11 +1000
Subject: [PATCH] fix: use nullish coalescing
---
spinifex/services/spinifexui/frontend/.oxlintrc.json | 1 -
.../spinifexui/frontend/src/components/detail-row.tsx | 1 +
.../services/spinifexui/frontend/src/mutations/ec2.ts | 7 +++++++
.../services/spinifexui/frontend/src/mutations/iam.ts | 2 ++
.../_auth/ec2/(images)/describe-images/index.tsx | 2 +-
.../_auth/ec2/(instances)/describe-instances/$id.tsx | 2 ++
.../_auth/ec2/(instances)/describe-instances/index.tsx | 4 ++--
.../src/routes/_auth/ec2/(instances)/run-instances.tsx | 6 +++---
.../routes/_auth/ec2/(key)/describe-key-pairs/$id.tsx | 2 +-
.../_auth/ec2/(key)/describe-key-pairs/index.tsx | 2 +-
.../_auth/ec2/(snapshots)/describe-snapshots/index.tsx | 2 +-
.../src/routes/_auth/ec2/(subnet)/create-subnet.tsx | 2 +-
.../_auth/ec2/(subnet)/describe-subnets/index.tsx | 2 +-
.../_auth/ec2/(volumes)/describe-volumes/$id.tsx | 2 +-
.../_auth/ec2/(volumes)/describe-volumes/index.tsx | 2 +-
.../src/routes/_auth/ec2/(vpc)/describe-vpcs/index.tsx | 2 +-
.../src/routes/_auth/ec2/-components/ami-details.tsx | 2 +-
.../routes/_auth/ec2/-components/instance-actions.tsx | 2 +-
.../_auth/iam/(policies)/list-policies/$policyArn.tsx | 2 +-
.../_auth/iam/(policies)/list-policies/index.tsx | 2 +-
.../routes/_auth/iam/(users)/list-users/$userName.tsx | 6 +++---
.../src/routes/_auth/iam/(users)/list-users/index.tsx | 2 +-
.../routes/_auth/s3/-components/object-list-item.tsx | 2 +-
.../frontend/src/routes/_auth/s3/ls/$bucket/$.tsx | 10 +++++-----
.../frontend/src/routes/_auth/s3/ls/$bucket/index.tsx | 4 ++--
.../frontend/src/routes/_auth/s3/ls/index.tsx | 2 +-
26 files changed, 43 insertions(+), 32 deletions(-)
diff --git a/spinifex/services/spinifexui/frontend/.oxlintrc.json b/spinifex/services/spinifexui/frontend/.oxlintrc.json
index e3a31bde8..6a8a691c9 100644
--- a/spinifex/services/spinifexui/frontend/.oxlintrc.json
+++ b/spinifex/services/spinifexui/frontend/.oxlintrc.json
@@ -39,7 +39,6 @@
"promise/prefer-await-to-callbacks": "off",
"react-perf/jsx-no-new-function-as-prop": "off",
"typescript/no-confusing-void-expression": "off",
- "typescript/prefer-nullish-coalescing": "off",
"typescript/return-await": "off",
"typescript/no-floating-promises": "off",
"typescript/strict-boolean-expressions": "off",
diff --git a/spinifex/services/spinifexui/frontend/src/components/detail-row.tsx b/spinifex/services/spinifexui/frontend/src/components/detail-row.tsx
index 3d4c20a76..44e4e15e7 100644
--- a/spinifex/services/spinifexui/frontend/src/components/detail-row.tsx
+++ b/spinifex/services/spinifexui/frontend/src/components/detail-row.tsx
@@ -11,6 +11,7 @@ export function DetailRow({
{label}
+ {/* oxlint-disable-next-line typescript/prefer-nullish-coalescing */}
{value || —}
diff --git a/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts b/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts
index a34538383..bf0f1999e 100644
--- a/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts
+++ b/spinifex/services/spinifexui/frontend/src/mutations/ec2.ts
@@ -117,6 +117,7 @@ export function useCreateInstance() {
KeyName: params.keyName,
MinCount: params.count,
MaxCount: params.count,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
SubnetId: params.subnetId || undefined,
})
return getEc2Client().send(command)
@@ -232,6 +233,7 @@ export function useCreateSnapshot() {
mutationFn: (params: CreateSnapshotFormData) => {
const command = new CreateSnapshotCommand({
VolumeId: params.volumeId,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
Description: params.description || undefined,
})
return getEc2Client().send(command)
@@ -264,6 +266,7 @@ export function useCopySnapshot() {
const command = new CopySnapshotCommand({
SourceSnapshotId: params.sourceSnapshotId,
SourceRegion: params.sourceRegion,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
Description: params.description || undefined,
})
return getEc2Client().send(command)
@@ -281,6 +284,7 @@ export function useAttachVolume() {
const command = new AttachVolumeCommand({
VolumeId: params.volumeId,
InstanceId: params.instanceId,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
Device: params.device || undefined,
})
return getEc2Client().send(command)
@@ -298,6 +302,7 @@ export function useDetachVolume() {
mutationFn: (params: DetachVolumeFormData) => {
const command = new DetachVolumeCommand({
VolumeId: params.volumeId,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
InstanceId: params.instanceId || undefined,
Force: params.force,
})
@@ -347,6 +352,7 @@ export function useCreateImage() {
const command = new CreateImageCommand({
InstanceId: params.instanceId,
Name: params.name,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
Description: params.description || undefined,
})
return getEc2Client().send(command)
@@ -402,6 +408,7 @@ export function useCreateSubnet() {
const command = new CreateSubnetCommand({
VpcId: params.vpcId,
CidrBlock: params.cidrBlock,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
AvailabilityZone: params.availabilityZone || undefined,
})
return getEc2Client().send(command)
diff --git a/spinifex/services/spinifexui/frontend/src/mutations/iam.ts b/spinifex/services/spinifexui/frontend/src/mutations/iam.ts
index c0498053a..f688a6911 100644
--- a/spinifex/services/spinifexui/frontend/src/mutations/iam.ts
+++ b/spinifex/services/spinifexui/frontend/src/mutations/iam.ts
@@ -26,6 +26,7 @@ export function useCreateUser() {
mutationFn: (params: CreateUserFormData) => {
const command = new CreateUserCommand({
UserName: params.userName,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
Path: params.path || undefined,
})
return getIamClient().send(command)
@@ -101,6 +102,7 @@ export function useCreatePolicy() {
mutationFn: (params: CreatePolicyFormData) => {
const command = new CreatePolicyCommand({
PolicyName: params.policyName,
+ // oxlint-disable-next-line typescript/prefer-nullish-coalescing
Description: params.description || undefined,
PolicyDocument: params.policyDocument,
})
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(images)/describe-images/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(images)/describe-images/index.tsx
index 6940c7763..9bc625755 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(images)/describe-images/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(images)/describe-images/index.tsx
@@ -24,7 +24,7 @@ export const Route = createFileRoute("/_auth/ec2/(images)/describe-images/")({
function Images() {
const { data } = useSuspenseQuery(ec2ImagesQueryOptions)
- const images = data.Images || []
+ const images = data.Images ?? []
return (
<>
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/$id.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/$id.tsx
index dbb3af699..a53d08bb2 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/$id.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/$id.tsx
@@ -247,11 +247,13 @@ function InstanceDetail() {
{/* Network & Security */}
+ {/* oxlint-disable typescript/prefer-nullish-coalescing */}
{(instance.PrivateIpAddress ||
instance.PublicIpAddress ||
instance.VpcId ||
instance.SubnetId ||
(instance.SecurityGroups && instance.SecurityGroups.length > 0)) && (
+ /* oxlint-enable typescript/prefer-nullish-coalescing */
Network & Security
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/index.tsx
index 8a4ba5878..612ae0bb1 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/describe-instances/index.tsx
@@ -38,8 +38,8 @@ function Ec2() {
const instances = (
data.Reservations?.flatMap(
- (reservation: Reservation) => reservation.Instances || [],
- ) || []
+ (reservation: Reservation) => reservation.Instances ?? [],
+ ) ?? []
).toSorted((a, b) => {
const pa = statePriority[a.State?.Name ?? ""] ?? 6
const pb = statePriority[b.State?.Name ?? ""] ?? 6
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/run-instances.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/run-instances.tsx
index 4080a5219..f663a2e0b 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/run-instances.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(instances)/run-instances.tsx
@@ -60,7 +60,7 @@ function CreateInstance() {
for (const type of instanceTypesData.InstanceTypes ?? []) {
const typeName = type.InstanceType
if (typeName) {
- instanceTypeCounts[typeName] = (instanceTypeCounts[typeName] || 0) + 1
+ instanceTypeCounts[typeName] = (instanceTypeCounts[typeName] ?? 0) + 1
}
}
@@ -151,7 +151,7 @@ function CreateInstance() {
>
{selectedImage
- ? `${selectedImage.Name || "Unnamed"} (${selectedImage.Architecture})`
+ ? `${selectedImage.Name ?? "Unnamed"} (${selectedImage.Architecture})`
: ""}
@@ -161,7 +161,7 @@ function CreateInstance() {
key={image.ImageId}
value={image.ImageId ?? ""}
>
- {image.Name || "Unnamed"} ({image.Architecture})
+ {image.Name ?? "Unnamed"} ({image.Architecture})
))}
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/$id.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/$id.tsx
index 4ed4c684f..08a118da1 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/$id.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/$id.tsx
@@ -106,7 +106,7 @@ function KeyPairDetail() {
{keyPair.Tags.map((tag) => (
))}
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/index.tsx
index 4c2bc18d9..254b0031c 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(key)/describe-key-pairs/index.tsx
@@ -24,7 +24,7 @@ export const Route = createFileRoute("/_auth/ec2/(key)/describe-key-pairs/")({
function KeyPairs() {
const { data } = useSuspenseQuery(ec2KeyPairsQueryOptions)
- const keyPairs = (data.KeyPairs || []).toSorted((a, b) => {
+ const keyPairs = (data.KeyPairs ?? []).toSorted((a, b) => {
const nameA = a.KeyName?.toLowerCase() ?? ""
const nameB = b.KeyName?.toLowerCase() ?? ""
return nameA.localeCompare(nameB)
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(snapshots)/describe-snapshots/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(snapshots)/describe-snapshots/index.tsx
index 7fd022493..ed32657d6 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(snapshots)/describe-snapshots/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(snapshots)/describe-snapshots/index.tsx
@@ -27,7 +27,7 @@ export const Route = createFileRoute(
function Snapshots() {
const { data } = useSuspenseQuery(ec2SnapshotsQueryOptions)
- const snapshots = data.Snapshots || []
+ const snapshots = data.Snapshots ?? []
return (
<>
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/create-subnet.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/create-subnet.tsx
index 946715274..21c8bfb9d 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/create-subnet.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/create-subnet.tsx
@@ -152,7 +152,7 @@ function CreateSubnet() {
onValueChange={(value) =>
field.onChange(value === "none" ? "" : value)
}
- value={field.value || "none"}
+ value={field.value ?? "none"}
>
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/describe-subnets/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/describe-subnets/index.tsx
index 8872cce7b..fc77b50f6 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/describe-subnets/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(subnet)/describe-subnets/index.tsx
@@ -26,7 +26,7 @@ export const Route = createFileRoute("/_auth/ec2/(subnet)/describe-subnets/")({
function Subnets() {
const { data } = useSuspenseQuery(ec2SubnetsQueryOptions)
- const subnets = data.Subnets || []
+ const subnets = data.Subnets ?? []
return (
<>
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/$id.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/$id.tsx
index 58d964025..181a2f831 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/$id.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/$id.tsx
@@ -113,7 +113,7 @@ function VolumeDetail() {
try {
await detachMutation.mutateAsync({
volumeId: id,
- instanceId: instanceId || undefined,
+ instanceId: instanceId ?? undefined,
force: detachForce || undefined,
})
closeDialog()
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/index.tsx
index 7ef7a6d10..a0b5d9028 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(volumes)/describe-volumes/index.tsx
@@ -25,7 +25,7 @@ export const Route = createFileRoute("/_auth/ec2/(volumes)/describe-volumes/")({
function Volumes() {
const { data } = useSuspenseQuery(ec2VolumesQueryOptions)
- const volumes = data.Volumes || []
+ const volumes = data.Volumes ?? []
return (
<>
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(vpc)/describe-vpcs/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(vpc)/describe-vpcs/index.tsx
index 4d4dc38a8..8222daf52 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(vpc)/describe-vpcs/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/(vpc)/describe-vpcs/index.tsx
@@ -26,7 +26,7 @@ export const Route = createFileRoute("/_auth/ec2/(vpc)/describe-vpcs/")({
function Vpcs() {
const { data } = useSuspenseQuery(ec2VpcsQueryOptions)
- const vpcs = data.Vpcs || []
+ const vpcs = data.Vpcs ?? []
return (
<>
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/ami-details.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/ami-details.tsx
index f1d035101..a11aa1b8f 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/ami-details.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/ami-details.tsx
@@ -47,7 +47,7 @@ export function AmiDetails({
label="Virtualization Type"
value={image.VirtualizationType}
/>
-
+
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/instance-actions.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/instance-actions.tsx
index 185a28675..255758082 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/instance-actions.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/ec2/-components/instance-actions.tsx
@@ -27,7 +27,7 @@ export function InstanceActions({ instanceId, state }: InstanceActionsProps) {
const rebootMutation = useRebootInstance()
const terminateMutation = useTerminateInstance()
- const isTransitioning = TRANSITIONING_STATES.has(state || "")
+ const isTransitioning = TRANSITIONING_STATES.has(state ?? "")
if (isTransitioning && state !== "terminated") {
return (
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(policies)/list-policies/$policyArn.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(policies)/list-policies/$policyArn.tsx
index 52903e9f0..523bf5509 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(policies)/list-policies/$policyArn.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(policies)/list-policies/$policyArn.tsx
@@ -117,7 +117,7 @@ function PolicyDetail() {
-
+
{
+ const policies = (data.Policies ?? []).toSorted((a, b) => {
const nameA = a.PolicyName?.toLowerCase() ?? ""
const nameB = b.PolicyName?.toLowerCase() ?? ""
return nameA.localeCompare(nameB)
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/$userName.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/$userName.tsx
index 3fc5c1b69..8182bd8d0 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/$userName.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/$userName.tsx
@@ -84,9 +84,9 @@ function UserDetail() {
)
const user = userData.User
- const accessKeys = accessKeysData.AccessKeyMetadata || []
- const attachedPolicies = attachedPoliciesData.AttachedPolicies || []
- const allPolicies = allPoliciesData.Policies || []
+ const accessKeys = accessKeysData.AccessKeyMetadata ?? []
+ const attachedPolicies = attachedPoliciesData.AttachedPolicies ?? []
+ const allPolicies = allPoliciesData.Policies ?? []
const attachedArns = new Set(attachedPolicies.map((p) => p.PolicyArn))
const availablePolicies = allPolicies.filter(
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/index.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/index.tsx
index f6d7eaba5..b7d83a78f 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/index.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/iam/(users)/list-users/index.tsx
@@ -21,7 +21,7 @@ export const Route = createFileRoute("/_auth/iam/(users)/list-users/")({
function Users() {
const { data } = useSuspenseQuery(iamUsersQueryOptions)
- const users = (data.Users || []).toSorted((a, b) => {
+ const users = (data.Users ?? []).toSorted((a, b) => {
const nameA = a.UserName?.toLowerCase() ?? ""
const nameB = b.UserName?.toLowerCase() ?? ""
return nameA.localeCompare(nameB)
diff --git a/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx b/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx
index abe6ceb1b..d04c82fab 100644
--- a/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx
+++ b/spinifex/services/spinifexui/frontend/src/routes/_auth/s3/-components/object-list-item.tsx
@@ -85,7 +85,7 @@ export function ObjectListItem({
- {formatSize(object.Size || 0)}
+ {formatSize(object.Size ?? 0)}