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 7637061..7aa3793 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -198,15 +198,15 @@ "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", @@ -214,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/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..5cec245 100644 --- a/extensions/vscode/src/api/vulnerability.ts +++ b/extensions/vscode/src/api/vulnerability.ts @@ -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' 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 cf2ed5f..6b3daa5 100644 --- a/extensions/vscode/src/core/workspace.ts +++ b/extensions/vscode/src/core/workspace.ts @@ -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 = Omit & { - dependencies: ResolvedDependencyInfo[] +export interface DependencyInfo extends ExtractedDependencyInfo, ResolvedDependencyInfo { + packageInfo: () => Promise + resolvedVersion: () => Promise +} + +type WithDependencyInfo = Omit & { + dependencies: DependencyInfo[] } export const workspaceFileMapping: Record, string> = { @@ -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( @@ -118,7 +129,7 @@ class WorkspaceContext { } loadPackageManifestInfo = defineCachedFunction< - WithResolvedDependencyInfo | undefined, + WithDependencyInfo | undefined, [Uri] >(async (uri) => { const path = uri.path @@ -146,7 +157,7 @@ class WorkspaceContext { }, this.#cacheOptions) loadWorkspaceCatalogInfo = defineCachedFunction< - WithResolvedDependencyInfo | undefined, + WithDependencyInfo | undefined, [Uri] >(async (uri) => { const path = uri.path @@ -200,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 @@ -212,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/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/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/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 18a0a7e..e4190a4 100644 --- a/extensions/vscode/src/providers/diagnostics/index.ts +++ b/extensions/vscode/src/providers/diagnostics/index.ts @@ -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' @@ -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 6ee47fd..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 '#types/context' +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 7e20dd1..57a8fd1 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 { 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' @@ -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/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/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/types/extractor.ts b/extensions/vscode/src/types/extractor.ts deleted file mode 100644 index 696c8e2..0000000 --- a/extensions/vscode/src/types/extractor.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { Engines } from 'fast-npm-meta' - -export type { - Node as JsonNode, -} from 'jsonc-parser' - -export type { - Node as YamlNode, -} from 'yaml' - -export type OffsetRange = [start: number, end: number] - -export type DependencyCategory - = | 'dependencies' - | 'devDependencies' - | 'peerDependencies' - | 'optionalDependencies' - | 'catalog' - | 'catalogs' - -export interface DependencyInfo { - category: DependencyCategory - categoryName?: string - rawName: string - rawSpec: string - nameRange: OffsetRange - specRange: OffsetRange -} - -interface DependenciesInfo { - dependencies: DependencyInfo[] -} - -export interface PackageManifestInfo extends DependenciesInfo { - name?: string - version?: string - packageManager?: string - engines?: Engines -} - -export interface WorkspaceCatalogInfo extends DependenciesInfo { - catalogs?: Record> -} - -export interface BaseExtractor { - parse: (text: string) => T | null | undefined - getDependenciesInfo: (root: T) => DependencyInfo[] -} - -export interface PackageManifestExtractor { - getPackageManifestInfo: (text: string) => PackageManifestInfo | undefined -} - -export interface WorkspaceCatalogExtractor { - getWorkspaceCatalogInfo: (text: string) => WorkspaceCatalogInfo | undefined -} 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/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 7e1ac76..be670b5 100644 --- a/extensions/vscode/src/utils/file.ts +++ b/extensions/vscode/src/utils/file.ts @@ -1,6 +1,6 @@ -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 { 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/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/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/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 7b954d2..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 '#types/context' +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 6e433b6..1db0393 100644 --- a/extensions/vscode/src/utils/version.ts +++ b/extensions/vscode/src/utils/version.ts @@ -1,5 +1,5 @@ -import type { ResolvedDependencyInfo } from '#types/context' -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/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/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..64e9785 --- /dev/null +++ b/packages/language-core/package.json @@ -0,0 +1,37 @@ +{ + "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": { + "./constants": "./dist/constants.js", + "./extractors": "./dist/extractors/index.js", + "./types": "./dist/types.js", + "./utils": "./dist/utils/index.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/packages/language-core/src/constants.ts b/packages/language-core/src/constants.ts new file mode 100644 index 0000000..9292139 --- /dev/null +++ b/packages/language-core/src/constants.ts @@ -0,0 +1,3 @@ +export const PACKAGE_JSON_BASENAME = 'package.json' +export const PNPM_WORKSPACE_BASENAME = 'pnpm-workspace.yaml' +export const YARN_WORKSPACE_BASENAME = '.yarnrc.yml' 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 89% rename from extensions/vscode/src/core/extractors/json.ts rename to packages/language-core/src/extractors/json.ts index a7d3de0..d56fd4e 100644 --- a/extensions/vscode/src/core/extractors/json.ts +++ b/packages/language-core/src/extractors/json.ts @@ -1,5 +1,5 @@ -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, 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/extensions/vscode/src/core/extractors/yaml.ts b/packages/language-core/src/extractors/yaml.ts similarity index 88% rename from extensions/vscode/src/core/extractors/yaml.ts rename to packages/language-core/src/extractors/yaml.ts index ae75337..e3fdda2 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, ExtractedDependencyInfo, OffsetRange, WorkspaceCatalogExtractor, WorkspaceCatalogInfo } from '../types' import { isMap, isPair, isScalar, parseDocument } from 'yaml' +import { normalizeCatalogName } from '../utils' const CATALOG_SECTION = 'catalog' const CATALOGS_SECTION = 'catalogs' @@ -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 new file mode 100644 index 0000000..78f236c --- /dev/null +++ b/packages/language-core/src/types.ts @@ -0,0 +1,68 @@ +export type OffsetRange = [start: number, end: number] + +export type DependencyProtocol + = | 'npm' + | 'jsr' + | 'workspace' + | 'catalog' + | 'git' + | 'file' + | 'http' + | null + +export type DependencyCategory + = | 'dependencies' + | 'devDependencies' + | 'peerDependencies' + | 'optionalDependencies' + | 'catalog' + | 'catalogs' + +export interface ExtractedDependencyInfo { + category: DependencyCategory + categoryName?: string + rawName: string + rawSpec: string + nameRange: OffsetRange + specRange: OffsetRange +} + +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 HasDependenciesInfo { + name?: string + version?: string + packageManager?: string + engines?: Engines +} + +export type CatalogsInfo = Record> + +export interface WorkspaceCatalogInfo extends HasDependenciesInfo { + catalogs?: CatalogsInfo +} + +export interface BaseExtractor { + parse: (text: string) => T | null | undefined + getDependenciesInfo: (root: T) => ExtractedDependencyInfo[] +} + +export interface PackageManifestExtractor { + getPackageManifestInfo: (text: string) => PackageManifestInfo | undefined +} + +export interface WorkspaceCatalogExtractor { + getWorkspaceCatalogInfo: (text: string) => WorkspaceCatalogInfo | undefined +} 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 85% rename from extensions/vscode/src/utils/dependency.ts rename to packages/language-core/src/utils/dependency.ts index acc43c8..079e558 100644 --- a/extensions/vscode/src/utils/dependency.ts +++ b/packages/language-core/src/utils/dependency.ts @@ -1,20 +1,12 @@ -import type { CatalogsInfo, ResolvedDependencyInfo } from '#types/context' -import { isJsrNpmPackage, jsrNpmToJsrName, parsePackageId } from '#utils/package' +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 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) { @@ -108,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/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..d9b6a29 --- /dev/null +++ b/packages/language-core/tsdown.config.ts @@ -0,0 +1,29 @@ +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/constants.ts', + 'src/extractors/index.ts', + 'src/types.ts', + 'src/utils/index.ts', + ], + platform: 'neutral', + 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 c8a9c41..06cf9b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,9 +139,9 @@ 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 ocache: specifier: catalog:inline version: 0.1.2 @@ -166,6 +166,15 @@ importers: vscode-find-up: specifier: catalog:inline version: 0.1.1(@types/vscode@1.101.0) + + packages/language-core: + devDependencies: + 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 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": [] } 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/*', ], }, })