refactor: switch to using Bun (#718)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user