|
1 | 1 | import * as vscode from 'vscode'
|
2 | 2 | import defaultBranch from 'default-branch'
|
3 |
| -import { fromUrl } from 'hosted-git-info' |
4 | 3 | import { getExtensionCommandId, getExtensionSetting, registerExtensionCommand, RegularCommands, showQuickPick } from 'vscode-framework'
|
5 | 4 | import { getCurrentWorkspaceRoot } from '@zardoy/vscode-utils/build/fs'
|
6 | 5 | import { noCase } from 'change-case'
|
7 | 6 | import { findUpNodeModules, pickInstalledDeps, readDirPackageJson } from '../commands-core/packageJson'
|
8 | 7 | import { joinPackageJson, supportedFileSchemes } from '../commands-core/util'
|
| 8 | +import { getPackageRepositoryUrl } from './npmOpenRepository' |
9 | 9 |
|
10 | 10 | /** get module dir URI from closest node_modules */
|
11 | 11 | const getClosestModulePath = async (module: string, path = '') => {
|
@@ -53,38 +53,34 @@ export const registerOpenPackageAtCommands = () => {
|
53 | 53 | if (!module) module = await pickInstalledDeps({ commandId, multiple: false, flatTypes: false })
|
54 | 54 | if (module === undefined) return
|
55 | 55 | const cwd = await getClosestModulePath(module)
|
56 |
| - let { repository } = await readDirPackageJson(cwd) |
| 56 | + const manifest = await readDirPackageJson(cwd) |
| 57 | + const { repository } = manifest |
57 | 58 | if (!repository) {
|
58 | 59 | // TODO try to resolve url automatically
|
59 | 60 | const action = await vscode.window.showWarningMessage(`${module} doesn't have repository field`, 'Open on NPM')
|
60 | 61 | if (action === 'Open on NPM') await vscode.commands.executeCommand(getExtensionCommandId('openOnNpm'), module)
|
61 | 62 | return
|
62 | 63 | }
|
63 | 64 |
|
64 |
| - // TODO use lib from vsce |
65 |
| - // TODO support just url |
66 |
| - let repoDir: string | undefined |
67 |
| - if (typeof repository === 'object') { |
68 |
| - repoDir = repository.directory |
69 |
| - repository = repository.url |
70 |
| - } |
71 |
| - |
72 |
| - const repo = fromUrl(repository)! |
73 |
| - let urlPath = '' |
74 |
| - if (repo.domain === 'github.com' && repoDir) { |
75 |
| - let branchName: string |
| 65 | + const handlePathManually = typeof repository === 'object' && repository.url.startsWith('https://github.com/') && repository.directory |
| 66 | + let openPath = '' |
| 67 | + if (handlePathManually) { |
| 68 | + let branchName = 'master' |
76 | 69 | if (getExtensionSetting('codeAction.resolveBranchName')) {
|
77 |
| - console.time('get branch') |
78 |
| - branchName = await defaultBranch(`${repo.user}/${repo.project}`) |
79 |
| - console.timeEnd('get branch') |
80 |
| - } else { |
81 |
| - branchName = 'master' |
| 70 | + console.time('get repo github branch') |
| 71 | + branchName = await defaultBranch(repository.url) |
| 72 | + console.timeEnd('get repo github branch') |
82 | 73 | }
|
83 | 74 |
|
84 |
| - urlPath = `/tree/${branchName}/${repoDir}` |
| 75 | + openPath = `/tree/${branchName}/${repository.directory!.replace(/^\//, '')}` |
85 | 76 | }
|
86 | 77 |
|
87 |
| - await vscode.env.openExternal((repo.browse() + urlPath) as any) |
| 78 | + try { |
| 79 | + const url: string = getPackageRepositoryUrl(module, { repository }, !handlePathManually) |
| 80 | + await vscode.commands.executeCommand('vscode.open', url.replace(/\/$/, '') + openPath) |
| 81 | + } catch (err) { |
| 82 | + await vscode.window.showWarningMessage(err.message ?? err.stack) |
| 83 | + } |
88 | 84 | })
|
89 | 85 |
|
90 | 86 | registerExtensionCommand('revealInExplorer', async ({ command: commandId }, module?: string) => {
|
|
0 commit comments