From fcacac3fc1617f34532b96c06755d6d8d1622b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Mon, 7 Sep 2026 16:19:39 +0200 Subject: [PATCH 1/2] Merge Electron src and test tsconfig --- .changeset/electron-single-tsconfig.md | 2 ++ packages/electron/tsconfig.base.json | 18 ------------------ packages/electron/tsconfig.json | 19 +++++++++++++++---- packages/electron/tsconfig.test.json | 13 ------------- 4 files changed, 17 insertions(+), 35 deletions(-) create mode 100644 .changeset/electron-single-tsconfig.md delete mode 100644 packages/electron/tsconfig.base.json delete mode 100644 packages/electron/tsconfig.test.json diff --git a/.changeset/electron-single-tsconfig.md b/.changeset/electron-single-tsconfig.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/electron-single-tsconfig.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/electron/tsconfig.base.json b/packages/electron/tsconfig.base.json deleted file mode 100644 index ee52e33f76a..00000000000 --- a/packages/electron/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2019", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "preserve", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx" - } -} diff --git a/packages/electron/tsconfig.json b/packages/electron/tsconfig.json index 455bdc92f74..bea43e10d3c 100644 --- a/packages/electron/tsconfig.json +++ b/packages/electron/tsconfig.json @@ -1,13 +1,24 @@ { - "extends": "./tsconfig.base.json", "compilerOptions": { + "target": "ES2019", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "preserve", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", "declaration": true, "declarationDir": "dist/types", "declarationMap": true, "emitDeclarationOnly": true, "rootDir": "./src" }, - "include": ["src"], - "exclude": ["src/**/__tests__/**"], - "references": [{ "path": "./tsconfig.test.json" }] + "include": ["src"] } diff --git a/packages/electron/tsconfig.test.json b/packages/electron/tsconfig.test.json deleted file mode 100644 index 4f9dcdd38bd..00000000000 --- a/packages/electron/tsconfig.test.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - // composite so tsserver can load this via tsconfig.json references (tsc --noEmit requires it). - "composite": true, - "declaration": true, - "emitDeclarationOnly": true, - "outDir": "node_modules/.cache/tsconfig-test", - "tsBuildInfoFile": "node_modules/.cache/tsconfig-test.tsbuildinfo" - }, - "include": ["src/**/__tests__/**/*.ts", "src/**/__tests__/**/*.tsx"], - "exclude": ["node_modules", "dist"] -} From cdcaf959387e411070029d615abd01674ca20f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Mon, 7 Sep 2026 16:19:54 +0200 Subject: [PATCH 2/2] Fix TS errors in Electron tests --- .../__tests__/create-clerk-bridge.test.ts | 36 ++++++++----------- .../src/passkeys/__tests__/index.test.ts | 30 ++++++++-------- .../react/__tests__/ClerkProvider.test.tsx | 2 +- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/packages/electron/src/main/__tests__/create-clerk-bridge.test.ts b/packages/electron/src/main/__tests__/create-clerk-bridge.test.ts index 4b66d664cb1..d7617f08d99 100644 --- a/packages/electron/src/main/__tests__/create-clerk-bridge.test.ts +++ b/packages/electron/src/main/__tests__/create-clerk-bridge.test.ts @@ -58,6 +58,12 @@ const windowSender = { mainFrame, getType: () => 'window' }; const mainFrameEvent = { sender: windowSender, senderFrame: mainFrame } as unknown as Electron.IpcMainInvokeEvent; const subframeEvent = { sender: windowSender, senderFrame: {} } as unknown as Electron.IpcMainInvokeEvent; +function getAppListener void>(event: string): T | undefined { + return (vi.mocked(app.on).mock.calls as unknown as Array<[string, T]>).find( + ([registered]) => registered === event, + )?.[1]; +} + describe('createClerkBridge', () => { const missingStorage = {} as Parameters[0]; const storage: TokenStorage = { @@ -145,7 +151,6 @@ describe('createClerkBridge', () => { host: 'renderer', scheme: 'my-app', privileges: { - allowExtensions: true, allowServiceWorkers: true, bypassCSP: true, codeCache: true, @@ -157,7 +162,6 @@ describe('createClerkBridge', () => { { scheme: 'my-app', privileges: { - allowExtensions: true, allowServiceWorkers: true, bypassCSP: true, codeCache: true, @@ -590,12 +594,9 @@ describe('createClerkBridge', () => { return channel === OAUTH_TRANSPORT_CHANNELS.open; })?.[1]; const openPromise = openHandler?.(mainFrameEvent, 'https://accounts.example.com/oauth'); - const openUrlListener = vi.mocked(app.on).mock.calls.find(([event]) => event === 'open-url')?.[1] as ( - event: Electron.Event, - url: string, - ) => void; + const openUrlListener = getAppListener<(event: Electron.Event, url: string) => void>('open-url'); - openUrlListener({ preventDefault: vi.fn() } as unknown as Electron.Event, 'my-app://renderer/?code=123'); + openUrlListener?.({ preventDefault: vi.fn() } as unknown as Electron.Event, 'my-app://renderer/?code=123'); await expect(openPromise).resolves.toEqual({ callbackUrl: 'my-app://renderer/?code=123' }); expect(shell.openExternal).toHaveBeenCalledWith('https://accounts.example.com/oauth'); @@ -615,12 +616,9 @@ describe('createClerkBridge', () => { return channel === OAUTH_TRANSPORT_CHANNELS.open; })?.[1]; const openPromise = openHandler?.(mainFrameEvent, 'https://accounts.example.com/oauth'); - const secondInstanceListener = vi.mocked(app.on).mock.calls.find(([event]) => event === 'second-instance')?.[1] as ( - event: Electron.Event, - argv: string[], - ) => void; + const secondInstanceListener = getAppListener<(event: Electron.Event, argv: string[]) => void>('second-instance'); - secondInstanceListener({} as Electron.Event, [ + secondInstanceListener?.({} as Electron.Event, [ '/opt/MyApp/my-app', '--enable-features=UseOzonePlatform', 'my-app://renderer/?code=123', @@ -647,12 +645,9 @@ describe('createClerkBridge', () => { return channel === OAUTH_TRANSPORT_CHANNELS.open; })?.[1]; const openPromise = openHandler?.(mainFrameEvent, 'https://accounts.example.com/oauth'); - const secondInstanceListener = vi.mocked(app.on).mock.calls.find(([event]) => event === 'second-instance')?.[1] as ( - event: Electron.Event, - argv: string[], - ) => void; + const secondInstanceListener = getAppListener<(event: Electron.Event, argv: string[]) => void>('second-instance'); - secondInstanceListener({} as Electron.Event, ['/opt/MyApp/my-app', 'my-app://renderer/?code=123']); + secondInstanceListener?.({} as Electron.Event, ['/opt/MyApp/my-app', 'my-app://renderer/?code=123']); await expect(openPromise).resolves.toEqual({ callbackUrl: 'my-app://renderer/?code=123' }); expect(rendererWindow.restore).toHaveBeenCalledOnce(); @@ -676,13 +671,10 @@ describe('createClerkBridge', () => { return channel === OAUTH_TRANSPORT_CHANNELS.open; })?.[1]; const openPromise = openHandler?.(mainFrameEvent, 'https://accounts.example.com/oauth'); - const secondInstanceListener = vi.mocked(app.on).mock.calls.find(([event]) => event === 'second-instance')?.[1] as ( - event: Electron.Event, - argv: string[], - ) => void; + const secondInstanceListener = getAppListener<(event: Electron.Event, argv: string[]) => void>('second-instance'); rendererWindow.isDestroyed.mockReturnValue(true); - secondInstanceListener({} as Electron.Event, ['/opt/MyApp/my-app', 'my-app://renderer/?code=123']); + secondInstanceListener?.({} as Electron.Event, ['/opt/MyApp/my-app', 'my-app://renderer/?code=123']); await expect(openPromise).resolves.toEqual({ callbackUrl: 'my-app://renderer/?code=123' }); expect(rendererWindow.focus).not.toHaveBeenCalled(); diff --git a/packages/electron/src/passkeys/__tests__/index.test.ts b/packages/electron/src/passkeys/__tests__/index.test.ts index e4208870153..f493bbac7ee 100644 --- a/packages/electron/src/passkeys/__tests__/index.test.ts +++ b/packages/electron/src/passkeys/__tests__/index.test.ts @@ -1,4 +1,8 @@ import { webAuthnCreateCredential, webAuthnGetCredential } from '@clerk/shared/internal/clerk-js/passkeys'; +import type { + PublicKeyCredentialCreationOptionsWithoutExtensions, + PublicKeyCredentialRequestOptionsWithoutExtensions, +} from '@clerk/shared/types'; import { isWebAuthnAutofillSupported } from '@clerk/shared/webauthn'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; @@ -22,7 +26,7 @@ vi.mock('@clerk/shared/webauthn', () => ({ const HELLO_B64URL = 'aGVsbG8'; -const creationOptions = () => +const creationOptions = (): PublicKeyCredentialCreationOptionsWithoutExtensions => ({ rp: { id: 'example.com', name: 'Example' }, user: { id: new Uint8Array([1]).buffer, name: 'jdoe', displayName: 'J Doe' }, @@ -37,28 +41,26 @@ const creationOptions = () => }, attestation: 'none', excludeCredentials: [], - }) as never; + }) as PublicKeyCredentialCreationOptionsWithoutExtensions; -const requestOptions = () => +const requestOptions = (): PublicKeyCredentialRequestOptionsWithoutExtensions => ({ challenge: new Uint8Array([1, 2, 3]).buffer, rpId: 'example.com', timeout: 60_000, userVerification: 'required', allowCredentials: [], - }) as never; + }) as PublicKeyCredentialRequestOptionsWithoutExtensions; -const creationOptionsForRpId = (rpId: string) => - ({ - ...creationOptions(), - rp: { id: rpId, name: 'Example' }, - }) as never; +const creationOptionsForRpId = (rpId: string): PublicKeyCredentialCreationOptionsWithoutExtensions => ({ + ...creationOptions(), + rp: { id: rpId, name: 'Example' }, +}); -const requestOptionsForRpId = (rpId: string) => - ({ - ...requestOptions(), - rpId, - }) as never; +const requestOptionsForRpId = (rpId: string): PublicKeyCredentialRequestOptionsWithoutExtensions => ({ + ...requestOptions(), + rpId, +}); const registrationJSON = { id: HELLO_B64URL, diff --git a/packages/electron/src/react/__tests__/ClerkProvider.test.tsx b/packages/electron/src/react/__tests__/ClerkProvider.test.tsx index a67d00d501c..a7b451521f7 100644 --- a/packages/electron/src/react/__tests__/ClerkProvider.test.tsx +++ b/packages/electron/src/react/__tests__/ClerkProvider.test.tsx @@ -306,7 +306,7 @@ describe('Electron ClerkProvider', () => { tokenCache.getToken.mockResolvedValue('client-jwt'); renderToStaticMarkup(App); - const request = { + const request: { credentials?: RequestCredentials; headers: Headers; url: URL } = { headers: new Headers(), url: new URL('https://api.clerk.test/v1/client'), };