Skip to content

Commit 4a00c8f

Browse files
committed
perf: skip to resolving clipboard when target alias is subset of source alias
1 parent 61a515a commit 4a00c8f

File tree

3 files changed

+83
-17
lines changed

3 files changed

+83
-17
lines changed

src/extension.ts

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { Alias } from './types'
1010
import {
1111
filterAliases,
1212
formatUnaliasCommand,
13+
isAliasSubset,
1314
isSameAlias,
1415
mergeAlias,
1516
normalizeAliasesToArray,
@@ -205,25 +206,27 @@ class AliasView implements vscode.TreeDataProvider<AliasItem> {
205206
{
206207
const content = await vscode.env.clipboard.readText()
207208
const aliases = filterAliases(content)
208-
if (aliases.length) {
209-
const result = mergeAlias(this.convertAliasToObject(), {
210-
[SYSTEM_ALIAS]: aliases,
211-
})
212-
const systemAliases: Alias[] = Reflect.get(result, SYSTEM_ALIAS)
213-
await this.globalState.update(SYSTEM_ALIAS, systemAliases)
214-
deleteAliases(storePath.path)
215-
appendAliasToStoreFile(
216-
storePath.path,
217-
systemAliases.map((alias) => `\nalias ${alias.aliasName}='${alias.command}'`).join(''),
218-
)
219-
executeCommandInTerminal(
220-
systemAliases.map((alias) => `alias ${alias.aliasName}='${alias.command}'`).join('; '),
221-
)
222-
this.refresh()
223-
vscode.window.showInformationMessage(vscode.l10n.t('Import clipboard text successfully'))
224-
} else {
209+
210+
if (!aliases.length || isAliasSubset(Reflect.get(this.convertAliasToObject(), SYSTEM_ALIAS), aliases)) {
225211
vscode.window.showInformationMessage(vscode.l10n.t('No any alias need to import'))
212+
return
226213
}
214+
215+
const result = mergeAlias(this.convertAliasToObject(), {
216+
[SYSTEM_ALIAS]: aliases,
217+
})
218+
const systemAliases: Alias[] = Reflect.get(result, SYSTEM_ALIAS)
219+
await this.globalState.update(SYSTEM_ALIAS, systemAliases)
220+
deleteAliases(storePath.path)
221+
appendAliasToStoreFile(
222+
storePath.path,
223+
systemAliases.map((alias) => `\nalias ${alias.aliasName}='${alias.command}'`).join(''),
224+
)
225+
executeCommandInTerminal(
226+
systemAliases.map((alias) => `alias ${alias.aliasName}='${alias.command}'`).join('; '),
227+
)
228+
this.refresh()
229+
vscode.window.showInformationMessage(vscode.l10n.t('Import clipboard text successfully'))
227230
}
228231
break
229232
case json:
@@ -255,6 +258,7 @@ class AliasView implements vscode.TreeDataProvider<AliasItem> {
255258

256259
return acc
257260
}, {})
261+
258262
if (Object.values(targetAlias).length) {
259263
const result = mergeAlias(this.convertAliasToObject(), targetAlias)
260264
for (const [groupName, aliases] of Object.entries(result)) {

src/utils.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,19 @@ export function filterAliases(content: string) {
241241

242242
return aliases
243243
}
244+
245+
/**
246+
* Check if the target is a subset of the source alias
247+
* @param {Alias[]} source
248+
* @param {Alias[]} target
249+
* @returns {boolean}
250+
*/
251+
export function isAliasSubset(source: Alias[], target: Alias[]) {
252+
const set = new Set()
253+
source.forEach((alias) => {
254+
const { aliasName, command } = alias
255+
set.add(`${aliasName}=${command}`)
256+
})
257+
258+
return target.every((alias) => set.has(`${alias.aliasName}=${alias.command}`))
259+
}

tests/utils.spec.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
allNotEqualToTarget,
66
filterAliases,
77
formatUnaliasCommand,
8+
isAliasSubset,
89
isSameAlias,
910
isValid,
1011
mergeAlias,
@@ -310,3 +311,48 @@ describe('test merge alias', () => {
310311
})
311312
})
312313
})
314+
315+
describe('test is alias subset', () => {
316+
const source: Alias[] = [
317+
{ aliasName: 'a', command: 'cmd1' },
318+
{ aliasName: 'b', command: 'cmd2' },
319+
{ aliasName: 'c', command: 'cmd3' },
320+
]
321+
322+
it('is subset', () => {
323+
const target: Alias[] = [
324+
{ aliasName: 'a', command: 'cmd1' },
325+
{ aliasName: 'b', command: 'cmd2' },
326+
]
327+
328+
expect(isAliasSubset(source, target)).toBe(true)
329+
})
330+
331+
it('has different aliasName', () => {
332+
const target: Alias[] = [
333+
{ aliasName: 'c', command: 'cmd1' },
334+
{ aliasName: 'b', command: 'cmd3' },
335+
]
336+
337+
expect(isAliasSubset(source, target)).toBe(false)
338+
})
339+
340+
it('has different command', () => {
341+
const target: Alias[] = [
342+
{ aliasName: 'a', command: 'cmd1' },
343+
{ aliasName: 'b', command: 'cmd3' },
344+
]
345+
346+
expect(isAliasSubset(source, target)).toBe(false)
347+
})
348+
349+
it('has another alias', () => {
350+
const target: Alias[] = [
351+
{ aliasName: 'a', command: 'cmd1' },
352+
{ aliasName: 'b', command: 'cmd2' },
353+
{ aliasName: 'd', command: 'cmd4' },
354+
]
355+
356+
expect(isAliasSubset(source, target)).toBe(false)
357+
})
358+
})

0 commit comments

Comments
 (0)