Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ jobs:
with:
fetch-all: true

- name: Generate Github Changelog
run: npx changelogithub
continue-on-error: true
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
- name: Build
run: pnpm build

- name: Generate .vsix file
working-directory: extensions/vscode
Expand All @@ -36,3 +33,9 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VSCE_PAT: ${{secrets.VSCE_PAT}}
OVSX_PAT: ${{secrets.OVSX_PAT}}

- name: Generate Github Changelog
run: npx changelogithub
continue-on-error: true
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
6 changes: 6 additions & 0 deletions .github/workflows/unit-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ jobs:
- name: Setup JS
uses: sxzz/workflows/setup-js@69098296b6f6083ed99f38e2040f2a7238580e27 # v1.4.0

- name: Build
run: pnpm build

- name: Type Check
run: pnpm run typecheck

Expand All @@ -37,5 +40,8 @@ jobs:
with:
node-version: ${{ matrix.node-version }}

- name: Build
run: pnpm build

- name: Unit Test
run: pnpm run test
9 changes: 4 additions & 5 deletions extensions/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -198,23 +198,22 @@
"scripts": {
"dev": "tsdown --watch",
"build": "tsdown",
"postinstall": "npm run update",
"update": "vscode-ext-gen --scope npmx --output ../../shared/meta.ts",
"vscode:prepublish": "npm run build",
"package": "npx @vscode/vsce package --no-dependencies"
"package": "npx @vscode/vsce package --no-dependencies",
"prepare": "npm run update"
},
"devDependencies": {
"@types/vscode": "1.101.0",
"fast-npm-meta": "catalog:inline",
"jsonc-parser": "catalog:inline",
"npmx-language-core": "workspace:*",
"ocache": "catalog:inline",
"ofetch": "catalog:inline",
"pathe": "catalog:inline",
"perfect-debounce": "catalog:inline",
"reactive-vscode": "catalog:inline",
"semver": "catalog:inline",
"vscode-ext-gen": "catalog:dev",
"vscode-find-up": "catalog:inline",
"yaml": "catalog:inline"
"vscode-find-up": "catalog:inline"
}
}
2 changes: 1 addition & 1 deletion extensions/vscode/src/api/package.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { MaybeError, PackageVersionsInfoWithMetadata } from 'fast-npm-meta'
import { CACHE_MAX_AGE_ONE_DAY } from '#shared/constants'
import { logger } from '#state'
import { createBatchRunner } from '#utils/batch'
import { CACHE_MAX_AGE_ONE_DAY } from '#utils/constants'
import { getVersionsBatch } from 'fast-npm-meta'
import { defineCachedFunction } from 'ocache'

Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/api/replacement.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ModuleReplacement } from 'module-replacements'
import { CACHE_MAX_AGE_ONE_DAY, NPMX_DEV_API } from '#shared/constants'
import { logger } from '#state'
import { CACHE_MAX_AGE_ONE_DAY, NPMX_DEV_API } from '#utils/constants'
import { encodePackageName } from '#utils/package'
import { defineCachedFunction } from 'ocache'
import { ofetch } from 'ofetch'
Expand Down
5 changes: 3 additions & 2 deletions extensions/vscode/src/api/vulnerability.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { CACHE_MAX_AGE_ONE_DAY, NPMX_DEV_API } from '#shared/constants'
import { logger } from '#state'
import { encodePackageName, formatPackageId } from '#utils/package'
import { CACHE_MAX_AGE_ONE_DAY, NPMX_DEV_API } from '#utils/constants'
import { encodePackageName } from '#utils/package'
import { formatPackageId } from 'npmx-language-core/utils'
import { defineCachedFunction } from 'ocache'
import { ofetch } from 'ofetch'

Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/commands/open-file-in-npmx.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { PACKAGE_JSON_BASENAME } from '#shared/constants'
import { logger } from '#state'
import { readPackageManifest } from '#utils/file'
import { npmxFileUrl } from '#utils/links'
import { PACKAGE_JSON_BASENAME } from 'npmx-language-core/constants'
import { env, Uri, window } from 'vscode'
import { findUp } from 'vscode-find-up'

Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/commands/open-in-browser.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NPMX_DEV } from '#shared/constants'
import { NPMX_DEV } from '#utils/constants'
import { env, Uri } from 'vscode'

