Skip to content

Commit dc9d07c

Browse files
authored
Merge pull request #86 from whale4113/fix/whale/unique-id
fix(chrome-extension): entry filename already exists
2 parents 737dd95 + 704466d commit dc9d07c

File tree

7 files changed

+81
-32
lines changed

7 files changed

+81
-32
lines changed

.changeset/chatty-signs-check.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@dolphin/chrome-extension': patch
3+
---
4+
5+
fix: entry filename already exists

apps/chrome-extension/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"scripts": {
66
"type-check": "vue-tsc -b",
77
"build": "node --experimental-strip-types ./scripts/cli.ts build",
8-
"dev:pages": "vite"
8+
"dev:pages": "vite",
9+
"test": "vitest run"
910
},
1011
"devDependencies": {
1112
"@babel/core": "catalog:dev",

apps/chrome-extension/src/common/utils.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,32 @@ export const withSignal = async <T>(
3939

4040
return result
4141
}
42+
43+
export class UniqueFileName {
44+
private usedNames = new Set<string>()
45+
private fileNameToPreId = new Map<string, number>()
46+
47+
generate(originFileName: string): string {
48+
let newFileName = originFileName
49+
50+
while (this.usedNames.has(newFileName)) {
51+
const startDotIndex = originFileName.lastIndexOf('.')
52+
53+
const preId = this.fileNameToPreId.get(originFileName) ?? 0
54+
const id = preId + 1
55+
this.fileNameToPreId.set(originFileName, id)
56+
57+
newFileName =
58+
startDotIndex === -1
59+
? originFileName.concat(`-${id.toFixed()}`)
60+
: originFileName
61+
.slice(0, startDotIndex)
62+
.concat(`-${id.toFixed()}`)
63+
.concat(originFileName.slice(startDotIndex))
64+
}
65+
66+
this.usedNames.add(newFileName)
67+
68+
return newFileName
69+
}
70+
}

apps/chrome-extension/src/scripts/download-lark-docx-as-markdown.ts

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import { CommonTranslationKey, en, Namespace, zh } from '../common/i18n'
99
import { confirm } from '../common/notification'
1010
import { legacyFileSave } from '../common/legacy'
1111
import { reportBug } from '../common/issue'
12-
import { withSignal } from '../common/utils'
12+
import { UniqueFileName, withSignal } from '../common/utils'
1313
import { getDownloadSettings } from '../common/settings'
1414
import { DownloadMethod, SettingKey } from '@/common/settings'
1515

16+
const uniqueFileName = new UniqueFileName()
17+
1618
const DOWNLOAD_ABORTED = 'Download aborted'
1719

1820
const enum TranslationKey {
@@ -85,32 +87,6 @@ i18next
8587
})
8688
.catch(console.error)
8789

88-
const usedNames = new Set<string>()
89-
const fileNameToPreId = new Map<string, number>()
90-
const uniqueFileName = (originFileName: string) => {
91-
if (usedNames.has(originFileName)) {
92-
const startDotIndex = originFileName.lastIndexOf('.')
93-
94-
const preId = fileNameToPreId.get(originFileName) ?? 0
95-
const id = preId + 1
96-
fileNameToPreId.set(originFileName, id)
97-
98-
const fileName =
99-
startDotIndex === -1
100-
? originFileName.concat(`-${id.toFixed()}`)
101-
: originFileName
102-
.slice(0, startDotIndex)
103-
.concat(`-${id.toFixed()}`)
104-
.concat(originFileName.slice(startDotIndex))
105-
106-
return fileName
107-
}
108-
109-
usedNames.add(originFileName)
110-
111-
return originFileName
112-
}
113-
11490
interface ProgressOptions {
11591
onProgress?: (progress: number) => void
11692
onComplete?: () => void
@@ -186,7 +162,7 @@ const downloadImage = async (
186162
const content = await fetchBlob()
187163
if (!content) return null
188164

189-
const name = uniqueFileName('diagram.png')
165+
const name = uniqueFileName.generate('diagram.png')
190166
const filename = `images/${name}`
191167

192168
image.url = filename
@@ -205,7 +181,7 @@ const downloadImage = async (
205181
const sources = await fetchSources()
206182
if (!sources) return null
207183

208-
const name = uniqueFileName(originName)
184+
const name = uniqueFileName.generate(originName)
209185
const filename = `images/${name}`
210186

211187
const { src } = sources
@@ -300,7 +276,7 @@ const downloadFile = async (
300276
const result = await withSignal(
301277
async () => {
302278
try {
303-
const filename = `files/${uniqueFileName(name)}`
279+
const filename = `files/${uniqueFileName.generate(name)}`
304280

305281
const response = await fetchFile({ signal: controller.signal })
306282
try {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { UniqueFileName } from '../src/common/utils'
3+
4+
describe('UniqueFileName', () => {
5+
it('should generate unique filename', () => {
6+
const uniqueFilename = new UniqueFileName()
7+
const filename = uniqueFilename.generate('test.txt')
8+
expect(filename).toBe('test.txt')
9+
10+
const filename2 = uniqueFilename.generate('test.txt')
11+
expect(filename2).toBe('test-1.txt')
12+
13+
const filename3 = uniqueFilename.generate('test-1.txt')
14+
expect(filename3).toBe('test-1-1.txt')
15+
16+
const filename4 = uniqueFilename.generate('test-2.txt')
17+
expect(filename4).toBe('test-2.txt')
18+
19+
const filename5 = uniqueFilename.generate('test.txt')
20+
expect(filename5).toBe('test-3.txt')
21+
})
22+
})

apps/chrome-extension/tsconfig.node.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,11 @@
44
"noEmit": true
55
},
66
"extends": "@dolphin/typescript-config/node.json",
7-
"include": ["scripts", "tsdown.config.ts", "vite.config.ts"]
7+
"include": [
8+
"scripts",
9+
"tests",
10+
"tsdown.config.ts",
11+
"vite.config.ts",
12+
"vitest.config.ts"
13+
]
814
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { defineConfig } from 'vitest/config'
2+
3+
export default defineConfig({
4+
resolve: {
5+
conditions: ['dev'],
6+
},
7+
test: {
8+
environment: 'happy-dom',
9+
},
10+
})

0 commit comments

Comments
 (0)