Skip to content

Commit 9fc85a8

Browse files
authored
feat: add package.json dependencies links (disabled by default) (#21)
Can be configured different actions for name & version of the dependency. Co-authored-by: @maIIady
1 parent 24f671d commit 9fc85a8

File tree

7 files changed

+245
-29
lines changed

7 files changed

+245
-29
lines changed

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@
9696
{
9797
"command": "showPackageManagerTerminal",
9898
"title": "Show Package Manager Terminal"
99+
},
100+
{
101+
"command": "openPackageAt",
102+
"title": "Open Package At"
99103
}
100104
],
101105
"menus": {
@@ -202,7 +206,7 @@
202206
"@types/jsonfile": "^6.0.1",
203207
"@types/node": "^16.11.22",
204208
"@zardoy/utils": "^0.0.9",
205-
"@zardoy/vscode-utils": "^0.0.29",
209+
"@zardoy/vscode-utils": "^0.0.41",
206210
"algoliasearch": "^4.14.2",
207211
"change-case": "^4.1.2",
208212
"cross-env": "^7.0.3",

pnpm-lock.yaml

Lines changed: 43 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/commands-core/packageJson.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ type PickedDeps = string[] & {
7979
realDepsCount: number
8080
}
8181

82+
export const packageJsonAllDependenciesKeys = ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies']
83+
export const packageJsonInstallDependenciesKeys = ['dependencies', 'devDependencies', 'optionalDependencies']
84+
8285
export const pickInstalledDeps = async <M extends boolean>({
8386
commandId,
8487
multiple,
@@ -91,7 +94,6 @@ export const pickInstalledDeps = async <M extends boolean>({
9194
flatTypes?
9295
}): Promise<(M extends true ? PickedDeps : string) | undefined> => {
9396
if (!packageJson) ({ packageJson } = await readPackageJsonWithMetadata({ type: 'closest', fallback: true }))
94-
const depsPick: Array<keyof PackageJson> = ['dependencies', 'devDependencies', 'optionalDependencies']
9597
const depsIconMap = {
9698
dependencies: 'package',
9799
devDependencies: 'tools',
@@ -106,7 +108,7 @@ export const pickInstalledDeps = async <M extends boolean>({
106108
const packagesWithTypes = [] as string[]
107109

108110
const pickedDeps = (await showQuickPick(
109-
depsPick.flatMap(depKey => {
111+
packageJsonInstallDependenciesKeys.flatMap(depKey => {
110112
const deps = (packageJson![depKey] as PackageJson['dependencies']) ?? {}
111113
return Object.entries(deps)
112114
.map(

src/commands/openPackageAt.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import * as vscode from 'vscode'
22
import defaultBranch from 'default-branch'
33
import { fromUrl } from 'hosted-git-info'
4-
import { getExtensionCommandId, getExtensionSetting, registerExtensionCommand } from 'vscode-framework'
4+
import { getExtensionCommandId, getExtensionSetting, registerExtensionCommand, RegularCommands, showQuickPick } from 'vscode-framework'
55
import { getCurrentWorkspaceRoot } from '@zardoy/vscode-utils/build/fs'
6+
import { noCase } from 'change-case'
67
import { findUpNodeModules, pickInstalledDeps, readDirPackageJson } from '../commands-core/packageJson'
78
import { joinPackageJson, supportedFileSchemes } from '../commands-core/util'
89

@@ -85,16 +86,39 @@ export const registerOpenPackageAtCommands = () => {
8586

8687
await vscode.env.openExternal((repo.browse() + urlPath) as any)
8788
})
89+
8890
registerExtensionCommand('revealInExplorer', async ({ command: commandId }, module?: string) => {
8991
if (!module) module = await pickInstalledDeps({ commandId, multiple: false, flatTypes: false })
9092
if (module === undefined) return
9193
const moduleUri = await getClosestModulePath(module)
9294
await vscode.commands.executeCommand('revealInExplorer', moduleUri)
9395
})
96+
9497
registerExtensionCommand('openPackagePackageJson', async ({ command: commandId }, module?: string) => {
9598
if (!module) module = await pickInstalledDeps({ commandId, multiple: false, flatTypes: false })
9699
if (module === undefined) return
97100
const packageJsonUri = joinPackageJson(await getClosestModulePath(module))
98101
await vscode.window.showTextDocument(packageJsonUri)
99102
})
103+
104+
registerExtensionCommand('openPackageAt', async ({ command: commandId }, module?: string) => {
105+
if (!module) module = await pickInstalledDeps({ commandId, multiple: false, flatTypes: false })
106+
if (module === undefined) return
107+
const actionCommand = await showQuickPick(
108+
openAtActions.map(action => ({ label: noCase(action), value: action })),
109+
{ title: `Select action for ${module} package` },
110+
)
111+
if (!actionCommand) return
112+
await vscode.commands.executeCommand(getExtensionCommandId(actionCommand), module)
113+
})
100114
}
115+
116+
export const openAtActions: Array<keyof RegularCommands> = [
117+
'openOnNpm',
118+
'openPackageRepository',
119+
'revealInExplorer',
120+
'openPackagePackageJson',
121+
'openPackageReadmePreview',
122+
'openAtJsdelivr',
123+
'openAtPaka',
124+
]

src/configurationType.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ type RunOnSaveRule = {
2222
killPrev: boolean
2323
}
2424

25+
type PackageLinkAction =
26+
| 'disable'
27+
| 'openOnNpm'
28+
| 'openPackageReadmePreview'
29+
| 'openAtJsdelivr'
30+
| 'openPackageRepository'
31+
| 'revealInExplorer'
32+
| 'openPackageJson'
33+
| 'chooseAction'
34+
// always keep in sync:
35+
// @enumDescriptions ["Do not display link with action", "Reveal package at npmjs.com", "Open package's README.MD at side", "Open package's content at jsdelivr.com", "Open package's repository (e.g. at GitHub)", "Reveal package's folder in explorer area", "Open package's package.json file", "Open Quick Pick to let decide the action"]
36+
2537
export type Configuration = {
2638
// TOOD describe difference between builtin setting
2739
/**
@@ -215,6 +227,20 @@ export type Configuration = {
215227
* @default false
216228
*/
217229
packageJsonScriptNameLink: boolean
230+
/**
231+
* Assign the link's action in package.json dependencies objects at dependencies key (name)
232+
* Recommended: `openPackageJson`
233+
* @enumDescriptions ["Do not display link with action", "Reveal package at npmjs.com", "Open package's README.MD at side", "Open package's content at jsdelivr.com", "Open package's repository (e.g. at GitHub)", "Reveal package's folder in explorer area", "Open package's package.json file", "Open Quick Pick to let decide the action"]
234+
* @default disable
235+
*/
236+
depsKeyLinkAction: PackageLinkAction
237+
/**
238+
* Assign the link's action in package.json dependencies objects at dependencies value (version)
239+
* Recommended: `openPackageRepository`
240+
* @enumDescriptions ["Do not display link with action", "Reveal package at npmjs.com", "Open package's README.MD at side", "Open package's content at jsdelivr.com", "Open package's repository (e.g. at GitHub)", "Reveal package's folder in explorer area", "Open package's package.json file", "Open Quick Pick to let decide the action"]
241+
* @default disable
242+
*/
243+
depsValueLinkAction: PackageLinkAction
218244
/** @default true */
219245
// enableTerminalLinkProvider: boolean
220246
}

src/configurationTypeCache.jsonc

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// GENERATED. DON'T EDIT MANUALLY
2-
// md5hash: 1c646648f7a8e134e9ad34cabba831df
2+
// md5hash: 871f0089b070a6d5baae9a3725012f2d
33
{
44
"type": "object",
55
"properties": {
@@ -279,12 +279,64 @@
279279
"description": "Wether to enable links script names to run script",
280280
"default": false,
281281
"type": "boolean"
282+
},
283+
"depsKeyLinkAction": {
284+
"description": "Assign the link's action in package.json dependencies objects at dependencies key (name)\nRecommended: `openPackageJson`",
285+
"enumDescriptions": [
286+
"Do not display link with action",
287+
"Reveal package at npmjs.com",
288+
"Open package's README.MD at side",
289+
"Open package's content at jsdelivr.com",
290+
"Open package's repository (e.g. at GitHub)",
291+
"Reveal package's folder in explorer area",
292+
"Open package's package.json file",
293+
"Open Quick Pick to let decide the action"
294+
],
295+
"default": "disable",
296+
"enum": [
297+
"chooseAction",
298+
"disable",
299+
"openAtJsdelivr",
300+
"openOnNpm",
301+
"openPackageJson",
302+
"openPackageReadmePreview",
303+
"openPackageRepository",
304+
"revealInExplorer"
305+
],
306+
"type": "string"
307+
},
308+
"depsValueLinkAction": {
309+
"description": "Assign the link's action in package.json dependencies objects at dependencies value (version)\nRecommended: `openPackageRepository`",
310+
"enumDescriptions": [
311+
"Do not display link with action",
312+
"Reveal package at npmjs.com",
313+
"Open package's README.MD at side",
314+
"Open package's content at jsdelivr.com",
315+
"Open package's repository (e.g. at GitHub)",
316+
"Reveal package's folder in explorer area",
317+
"Open package's package.json file",
318+
"Open Quick Pick to let decide the action"
319+
],
320+
"default": "disable",
321+
"enum": [
322+
"chooseAction",
323+
"disable",
324+
"openAtJsdelivr",
325+
"openOnNpm",
326+
"openPackageJson",
327+
"openPackageReadmePreview",
328+
"openPackageRepository",
329+
"revealInExplorer"
330+
],
331+
"type": "string"
282332
}
283333
},
284334
"required": [
285335
"addPackages.installTypes",
286336
"codeAction.resolveBranchName",
287337
"codeActions.enableLanguages",
338+
"depsKeyLinkAction",
339+
"depsValueLinkAction",
288340
"install.clipboardDetection",
289341
"install.runOnOpen",
290342
"install.watchDelay",

0 commit comments

Comments
 (0)