Skip to content

Commit 83d1ed7

Browse files
committed
fix(clipboard-link-detection): don't spam with *Install packages?* notification on every windows focus
chore: enable typechecking for codebase on CI chore: first unit test
1 parent 1a94fb0 commit 83d1ed7

10 files changed

+91
-42
lines changed

.eslintrc.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
22
"extends": "zardoy",
3-
"rules": {}
3+
"rules": {
4+
"@typescript-eslint/prefer-nullish-coalescing": "off"
5+
}
46
}

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
"capabilities": {
119119
"untrustedWorkspaces": {
120120
"supported": false,
121-
"description": "This extension needs to run arbitrary commands provided by package manager, installed on your system"
121+
"description": "This extension needs to run arbitrary commands provided by package manager installed on your system"
122122
},
123123
"virtualWorkspaces": {
124124
"supported": "limited",
@@ -141,8 +141,9 @@
141141
],
142142
"scripts": {
143143
"start": "vscode-framework start",
144-
"build": "vscode-framework build --skip-typechecking",
145-
"lint": "eslint src/**"
144+
"build": "vscode-framework build",
145+
"lint": "eslint src/**",
146+
"test": "jest"
146147
},
147148
"devDependencies": {
148149
"@types/fs-extra": "^9.0.13",

src/autocompletion.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/core/clipboardDetection.test.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/core/clipboardDetection.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ import { getPrefferedPackageManager, packageManagerCommand } from '../commands-c
55
import { confirmAction, getCurrentWorkspaceRoot } from '../commands-core/util'
66

77
export const registerClipboardDetection = () => {
8+
let lastAskedClipboardString = null as string | null
89
vscode.window.onDidChangeWindowState(async ({ focused }) => {
910
if (!focused) return
1011
if (getExtensionSetting('install.clipboardDetection') === 'disabled') return
11-
const clipboardText = (await vscode.env.clipboard.readText()).trim()
12+
const clipboardText = await vscode.env.clipboard.readText().then(str => str.trim())
13+
if (lastAskedClipboardString === clipboardText) return
14+
// don't spam with messages on every window focus
15+
lastAskedClipboardString = clipboardText
1216
const result = getPackagesFromInstallCmd(clipboardText)
1317
if (!result) return
1418

@@ -28,19 +32,18 @@ export const registerClipboardDetection = () => {
2832
}
2933

3034
export const getPackagesFromInstallCmd = (input: string) => {
31-
// const regex = /^(npm|yarn|pnpm) (?:i|install|add)((?: (?:@[a-z\d~-][a-z\d._~-]*\/)?[a-z\d~-][a-z\d._~-]*)+)$/
35+
// stricter regex: /^(npm|yarn|pnpm) (?:i|install|add)((?: (?:@[a-z\d~-][a-z\d._~-]*\/)?[a-z\d~-][a-z\d._~-]*)+)$/
3236
const result = /^(npm|yarn|pnpm) (?:i|install|add) (.+)$/.exec(input.trim())
3337
if (!result) return
3438
const packageManager = result[1]!
39+
// space delimiter is fine, since package names can't have space within
3540
let [flags, packages] = partition(result[2]!.split(' '), value => value.startsWith('-'))
3641
const preserveFlags = new Set(['--global', '-g', '--ignore-scripts'])
3742
// lodash-marker
38-
flags = flags.filter(flag => preserveFlags.has(flag) || flag.startsWith('--save') || ['dev', '-D'].includes(flag))
43+
flags = flags.filter(flag => preserveFlags.has(flag) || flag.startsWith('--save') || ['--dev', '-D'].includes(flag))
3944
return {
4045
packageManager,
4146
packages,
4247
flags,
4348
}
4449
}
45-
46-
const yarnStripSavePart = (input: string) => {}

src/packageJsonAutoComplete.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ import { parseTree, getLocation } from 'jsonc-parser'
33
import { getExtensionSetting } from 'vscode-framework'
44

55
export const registerPackageJsonAutoComplete = () => {
6-
if (true || !getExtensionSetting('scriptsCompletion')) return
7-
vscode.languages.registerCompletionItemProvider('json', {
8-
provideCompletionItems(document, position, token, context) {
9-
if (!document.uri.path.endsWith('package.json')) return []
10-
11-
const offset = document.offsetAt(position)
12-
const node = parseTree(document.getText())
13-
if (!node) return
14-
// getNdoeAtLocation
15-
// console.log(getLocation(document.getText(), offset).matches(['scripts', '*']))
16-
},
17-
})
6+
// if (true || !getExtensionSetting('scriptsCompletion')) return
7+
// vscode.languages.registerCompletionItemProvider('json', {
8+
// provideCompletionItems(document, position, token, context) {
9+
// if (!document.uri.path.endsWith('package.json')) return []
10+
// const offset = document.offsetAt(position)
11+
// const node = parseTree(document.getText())
12+
// if (!node) return
13+
// // getNdoeAtLocation
14+
// // console.log(getLocation(document.getText(), offset).matches(['scripts', '*']))
15+
// },
16+
// })
1817
}

test/__mocks__/fkill.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = {}

test/__mocks__/vscode.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = {}

test/clipboardDetection.test.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/// <reference types="jest" />
2+
import { getPackagesFromInstallCmd } from '../src/core/clipboardDetection'
3+
4+
describe('getPackagesFromInstallCmd', () => {
5+
test('0', () => {
6+
expect(getPackagesFromInstallCmd('npm i foo')).toMatchInlineSnapshot(`
7+
Object {
8+
"flags": Array [],
9+
"packageManager": "npm",
10+
"packages": Array [
11+
"foo",
12+
],
13+
}
14+
`)
15+
})
16+
test('1', () => {
17+
expect(getPackagesFromInstallCmd('npm i foo --dev bar --dangerous-flag foo -D some-another-package')).toMatchInlineSnapshot(`
18+
Object {
19+
"flags": Array [
20+
"--dev",
21+
"-D",
22+
],
23+
"packageManager": "npm",
24+
"packages": Array [
25+
"foo",
26+
"bar",
27+
"foo",
28+
"some-another-package",
29+
],
30+
}
31+
`)
32+
})
33+
test('2', () => {
34+
expect(getPackagesFromInstallCmd('yarn add "test" --dev')).toMatchInlineSnapshot(`
35+
Object {
36+
"flags": Array [
37+
"--dev",
38+
],
39+
"packageManager": "yarn",
40+
"packages": Array [
41+
"\\"test\\"",
42+
],
43+
}
44+
`)
45+
})
46+
test('3', () => {
47+
expect(getPackagesFromInstallCmd('pnpm install "test" --save-dev -foo "-d" 83')).toMatchInlineSnapshot(`
48+
Object {
49+
"flags": Array [
50+
"--save-dev",
51+
],
52+
"packageManager": "pnpm",
53+
"packages": Array [
54+
"\\"test\\"",
55+
"\\"-d\\"",
56+
"83",
57+
],
58+
}
59+
`)
60+
})
61+
})

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"extends": "@zardoy/tsconfig/node",
3-
"include": ["src"]
3+
"include": ["src"],
4+
"exclude": ["src/webview"]
45
}

0 commit comments

Comments
 (0)