Browse Source

Lint tests, format JSON

pull/818/head
philon- 11 months ago
parent
commit
770332dd40
  1. 6
      .vscode/settings.json
  2. 33
      biome.json
  3. 4
      packages/core/package.json
  4. 9
      packages/core/tsconfig.json
  5. 4
      packages/transport-deno/package.json
  6. 8
      packages/transport-http/package.json
  7. 2
      packages/transport-http/tsconfig.json
  8. 4
      packages/transport-node-serial/package.json
  9. 9
      packages/transport-node-serial/tsconfig.json
  10. 4
      packages/transport-node/package.json
  11. 9
      packages/transport-node/tsconfig.json
  12. 4
      packages/transport-web-bluetooth/package.json
  13. 67
      packages/transport-web-bluetooth/src/transport.test.ts
  14. 9
      packages/transport-web-bluetooth/tsconfig.json
  15. 4
      packages/transport-web-serial/package.json
  16. 39
      packages/transport-web-serial/src/transport.test.ts
  17. 9
      packages/transport-web-serial/tsconfig.json
  18. 11
      packages/web/src/core/stores/nodeDBStore/nodeDBStore.test.ts

6
.vscode/settings.json

@ -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"
}

33
biome.json

@ -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"
}
}
}
}
]
}

4
packages/core/package.json

@ -13,7 +13,9 @@
"tsdown": {
"entry": "mod.ts",
"dts": true,
"format": ["esm"],
"format": [
"esm"
],
"splitting": false,
"clean": true
},

9
packages/core/tsconfig.json

@ -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"]
}

4
packages/transport-deno/package.json

@ -12,7 +12,9 @@
"tsdown": {
"entry": "mod.ts",
"dts": true,
"format": ["esm"],
"format": [
"esm"
],
"splitting": false,
"clean": true
},

8
packages/transport-http/package.json

@ -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
},

2
packages/transport-http/tsconfig.json

@ -7,7 +7,7 @@
"outDir": "./dist",
"moduleResolution": "bundler",
"emitDeclarationOnly": false,
"esModuleInterop": true,
"esModuleInterop": true
},
"include": ["src"]
}

4
packages/transport-node-serial/package.json

@ -13,7 +13,9 @@
"tsdown": {
"entry": "mod.ts",
"dts": true,
"format": ["esm"],
"format": [
"esm"
],
"splitting": false,
"clean": true
},

9
packages/transport-node-serial/tsconfig.json

@ -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"]
}

4
packages/transport-node/package.json

@ -14,7 +14,9 @@
"tsdown": {
"entry": "mod.ts",
"dts": true,
"format": ["esm"],
"format": [
"esm"
],
"splitting": false,
"clean": true
},

9
packages/transport-node/tsconfig.json

@ -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"]
}

4
packages/transport-web-bluetooth/package.json

@ -19,7 +19,9 @@
"tsdown": {
"entry": "mod.ts",
"dts": true,
"format": ["esm"],
"format": [
"esm"
],
"splitting": false,
"clean": true
},

67
packages/transport-web-bluetooth/src/transport.test.ts

@ -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();
},
});

9
packages/transport-web-bluetooth/tsconfig.json

@ -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"]
}

4
packages/transport-web-serial/package.json

@ -19,7 +19,9 @@
"tsdown": {
"entry": "mod.ts",
"dts": true,
"format": ["esm"],
"format": [
"esm"
],
"splitting": false,
"clean": true
},

39
packages/transport-web-serial/src/transport.test.ts

@ -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;
}

9
packages/transport-web-serial/tsconfig.json

@ -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"]
}

11
packages/web/src/core/stores/nodeDBStore/nodeDBStore.test.ts

@ -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();

Loading…
Cancel
Save