Skip to content

Commit 8caaa25

Browse files
committed
Merge branch 'main' into resolve
# Conflicts: # src/index.ts
2 parents 5a14242 + c24bca6 commit 8caaa25

8 files changed

Lines changed: 71 additions & 299 deletions

File tree

src/constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ export const YARN_WORKSPACE_BASENAME = '.yarnrc.yml'
44

55
export const SUPPORTED_DOCUMENT_PATTERN = `**/{${PACKAGE_JSON_BASENAME},${PNPM_WORKSPACE_BASENAME},${YARN_WORKSPACE_BASENAME}}`
66

7-
export const VERSION_TRIGGER_CHARACTERS = [':', '^', '~', '.', ...Array.from({ length: 10 }).map((_, i) => `${i}`)]
87
export const PRERELEASE_PATTERN = /-.+/
98

109
export const CACHE_TTL_ONE_DAY = 1000 * 60 * 60 * 24

src/index.ts

Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,22 @@
1-
import { SUPPORTED_DOCUMENT_PATTERN, VERSION_TRIGGER_CHARACTERS } from '#constants'
2-
import { defineExtension, useCommands, watchEffect } from 'reactive-vscode'
3-
import { languages } from 'vscode'
1+
import { defineExtension, useCommands } from 'reactive-vscode'
42
import { openFileInNpmx } from './commands/open-file-in-npmx'
53
import { openInBrowser } from './commands/open-in-browser'
64
import { commands, displayName, version } from './generated-meta'
75
import { useCodeActions } from './providers/code-actions'
8-
import { VersionCompletionItemProvider } from './providers/completion-item/version'
6+
import { useCompletionItem } from './providers/completion-item'
97
import { useDiagnostics } from './providers/diagnostics'
10-
import { NpmxDocumentLinkProvider } from './providers/document-link/npmx'
11-
import { NpmxHoverProvider } from './providers/hover/npmx'
12-
import { config, logger } from './state'
13-
14-
const documentFilter = { pattern: SUPPORTED_DOCUMENT_PATTERN }
8+
import { useDocumentLink } from './providers/document-link'
9+
import { useHover } from './providers/hover'
10+
import { logger } from './state'
1511

