refactor: switch to using Bun (#718)

This commit is contained in:
Dan Ditomaso
2025-07-16 22:30:10 -04:00
committed by GitHub
parent acfd7ebd2d
commit 704d06cfe7
401 changed files with 35294 additions and 39107 deletions
+9 -9
View File
@@ -1,6 +1,6 @@
import { fromByteArray } from "base64-js";
import { describe, expect, it } from "vitest";
import { makeChannelSchema } from "./channel.ts";
import { fromByteArray } from "base64-js";
const mockRole = 0;
@@ -42,8 +42,8 @@ describe("makeChannelSchema", () => {
expect(result.success).toBe(false);
if (!result.success) {
expect(
result.error.issues.some((i) =>
i.path.includes("settings") && i.path.includes("psk")
result.error.issues.some(
(i) => i.path.includes("settings") && i.path.includes("psk"),
),
).toBe(true);
}
@@ -59,8 +59,8 @@ describe("makeChannelSchema", () => {
expect(result.success).toBe(false);
if (!result.success) {
expect(
result.error.issues.some((i) =>
i.path.includes("settings") && i.path.includes("psk")
result.error.issues.some(
(i) => i.path.includes("settings") && i.path.includes("psk"),
),
).toBe(true);
}
@@ -76,8 +76,8 @@ describe("makeChannelSchema", () => {
expect(result.success).toBe(false);
if (!result.success) {
expect(
result.error.issues.some((i) =>
i.path.includes("settings") && i.path.includes("name")
result.error.issues.some(
(i) => i.path.includes("settings") && i.path.includes("name"),
),
).toBe(true);
}
@@ -92,8 +92,8 @@ describe("makeChannelSchema", () => {
expect(result.success).toBe(false);
if (!result.success) {
expect(
result.error.issues.some((i) =>
i.path.includes("settings") && i.path.includes("channelNum")
result.error.issues.some(
(i) => i.path.includes("settings") && i.path.includes("channelNum"),
),
).toBe(true);
}
+7 -8
View File
@@ -1,7 +1,7 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { makePskHelpers } from "./pskSchema.ts";
import { validateMaxByteLength } from "@core/utils/string.ts";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
import { makePskHelpers } from "./pskSchema.ts";
const RoleEnum = z.enum(Protobuf.Channel.Channel_Role);
@@ -19,11 +19,10 @@ export function makeChannelSchema(allowedBytes: number) {
const ChannelSettingsSchema = z.object({
channelNum: z.coerce.number().int().min(0).max(7),
psk: stringSchema(false),
name: z.string()
.refine(
(s) => validateMaxByteLength(s, 12).isValid,
{ message: "formValidation.tooBig.bytes", params: { maximum: 12 } },
),
name: z.string().refine((s) => validateMaxByteLength(s, 12).isValid, {
message: "formValidation.tooBig.bytes",
params: { maximum: 12 },
}),
id: z.coerce.number().int(),
uplinkEnabled: z.boolean(),
downlinkEnabled: z.boolean(),
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const PairingModeEnum = z.enum(
Protobuf.Config.Config_BluetoothConfig_PairingMode,
+2 -4
View File
@@ -1,9 +1,7 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const RoleEnum = z.enum(
Protobuf.Config.Config_DeviceConfig_Role,
);
const RoleEnum = z.enum(Protobuf.Config.Config_DeviceConfig_Role);
const RebroadcastModeEnum = z.enum(
Protobuf.Config.Config_DeviceConfig_RebroadcastMode,
);
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const GpsCoordinateEnum = z.enum(
Protobuf.Config.Config_DisplayConfig_GpsCoordinateFormat,
@@ -7,9 +7,7 @@ const GpsCoordinateEnum = z.enum(
const DisplayUnitsEnum = z.enum(
Protobuf.Config.Config_DisplayConfig_DisplayUnits,
);
const OledTypeEnum = z.enum(
Protobuf.Config.Config_DisplayConfig_OledType,
);
const OledTypeEnum = z.enum(Protobuf.Config.Config_DisplayConfig_OledType);
const DisplayModeEnum = z.enum(
Protobuf.Config.Config_DisplayConfig_DisplayMode,
);
+3 -7
View File
@@ -1,12 +1,8 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const ModemPresetEnum = z.enum(
Protobuf.Config.Config_LoRaConfig_ModemPreset,
);
const RegionCodeEnum = z.enum(
Protobuf.Config.Config_LoRaConfig_RegionCode,
);
const ModemPresetEnum = z.enum(Protobuf.Config.Config_LoRaConfig_ModemPreset);
const RegionCodeEnum = z.enum(Protobuf.Config.Config_LoRaConfig_RegionCode);
export const LoRaValidationSchema = z.object({
usePreset: z.boolean(),
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const AddressModeEnum = z.enum(
Protobuf.Config.Config_NetworkConfig_AddressMode,
@@ -1,9 +1,7 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const GpsModeEnum = z.enum(
Protobuf.Config.Config_PositionConfig_GpsMode,
);
const GpsModeEnum = z.enum(Protobuf.Config.Config_PositionConfig_GpsMode);
export const PositionValidationSchema = z.object({
positionBroadcastSecs: z.coerce.number().int().min(0),
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { fromByteArray } from "base64-js";
import { describe, expect, it } from "vitest";
import { ParsedSecuritySchema, RawSecuritySchema } from "./security.ts";
function makeBase64OfLength(len: number): string {
@@ -34,8 +34,9 @@ describe("RawSecuritySchema", () => {
});
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues.some((i) => i.path.includes("privateKey")))
.toBe(true);
expect(
result.error.issues.some((i) => i.path.includes("privateKey")),
).toBe(true);
}
});
@@ -52,8 +53,8 @@ describe("RawSecuritySchema", () => {
expect(result.success).toBe(false);
if (!result.success) {
expect(
result.error.issues.some((i) =>
i.message === "formValidation.required.managed"
result.error.issues.some(
(i) => i.message === "formValidation.required.managed",
),
).toBe(true);
}
@@ -102,8 +103,8 @@ describe("ParsedSecuritySchema", () => {
expect(result.success).toBe(false);
if (!result.success) {
expect(
result.error.issues.some((i) =>
i.message === "formValidation.required.managed"
result.error.issues.some(
(i) => i.message === "formValidation.required.managed",
),
).toBe(true);
}
@@ -1,11 +1,7 @@
import { z, ZodType } from "zod/v4";
import { type ZodType, z } from "zod/v4";
import { makePskHelpers } from "./../pskSchema.ts";
const {
stringSchema,
bytesSchema,
isValidKey,
} = makePskHelpers([32]); // 256-bit
const { stringSchema, bytesSchema, isValidKey } = makePskHelpers([32]); // 256-bit
const isManagedRequiredMsg = "formValidation.required.managed";
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const Audio_BaudEnum = z.enum(
Protobuf.ModuleConfig.ModuleConfig_AudioConfig_Audio_Baud,
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const InputEventCharEnum = z.enum(
Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar,
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const detectionTriggerTypeEnum = z.enum(
Protobuf.ModuleConfig.ModuleConfig_DetectionSensorConfig_TriggerType,
@@ -1,5 +1,5 @@
import { z } from "zod/v4";
import { Protobuf } from "@meshtastic/core";
import { z } from "zod/v4";
const Serial_BaudEnum = z.enum(
Protobuf.ModuleConfig.ModuleConfig_SerialConfig_Serial_Baud,
@@ -13,6 +13,4 @@ export const TelemetryValidationSchema = z.object({
powerScreenEnabled: z.boolean(),
});
export type TelemetryValidation = z.infer<
typeof TelemetryValidationSchema
>;
export type TelemetryValidation = z.infer<typeof TelemetryValidationSchema>;
@@ -1,6 +1,6 @@
import { fromByteArray } from "base64-js";
import { describe, expect, it } from "vitest";
import { makePskHelpers } from "./pskSchema.ts";
import { fromByteArray } from "base64-js";
function makeBase64OfLength(len: number): string {
return fromByteArray(new Uint8Array(len));
@@ -71,7 +71,7 @@ describe("stringSchema", () => {
it("rejects base64 string with correct length but extra padding", () => {
const { stringSchema, msgs } = makePskHelpers([16]);
const valid = makeBase64OfLength(16) + "==";
const valid = `${makeBase64OfLength(16)}==`;
const result = stringSchema().safeParse(valid);
expect(result.success).toBe(false);
if (!result.success) {
+19 -17
View File
@@ -1,9 +1,7 @@
import { z, ZodType } from "zod/v4";
import { toByteArray } from "base64-js";
import { type ZodType, z } from "zod/v4";
export function makePskHelpers(
allowedByteLengths: readonly number[],
) {
export function makePskHelpers(allowedByteLengths: readonly number[]) {
const bitsLabel = allowedByteLengths.map((b) => b * 8).join(" | ");
const msgs = {
format: "formValidation.invalidFormat.key",
@@ -21,12 +19,13 @@ export function makePskHelpers(
function isValidString(str: string): boolean {
const arr = tryParse(str);
return arr !== null &&
allowedByteLengths.includes(arr.byteLength);
return arr !== null && allowedByteLengths.includes(arr.byteLength);
}
function isValidKey(v: unknown): boolean {
if (typeof v === "string") return isValidString(v);
if (typeof v === "string") {
return isValidString(v);
}
if (v instanceof Uint8Array) {
return allowedByteLengths.includes(v.byteLength);
}
@@ -34,21 +33,24 @@ export function makePskHelpers(
}
const stringSchema = (optional = false) =>
z.string()
.refine((s) =>
optional || s !== "" || (s === "" && allowedByteLengths.includes(0)), {
message: msgs.required,
})
.refine((s) =>
s === "" || tryParse(s) !== null, { message: msgs.format })
.refine((s) =>
s === "" || isValidString(s), {
z
.string()
.refine(
(s) =>
optional || s !== "" || (s === "" && allowedByteLengths.includes(0)),
{
message: msgs.required,
},
)
.refine((s) => s === "" || tryParse(s) !== null, { message: msgs.format })
.refine((s) => s === "" || isValidString(s), {
message: msgs.length,
params: { bits: bitsLabel },
});
const bytesSchema = (optional = false): ZodType<Uint8Array> =>
z.instanceof(Uint8Array)
z
.instanceof(Uint8Array)
.refine(
(arr) =>
optional || arr.byteLength !== 0 || allowedByteLengths.includes(0),
+2 -3
View File
@@ -1,4 +1,4 @@
import { ZodError, ZodType } from "zod/v4";
import type { ZodError, ZodType } from "zod/v4";
export function validateSchema<T>(
schema: ZodType<T>,
@@ -7,7 +7,6 @@ export function validateSchema<T>(
const result = schema.safeParse(data);
if (result.success) {
return { success: true, data: result.data };
} else {
return { success: false, errors: result.error.issues };
}
return { success: false, errors: result.error.issues };
}