From dd98b8896b611bb9ff65e81dae0b130bb7f97d23 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Tue, 17 Mar 2026 15:14:51 +0800 Subject: [PATCH 1/6] refactor: extract language-core --- extensions/vscode/package.json | 1 + extensions/vscode/src/core/workspace.ts | 15 ++++++-- .../src/providers/definition/catalog.ts | 2 +- .../vscode/src/providers/diagnostics/index.ts | 4 +-- .../diagnostics/rules/upgrade.test.ts | 2 +- .../providers/diagnostics/rules/upgrade.ts | 4 +-- extensions/vscode/src/types/context.ts | 23 ------------ extensions/vscode/src/utils/ast.ts | 2 +- extensions/vscode/src/utils/dependency.ts | 9 ++--- extensions/vscode/src/utils/file.ts | 2 +- extensions/vscode/src/utils/version.test.ts | 2 +- extensions/vscode/src/utils/version.ts | 2 +- extensions/vscode/tsdown.config.ts | 8 ----- packages/language-core/package.json | 36 +++++++++++++++++++ .../language-core/src}/extractors/index.ts | 0 .../language-core/src}/extractors/json.ts | 3 +- .../language-core/src}/extractors/yaml.ts | 6 ++-- .../language-core/src/types.ts | 20 ++++++----- packages/language-core/src/utils.ts | 5 +++ packages/language-core/tsconfig.json | 9 +++++ packages/language-core/tsdown.config.ts | 20 +++++++++++ pnpm-lock.yaml | 18 ++++++++++ pnpm-workspace.yaml | 1 + tsconfig.json | 3 +- 24 files changed, 134 insertions(+), 63 deletions(-) delete mode 100644 extensions/vscode/src/types/context.ts create mode 100644 packages/language-core/package.json rename {extensions/vscode/src/core => packages/language-core/src}/extractors/index.ts (100%) rename {extensions/vscode/src/core => packages/language-core/src}/extractors/json.ts (95%) rename {extensions/vscode/src/core => packages/language-core/src}/extractors/yaml.ts (94%) rename extensions/vscode/src/types/extractor.ts => packages/language-core/src/types.ts (81%) create mode 100644 packages/language-core/src/utils.ts create mode 100644 packages/language-core/tsconfig.json create mode 100644 packages/language-core/tsdown.config.ts diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 7637061..eba97c7 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -207,6 +207,7 @@ "@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", diff --git a/extensions/vscode/src/core/workspace.ts b/extensions/vscode/src/core/workspace.ts index cf2ed5f..7a08b2b 100644 --- a/extensions/vscode/src/core/workspace.ts +++ b/extensions/vscode/src/core/workspace.ts @@ -1,6 +1,6 @@ +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, DependencyInfo, DependencyProtocol, PackageManifestInfo, WorkspaceCatalogInfo } from 'npmx-language-core/types' import type { CacheOptions } from 'ocache' import type { WorkspaceFolder } from 'vscode' import { getPackageInfo } from '#api/package' @@ -11,10 +11,19 @@ import { resolveDependencySpec } from '#utils/dependency' import { getDocumentText, isPackageManifestPath, isWorkspaceFilePath } from '#utils/file' import { resolveExactVersion } from '#utils/package' import { lazyInit } from '#utils/shared' +import { getExtractor } from 'npmx-language-core/extractors' import { defineCachedFunction } from 'ocache' import { commands, Uri, window, workspace } from 'vscode' import { accessOk } from 'vscode-find-up' -import { getExtractor } from './extractors' + +export interface ResolvedDependencyInfo extends DependencyInfo { + protocol: DependencyProtocol + resolvedName: string + resolvedSpec: string + resolvedProtocol: DependencyProtocol + packageInfo: () => Promise + resolvedVersion: () => Promise +} type WithResolvedDependencyInfo = Omit & { dependencies: ResolvedDependencyInfo[] diff --git a/extensions/vscode/src/providers/definition/catalog.ts b/extensions/vscode/src/providers/definition/catalog.ts index f42848e..b6e394a 100644 --- a/extensions/vscode/src/providers/definition/catalog.ts +++ b/extensions/vscode/src/providers/definition/catalog.ts @@ -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 { diff --git a/extensions/vscode/src/providers/diagnostics/index.ts b/extensions/vscode/src/providers/diagnostics/index.ts index 18a0a7e..c49f2da 100644 --- a/extensions/vscode/src/providers/diagnostics/index.ts +++ b/extensions/vscode/src/providers/diagnostics/index.ts @@ -1,5 +1,5 @@ -import type { ResolvedDependencyInfo } from '#types/context' -import type { OffsetRange } from '#types/extractor' +import type { ResolvedDependencyInfo } 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' diff --git a/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts b/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts index 6ee47fd..96ed393 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts @@ -1,5 +1,5 @@ import type { PackageInfo } from '#api/package' -import type { ResolvedDependencyInfo } from '#types/context' +import type { ResolvedDependencyInfo } from '#core/workspace' import { describe, expect, it } from 'vitest' import { createContext } from './__tests__/utils' import { resolveUpgrade } from './upgrade' diff --git a/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts b/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts index 7e20dd1..3953752 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts @@ -1,6 +1,6 @@ import type { PackageInfo } from '#api/package' -import type { ResolvedDependencyInfo } from '#types/context' -import type { OffsetRange } from '#types/extractor' +import type { ResolvedDependencyInfo } 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' diff --git a/extensions/vscode/src/types/context.ts b/extensions/vscode/src/types/context.ts deleted file mode 100644 index 46ff099..0000000 --- a/extensions/vscode/src/types/context.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { PackageInfo } from '#api/package' -import type { DependencyInfo } from '#types/extractor' - -export type DependencyProtocol - = | 'npm' - | 'jsr' - | 'workspace' - | 'catalog' - | 'git' - | 'file' - | 'http' - | null - -export type CatalogsInfo = Record> - -export interface ResolvedDependencyInfo extends DependencyInfo { - protocol: DependencyProtocol - resolvedName: string - resolvedSpec: string - resolvedProtocol: DependencyProtocol - packageInfo: () => Promise - resolvedVersion: () => Promise -} diff --git a/extensions/vscode/src/utils/ast.ts b/extensions/vscode/src/utils/ast.ts index 87c312a..bad283a 100644 --- a/extensions/vscode/src/utils/ast.ts +++ b/extensions/vscode/src/utils/ast.ts @@ -1,4 +1,4 @@ -import type { OffsetRange } from '#types/extractor' +import type { OffsetRange } from 'npmx-language-core/types' import type { TextDocument } from 'vscode' import { Range } from 'vscode' diff --git a/extensions/vscode/src/utils/dependency.ts b/extensions/vscode/src/utils/dependency.ts index acc43c8..51f029c 100644 --- a/extensions/vscode/src/utils/dependency.ts +++ b/extensions/vscode/src/utils/dependency.ts @@ -1,5 +1,7 @@ -import type { CatalogsInfo, ResolvedDependencyInfo } from '#types/context' +import type { ResolvedDependencyInfo } from '#core/workspace' +import type { CatalogsInfo } from 'npmx-language-core/types' import { isJsrNpmPackage, jsrNpmToJsrName, parsePackageId } from '#utils/package' +import { normalizeCatalogName } from 'npmx-language-core/utils' interface FinalResolution extends Pick { } @@ -7,14 +9,9 @@ interface FinalResolution extends Pick { } -const DEFAULT_CATALOG_NAME = 'default' const GIT_PATTERN = /^(?:git\+|git:\/\/|github:|gitlab:|bitbucket:|ssh:\/\/git@)/i const HTTP_PATTERN = /^https?:/i -export function normalizeCatalogName(name: string): string { - return name.trim() || DEFAULT_CATALOG_NAME -} - function resolveNpmSpec(rawName: string, spec: string): FinalResolution { const alias = parsePackageId(spec) if (!alias.version) { diff --git a/extensions/vscode/src/utils/file.ts b/extensions/vscode/src/utils/file.ts index 7e1ac76..d14580a 100644 --- a/extensions/vscode/src/utils/file.ts +++ b/extensions/vscode/src/utils/file.ts @@ -1,4 +1,4 @@ -import type { PackageManifestInfo } from '#types/extractor' +import type { PackageManifestInfo } from 'npmx-language-core/types' import type { TextDocument, Uri } from 'vscode' import { PACKAGE_JSON_BASENAME, PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from '#shared/constants' import { basename } from 'pathe' diff --git a/extensions/vscode/src/utils/version.test.ts b/extensions/vscode/src/utils/version.test.ts index 7b954d2..327e474 100644 --- a/extensions/vscode/src/utils/version.test.ts +++ b/extensions/vscode/src/utils/version.test.ts @@ -1,4 +1,4 @@ -import type { ResolvedDependencyInfo } from '#types/context' +import type { ResolvedDependencyInfo } from '#core/workspace' import { describe, expect, it } from 'vitest' import { formatUpgradeVersion } from './version' diff --git a/extensions/vscode/src/utils/version.ts b/extensions/vscode/src/utils/version.ts index 6e433b6..37fc11c 100644 --- a/extensions/vscode/src/utils/version.ts +++ b/extensions/vscode/src/utils/version.ts @@ -1,4 +1,4 @@ -import type { ResolvedDependencyInfo } from '#types/context' +import type { ResolvedDependencyInfo } from '#core/workspace' import { formatPackageId } from './package' const RANGE_PREFIXES = ['>=', '<=', '=', '>', '<'] diff --git a/extensions/vscode/tsdown.config.ts b/extensions/vscode/tsdown.config.ts index 39000d6..db46a2b 100644 --- a/extensions/vscode/tsdown.config.ts +++ b/extensions/vscode/tsdown.config.ts @@ -1,13 +1,7 @@ -import { resolve } from 'node:path' import { defineConfig } from 'tsdown' /// keep-sorted export default defineConfig({ - alias: { - // defaults to bundle the UMD entry point and generate incorrect output. - // so explicitly specifying a fixed entry point here. - 'jsonc-parser': resolve('./node_modules/jsonc-parser/lib/esm/main.js'), - }, copy: [ '../../res', ], @@ -16,7 +10,6 @@ export default defineConfig({ /// keep-sorted onlyBundle: [ 'fast-npm-meta', - 'jsonc-parser', 'ocache', 'ofetch', 'ohash', @@ -24,7 +17,6 @@ export default defineConfig({ 'perfect-debounce', 'semver', 'vscode-find-up', - 'yaml', /reactive-vscode/, ], }, diff --git a/packages/language-core/package.json b/packages/language-core/package.json new file mode 100644 index 0000000..2c4da67 --- /dev/null +++ b/packages/language-core/package.json @@ -0,0 +1,36 @@ +{ + "name": "npmx-language-core", + "type": "module", + "version": "0.7.0", + "private": true, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/npmx-dev/vscode-npmx.git", + "directory": "packages/language-core" + }, + "sideEffects": false, + "exports": { + "./extractors": "./dist/extractors/index.js", + "./types": "./dist/types.js", + "./utils": "./dist/utils.js", + "./package.json": "./package.json" + }, + "files": [ + "dist/**/*" + ], + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown" + }, + "devDependencies": { + "jsonc-parser": "catalog:inline", + "pathe": "catalog:inline", + "yaml": "catalog:inline" + }, + "inlinedDependencies": { + "jsonc-parser": "3.3.1", + "yaml": "2.8.2", + "pathe": "2.0.3" + } +} diff --git a/extensions/vscode/src/core/extractors/index.ts b/packages/language-core/src/extractors/index.ts similarity index 100% rename from extensions/vscode/src/core/extractors/index.ts rename to packages/language-core/src/extractors/index.ts diff --git a/extensions/vscode/src/core/extractors/json.ts b/packages/language-core/src/extractors/json.ts similarity index 95% rename from extensions/vscode/src/core/extractors/json.ts rename to packages/language-core/src/extractors/json.ts index a7d3de0..de283c5 100644 --- a/extensions/vscode/src/core/extractors/json.ts +++ b/packages/language-core/src/extractors/json.ts @@ -1,5 +1,6 @@ -import type { BaseExtractor, DependencyCategory, DependencyInfo, JsonNode, OffsetRange, PackageManifestExtractor, PackageManifestInfo } from '#types/extractor' import type { Engines } from 'fast-npm-meta' +import type { Node as JsonNode } from 'jsonc-parser' +import type { BaseExtractor, DependencyCategory, DependencyInfo, OffsetRange, PackageManifestExtractor, PackageManifestInfo } from '../types' import { findNodeAtLocation, parseTree } from 'jsonc-parser' const DEPENDENCY_SECTIONS: DependencyCategory[] = [ diff --git a/extensions/vscode/src/core/extractors/yaml.ts b/packages/language-core/src/extractors/yaml.ts similarity index 94% rename from extensions/vscode/src/core/extractors/yaml.ts rename to packages/language-core/src/extractors/yaml.ts index ae75337..9389696 100644 --- a/extensions/vscode/src/core/extractors/yaml.ts +++ b/packages/language-core/src/extractors/yaml.ts @@ -1,7 +1,7 @@ -import type { BaseExtractor, DependencyInfo, OffsetRange, WorkspaceCatalogExtractor, WorkspaceCatalogInfo, YamlNode } from '#types/extractor' -import type { Pair, Scalar, YAMLMap } from 'yaml' -import { normalizeCatalogName } from '#utils/dependency' +import type { Pair, Scalar, YAMLMap, Node as YamlNode } from 'yaml' +import type { BaseExtractor, DependencyInfo, OffsetRange, WorkspaceCatalogExtractor, WorkspaceCatalogInfo } from '../types' import { isMap, isPair, isScalar, parseDocument } from 'yaml' +import { normalizeCatalogName } from '../utils' const CATALOG_SECTION = 'catalog' const CATALOGS_SECTION = 'catalogs' diff --git a/extensions/vscode/src/types/extractor.ts b/packages/language-core/src/types.ts similarity index 81% rename from extensions/vscode/src/types/extractor.ts rename to packages/language-core/src/types.ts index 696c8e2..be64c0c 100644 --- a/extensions/vscode/src/types/extractor.ts +++ b/packages/language-core/src/types.ts @@ -1,14 +1,18 @@ import type { Engines } from 'fast-npm-meta' -export type { - Node as JsonNode, -} from 'jsonc-parser' +export type OffsetRange = [start: number, end: number] -export type { - Node as YamlNode, -} from 'yaml' +export type DependencyProtocol + = | 'npm' + | 'jsr' + | 'workspace' + | 'catalog' + | 'git' + | 'file' + | 'http' + | null -export type OffsetRange = [start: number, end: number] +export type CatalogsInfo = Record> export type DependencyCategory = | 'dependencies' @@ -42,7 +46,7 @@ export interface WorkspaceCatalogInfo extends DependenciesInfo { catalogs?: Record> } -export interface BaseExtractor { +export interface BaseExtractor { parse: (text: string) => T | null | undefined getDependenciesInfo: (root: T) => DependencyInfo[] } diff --git a/packages/language-core/src/utils.ts b/packages/language-core/src/utils.ts new file mode 100644 index 0000000..f41a0c2 --- /dev/null +++ b/packages/language-core/src/utils.ts @@ -0,0 +1,5 @@ +const DEFAULT_CATALOG_NAME = 'default' + +export function normalizeCatalogName(name: string): string { + return name.trim() || DEFAULT_CATALOG_NAME +} diff --git a/packages/language-core/tsconfig.json b/packages/language-core/tsconfig.json new file mode 100644 index 0000000..543e361 --- /dev/null +++ b/packages/language-core/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tsbuildinfo" + }, + "include": [ + "src" + ] +} diff --git a/packages/language-core/tsdown.config.ts b/packages/language-core/tsdown.config.ts new file mode 100644 index 0000000..54f2aab --- /dev/null +++ b/packages/language-core/tsdown.config.ts @@ -0,0 +1,20 @@ +import { resolve } from 'node:path' +import { defineConfig } from 'tsdown' + +export default defineConfig({ + alias: { + // defaults to bundle the UMD entry point and generate incorrect output. + // so explicitly specifying a fixed entry point here. + 'jsonc-parser': resolve('./node_modules/jsonc-parser/lib/esm/main.js'), + }, + /// keep-sorted + entry: [ + 'src/extractors/index.ts', + 'src/types.ts', + 'src/utils.ts', + ], + platform: 'neutral', + exports: true, + dts: true, + minify: 'dce-only', +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8a9c41..6ef1956 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -142,6 +142,9 @@ importers: jsonc-parser: specifier: catalog:inline version: 3.3.1 + npmx-language-core: + specifier: workspace:* + version: link:../../packages/language-core ocache: specifier: catalog:inline version: 0.1.2 @@ -170,6 +173,21 @@ importers: specifier: catalog:inline version: 2.8.2 + packages/language-core: + dependencies: + fast-npm-meta: + specifier: catalog:inline + version: 1.4.2 + jsonc-parser: + specifier: catalog:inline + version: 3.3.1 + pathe: + specifier: catalog:inline + version: 2.0.3 + yaml: + specifier: catalog:inline + version: 2.8.2 + packages: '@antfu/eslint-config@7.7.2': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 81764ca..c76eaab 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,6 +3,7 @@ trustPolicy: no-downgrade packages: - extensions/* + - packages/* catalogs: dev: diff --git a/tsconfig.json b/tsconfig.json index 809b99e..aa57184 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "references": [ - { "path": "./extensions/vscode/tsconfig.json" } + { "path": "./extensions/vscode/tsconfig.json" }, + { "path": "./packages/language-core/tsconfig.json" } ], "files": [] } From 7f62c4524cd6206e057c8382d629d59f4e319b62 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Tue, 17 Mar 2026 15:44:53 +0800 Subject: [PATCH 2/6] refactor: move constants to language-core --- extensions/vscode/src/api/package.ts | 2 +- extensions/vscode/src/api/replacement.ts | 2 +- extensions/vscode/src/api/vulnerability.ts | 2 +- extensions/vscode/src/commands/open-file-in-npmx.ts | 2 +- extensions/vscode/src/commands/open-in-browser.ts | 2 +- extensions/vscode/src/composables/workspace-context.ts | 2 +- extensions/vscode/src/core/workspace.ts | 2 +- extensions/vscode/src/providers/code-actions/index.ts | 2 +- .../vscode/src/providers/completion-item/index.ts | 4 ++-- .../vscode/src/providers/completion-item/version.ts | 2 +- extensions/vscode/src/providers/definition/index.ts | 4 ++-- extensions/vscode/src/providers/diagnostics/index.ts | 2 +- extensions/vscode/src/providers/document-link/index.ts | 2 +- extensions/vscode/src/providers/hover/index.ts | 2 +- extensions/vscode/src/providers/hover/npmx.ts | 3 ++- {shared => extensions/vscode/src/utils}/constants.ts | 7 ++----- extensions/vscode/src/utils/file.ts | 2 +- extensions/vscode/src/utils/links.ts | 2 +- extensions/vscode/tests/__setup__/msw.ts | 2 +- packages/language-core/package.json | 1 + packages/language-core/src/constants.ts | 5 +++++ packages/language-core/src/extractors/json.ts | 3 +-- packages/language-core/src/types.ts | 10 +++++----- packages/language-core/src/utils.ts | 2 +- packages/language-core/tsdown.config.ts | 9 +++++++++ pnpm-lock.yaml | 3 --- 26 files changed, 45 insertions(+), 36 deletions(-) rename {shared => extensions/vscode/src/utils}/constants.ts (61%) create mode 100644 packages/language-core/src/constants.ts diff --git a/extensions/vscode/src/api/package.ts b/extensions/vscode/src/api/package.ts index 64b67e2..d2b5abd 100644 --- a/extensions/vscode/src/api/package.ts +++ b/extensions/vscode/src/api/package.ts @@ -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' diff --git a/extensions/vscode/src/api/replacement.ts b/extensions/vscode/src/api/replacement.ts index 4f22650..aa3a0a3 100644 --- a/extensions/vscode/src/api/replacement.ts +++ b/extensions/vscode/src/api/replacement.ts @@ -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' diff --git a/extensions/vscode/src/api/vulnerability.ts b/extensions/vscode/src/api/vulnerability.ts index 56bdc83..f1bb394 100644 --- a/extensions/vscode/src/api/vulnerability.ts +++ b/extensions/vscode/src/api/vulnerability.ts @@ -1,5 +1,5 @@ -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, formatPackageId } from '#utils/package' import { defineCachedFunction } from 'ocache' import { ofetch } from 'ofetch' diff --git a/extensions/vscode/src/commands/open-file-in-npmx.ts b/extensions/vscode/src/commands/open-file-in-npmx.ts index bac53c9..d6e027b 100644 --- a/extensions/vscode/src/commands/open-file-in-npmx.ts +++ b/extensions/vscode/src/commands/open-file-in-npmx.ts @@ -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' diff --git a/extensions/vscode/src/commands/open-in-browser.ts b/extensions/vscode/src/commands/open-in-browser.ts index d95ab06..62c5ddd 100644 --- a/extensions/vscode/src/commands/open-in-browser.ts +++ b/extensions/vscode/src/commands/open-in-browser.ts @@ -1,4 +1,4 @@ -import { NPMX_DEV } from '#shared/constants' +import { NPMX_DEV } from '#utils/constants' import { env, Uri } from 'vscode' export function openInBrowser() { diff --git a/extensions/vscode/src/composables/workspace-context.ts b/extensions/vscode/src/composables/workspace-context.ts index 0025387..39ef6ba 100644 --- a/extensions/vscode/src/composables/workspace-context.ts +++ b/extensions/vscode/src/composables/workspace-context.ts @@ -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' diff --git a/extensions/vscode/src/core/workspace.ts b/extensions/vscode/src/core/workspace.ts index 7a08b2b..aa6b0f4 100644 --- a/extensions/vscode/src/core/workspace.ts +++ b/extensions/vscode/src/core/workspace.ts @@ -4,13 +4,13 @@ import type { CatalogsInfo, DependencyInfo, DependencyProtocol, PackageManifestI 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 { defineCachedFunction } from 'ocache' import { commands, Uri, window, workspace } from 'vscode' diff --git a/extensions/vscode/src/providers/code-actions/index.ts b/extensions/vscode/src/providers/code-actions/index.ts index 423c8b0..7028b7d 100644 --- a/extensions/vscode/src/providers/code-actions/index.ts +++ b/extensions/vscode/src/providers/code-actions/index.ts @@ -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' diff --git a/extensions/vscode/src/providers/completion-item/index.ts b/extensions/vscode/src/providers/completion-item/index.ts index e1c2358..944e5f2 100644 --- a/extensions/vscode/src/providers/completion-item/index.ts +++ b/extensions/vscode/src/providers/completion-item/index.ts @@ -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' @@ -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, ) diff --git a/extensions/vscode/src/providers/completion-item/version.ts b/extensions/vscode/src/providers/completion-item/version.ts index cd9072c..743358a 100644 --- a/extensions/vscode/src/providers/completion-item/version.ts +++ b/extensions/vscode/src/providers/completion-item/version.ts @@ -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' diff --git a/extensions/vscode/src/providers/definition/index.ts b/extensions/vscode/src/providers/definition/index.ts index 67f05c9..4aa79f2 100644 --- a/extensions/vscode/src/providers/definition/index.ts +++ b/extensions/vscode/src/providers/definition/index.ts @@ -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()), ) } diff --git a/extensions/vscode/src/providers/diagnostics/index.ts b/extensions/vscode/src/providers/diagnostics/index.ts index c49f2da..cb8161b 100644 --- a/extensions/vscode/src/providers/diagnostics/index.ts +++ b/extensions/vscode/src/providers/diagnostics/index.ts @@ -3,10 +3,10 @@ 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' diff --git a/extensions/vscode/src/providers/document-link/index.ts b/extensions/vscode/src/providers/document-link/index.ts index 03cfc14..d5a9aa1 100644 --- a/extensions/vscode/src/providers/document-link/index.ts +++ b/extensions/vscode/src/providers/document-link/index.ts @@ -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' diff --git a/extensions/vscode/src/providers/hover/index.ts b/extensions/vscode/src/providers/hover/index.ts index 77ba100..7e5f992 100644 --- a/extensions/vscode/src/providers/hover/index.ts +++ b/extensions/vscode/src/providers/hover/index.ts @@ -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' diff --git a/extensions/vscode/src/providers/hover/npmx.ts b/extensions/vscode/src/providers/hover/npmx.ts index 34db1d7..ac63d64 100644 --- a/extensions/vscode/src/providers/hover/npmx.ts +++ b/extensions/vscode/src/providers/hover/npmx.ts @@ -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 = ' ' + export class NpmxHoverProvider implements HoverProvider { async provideHover(document: TextDocument, position: Position) { const offset = document.offsetAt(position) diff --git a/shared/constants.ts b/extensions/vscode/src/utils/constants.ts similarity index 61% rename from shared/constants.ts rename to extensions/vscode/src/utils/constants.ts index 7c4c2a2..5f95e63 100644 --- a/shared/constants.ts +++ b/extensions/vscode/src/utils/constants.ts @@ -1,7 +1,6 @@ -export const PACKAGE_JSON_BASENAME = 'package.json' -export const PNPM_WORKSPACE_BASENAME = 'pnpm-workspace.yaml' -export const YARN_WORKSPACE_BASENAME = '.yarnrc.yml' +import { PACKAGE_JSON_BASENAME, PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from 'npmx-language-core/constants' +export const PACKAGE_JSON_PATTERN = `**/${PACKAGE_JSON_BASENAME}` export const SUPPORTED_DOCUMENT_PATTERN = `**/{${PACKAGE_JSON_BASENAME},${PNPM_WORKSPACE_BASENAME},${YARN_WORKSPACE_BASENAME}}` export const PRERELEASE_PATTERN = /-.+/ @@ -10,5 +9,3 @@ export const CACHE_MAX_AGE_ONE_DAY = 60 * 60 * 24 export const NPMX_DEV = 'https://npmx.dev' export const NPMX_DEV_API = `${NPMX_DEV}/api` - -export const SPACER = ' ' diff --git a/extensions/vscode/src/utils/file.ts b/extensions/vscode/src/utils/file.ts index d14580a..be670b5 100644 --- a/extensions/vscode/src/utils/file.ts +++ b/extensions/vscode/src/utils/file.ts @@ -1,6 +1,6 @@ import type { PackageManifestInfo } from 'npmx-language-core/types' import type { TextDocument, Uri } from 'vscode' -import { PACKAGE_JSON_BASENAME, PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from '#shared/constants' +import { PACKAGE_JSON_BASENAME, PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from 'npmx-language-core/constants' import { basename } from 'pathe' import { workspace } from 'vscode' diff --git a/extensions/vscode/src/utils/links.ts b/extensions/vscode/src/utils/links.ts index 4d070d6..ef5bc12 100644 --- a/extensions/vscode/src/utils/links.ts +++ b/extensions/vscode/src/utils/links.ts @@ -1,4 +1,4 @@ -import { NPMX_DEV } from '#shared/constants' +import { NPMX_DEV } from '#utils/constants' const SPACES = /\s+/g diff --git a/extensions/vscode/tests/__setup__/msw.ts b/extensions/vscode/tests/__setup__/msw.ts index 82da395..43e6912 100644 --- a/extensions/vscode/tests/__setup__/msw.ts +++ b/extensions/vscode/tests/__setup__/msw.ts @@ -1,4 +1,4 @@ -import { NPMX_DEV_API } from '#shared/constants' +import { NPMX_DEV_API } from '#utils/constants' import { all } from 'module-replacements' import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' diff --git a/packages/language-core/package.json b/packages/language-core/package.json index 2c4da67..4e746df 100644 --- a/packages/language-core/package.json +++ b/packages/language-core/package.json @@ -11,6 +11,7 @@ }, "sideEffects": false, "exports": { + "./constants": "./dist/constants.js", "./extractors": "./dist/extractors/index.js", "./types": "./dist/types.js", "./utils": "./dist/utils.js", diff --git a/packages/language-core/src/constants.ts b/packages/language-core/src/constants.ts new file mode 100644 index 0000000..67b9b5b --- /dev/null +++ b/packages/language-core/src/constants.ts @@ -0,0 +1,5 @@ +export const PACKAGE_JSON_BASENAME = 'package.json' +export const PNPM_WORKSPACE_BASENAME = 'pnpm-workspace.yaml' +export const YARN_WORKSPACE_BASENAME = '.yarnrc.yml' + +export const DEFAULT_CATALOG_NAME = 'default' diff --git a/packages/language-core/src/extractors/json.ts b/packages/language-core/src/extractors/json.ts index de283c5..d57c8bc 100644 --- a/packages/language-core/src/extractors/json.ts +++ b/packages/language-core/src/extractors/json.ts @@ -1,6 +1,5 @@ -import type { Engines } from 'fast-npm-meta' import type { Node as JsonNode } from 'jsonc-parser' -import type { BaseExtractor, DependencyCategory, DependencyInfo, OffsetRange, PackageManifestExtractor, PackageManifestInfo } from '../types' +import type { BaseExtractor, DependencyCategory, DependencyInfo, Engines, OffsetRange, PackageManifestExtractor, PackageManifestInfo } from '../types' import { findNodeAtLocation, parseTree } from 'jsonc-parser' const DEPENDENCY_SECTIONS: DependencyCategory[] = [ diff --git a/packages/language-core/src/types.ts b/packages/language-core/src/types.ts index be64c0c..8c9b304 100644 --- a/packages/language-core/src/types.ts +++ b/packages/language-core/src/types.ts @@ -1,5 +1,3 @@ -import type { Engines } from 'fast-npm-meta' - export type OffsetRange = [start: number, end: number] export type DependencyProtocol @@ -12,8 +10,6 @@ export type DependencyProtocol | 'http' | null -export type CatalogsInfo = Record> - export type DependencyCategory = | 'dependencies' | 'devDependencies' @@ -35,6 +31,8 @@ interface DependenciesInfo { dependencies: DependencyInfo[] } +export type Engines = Record + export interface PackageManifestInfo extends DependenciesInfo { name?: string version?: string @@ -42,8 +40,10 @@ export interface PackageManifestInfo extends DependenciesInfo { engines?: Engines } +export type CatalogsInfo = Record> + export interface WorkspaceCatalogInfo extends DependenciesInfo { - catalogs?: Record> + catalogs?: CatalogsInfo } export interface BaseExtractor { diff --git a/packages/language-core/src/utils.ts b/packages/language-core/src/utils.ts index f41a0c2..da241ad 100644 --- a/packages/language-core/src/utils.ts +++ b/packages/language-core/src/utils.ts @@ -1,4 +1,4 @@ -const DEFAULT_CATALOG_NAME = 'default' +import { DEFAULT_CATALOG_NAME } from './constants' export function normalizeCatalogName(name: string): string { return name.trim() || DEFAULT_CATALOG_NAME diff --git a/packages/language-core/tsdown.config.ts b/packages/language-core/tsdown.config.ts index 54f2aab..3b9f46e 100644 --- a/packages/language-core/tsdown.config.ts +++ b/packages/language-core/tsdown.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ }, /// keep-sorted entry: [ + 'src/constants.ts', 'src/extractors/index.ts', 'src/types.ts', 'src/utils.ts', @@ -17,4 +18,12 @@ export default defineConfig({ exports: true, dts: true, minify: 'dce-only', + deps: { + /// keep-sorted + onlyBundle: [ + 'jsonc-parser', + 'pathe', + 'yaml', + ], + }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ef1956..baa9326 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,9 +175,6 @@ importers: packages/language-core: dependencies: - fast-npm-meta: - specifier: catalog:inline - version: 1.4.2 jsonc-parser: specifier: catalog:inline version: 3.3.1 From d0d68d8927113ea76335c79b81659cb558464d53 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Tue, 17 Mar 2026 16:51:48 +0800 Subject: [PATCH 3/6] move more --- extensions/vscode/src/api/vulnerability.ts | 3 +- extensions/vscode/src/core/workspace.ts | 30 +++++++------ .../vscode/src/providers/diagnostics/index.ts | 8 ++-- .../diagnostics/rules/__tests__/utils.ts | 2 +- .../diagnostics/rules/deprecation.ts | 2 +- .../diagnostics/rules/engine-mismatch.ts | 2 +- .../diagnostics/rules/upgrade.test.ts | 4 +- .../providers/diagnostics/rules/upgrade.ts | 4 +- .../diagnostics/rules/vulnerability.ts | 2 +- extensions/vscode/src/utils/ignore.ts | 2 +- extensions/vscode/src/utils/package.test.ts | 44 +------------------ extensions/vscode/src/utils/package.ts | 41 ----------------- extensions/vscode/src/utils/version.test.ts | 4 +- extensions/vscode/src/utils/version.ts | 6 +-- packages/language-core/package.json | 2 +- packages/language-core/src/constants.ts | 2 - packages/language-core/src/extractors/json.ts | 6 +-- packages/language-core/src/extractors/yaml.ts | 6 +-- packages/language-core/src/types.ts | 20 ++++++--- packages/language-core/src/utils.ts | 5 --- packages/language-core/src/utils/catalog.ts | 3 ++ .../src/utils/dependency.test.ts | 0 .../language-core}/src/utils/dependency.ts | 15 +++---- packages/language-core/src/utils/index.ts | 3 ++ .../language-core/src/utils/package.test.ts | 44 +++++++++++++++++++ packages/language-core/src/utils/package.ts | 38 ++++++++++++++++ packages/language-core/tsdown.config.ts | 2 +- pnpm-lock.yaml | 2 +- vitest.config.ts | 1 + 29 files changed, 154 insertions(+), 149 deletions(-) delete mode 100644 packages/language-core/src/utils.ts create mode 100644 packages/language-core/src/utils/catalog.ts rename {extensions/vscode => packages/language-core}/src/utils/dependency.test.ts (100%) rename {extensions/vscode => packages/language-core}/src/utils/dependency.ts (86%) create mode 100644 packages/language-core/src/utils/index.ts create mode 100644 packages/language-core/src/utils/package.test.ts create mode 100644 packages/language-core/src/utils/package.ts diff --git a/extensions/vscode/src/api/vulnerability.ts b/extensions/vscode/src/api/vulnerability.ts index f1bb394..5cec245 100644 --- a/extensions/vscode/src/api/vulnerability.ts +++ b/extensions/vscode/src/api/vulnerability.ts @@ -1,6 +1,7 @@ import { logger } from '#state' import { CACHE_MAX_AGE_ONE_DAY, NPMX_DEV_API } from '#utils/constants' -import { encodePackageName, formatPackageId } from '#utils/package' +import { encodePackageName } from '#utils/package' +import { formatPackageId } from 'npmx-language-core/utils' import { defineCachedFunction } from 'ocache' import { ofetch } from 'ofetch' diff --git a/extensions/vscode/src/core/workspace.ts b/extensions/vscode/src/core/workspace.ts index aa6b0f4..6b3daa5 100644 --- a/extensions/vscode/src/core/workspace.ts +++ b/extensions/vscode/src/core/workspace.ts @@ -1,32 +1,34 @@ import type { PackageInfo } from '#api/package' import type { PackageManager } from '#shared/types' -import type { CatalogsInfo, DependencyInfo, DependencyProtocol, PackageManifestInfo, WorkspaceCatalogInfo } from 'npmx-language-core/types' +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 { 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' -export interface ResolvedDependencyInfo extends DependencyInfo { - protocol: DependencyProtocol - resolvedName: string - resolvedSpec: string - resolvedProtocol: DependencyProtocol +export interface DependencyInfo extends ExtractedDependencyInfo, ResolvedDependencyInfo { packageInfo: () => Promise resolvedVersion: () => Promise } -type WithResolvedDependencyInfo = Omit & { - dependencies: ResolvedDependencyInfo[] +type WithDependencyInfo = Omit & { + dependencies: DependencyInfo[] } export const workspaceFileMapping: Record, string> = { @@ -99,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( @@ -127,7 +129,7 @@ class WorkspaceContext { } loadPackageManifestInfo = defineCachedFunction< - WithResolvedDependencyInfo | undefined, + WithDependencyInfo | undefined, [Uri] >(async (uri) => { const path = uri.path @@ -155,7 +157,7 @@ class WorkspaceContext { }, this.#cacheOptions) loadWorkspaceCatalogInfo = defineCachedFunction< - WithResolvedDependencyInfo | undefined, + WithDependencyInfo | undefined, [Uri] >(async (uri) => { const path = uri.path @@ -209,7 +211,7 @@ export async function getWorkspaceContext(uri: Uri) { return await getWorkspaceContextByFolder(folder) } -export async function getResolvedDependencies(uri: Uri): Promise { +export async function getResolvedDependencies(uri: Uri): Promise { const ctx = await getWorkspaceContext(uri) if (!ctx) return @@ -221,7 +223,7 @@ export async function getResolvedDependencies(uri: Uri): Promise { +export async function getResolvedDependencyByOffset(uri: Uri, offset: number): Promise { const dependencies = await getResolvedDependencies(uri) return dependencies?.find((dependency) => isOffsetInRange(offset, dependency.nameRange) || isOffsetInRange(offset, dependency.specRange)) diff --git a/extensions/vscode/src/providers/diagnostics/index.ts b/extensions/vscode/src/providers/diagnostics/index.ts index cb8161b..e4190a4 100644 --- a/extensions/vscode/src/providers/diagnostics/index.ts +++ b/extensions/vscode/src/providers/diagnostics/index.ts @@ -1,4 +1,4 @@ -import type { ResolvedDependencyInfo } from '#core/workspace' +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' @@ -20,8 +20,8 @@ import { checkVulnerability } from './rules/vulnerability' export interface DiagnosticContext { uri: Uri - dep: ResolvedDependencyInfo - pkg: NonNullable>> + dep: DependencyInfo + pkg: NonNullable>> } export interface RangeDiagnosticInfo extends Omit { @@ -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)) diff --git a/extensions/vscode/src/providers/diagnostics/rules/__tests__/utils.ts b/extensions/vscode/src/providers/diagnostics/rules/__tests__/utils.ts index f8b6bd9..02a2f6d 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/__tests__/utils.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/__tests__/utils.ts @@ -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 { diff --git a/extensions/vscode/src/providers/diagnostics/rules/deprecation.ts b/extensions/vscode/src/providers/diagnostics/rules/deprecation.ts index 39624fd..5194de2 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/deprecation.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/deprecation.ts @@ -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 }) => { diff --git a/extensions/vscode/src/providers/diagnostics/rules/engine-mismatch.ts b/extensions/vscode/src/providers/diagnostics/rules/engine-mismatch.ts index 37a660f..a739388 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/engine-mismatch.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/engine-mismatch.ts @@ -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' diff --git a/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts b/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts index 96ed393..0e7d029 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/upgrade.test.ts @@ -1,5 +1,5 @@ import type { PackageInfo } from '#api/package' -import type { ResolvedDependencyInfo } from '#core/workspace' +import type { DependencyInfo } from '#core/workspace' import { describe, expect, it } from 'vitest' import { createContext } from './__tests__/utils' import { resolveUpgrade } from './upgrade' @@ -16,7 +16,7 @@ const versionsMeta: Record = { '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())!] } diff --git a/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts b/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts index 3953752..57a8fd1 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/upgrade.ts @@ -1,5 +1,5 @@ import type { PackageInfo } from '#api/package' -import type { ResolvedDependencyInfo } from '#core/workspace' +import type { DependencyInfo } from '#core/workspace' import type { OffsetRange } from 'npmx-language-core/types' import type { DiagnosticRule, RangeDiagnosticInfo } from '..' import { config } from '#state' @@ -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 diff --git a/extensions/vscode/src/providers/diagnostics/rules/vulnerability.ts b/extensions/vscode/src/providers/diagnostics/rules/vulnerability.ts index 4d259c7..a174276 100644 --- a/extensions/vscode/src/providers/diagnostics/rules/vulnerability.ts +++ b/extensions/vscode/src/providers/diagnostics/rules/vulnerability.ts @@ -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' diff --git a/extensions/vscode/src/utils/ignore.ts b/extensions/vscode/src/utils/ignore.ts index 7777ebf..d7aa6a6 100644 --- a/extensions/vscode/src/utils/ignore.ts +++ b/extensions/vscode/src/utils/ignore.ts @@ -1,4 +1,4 @@ -import { formatPackageId, parsePackageId } from './package' +import { formatPackageId, parsePackageId } from 'npmx-language-core/utils' export function checkIgnored(options: { ignoreList: string[] diff --git a/extensions/vscode/src/utils/package.test.ts b/extensions/vscode/src/utils/package.test.ts index 02cdf92..5954c0c 100644 --- a/extensions/vscode/src/utils/package.test.ts +++ b/extensions/vscode/src/utils/package.test.ts @@ -1,6 +1,6 @@ import type { PackageInfo } from '#api/package' import { describe, expect, it } from 'vitest' -import { encodePackageName, isJsrNpmPackage, jsrNpmToJsrName, parsePackageId, resolveExactVersion } from './package' +import { encodePackageName, resolveExactVersion } from './package' describe('encodePackageName', () => { it('should encode regular package name', () => { @@ -12,48 +12,6 @@ describe('encodePackageName', () => { }) }) -describe('isJsrNpmPackage', () => { - it('should detect @jsr/ scoped packages', () => { - expect(isJsrNpmPackage('@jsr/luca__cases')).toBe(true) - expect(isJsrNpmPackage('@jsr/std__path')).toBe(true) - }) - - it('should not detect non-jsr packages', () => { - expect(isJsrNpmPackage('lodash')).toBe(false) - expect(isJsrNpmPackage('@types/node')).toBe(false) - }) -}) - -describe('jsrNpmToJsrName', () => { - it('should convert @jsr/ npm name to JSR name', () => { - expect(jsrNpmToJsrName('@jsr/luca__cases')).toBe('@luca/cases') - expect(jsrNpmToJsrName('@jsr/std__path')).toBe('@std/path') - }) -}) - -describe('parsePackageId', () => { - it('should parse package id with version', () => { - expect(parsePackageId('lodash@4.17.21')).toEqual({ - name: 'lodash', - version: '4.17.21', - }) - }) - - it('should parse scoped package id with version', () => { - expect(parsePackageId('@babel/core@7.0.0')).toEqual({ - name: '@babel/core', - version: '7.0.0', - }) - }) - - it('should keep package name when version is missing', () => { - expect(parsePackageId('@babel/core')).toEqual({ - name: '@babel/core', - version: null, - }) - }) -}) - describe('resolveExactVersion', () => { it.each([ ['', '4.10.0'], diff --git a/extensions/vscode/src/utils/package.ts b/extensions/vscode/src/utils/package.ts index b7307df..dea3349 100644 --- a/extensions/vscode/src/utils/package.ts +++ b/extensions/vscode/src/utils/package.ts @@ -15,47 +15,6 @@ export function encodePackageName(name: string): string { return encodeURIComponent(name) } -const JSR_NPM_SCOPE = '@jsr/' - -export function isJsrNpmPackage(name: string): boolean { - return name.startsWith(JSR_NPM_SCOPE) -} - -export function jsrNpmToJsrName(name: string): string { - if (!isJsrNpmPackage(name)) - return name - - const bare = name.slice(JSR_NPM_SCOPE.length) - const separatorIndex = bare.indexOf('__') - if (separatorIndex === -1) - return bare - return `@${bare.slice(0, separatorIndex)}/${bare.slice(separatorIndex + 2)}` -} - -export function formatPackageId(name: string, version: string): string { - return `${name}@${version}` -} - -interface ParsedPackageId { - name: string - version: string | null -} - -export function parsePackageId(id: string): ParsedPackageId { - const separatorIndex = id.lastIndexOf('@') - if (separatorIndex <= 0) { - return { - name: id, - version: null, - } - } - - return { - name: id.slice(0, separatorIndex), - version: id.slice(separatorIndex + 1) || null, - } -} - /** * Resolve the maximum version satisfying the given range, capped by the `latest` dist-tag when possible. * diff --git a/extensions/vscode/src/utils/version.test.ts b/extensions/vscode/src/utils/version.test.ts index 327e474..f275dcb 100644 --- a/extensions/vscode/src/utils/version.test.ts +++ b/extensions/vscode/src/utils/version.test.ts @@ -1,4 +1,4 @@ -import type { ResolvedDependencyInfo } from '#core/workspace' +import type { DependencyInfo } from '#core/workspace' import { describe, expect, it } from 'vitest' import { formatUpgradeVersion } from './version' @@ -19,7 +19,7 @@ describe('formatUpgradeVersion', () => { [['^1.0.0', 'npm:foo@^1.0.0', 'my-foo'], '2.0.0', 'npm:foo@^2.0.0'], ])('should preserve $0', ([resolvedSpec, rawSpec = resolvedSpec, rawName = 'foo', protocol = 'npm'], target, expected) => { expect( - formatUpgradeVersion({ protocol, rawName, rawSpec, resolvedName: 'foo', resolvedSpec } as ResolvedDependencyInfo, target), + formatUpgradeVersion({ protocol, rawName, rawSpec, resolvedName: 'foo', resolvedSpec } as DependencyInfo, target), ).toBe(expected) }) }) diff --git a/extensions/vscode/src/utils/version.ts b/extensions/vscode/src/utils/version.ts index 37fc11c..1db0393 100644 --- a/extensions/vscode/src/utils/version.ts +++ b/extensions/vscode/src/utils/version.ts @@ -1,5 +1,5 @@ -import type { ResolvedDependencyInfo } from '#core/workspace' -import { formatPackageId } from './package' +import type { DependencyInfo } from '#core/workspace' +import { formatPackageId } from 'npmx-language-core/utils' const RANGE_PREFIXES = ['>=', '<=', '=', '>', '<'] @@ -29,7 +29,7 @@ function getVersionRangePrefix(v: string): string { const PROTOCOL_PATTERN = /^[a-z]+:/ -export function formatUpgradeVersion(dep: ResolvedDependencyInfo, target: string): string { +export function formatUpgradeVersion(dep: DependencyInfo, target: string): string { const { rawName, rawSpec, resolvedName, resolvedSpec, protocol } = dep const isAlias = resolvedName !== rawName diff --git a/packages/language-core/package.json b/packages/language-core/package.json index 4e746df..64e9785 100644 --- a/packages/language-core/package.json +++ b/packages/language-core/package.json @@ -14,7 +14,7 @@ "./constants": "./dist/constants.js", "./extractors": "./dist/extractors/index.js", "./types": "./dist/types.js", - "./utils": "./dist/utils.js", + "./utils": "./dist/utils/index.js", "./package.json": "./package.json" }, "files": [ diff --git a/packages/language-core/src/constants.ts b/packages/language-core/src/constants.ts index 67b9b5b..9292139 100644 --- a/packages/language-core/src/constants.ts +++ b/packages/language-core/src/constants.ts @@ -1,5 +1,3 @@ export const PACKAGE_JSON_BASENAME = 'package.json' export const PNPM_WORKSPACE_BASENAME = 'pnpm-workspace.yaml' export const YARN_WORKSPACE_BASENAME = '.yarnrc.yml' - -export const DEFAULT_CATALOG_NAME = 'default' diff --git a/packages/language-core/src/extractors/json.ts b/packages/language-core/src/extractors/json.ts index d57c8bc..d56fd4e 100644 --- a/packages/language-core/src/extractors/json.ts +++ b/packages/language-core/src/extractors/json.ts @@ -1,5 +1,5 @@ import type { Node as JsonNode } from 'jsonc-parser' -import type { BaseExtractor, DependencyCategory, DependencyInfo, Engines, OffsetRange, PackageManifestExtractor, PackageManifestInfo } from '../types' +import type { BaseExtractor, DependencyCategory, Engines, ExtractedDependencyInfo, OffsetRange, PackageManifestExtractor, PackageManifestInfo } from '../types' import { findNodeAtLocation, parseTree } from 'jsonc-parser' const DEPENDENCY_SECTIONS: DependencyCategory[] = [ @@ -21,7 +21,7 @@ export class JsonExtractor implements PackageManifestExtractor, BaseExtractor { const node = findNodeAtLocation(root, [section]) diff --git a/packages/language-core/src/extractors/yaml.ts b/packages/language-core/src/extractors/yaml.ts index 9389696..e3fdda2 100644 --- a/packages/language-core/src/extractors/yaml.ts +++ b/packages/language-core/src/extractors/yaml.ts @@ -1,5 +1,5 @@ import type { Pair, Scalar, YAMLMap, Node as YamlNode } from 'yaml' -import type { BaseExtractor, DependencyInfo, OffsetRange, WorkspaceCatalogExtractor, WorkspaceCatalogInfo } from '../types' +import type { BaseExtractor, ExtractedDependencyInfo, OffsetRange, WorkspaceCatalogExtractor, WorkspaceCatalogInfo } from '../types' import { isMap, isPair, isScalar, parseDocument } from 'yaml' import { normalizeCatalogName } from '../utils' @@ -64,11 +64,11 @@ export class YamlExtractor implements WorkspaceCatalogExtractor, BaseExtractor { result.push({ diff --git a/packages/language-core/src/types.ts b/packages/language-core/src/types.ts index 8c9b304..78f236c 100644 --- a/packages/language-core/src/types.ts +++ b/packages/language-core/src/types.ts @@ -18,7 +18,7 @@ export type DependencyCategory | 'catalog' | 'catalogs' -export interface DependencyInfo { +export interface ExtractedDependencyInfo { category: DependencyCategory categoryName?: string rawName: string @@ -27,13 +27,21 @@ export interface DependencyInfo { specRange: OffsetRange } -interface DependenciesInfo { - dependencies: DependencyInfo[] +export interface ResolvedDependencyInfo { + protocol: DependencyProtocol + categoryName?: string + resolvedName: string + resolvedSpec: string + resolvedProtocol: string +} + +interface HasDependenciesInfo { + dependencies: ExtractedDependencyInfo[] } export type Engines = Record -export interface PackageManifestInfo extends DependenciesInfo { +export interface PackageManifestInfo extends HasDependenciesInfo { name?: string version?: string packageManager?: string @@ -42,13 +50,13 @@ export interface PackageManifestInfo extends DependenciesInfo { export type CatalogsInfo = Record> -export interface WorkspaceCatalogInfo extends DependenciesInfo { +export interface WorkspaceCatalogInfo extends HasDependenciesInfo { catalogs?: CatalogsInfo } export interface BaseExtractor { parse: (text: string) => T | null | undefined - getDependenciesInfo: (root: T) => DependencyInfo[] + getDependenciesInfo: (root: T) => ExtractedDependencyInfo[] } export interface PackageManifestExtractor { diff --git a/packages/language-core/src/utils.ts b/packages/language-core/src/utils.ts deleted file mode 100644 index da241ad..0000000 --- a/packages/language-core/src/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { DEFAULT_CATALOG_NAME } from './constants' - -export function normalizeCatalogName(name: string): string { - return name.trim() || DEFAULT_CATALOG_NAME -} diff --git a/packages/language-core/src/utils/catalog.ts b/packages/language-core/src/utils/catalog.ts new file mode 100644 index 0000000..5239b67 --- /dev/null +++ b/packages/language-core/src/utils/catalog.ts @@ -0,0 +1,3 @@ +export function normalizeCatalogName(name: string): string { + return name.trim() || 'default' +} diff --git a/extensions/vscode/src/utils/dependency.test.ts b/packages/language-core/src/utils/dependency.test.ts similarity index 100% rename from extensions/vscode/src/utils/dependency.test.ts rename to packages/language-core/src/utils/dependency.test.ts diff --git a/extensions/vscode/src/utils/dependency.ts b/packages/language-core/src/utils/dependency.ts similarity index 86% rename from extensions/vscode/src/utils/dependency.ts rename to packages/language-core/src/utils/dependency.ts index 51f029c..079e558 100644 --- a/extensions/vscode/src/utils/dependency.ts +++ b/packages/language-core/src/utils/dependency.ts @@ -1,13 +1,8 @@ -import type { ResolvedDependencyInfo } from '#core/workspace' -import type { CatalogsInfo } from 'npmx-language-core/types' -import { isJsrNpmPackage, jsrNpmToJsrName, parsePackageId } from '#utils/package' -import { normalizeCatalogName } from 'npmx-language-core/utils' +import type { CatalogsInfo, ResolvedDependencyInfo } from '../types' +import { normalizeCatalogName } from './catalog' +import { isJsrNpmPackage, jsrNpmToJsrName, parsePackageId } from './package' -interface FinalResolution extends Pick { -} - -interface DependencySpecResolution extends FinalResolution, Pick { -} +type FinalResolution = Pick const GIT_PATTERN = /^(?:git\+|git:\/\/|github:|gitlab:|bitbucket:|ssh:\/\/git@)/i const HTTP_PATTERN = /^https?:/i @@ -105,7 +100,7 @@ function resolveEffectiveSpec(rawName: string, rawSpec: string, catalogs?: Catal } } -export function resolveDependencySpec(rawName: string, rawSpec: string, catalogs: CatalogsInfo = {}): DependencySpecResolution { +export function resolveDependencySpec(rawName: string, rawSpec: string, catalogs: CatalogsInfo = {}): ResolvedDependencyInfo { const spec = rawSpec.trim() const effective = resolveEffectiveSpec(rawName, rawSpec, catalogs) diff --git a/packages/language-core/src/utils/index.ts b/packages/language-core/src/utils/index.ts new file mode 100644 index 0000000..e6058e0 --- /dev/null +++ b/packages/language-core/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './catalog' +export * from './dependency' +export * from './package' diff --git a/packages/language-core/src/utils/package.test.ts b/packages/language-core/src/utils/package.test.ts new file mode 100644 index 0000000..2fcae8f --- /dev/null +++ b/packages/language-core/src/utils/package.test.ts @@ -0,0 +1,44 @@ +import { describe, expect, it } from 'vitest' +import { isJsrNpmPackage, jsrNpmToJsrName, parsePackageId } from './package' + +describe('parsePackageId', () => { + it('should parse package id with version', () => { + expect(parsePackageId('lodash@4.17.21')).toEqual({ + name: 'lodash', + version: '4.17.21', + }) + }) + + it('should parse scoped package id with version', () => { + expect(parsePackageId('@babel/core@7.0.0')).toEqual({ + name: '@babel/core', + version: '7.0.0', + }) + }) + + it('should keep package name when version is missing', () => { + expect(parsePackageId('@babel/core')).toEqual({ + name: '@babel/core', + version: null, + }) + }) +}) + +describe('isJsrNpmPackage', () => { + it('should detect @jsr/ scoped packages', () => { + expect(isJsrNpmPackage('@jsr/luca__cases')).toBe(true) + expect(isJsrNpmPackage('@jsr/std__path')).toBe(true) + }) + + it('should not detect non-jsr packages', () => { + expect(isJsrNpmPackage('lodash')).toBe(false) + expect(isJsrNpmPackage('@types/node')).toBe(false) + }) +}) + +describe('jsrNpmToJsrName', () => { + it('should convert @jsr/ npm name to JSR name', () => { + expect(jsrNpmToJsrName('@jsr/luca__cases')).toBe('@luca/cases') + expect(jsrNpmToJsrName('@jsr/std__path')).toBe('@std/path') + }) +}) diff --git a/packages/language-core/src/utils/package.ts b/packages/language-core/src/utils/package.ts new file mode 100644 index 0000000..c4f6725 --- /dev/null +++ b/packages/language-core/src/utils/package.ts @@ -0,0 +1,38 @@ +export function formatPackageId(name: string, version: string): string { + return `${name}@${version}` +} + +export function parsePackageId(id: string): { + name: string + version: string | null +} { + const separatorIndex = id.lastIndexOf('@') + if (separatorIndex <= 0) { + return { + name: id, + version: null, + } + } + + return { + name: id.slice(0, separatorIndex), + version: id.slice(separatorIndex + 1) || null, + } +} + +const JSR_NPM_SCOPE = '@jsr/' + +export function isJsrNpmPackage(name: string): boolean { + return name.startsWith(JSR_NPM_SCOPE) +} + +export function jsrNpmToJsrName(name: string): string { + if (!isJsrNpmPackage(name)) + return name + + const bare = name.slice(JSR_NPM_SCOPE.length) + const separatorIndex = bare.indexOf('__') + if (separatorIndex === -1) + return bare + return `@${bare.slice(0, separatorIndex)}/${bare.slice(separatorIndex + 2)}` +} diff --git a/packages/language-core/tsdown.config.ts b/packages/language-core/tsdown.config.ts index 3b9f46e..d9b6a29 100644 --- a/packages/language-core/tsdown.config.ts +++ b/packages/language-core/tsdown.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ 'src/constants.ts', 'src/extractors/index.ts', 'src/types.ts', - 'src/utils.ts', + 'src/utils/index.ts', ], platform: 'neutral', exports: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baa9326..19dff17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: version: 2.8.2 packages/language-core: - dependencies: + devDependencies: jsonc-parser: specifier: catalog:inline version: 3.3.1 diff --git a/vitest.config.ts b/vitest.config.ts index 241121a..f7370b4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ include: ['**/*.test.ts'], projects: [ 'extensions/*', + 'packages/*', ], }, }) From 7ad5dd1dfee68c4968ea50bb1d5a7238497fa98c Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Tue, 17 Mar 2026 16:55:54 +0800 Subject: [PATCH 4/6] update --- extensions/vscode/package.json | 4 +--- pnpm-lock.yaml | 6 ------ 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index eba97c7..051efa0 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -206,7 +206,6 @@ "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", @@ -215,7 +214,6 @@ "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" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19dff17..06cf9b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,9 +139,6 @@ importers: fast-npm-meta: specifier: catalog:inline version: 1.4.2 - jsonc-parser: - specifier: catalog:inline - version: 3.3.1 npmx-language-core: specifier: workspace:* version: link:../../packages/language-core @@ -169,9 +166,6 @@ importers: vscode-find-up: specifier: catalog:inline version: 0.1.1(@types/vscode@1.101.0) - yaml: - specifier: catalog:inline - version: 2.8.2 packages/language-core: devDependencies: From 4ac061e3758b481b8b442897a04e5717fdfca9d4 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Tue, 17 Mar 2026 17:04:11 +0800 Subject: [PATCH 5/6] ci: fix --- .github/workflows/autofix.yml | 3 +++ .github/workflows/publish.yml | 13 ++++++++----- .github/workflows/unit-test.yml | 6 ++++++ extensions/vscode/package.json | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 52b249c..924e50b 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -17,6 +17,9 @@ jobs: with: no-frozen-lockfile: true + - name: Build + run: pnpm build + - name: Fix run: pnpm run lint:fix diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f7f00b6..de75e3f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -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 @@ -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}} diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index a8fcbe5..fe59261 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -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 @@ -37,5 +40,8 @@ jobs: with: node-version: ${{ matrix.node-version }} + - name: Build + run: pnpm build + - name: Unit Test run: pnpm run test diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 051efa0..7aa3793 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -198,10 +198,10 @@ "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", From 0827ee74ac3ebcc56091bb3b7ac19141090e591e Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Tue, 17 Mar 2026 17:04:55 +0800 Subject: [PATCH 6/6] unnecessary --- .github/workflows/autofix.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 924e50b..52b249c 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -17,9 +17,6 @@ jobs: with: no-frozen-lockfile: true - - name: Build - run: pnpm build - - name: Fix run: pnpm run lint:fix