Skip to content

Commit 91d0d48

Browse files
msujawsclaude
andcommitted
chore: remove debug logging from api-key-storage
The Uint8Array fix resolved the CI issue. Remove temporary debug logging that was added to diagnose the problem. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 4091b51 commit 91d0d48

File tree

2 files changed

+11
-118
lines changed

2 files changed

+11
-118
lines changed

src/lib/storage/api-key-storage.test.ts

Lines changed: 8 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,24 @@
1-
import { describe, it, expect, beforeEach, beforeAll } from 'vitest'
1+
import { describe, it, expect, beforeEach } from 'vitest'
22
import { ApiKeyStorage, type Storage } from './api-key-storage'
33

4-
// Debug logging for CI - TODO: remove after debugging
5-
const DEBUG = true
6-
const log = (...args: unknown[]) => {
7-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- DEBUG may change
8-
if (DEBUG) {
9-
console.log('[ApiKeyStorage Test]', ...args)
10-
}
11-
}
12-
134
describe('ApiKeyStorage', () => {
145
let storage: ApiKeyStorage
156
let mockStorageData: Record<string, string>
167
let mockStorage: Storage
178
const testKeyMaterial = 'test-key-material-for-encryption'
189

19-
beforeAll(() => {
20-
// Log environment info - eslint disabled for debug logging
21-
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
22-
log('=== Environment Info ===')
23-
log('crypto available:', typeof crypto !== 'undefined')
24-
log('crypto.subtle available:', typeof crypto?.subtle !== 'undefined')
25-
log('globalThis.crypto available:', typeof globalThis.crypto !== 'undefined')
26-
log('globalThis.crypto.subtle available:', typeof globalThis.crypto?.subtle !== 'undefined')
27-
if (typeof crypto !== 'undefined' && crypto.subtle) {
28-
log('crypto.subtle methods:', Object.keys(crypto.subtle))
29-
}
30-
log('========================')
31-
/* eslint-enable @typescript-eslint/no-unnecessary-condition */
32-
})
33-
3410
beforeEach(() => {
3511
// Create in-memory storage mock (no global stubbing needed)
3612
mockStorageData = {}
3713
mockStorage = {
3814
getItem: (key: string) => {
39-
const value = mockStorageData[key]
4015
// eslint-disable-next-line unicorn/no-null -- localStorage API returns null
41-
const result = value ?? null
42-
log(`mockStorage.getItem('${key}'):`, value ? `${value.slice(0, 50)}...` : 'null')
43-
return result
16+
return mockStorageData[key] ?? null
4417
},
4518
setItem: (key: string, value: string) => {
46-
log(`mockStorage.setItem('${key}'):`, value.slice(0, 50) + '...')
4719
mockStorageData[key] = value
4820
},
4921
removeItem: (key: string) => {
50-
log(`mockStorage.removeItem('${key}')`)
5122
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
5223
delete mockStorageData[key]
5324
},
@@ -58,7 +29,6 @@ describe('ApiKeyStorage', () => {
5829
keyMaterial: testKeyMaterial,
5930
storage: mockStorage,
6031
})
61-
log('Created new ApiKeyStorage instance with keyMaterial:', testKeyMaterial)
6232
})
6333

6434
describe('saveApiKey', () => {
@@ -96,30 +66,10 @@ describe('ApiKeyStorage', () => {
9666
it('should retrieve and decrypt saved API key', async () => {
9767
const apiKey = 'test-api-key-456'
9868

99-
log('--- Test: should retrieve and decrypt saved API key ---')
100-
log('Input apiKey:', apiKey)
101-
102-
try {
103-
log('Calling saveApiKey...')
104-
await storage.saveApiKey(apiKey)
105-
log('saveApiKey completed, mockStorageData:', JSON.stringify(mockStorageData))
106-
} catch (error) {
107-
log('saveApiKey FAILED with error:', error)
108-
throw error
109-
}
69+
await storage.saveApiKey(apiKey)
70+
const retrieved = await storage.getApiKey()
11071

111-
try {
112-
log('Calling getApiKey...')
113-
const retrieved = await storage.getApiKey()
114-
log('getApiKey returned:', retrieved)
115-
log('Expected:', apiKey)
116-
log('Match:', retrieved === apiKey)
117-
118-
expect(retrieved).toBe(apiKey)
119-
} catch (error) {
120-
log('getApiKey FAILED with error:', error)
121-
throw error
122-
}
72+
expect(retrieved).toBe(apiKey)
12373
})
12474

12575
it('should return undefined when no API key is stored', async () => {
@@ -195,34 +145,10 @@ describe('ApiKeyStorage', () => {
195145
it('should successfully decrypt after multiple save/retrieve cycles', async () => {
196146
const keys = ['key1', 'key2', 'key3']
197147

198-
log('--- Test: should successfully decrypt after multiple save/retrieve cycles ---')
199-
200148
for (const key of keys) {
201-
log(`\nCycle for key: '${key}'`)
202-
try {
203-
log('Calling saveApiKey...')
204-
await storage.saveApiKey(key)
205-
log(
206-
'saveApiKey completed, stored value:',
207-
mockStorageData['bugzilla_api_key']?.slice(0, 50),
208-
)
209-
} catch (error) {
210-
log('saveApiKey FAILED:', error)
211-
throw error
212-
}
213-
214-
try {
215-
log('Calling getApiKey...')
216-
const retrieved = await storage.getApiKey()
217-
log('getApiKey returned:', retrieved)
218-
log('Expected:', key)
219-
log('Match:', retrieved === key)
220-
221-
expect(retrieved).toBe(key)
222-
} catch (error) {
223-
log('getApiKey FAILED:', error)
224-
throw error
225-
}
149+
await storage.saveApiKey(key)
150+
const retrieved = await storage.getApiKey()
151+
expect(retrieved).toBe(key)
226152
}
227153
})
228154
})

src/lib/storage/api-key-storage.ts

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,6 @@ export class ApiKeyStorage {
4343
private async deriveCryptoKey(): Promise<CryptoKey> {
4444
// Use user agent as key material (stable across sessions), or override for testing
4545
const keySource = this.keyMaterialOverride ?? navigator.userAgent
46-
// Debug logging - TODO: remove after debugging CI issue
47-
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
48-
console.log(
49-
'[ApiKeyStorage.deriveCryptoKey] keySource length:',
50-
keySource?.length,
51-
'using override:',
52-
!!this.keyMaterialOverride,
53-
)
54-
console.log('[ApiKeyStorage.deriveCryptoKey] crypto.subtle available:', !!crypto?.subtle)
55-
/* eslint-enable @typescript-eslint/no-unnecessary-condition */
5646
const keyMaterial = this.encoder.encode(keySource + 'bugzilla-kanban-salt')
5747

5848
// Import as raw key material
@@ -63,10 +53,9 @@ export class ApiKeyStorage {
6353
false,
6454
['deriveBits', 'deriveKey'],
6555
)
66-
console.log('[ApiKeyStorage.deriveCryptoKey] importKey succeeded')
6756

6857
// Derive actual encryption key
69-
const derivedKey = await crypto.subtle.deriveKey(
58+
return crypto.subtle.deriveKey(
7059
{
7160
name: 'PBKDF2',
7261
salt: this.encoder.encode('bugzilla-kanban'),
@@ -78,8 +67,6 @@ export class ApiKeyStorage {
7867
false,
7968
['encrypt', 'decrypt'],
8069
)
81-
console.log('[ApiKeyStorage.deriveCryptoKey] deriveKey succeeded')
82-
return derivedKey
8370
}
8471

8572
/**
@@ -153,16 +140,8 @@ export class ApiKeyStorage {
153140
* Save API key to localStorage (encrypted)
154141
*/
155142
async saveApiKey(apiKey: string): Promise<void> {
156-
console.log('[ApiKeyStorage.saveApiKey] saving key of length:', apiKey.length)
157143
const encrypted = await this.encrypt(apiKey)
158-
console.log(
159-
'[ApiKeyStorage.saveApiKey] encrypted, iv length:',
160-
encrypted.iv.length,
161-
'data length:',
162-
encrypted.encryptedData.length,
163-
)
164144
this.storage.setItem(STORAGE_KEY, JSON.stringify(encrypted))
165-
console.log('[ApiKeyStorage.saveApiKey] saved to storage')
166145
}
167146

168147
/**
@@ -171,27 +150,15 @@ export class ApiKeyStorage {
171150
async getApiKey(): Promise<string | undefined> {
172151
const stored = this.storage.getItem(STORAGE_KEY)
173152

174-
// Debug logging for CI
175-
console.log('[ApiKeyStorage.getApiKey] stored value:', stored ? 'exists' : 'null')
176-
177153
if (!stored) {
178154
return undefined
179155
}
180156

181157
try {
182158
const encrypted = JSON.parse(stored) as EncryptedData
183-
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
184-
console.log(
185-
'[ApiKeyStorage.getApiKey] parsed encrypted data, iv length:',
186-
encrypted.iv?.length,
187-
)
188-
const result = await this.decrypt(encrypted)
189-
console.log('[ApiKeyStorage.getApiKey] decrypt succeeded, result length:', result?.length)
190-
/* eslint-enable @typescript-eslint/no-unnecessary-condition */
191-
return result
192-
} catch (error) {
159+
return await this.decrypt(encrypted)
160+
} catch {
193161
// Invalid or corrupted data
194-
console.error('[ApiKeyStorage.getApiKey] decrypt FAILED:', error)
195162
return undefined
196163
}
197164
}

0 commit comments

Comments
 (0)