export function openInBrowser() {
Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/composables/workspace-context.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Uri } from 'vscode'
import { deleteWorkspaceContextCache, getWorkspaceContext } from '#core/workspace'
import { SUPPORTED_DOCUMENT_PATTERN } from '#shared/constants'
import { logger } from '#state'
import { SUPPORTED_DOCUMENT_PATTERN } from '#utils/constants'
import { isSupportedDependencyDocument, isWorkspaceLevelFile } from '#utils/file'
import { useDisposable, useFileSystemWatcher } from 'reactive-vscode'
import { window, workspace } from 'vscode'
Expand Down
35 changes: 23 additions & 12 deletions extensions/vscode/src/core/workspace.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
import type { PackageInfo } from '#api/package'
import type { PackageManager } from '#shared/types'
import type { CatalogsInfo, ResolvedDependencyInfo } from '#types/context'
import type { DependencyInfo, PackageManifestInfo, WorkspaceCatalogInfo } from '#types/extractor'
import type {
CatalogsInfo,
ExtractedDependencyInfo,
PackageManifestInfo,
ResolvedDependencyInfo,
WorkspaceCatalogInfo,
} from 'npmx-language-core/types'
import type { CacheOptions } from 'ocache'
import type { WorkspaceFolder } from 'vscode'
import { getPackageInfo } from '#api/package'
import { PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from '#shared/constants'
import { logger } from '#state'
import { isOffsetInRange } from '#utils/ast'
import { resolveDependencySpec } from '#utils/dependency'
import { getDocumentText, isPackageManifestPath, isWorkspaceFilePath } from '#utils/file'
import { resolveExactVersion } from '#utils/package'
import { lazyInit } from '#utils/shared'
import { PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from 'npmx-language-core/constants'
import { getExtractor } from 'npmx-language-core/extractors'
import { resolveDependencySpec } from 'npmx-language-core/utils'
import { defineCachedFunction } from 'ocache'
import { commands, Uri, window, workspace } from 'vscode'
import { accessOk } from 'vscode-find-up'
import { getExtractor } from './extractors'

type WithResolvedDependencyInfo<T> = Omit<T, 'dependencies'> & {
dependencies: ResolvedDependencyInfo[]
export interface DependencyInfo extends ExtractedDependencyInfo, ResolvedDependencyInfo {
packageInfo: () => Promise<PackageInfo | null>
resolvedVersion: () => Promise<string | null>
}

type WithDependencyInfo<T> = Omit<T, 'dependencies'> & {
dependencies: DependencyInfo[]
}

export const workspaceFileMapping: Record<Exclude<PackageManager, 'npm'>, string> = {
Expand Down Expand Up @@ -90,7 +101,7 @@ class WorkspaceContext {
return this.#catalogs!.promise
}

#createResolvedDependencyInfo(dependency: DependencyInfo, catalogs?: CatalogsInfo): ResolvedDependencyInfo {
#createResolvedDependencyInfo(dependency: ExtractedDependencyInfo, catalogs?: CatalogsInfo): DependencyInfo {
const resolution = resolveDependencySpec(dependency.rawName, dependency.rawSpec, catalogs)

const packageInfo = lazyInit(
Expand Down Expand Up @@ -118,7 +129,7 @@ class WorkspaceContext {
}

loadPackageManifestInfo = defineCachedFunction<
WithResolvedDependencyInfo<PackageManifestInfo> | undefined,
WithDependencyInfo<PackageManifestInfo> | undefined,
[Uri]
>(async (uri) => {
const path = uri.path
Expand Down Expand Up @@ -146,7 +157,7 @@ class WorkspaceContext {
}, this.#cacheOptions)

loadWorkspaceCatalogInfo = defineCachedFunction<
WithResolvedDependencyInfo<WorkspaceCatalogInfo> | undefined,
WithDependencyInfo<WorkspaceCatalogInfo> | undefined,
[Uri]
>(async (uri) => {
const path = uri.path
Expand Down Expand Up @@ -200,7 +211,7 @@ export async function getWorkspaceContext(uri: Uri) {
return await getWorkspaceContextByFolder(folder)
}

export async function getResolvedDependencies(uri: Uri): Promise<ResolvedDependencyInfo[] | undefined> {
export async function getResolvedDependencies(uri: Uri): Promise<DependencyInfo[] | undefined> {
const ctx = await getWorkspaceContext(uri)
if (!ctx)
return
Expand All @@ -212,7 +223,7 @@ export async function getResolvedDependencies(uri: Uri): Promise<ResolvedDepende
)?.dependencies
}

export async function getResolvedDependencyByOffset(uri: Uri, offset: number): Promise<ResolvedDependencyInfo | undefined> {
export async function getResolvedDependencyByOffset(uri: Uri, offset: number): Promise<DependencyInfo | undefined> {
const dependencies = await getResolvedDependencies(uri)

return dependencies?.find((dependency) => isOffsetInRange(offset, dependency.nameRange) || isOffsetInRange(offset, dependency.specRange))
Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/providers/code-actions/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SUPPORTED_DOCUMENT_PATTERN } from '#shared/constants'
import { config, internalCommands } from '#state'
import { SUPPORTED_DOCUMENT_PATTERN } from '#utils/constants'
import { computed, useCommand, watch } from 'reactive-vscode'
import { CodeActionKind, languages } from 'vscode'
import { addToIgnore } from '../../commands/add-to-ignore'
Expand Down
4 changes: 2 additions & 2 deletions extensions/vscode/src/providers/completion-item/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PACKAGE_JSON_BASENAME, SUPPORTED_DOCUMENT_PATTERN } from '#shared/constants'
import { config } from '#state'
import { PACKAGE_JSON_PATTERN, SUPPORTED_DOCUMENT_PATTERN } from '#utils/constants'
import { watchEffect } from 'reactive-vscode'
import { languages } from 'vscode'
import { CatalogCompletionItemProvider } from './catalog'
Expand All @@ -21,7 +21,7 @@ export function useCompletionItem() {

watchEffect((onCleanup) => {
const disposable = languages.registerCompletionItemProvider(
{ pattern: `**/${PACKAGE_JSON_BASENAME}` },
{ pattern: PACKAGE_JSON_PATTERN },
new CatalogCompletionItemProvider(),
...CatalogCompletionItemProvider.triggers,
)
Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/providers/completion-item/version.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { CompletionItemProvider, Position, TextDocument } from 'vscode'
import { getResolvedDependencyByOffset } from '#core/workspace'
import { PRERELEASE_PATTERN } from '#shared/constants'
import { config } from '#state'
import { offsetRangeToRange } from '#utils/ast'
import { PRERELEASE_PATTERN } from '#utils/constants'
import { formatUpgradeVersion } from '#utils/version'
import { CompletionItem, CompletionItemKind } from 'vscode'

Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/providers/definition/catalog.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { DefinitionProvider, Position, TextDocument } from 'vscode'
import { getResolvedDependencyByOffset, getWorkspaceContext } from '#core/workspace'
import { offsetRangeToRange } from '#utils/ast'
import { normalizeCatalogName } from '#utils/dependency'
import { normalizeCatalogName } from 'npmx-language-core/utils'
import { Location, workspace } from 'vscode'

export class CatalogDefinitionProvider implements DefinitionProvider {
Expand Down
4 changes: 2 additions & 2 deletions extensions/vscode/src/providers/definition/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { PACKAGE_JSON_BASENAME } from '#shared/constants'
import { PACKAGE_JSON_PATTERN } from '#utils/constants'
import { useDisposable } from 'reactive-vscode'
import { languages } from 'vscode'
import { CatalogDefinitionProvider } from './catalog'

export function useDefinition() {
useDisposable(
languages.registerDefinitionProvider({ pattern: `**/${PACKAGE_JSON_BASENAME}` }, new CatalogDefinitionProvider()),
languages.registerDefinitionProvider({ pattern: PACKAGE_JSON_PATTERN }, new CatalogDefinitionProvider()),
)
}
12 changes: 6 additions & 6 deletions extensions/vscode/src/providers/diagnostics/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import type { ResolvedDependencyInfo } from '#types/context'
import type { OffsetRange } from '#types/extractor'
import type { DependencyInfo } from '#core/workspace'
import type { OffsetRange } from 'npmx-language-core/types'
import type { Awaitable } from 'reactive-vscode'
import type { Diagnostic, TextDocument, Uri } from 'vscode'
import { getResolvedDependencies } from '#core/workspace'
import { SUPPORTED_DOCUMENT_PATTERN } from '#shared/constants'
import { displayName } from '#shared/meta'
import { config, logger } from '#state'
import { offsetRangeToRange } from '#utils/ast'
import { SUPPORTED_DOCUMENT_PATTERN } from '#utils/constants'
import { isSupportedDependencyDocument } from '#utils/file'
import { debounce } from 'perfect-debounce'
import { computed, nextTick, useActiveTextEditor, useDisposable, useDocumentText, useFileSystemWatcher, watch } from 'reactive-vscode'
Expand All @@ -20,8 +20,8 @@ import { checkVulnerability } from './rules/vulnerability'

export interface DiagnosticContext {
uri: Uri
dep: ResolvedDependencyInfo
pkg: NonNullable<Awaited<ReturnType<ResolvedDependencyInfo['packageInfo']>>>
dep: DependencyInfo
pkg: NonNullable<Awaited<ReturnType<DependencyInfo['packageInfo']>>>
}

export interface RangeDiagnosticInfo extends Omit<Diagnostic, 'range' | 'source'> {
Expand Down Expand Up @@ -102,7 +102,7 @@ export function useDiagnostics() {
}
}

const collect = async (dep: ResolvedDependencyInfo) => {
const collect = async (dep: DependencyInfo) => {
try {
const pkg = await dep.packageInfo()
if (!pkg || isStale(document, targetVersion))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { PackageInfo } from '#api/package'
import type { Engines } from 'fast-npm-meta'
import type { DiagnosticContext } from '../..'
import { resolveDependencySpec } from '#utils/dependency'
import { resolveExactVersion } from '#utils/package'
import { resolveDependencySpec } from 'npmx-language-core/utils'
import { Uri } from 'vscode'

interface CreateContextOptions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { DiagnosticRule } from '..'
import { config } from '#state'
import { checkIgnored } from '#utils/ignore'
import { npmxPackageUrl } from '#utils/links'
import { formatPackageId } from '#utils/package'
import { formatPackageId } from 'npmx-language-core/utils'
import { DiagnosticSeverity, DiagnosticTag, Uri } from 'vscode'

export const checkDeprecation: DiagnosticRule = async ({ dep, pkg }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { DiagnosticRule } from '..'
import { getWorkspaceContext } from '#core/workspace'
import { isPackageManifestPath } from '#utils/file'
import { npmxPackageUrl } from '#utils/links'
import { formatPackageId } from '#utils/package'
import { formatPackageId } from 'npmx-language-core/utils'
import Range from 'semver/classes/range'
import intersects from 'semver/ranges/intersects'
import subset from 'semver/ranges/subset'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { PackageInfo } from '#api/package'
import type { ResolvedDependencyInfo } from '#types/context'
import type { DependencyInfo } from '#core/workspace'
import { describe, expect, it } from 'vitest'
import { createContext } from './__tests__/utils'
import { resolveUpgrade } from './upgrade'
Expand All @@ -16,7 +16,7 @@ const versionsMeta: Record<string, object> = {
'3.0.0-alpha.5': {},
}

async function createOptions(version: string): Promise<[ResolvedDependencyInfo, PackageInfo, string]> {
async function createOptions(version: string): Promise<[DependencyInfo, PackageInfo, string]> {
const ctx = createContext({ name: 'vite', version, distTags, versionsMeta })
return [ctx.dep, ctx.pkg, (await ctx.dep.resolvedVersion())!]
}
Expand Down
6 changes: 3 additions & 3 deletions extensions/vscode/src/providers/diagnostics/rules/upgrade.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { PackageInfo } from '#api/package'
import type { ResolvedDependencyInfo } from '#types/context'
import type { OffsetRange } from '#types/extractor'
import type { DependencyInfo } from '#core/workspace'
import type { OffsetRange } from 'npmx-language-core/types'
import type { DiagnosticRule, RangeDiagnosticInfo } from '..'
import { config } from '#state'
import { checkIgnored } from '#utils/ignore'
Expand All @@ -11,7 +11,7 @@ import lte from 'semver/functions/lte'
import prerelease from 'semver/functions/prerelease'
import { DiagnosticSeverity, Uri } from 'vscode'

export function resolveUpgrade(dep: ResolvedDependencyInfo, pkg: PackageInfo, resolvedVersion: string, ignoreList = config.ignore.upgrade) {
export function resolveUpgrade(dep: DependencyInfo, pkg: PackageInfo, resolvedVersion: string, ignoreList = config.ignore.upgrade) {
const { distTags } = pkg
if (Object.hasOwn(distTags, dep.resolvedSpec))
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { getVulnerability, SEVERITY_LEVELS } from '#api/vulnerability'
import { config } from '#state'
import { checkIgnored } from '#utils/ignore'
import { npmxPackageUrl } from '#utils/links'
import { formatPackageId } from '#utils/package'
import { formatUpgradeVersion } from '#utils/version'
import { formatPackageId } from 'npmx-language-core/utils'
import lt from 'semver/functions/lt'
import { DiagnosticSeverity, Uri } from 'vscode'

Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/providers/document-link/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SUPPORTED_DOCUMENT_PATTERN } from '#shared/constants'
import { config } from '#state'
import { SUPPORTED_DOCUMENT_PATTERN } from '#utils/constants'
import { watchEffect } from 'reactive-vscode'
import { languages } from 'vscode'
import { NpmxDocumentLinkProvider } from './npmx'
Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/providers/hover/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SUPPORTED_DOCUMENT_PATTERN } from '#shared/constants'
import { config } from '#state'
import { SUPPORTED_DOCUMENT_PATTERN } from '#utils/constants'
import { watchEffect } from 'reactive-vscode'
import { languages } from 'vscode'
import { NpmxHoverProvider } from './npmx'
Expand Down
3 changes: 2 additions & 1 deletion extensions/vscode/src/providers/hover/npmx.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import type { HoverProvider, Position, TextDocument } from 'vscode'
import { getResolvedDependencyByOffset } from '#core/workspace'
import { SPACER } from '#shared/constants'
import { jsrPackageUrl, npmxDocsUrl, npmxPackageUrl } from '#utils/links'
import { Hover, MarkdownString } from 'vscode'

const SPACER = '&nbsp;'

export class NpmxHoverProvider implements HoverProvider {
async provideHover(document: TextDocument, position: Position) {
const offset = document.offsetAt(position)
Expand Down
Loading
Loading