Lint tests, format JSON (#818)
This commit is contained in:
Vendored
+3
-3
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"editor.formatOnSave": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.biome": "explicit",
|
||||
"source.fixAll.biome": "explicit"
|
||||
},
|
||||
"search.exclude": {
|
||||
"**/i18n/locales/*-*/**": true,
|
||||
"**/i18n/locales/*-*/**": true
|
||||
},
|
||||
"vitest.workspaceConfig": "vitest.config.ts",
|
||||
"vitest.workspaceConfig": "vitest.config.ts"
|
||||
}
|
||||
|
||||
+30
-3
@@ -1,6 +1,14 @@
|
||||
{
|
||||
"files": {
|
||||
"includes": ["**/*.ts", "**/*.tsx", "!**/*.test.ts", "!**/*.test.tsx", "!npm_modules/**", "!dist/**", "!npm/**"],
|
||||
"includes": [
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
"!npm_modules/**",
|
||||
"!dist/**",
|
||||
"!npm/**",
|
||||
"**/*.json",
|
||||
"!**/locales/*-*/*.json"
|
||||
],
|
||||
"ignoreUnknown": false
|
||||
},
|
||||
"formatter": {
|
||||
@@ -36,9 +44,28 @@
|
||||
"semicolons": "always"
|
||||
}
|
||||
},
|
||||
"json": {
|
||||
"json": {
|
||||
"formatter": {
|
||||
"enabled": false
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"includes": [
|
||||
"**/*.test.ts",
|
||||
"**/*.test.tsx",
|
||||
"**/__tests__/**/*.{ts,tsx}"
|
||||
],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"suspicious": {
|
||||
"noExplicitAny": "off"
|
||||
},
|
||||
"style": {
|
||||
"noNonNullAssertion": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
@@ -7,12 +7,7 @@
|
||||
"outDir": "./dist",
|
||||
"moduleResolution": "bundler",
|
||||
"emitDeclarationOnly": false,
|
||||
"esModuleInterop": true,
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
"name": "@meshtastic/transport-http",
|
||||
"version": "0.2.3-2",
|
||||
"description": "A transport layer for Meshtastic applications using HTTP.",
|
||||
"exports": {".": "./mod.ts"},
|
||||
"exports": {
|
||||
".": "./mod.ts"
|
||||
},
|
||||
"type": "module",
|
||||
"files": [
|
||||
"package.json",
|
||||
@@ -17,7 +19,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"outDir": "./dist",
|
||||
"moduleResolution": "bundler",
|
||||
"emitDeclarationOnly": false,
|
||||
"esModuleInterop": true,
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
@@ -13,7 +13,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
@@ -7,12 +7,7 @@
|
||||
"outDir": "./dist",
|
||||
"moduleResolution": "bundler",
|
||||
"emitDeclarationOnly": false,
|
||||
"esModuleInterop": true,
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
@@ -7,12 +7,7 @@
|
||||
"outDir": "./dist",
|
||||
"moduleResolution": "bundler",
|
||||
"emitDeclarationOnly": false,
|
||||
"esModuleInterop": true,
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { describe, vi, expect, beforeEach, afterEach } from "vitest";
|
||||
import { describe, expect, vi } from "vitest";
|
||||
import { runTransportContract } from "../../../tests/utils/transportContract";
|
||||
import { TransportWebBluetooth } from "./transport";
|
||||
|
||||
class MiniEmitter {
|
||||
private listeners = new Map<string, Set<(e: Event) => void>>();
|
||||
addEventListener(type: string, listener: (e: Event) => void) {
|
||||
if (!this.listeners.has(type)) this.listeners.set(type, new Set());
|
||||
if (!this.listeners.has(type)) {
|
||||
this.listeners.set(type, new Set());
|
||||
}
|
||||
this.listeners.get(type)!.add(listener);
|
||||
}
|
||||
removeEventListener(type: string, listener: (e: Event) => void) {
|
||||
@@ -66,10 +68,16 @@ function stubWebBluetooth() {
|
||||
// Primary service returns our three characteristics by UUID
|
||||
const primaryService: BluetoothRemoteGATTService = {
|
||||
async getCharacteristic(uuid: string) {
|
||||
if (uuid === TransportWebBluetooth.ToRadioUuid) return toRadioCharacteristic;
|
||||
if (uuid === TransportWebBluetooth.FromRadioUuid) return fromRadioCharacteristic;
|
||||
if (uuid === TransportWebBluetooth.FromNumUuid) return fromNumCharacteristic;
|
||||
throw new Error("Unknown characteristic: " + uuid);
|
||||
if (uuid === TransportWebBluetooth.ToRadioUuid) {
|
||||
return toRadioCharacteristic;
|
||||
}
|
||||
if (uuid === TransportWebBluetooth.FromRadioUuid) {
|
||||
return fromRadioCharacteristic;
|
||||
}
|
||||
if (uuid === TransportWebBluetooth.FromNumUuid) {
|
||||
return fromNumCharacteristic;
|
||||
}
|
||||
throw new Error(`Unknown characteristic: ${uuid}`);
|
||||
},
|
||||
} as unknown as BluetoothRemoteGATTService;
|
||||
|
||||
@@ -94,10 +102,20 @@ function stubWebBluetooth() {
|
||||
return primaryService;
|
||||
},
|
||||
device: {
|
||||
addEventListener: (...args: Parameters<EventTarget["addEventListener"]>) =>
|
||||
deviceEmitter.addEventListener(args[0] as string, args[1] as (e: Event) => void),
|
||||
removeEventListener: (...args: Parameters<EventTarget["removeEventListener"]>) =>
|
||||
deviceEmitter.removeEventListener(args[0] as string, args[1] as (e: Event) => void),
|
||||
addEventListener: (
|
||||
...args: Parameters<EventTarget["addEventListener"]>
|
||||
) =>
|
||||
deviceEmitter.addEventListener(
|
||||
args[0] as string,
|
||||
args[1] as (e: Event) => void,
|
||||
),
|
||||
removeEventListener: (
|
||||
...args: Parameters<EventTarget["removeEventListener"]>
|
||||
) =>
|
||||
deviceEmitter.removeEventListener(
|
||||
args[0] as string,
|
||||
args[1] as (e: Event) => void,
|
||||
),
|
||||
} as unknown as BluetoothDevice,
|
||||
} as unknown as BluetoothRemoteGATTServer;
|
||||
|
||||
@@ -114,7 +132,10 @@ function stubWebBluetooth() {
|
||||
},
|
||||
};
|
||||
|
||||
vi.stubGlobal("navigator", Object.assign({}, globalThis.navigator, fakeNavigator));
|
||||
vi.stubGlobal(
|
||||
"navigator",
|
||||
Object.assign({}, globalThis.navigator, fakeNavigator),
|
||||
);
|
||||
|
||||
// helper actions for tests/contract
|
||||
return {
|
||||
@@ -142,24 +163,36 @@ describe("TransportWebBluetooth (contract)", () => {
|
||||
name: "TransportWebBluetooth",
|
||||
setup: () => {},
|
||||
teardown: () => {
|
||||
(globalThis as unknown as { __ble?: ReturnType<typeof stubWebBluetooth> }).__ble?.cleanup();
|
||||
(globalThis as unknown as { __ble?: ReturnType<typeof stubWebBluetooth> }).__ble = undefined;
|
||||
(
|
||||
globalThis as unknown as { __ble?: ReturnType<typeof stubWebBluetooth> }
|
||||
).__ble?.cleanup();
|
||||
(
|
||||
globalThis as unknown as { __ble?: ReturnType<typeof stubWebBluetooth> }
|
||||
).__ble = undefined;
|
||||
vi.restoreAllMocks();
|
||||
vi.unstubAllGlobals();
|
||||
},
|
||||
create: async () => {
|
||||
(globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }).__ble = stubWebBluetooth();
|
||||
(
|
||||
globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }
|
||||
).__ble = stubWebBluetooth();
|
||||
return await TransportWebBluetooth.create();
|
||||
},
|
||||
pushIncoming: async (bytes) => {
|
||||
(globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }).__ble.pushIncoming(bytes);
|
||||
(
|
||||
globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }
|
||||
).__ble.pushIncoming(bytes);
|
||||
await Promise.resolve();
|
||||
},
|
||||
assertLastWritten: (bytes) => {
|
||||
(globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }).__ble.assertLastWritten(bytes);
|
||||
(
|
||||
globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }
|
||||
).__ble.assertLastWritten(bytes);
|
||||
},
|
||||
triggerDisconnect: async () => {
|
||||
(globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }).__ble.triggerGattDisconnect();
|
||||
(
|
||||
globalThis as unknown as { __ble: ReturnType<typeof stubWebBluetooth> }
|
||||
).__ble.triggerGattDisconnect();
|
||||
await Promise.resolve();
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
@@ -8,12 +8,7 @@
|
||||
"moduleResolution": "bundler",
|
||||
"emitDeclarationOnly": false,
|
||||
"esModuleInterop": true,
|
||||
"types": ["@types/web-bluetooth"],
|
||||
"types": ["@types/web-bluetooth"]
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"dts": true,
|
||||
"format": ["esm"],
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"clean": true
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
||||
import { TransportWebSerial } from "./transport";
|
||||
import { Types, Utils } from "@meshtastic/core";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { runTransportContract } from "../../../tests/utils/transportContract";
|
||||
import { TransportWebSerial } from "./transport";
|
||||
|
||||
function stubCoreTransforms() {
|
||||
const toDevice = new TransformStream<Uint8Array, Uint8Array>({
|
||||
@@ -45,14 +45,26 @@ function stubNavigatorSerial() {
|
||||
const handlers = new Set<SerialDisconnectHandler>();
|
||||
|
||||
const serialStub = {
|
||||
addEventListener: (type: string, handler: EventListenerOrEventListenerObject) => {
|
||||
if (type === "disconnect") handlers.add(handler as any as SerialDisconnectHandler);
|
||||
addEventListener: (
|
||||
type: string,
|
||||
handler: EventListenerOrEventListenerObject,
|
||||
) => {
|
||||
if (type === "disconnect") {
|
||||
handlers.add(handler as any as SerialDisconnectHandler);
|
||||
}
|
||||
},
|
||||
removeEventListener: (type: string, handler: EventListenerOrEventListenerObject) => {
|
||||
if (type === "disconnect") handlers.delete(handler as any as SerialDisconnectHandler);
|
||||
removeEventListener: (
|
||||
type: string,
|
||||
handler: EventListenerOrEventListenerObject,
|
||||
) => {
|
||||
if (type === "disconnect") {
|
||||
handlers.delete(handler as any as SerialDisconnectHandler);
|
||||
}
|
||||
},
|
||||
dispatchDisconnect(port: any) {
|
||||
for (const h of handlers) h({ port });
|
||||
for (const h of handlers) {
|
||||
h({ port });
|
||||
}
|
||||
},
|
||||
requestPort: vi.fn(async () => new FakeSerialPort()),
|
||||
};
|
||||
@@ -201,8 +213,12 @@ describe("TransportWebSerial (extras)", () => {
|
||||
// drain statuses until connected
|
||||
for (let i = 0; i < 3; i++) {
|
||||
const { value } = await reader.read();
|
||||
if (!value || value.type !== "status") break;
|
||||
if (value.data.status === Types.DeviceStatusEnum.DeviceConnected) break;
|
||||
if (!value || value.type !== "status") {
|
||||
break;
|
||||
}
|
||||
if (value.data.status === Types.DeviceStatusEnum.DeviceConnected) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// fire OS-level disconnect
|
||||
@@ -212,7 +228,10 @@ describe("TransportWebSerial (extras)", () => {
|
||||
let saw = false;
|
||||
for (let i = 0; i < 6; i++) {
|
||||
const { value } = await reader.read();
|
||||
if (value?.type === "status" && value.data.reason === "serial-disconnected") {
|
||||
if (
|
||||
value?.type === "status" &&
|
||||
value.data.reason === "serial-disconnected"
|
||||
) {
|
||||
saw = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
@@ -8,12 +8,7 @@
|
||||
"moduleResolution": "bundler",
|
||||
"emitDeclarationOnly": false,
|
||||
"esModuleInterop": true,
|
||||
"types": ["@types/w3c-web-serial"],
|
||||
"types": ["@types/w3c-web-serial"]
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ vi.mock("@core/services/featureFlags", () => {
|
||||
return {
|
||||
featureFlags: {
|
||||
get: vi.fn((key: string) => {
|
||||
if (key === "persistNodeDB") return true;
|
||||
if (key === "persistNodeDB") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}),
|
||||
},
|
||||
@@ -64,7 +66,7 @@ describe("NodeDB store", () => {
|
||||
expect(db.getNode(10)?.num).toBe(10);
|
||||
|
||||
const all = db.getNodes();
|
||||
expect(all.map(n => n.num).sort()).toEqual([10, 11]);
|
||||
expect(all.map((n) => n.num).sort()).toEqual([10, 11]);
|
||||
|
||||
db.removeNode(10);
|
||||
expect(db.getNodesLength()).toBe(1);
|
||||
@@ -128,7 +130,6 @@ describe("NodeDB store", () => {
|
||||
const { useNodeDBStore } = await freshStore();
|
||||
const st = useNodeDBStore.getState();
|
||||
|
||||
|
||||
const oldDB = st.addNodeDB(10);
|
||||
oldDB.setNodeNum(999);
|
||||
oldDB.addNode(makeNode(200));
|
||||
@@ -202,7 +203,9 @@ describe("NodeDB store", () => {
|
||||
it("when exceeding cap, evicts earliest inserted, not the newly added", async () => {
|
||||
const { useNodeDBStore } = await freshStore();
|
||||
const st = useNodeDBStore.getState();
|
||||
for (let i = 1; i <= 10; i++) st.addNodeDB(i);
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
st.addNodeDB(i);
|
||||
}
|
||||
st.addNodeDB(11);
|
||||
expect(st.getNodeDB(1)).toBeUndefined();
|
||||
expect(st.getNodeDB(11)).toBeDefined();
|
||||
|
||||
Reference in New Issue
Block a user