Skip to content

Commit 72ed925

Browse files
committed
Use Object.hasOwn instead of in keyword
1 parent 47aff3c commit 72ed925

8 files changed

Lines changed: 35 additions & 26 deletions

File tree

src/app.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ declare global {
1313
declare interface Window {
1414
turnstile: TurnstileInstance | undefined;
1515
}
16+
interface ObjectConstructor {
17+
hasOwn<T extends object, K extends PropertyKey>(
18+
o: T,
19+
prop: K,
20+
): o is T & Record<K, unknown>;
21+
}
1622
}
1723

1824
export {};

src/lib/errorhandling/apiErrorHandling.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export async function handleApiError(
4242
return;
4343
}
4444

45-
if ('cause' in error) {
45+
if (Object.hasOwn(error, 'cause')) {
4646
console.error('Got unknown error type: ' + JSON.stringify(error)); // TODO: Display toast
4747
return;
4848
}

src/lib/signalr/models/ControlLog.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@ export interface ControlLog {
1515
function isControlLogShockerInfo(value: unknown): value is ControlLogShockerInfo {
1616
return (
1717
isObject(value) &&
18-
'id' in value &&
18+
Object.hasOwn(value, 'id') &&
19+
Object.hasOwn(value, 'name') &&
1920
isString(value.id) &&
20-
'name' in value &&
2121
isString(value.name)
2222
);
2323
}
2424
export function isControlLog(value: unknown): value is ControlLog {
2525
return (
2626
isObject(value) &&
27-
'shocker' in value &&
27+
Object.hasOwn(value, 'shocker') &&
28+
Object.hasOwn(value, 'type') &&
29+
Object.hasOwn(value, 'intensity') &&
30+
Object.hasOwn(value, 'duration') &&
31+
Object.hasOwn(value, 'executedAt') &&
2832
isControlLogShockerInfo(value.shocker) &&
29-
'type' in value &&
3033
isNumber(value.type) &&
31-
'intensity' in value &&
3234
isNumber(value.intensity) &&
33-
'duration' in value &&
3435
isNumber(value.duration) &&
35-
'executedAt' in value &&
3636
isString(value.executedAt)
3737
);
3838
}

src/lib/signalr/models/ControlLogSender.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { isObject, isString } from '$lib/typeguards';
22

33
export interface ControlLogSender {
44
connectionId: string;
5-
additionalItems: { [key: string]: object };
5+
additionalItems: object;
66
id: string;
77
name: string;
88
image: string;
@@ -12,18 +12,17 @@ export interface ControlLogSender {
1212
export function isControlLogSender(value: unknown): value is ControlLogSender {
1313
return (
1414
isObject(value) &&
15-
'connectionId' in value &&
15+
Object.hasOwn(value, 'connectionId') &&
16+
Object.hasOwn(value, 'additionalItems') &&
17+
Object.hasOwn(value, 'id') &&
18+
Object.hasOwn(value, 'name') &&
19+
Object.hasOwn(value, 'image') &&
20+
Object.hasOwn(value, 'customName') &&
1621
isString(value.connectionId) &&
17-
'additionalItems' in value &&
1822
isObject(value.additionalItems) &&
19-
Object.values(value.additionalItems).every(isObject) &&
20-
'id' in value &&
2123
isString(value.id) &&
22-
'name' in value &&
2324
isString(value.name) &&
24-
'image' in value &&
2525
isString(value.image) &&
26-
'customName' in value &&
2726
(value.customName === null || isString(value.customName))
2827
);
2928
}
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isObject } from '$lib/typeguards';
1+
import { isBoolean, isObject, isString } from '$lib/typeguards';
22

33
export interface DeviceOnlineState {
44
device: string;
@@ -9,11 +9,11 @@ export interface DeviceOnlineState {
99
export function isDeviceOnlineState(value: unknown): value is DeviceOnlineState {
1010
return (
1111
isObject(value) &&
12-
'device' in value &&
13-
'online' in value &&
14-
'firmwareVersion' in value &&
15-
typeof value.device === 'string' &&
16-
typeof value.online === 'boolean' &&
17-
(typeof value.firmwareVersion === 'string' || value.firmwareVersion === null)
12+
Object.hasOwn(value, 'device') &&
13+
Object.hasOwn(value, 'online') &&
14+
Object.hasOwn(value, 'firmwareVersion') &&
15+
isString(value.device) &&
16+
isBoolean(value.online) &&
17+
(value.firmwareVersion === null || isString(value.firmwareVersion))
1818
);
1919
}

src/lib/typeguards/basicGuards.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
export function isObject(data: unknown): data is object {
2-
return typeof data === 'object' && data !== null;
1+
export function isObject(value: unknown): value is object {
2+
return typeof value === 'object' && !Array.isArray(value) && value !== null;
33
}
44
export function isString(value: unknown): value is string {
55
return typeof value === 'string' || value instanceof String;
@@ -14,5 +14,5 @@ export function isArrayBuffer(value: unknown): value is ArrayBuffer {
1414
return value instanceof ArrayBuffer;
1515
}
1616
export function isDate(value: unknown): value is Date {
17-
return value instanceof Date && !isNaN(value.getTime());
17+
return value instanceof Date;
1818
}

tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"extends": "./.svelte-kit/tsconfig.json",
33
"compilerOptions": {
4+
"lib": ["es2022", "DOM"],
45
"allowJs": true,
56
"checkJs": true,
67
"esModuleInterop": true,

vite.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ export default defineConfig(async ({ command, mode, isPreview }) => {
6464
const useLocalRedirect = isLocalServe && !isProduction && !isTruthy(env.CI);
6565

6666
return defineConfig({
67+
build: {
68+
target: 'es2022'
69+
},
6770
plugins: [...(useLocalRedirect ? [mkcert()] : []), sveltekit(), tailwindcss()],
6871
server: await getServerConfig(mode, useLocalRedirect),
6972
test: { include: ['src/**/*.{test,spec}.{js,ts}'] },

0 commit comments

Comments
 (0)