1612
export const { activate, deactivate } = defineExtension(() => {
1713
logger.info(`${displayName} Activated, v${version}`)
1814

19-
watchEffect((onCleanup) => {
20-
if (!config.hover.enabled)
21-
return
22-
23-
const disposable = languages.registerHoverProvider(documentFilter, new NpmxHoverProvider())
24-
25-
onCleanup(() => disposable.dispose())
26-
})
27-
28-
watchEffect((onCleanup) => {
29-
if (config.completion.version === 'off')
30-
return
31-
32-
const disposable = languages.registerCompletionItemProvider(
33-
documentFilter,
34-
new VersionCompletionItemProvider(),
35-
...VERSION_TRIGGER_CHARACTERS,
36-
)
37-
38-
onCleanup(() => disposable.dispose())
39-
})
40-
41-
watchEffect((onCleanup) => {
42-
if (config.packageLinks === 'off')
43-
return
44-
45-
const disposable = languages.registerDocumentLinkProvider(documentFilter, new NpmxDocumentLinkProvider())
46-
47-
onCleanup(() => disposable.dispose())
48-
})
49-
5015
useDiagnostics()
51-
5216
useCodeActions()
17+
useHover()
18+
useCompletionItem()
19+
useDocumentLink()
5320

5421
useCommands({
5522
[commands.openInBrowser]: openInBrowser,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { SUPPORTED_DOCUMENT_PATTERN } from '#constants'
2+
import { config } from '#state'
3+
import { watchEffect } from 'reactive-vscode'
4+
import { languages } from 'vscode'
5+
import { VersionCompletionItemProvider } from './version'
6+
7+
export const VERSION_TRIGGER_CHARACTERS = [':', '^', '~', '.', ...Array.from({ length: 10 }).map((_, i) => `${i}`)]
8+
9+
export function useCompletionItem() {
10+
watchEffect((onCleanup) => {
11+
if (!config.hover.enabled)
12+
return
13+
14+
const disposable = languages.registerCompletionItemProvider(
15+
{ pattern: SUPPORTED_DOCUMENT_PATTERN },
16+
new VersionCompletionItemProvider(),
17+
...VERSION_TRIGGER_CHARACTERS,
18+
)
19+
20+
onCleanup(() => disposable.dispose())
21+
})
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { SUPPORTED_DOCUMENT_PATTERN } from '#constants'
2+
import { config } from '#state'
3+
import { watchEffect } from 'reactive-vscode'
4+
import { languages } from 'vscode'
5+
import { NpmxDocumentLinkProvider } from './npmx'
6+
7+
export function useDocumentLink() {
8+
watchEffect((onCleanup) => {
9+
if (config.packageLinks === 'off')
10+
return
11+
12+
const disposable = languages.registerDocumentLinkProvider({ pattern: SUPPORTED_DOCUMENT_PATTERN }, new NpmxDocumentLinkProvider())
13+
14+
onCleanup(() => disposable.dispose())
15+
})
16+
}

src/providers/hover/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { SUPPORTED_DOCUMENT_PATTERN } from '#constants'
2+
import { config } from '#state'
3+
import { watchEffect } from 'reactive-vscode'
4+
import { languages } from 'vscode'
5+
import { NpmxHoverProvider } from './npmx'
6+
7+
export function useHover() {
8+
watchEffect((onCleanup) => {
9+
if (!config.hover.enabled)
10+
return
11+
12+
const disposable = languages.registerHoverProvider({ pattern: SUPPORTED_DOCUMENT_PATTERN }, new NpmxHoverProvider())
13+
14+
onCleanup(() => disposable.dispose())
15+
})
16+
}

src/utils/workspace.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,14 @@ function createResolvedDependencyInfo(
6666
}
6767
}
6868

69-
async function createWorkspaceContext(folder: WorkspaceFolder): Promise<WorkspaceContextState> {
69+
export const getWorkspaceContextState = memoize<Uri, Promise<WorkspaceContextState | undefined>>(async (uri) => {
70+
const folder = workspace.getWorkspaceFolder(uri)
71+
if (!folder)
72+
return
73+
7074
const workspacePath = folder.uri.path
7175
const packageManager = await detectPackageManager(folder)
7276

73-
logger.info(`[workspace-context] built ${workspacePath}`)
74-
7577
const loadWorkspaceCatalogInfo = memoize(async (uri: Uri): Promise<WithResolvedDependencyInfo<WorkspaceCatalogInfo> | undefined> => {
7678
const path = uri.path
7779

@@ -96,6 +98,8 @@ async function createWorkspaceContext(folder: WorkspaceFolder): Promise<Workspac
9698
? undefined
9799
: (await loadWorkspaceCatalogInfo(folder.uri))?.catalogs
98100

101+
logger.info(`[workspace-context] built ${workspacePath}`)
102+
99103
return {
100104
folder,
101105
workspaceContext: {
@@ -119,24 +123,12 @@ async function createWorkspaceContext(folder: WorkspaceFolder): Promise<Workspac
119123
}, { ttl: false, maxSize: Number.POSITIVE_INFINITY, fallbackToCachedOnError: false }),
120124
loadWorkspaceCatalogInfo,
121125
}
122-
}
123-
124-
export const getWorkspaceContextState = memoize<Uri, Promise<WorkspaceContextState | undefined>>(async (uri) => {
125-
const folder = workspace.getWorkspaceFolder(uri)
126-
if (!folder)
127-
return
128-
129-
return createWorkspaceContext(folder)
130126
}, {
131127
getKey: (uri: Uri) => workspace.getWorkspaceFolder(uri)!.uri.path,
132128
ttl: false,
133129
fallbackToCachedOnError: false,
134130
})
135131

136-
export function deleteWorkspaceContextState(workspacePath: string) {
137-
getWorkspaceContextState.deleteByKey(workspacePath)
138-
}
139-
140132
export async function getResolvedDependencies(uri: Uri): Promise<ResolvedDependencyInfo[] | undefined> {
141133
const state = await getWorkspaceContextState(uri)
142134
if (!state)

tests/diagnostics/context.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { PackageInfo } from '#utils/api/package'
22
import type { Engines } from 'fast-npm-meta'
33
import type { DiagnosticContext } from '../../src/providers/diagnostics'
44
import { resolveDependencySpec } from '#utils/dependency'
5+
import { Uri } from 'vscode'
56

67
interface CreateContextOptions {
78
name: string
@@ -32,5 +33,5 @@ export function createContext(options: CreateContextOptions): DiagnosticContext
3233
resolvedVersion: async () => '',
3334
packageInfo: async () => (pkg),
3435
}
35-
return { uri, dep, pkg }
36+
return { uri: Uri.file('package.json'), dep, pkg }
3637
}

0 commit comments

Comments
 (0)