diff --git a/esbuild.js b/esbuild.js index 8d4ed7afd1..6862e63557 100644 --- a/esbuild.js +++ b/esbuild.js @@ -177,19 +177,6 @@ const extensionConfig = { build.onResolve({ filter: /^pkce-challenge$/ }, (args) => { return { path: require.resolve("pkce-challenge/dist/index.browser.js") } }) - - // Handle @package-manager barrel file - build.onResolve({ filter: /^@package-manager$/ }, (args) => { - const resolvedPath = path.resolve(__dirname, "src/services/package-manager/index.ts") - return { path: resolvedPath } - }) - - // Handle @package-manager/* paths - build.onResolve({ filter: /^@package-manager\// }, (args) => { - const modulePath = args.path.replace(/^@package-manager\//, "") - const fullPath = path.resolve(__dirname, "src/services/package-manager", `${modulePath}.ts`) - return { path: fullPath } - }) }, }, ], diff --git a/src/core/webview/packageManagerMessageHandler.ts b/src/core/webview/packageManagerMessageHandler.ts index 5bcf230e11..447ae770b1 100644 --- a/src/core/webview/packageManagerMessageHandler.ts +++ b/src/core/webview/packageManagerMessageHandler.ts @@ -9,8 +9,8 @@ import { PackageManagerSource, validateSources, ValidationError, -} from "@package-manager" -import { DEFAULT_PACKAGE_MANAGER_SOURCE } from "@package-manager/constants" +} from "../../services/package-manager" +import { DEFAULT_PACKAGE_MANAGER_SOURCE } from "../../services/package-manager/constants" import { GlobalState } from "../../schemas" /** diff --git a/src/services/package-manager/GitFetcher.ts b/src/services/package-manager/GitFetcher.ts index 441a57467b..5eba83db3c 100644 --- a/src/services/package-manager/GitFetcher.ts +++ b/src/services/package-manager/GitFetcher.ts @@ -3,15 +3,10 @@ import * as path from "path" import * as fs from "fs/promises" import * as yaml from "js-yaml" import simpleGit, { SimpleGit } from "simple-git" -import { MetadataScanner } from "@package-manager/MetadataScanner" -import { validateAnyMetadata } from "@package-manager/schemas" -import { - LocalizationOptions, - PackageManagerItem, - PackageManagerRepository, - RepositoryMetadata, -} from "@package-manager/types" -import { getUserLocale } from "@package-manager/utils" +import { MetadataScanner } from "./MetadataScanner" +import { validateAnyMetadata } from "./schemas" +import { LocalizationOptions, PackageManagerItem, PackageManagerRepository, RepositoryMetadata } from "./types" +import { getUserLocale } from "./utils" /** * Handles fetching and caching package manager repositories diff --git a/src/services/package-manager/MetadataScanner.ts b/src/services/package-manager/MetadataScanner.ts index 7f71715eda..0e7277ec36 100644 --- a/src/services/package-manager/MetadataScanner.ts +++ b/src/services/package-manager/MetadataScanner.ts @@ -3,7 +3,7 @@ import * as fs from "fs/promises" import * as vscode from "vscode" import * as yaml from "js-yaml" import { SimpleGit } from "simple-git" -import { validateAnyMetadata } from "@package-manager/schemas" +import { validateAnyMetadata } from "./schemas" import { ComponentMetadata, ComponentType, @@ -11,8 +11,8 @@ import { LocalizedMetadata, PackageManagerItem, PackageMetadata, -} from "@package-manager/types" -import { getUserLocale } from "@package-manager/utils" +} from "./types" +import { getUserLocale } from "./utils" /** * Handles component discovery and metadata loading diff --git a/src/services/package-manager/PackageManagerManager.ts b/src/services/package-manager/PackageManagerManager.ts index cb44cbd3ff..204b752aa8 100644 --- a/src/services/package-manager/PackageManagerManager.ts +++ b/src/services/package-manager/PackageManagerManager.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode" import * as path from "path" import * as fs from "fs/promises" -import { GitFetcher } from "@package-manager/GitFetcher" +import { GitFetcher } from "./GitFetcher" import { PackageManagerItem, PackageManagerRepository, @@ -9,8 +9,8 @@ import { ComponentType, ComponentMetadata, LocalizationOptions, -} from "@package-manager/types" -import { getUserLocale } from "@package-manager/utils" +} from "./types" +import { getUserLocale } from "./utils" /** * Service for managing package manager data diff --git a/src/services/package-manager/__tests__/GitFetcher.test.ts b/src/services/package-manager/__tests__/GitFetcher.test.ts index 28de6d30bf..606adea2ee 100644 --- a/src/services/package-manager/__tests__/GitFetcher.test.ts +++ b/src/services/package-manager/__tests__/GitFetcher.test.ts @@ -1,9 +1,9 @@ import * as vscode from "vscode" -import { GitFetcher } from "@package-manager/GitFetcher" +import { GitFetcher } from "../GitFetcher" import * as fs from "fs/promises" import { Dirent, Stats } from "fs" import simpleGit, { SimpleGit } from "simple-git" -import { MetadataScanner } from "@package-manager/MetadataScanner" +import { MetadataScanner } from "../MetadataScanner" import { exec, ChildProcess } from "child_process" import { promisify } from "util" import { EventEmitter } from "events" diff --git a/src/services/package-manager/__tests__/MetadataScanner.test.ts b/src/services/package-manager/__tests__/MetadataScanner.test.ts index bdaec05d21..c1b2965622 100644 --- a/src/services/package-manager/__tests__/MetadataScanner.test.ts +++ b/src/services/package-manager/__tests__/MetadataScanner.test.ts @@ -1,9 +1,9 @@ import * as path from "path" import * as fs from "fs/promises" import { Dirent } from "fs" -import { MetadataScanner } from "@package-manager/MetadataScanner" +import { MetadataScanner } from "../MetadataScanner" import { SimpleGit } from "simple-git" -import { ComponentMetadata, LocalizationOptions, LocalizedMetadata, PackageMetadata } from "@package-manager/types" +import { ComponentMetadata, LocalizationOptions, LocalizedMetadata, PackageMetadata } from "../types" // Mock fs/promises jest.mock("fs/promises") diff --git a/src/services/package-manager/__tests__/PackageManagerManager.test.ts b/src/services/package-manager/__tests__/PackageManagerManager.test.ts index e89b9288b8..b1f8a6b385 100644 --- a/src/services/package-manager/__tests__/PackageManagerManager.test.ts +++ b/src/services/package-manager/__tests__/PackageManagerManager.test.ts @@ -1,7 +1,7 @@ -import { PackageManagerManager } from "@package-manager/PackageManagerManager" -import { PackageManagerItem, PackageManagerSource, PackageManagerRepository } from "@package-manager/types" -import { MetadataScanner } from "@package-manager/MetadataScanner" -import { GitFetcher } from "@package-manager/GitFetcher" +import { PackageManagerManager } from "../PackageManagerManager" +import { PackageManagerItem, PackageManagerSource, PackageManagerRepository, ComponentType } from "../types" +import { MetadataScanner } from "../MetadataScanner" +import { GitFetcher } from "../GitFetcher" import * as path from "path" import * as vscode from "vscode" @@ -511,20 +511,49 @@ describe("Concurrency Control", () => { let activeScans = 0 let maxConcurrentScans = 0 + const scanPromises: Promise[] = [] - // Mock metadata scanner to track concurrent scans - jest.spyOn(MetadataScanner.prototype, "scanDirectory").mockImplementation(async () => { + // Create a mock MetadataScanner + const mockScanner = new MetadataScanner() + const scanDirectorySpy = jest.spyOn(mockScanner, "scanDirectory").mockImplementation(async () => { activeScans++ maxConcurrentScans = Math.max(maxConcurrentScans, activeScans) - await new Promise((resolve) => setTimeout(resolve, 50)) + const promise = new Promise((resolve) => setTimeout(resolve, 50)) + scanPromises.push(promise) + await promise activeScans-- return [] }) + // Create a mock GitFetcher that uses our mock scanner + const mockGitFetcher = new GitFetcher({ + globalStorageUri: { fsPath: "/test/path" }, + } as vscode.ExtensionContext) + + // Replace GitFetcher's metadataScanner with our mock + ;(mockGitFetcher as any).metadataScanner = mockScanner + + // Mock GitFetcher's fetchRepository to trigger metadata scanning + jest.spyOn(mockGitFetcher, "fetchRepository").mockImplementation(async (repoUrl: string) => { + // Call scanDirectory through our mock scanner + await mockScanner.scanDirectory("/test/path", repoUrl) + + return { + metadata: { name: "test", description: "test", version: "1.0.0" }, + items: [], + url: repoUrl, + } + }) + + // Replace the GitFetcher instance in the manager + ;(manager as any).gitFetcher = mockGitFetcher + // Process all sources await manager.getPackageManagerItems(sources) + await Promise.all(scanPromises) - // Verify only one scan was active at a time + // Verify scans were called and only one was active at a time + expect(scanDirectorySpy).toHaveBeenCalledTimes(sources.length) expect(maxConcurrentScans).toBe(1) }) }) diff --git a/src/services/package-manager/__tests__/PackageManagerSourceValidation.test.ts b/src/services/package-manager/__tests__/PackageManagerSourceValidation.test.ts index f489d495ac..03f8c0580e 100644 --- a/src/services/package-manager/__tests__/PackageManagerSourceValidation.test.ts +++ b/src/services/package-manager/__tests__/PackageManagerSourceValidation.test.ts @@ -6,8 +6,8 @@ import { validateSource, validateSources, ValidationError, -} from "@package-manager/PackageManagerSourceValidation" -import { PackageManagerSource } from "@package-manager/types" +} from "../PackageManagerSourceValidation" +import { PackageManagerSource } from "../types" describe("PackageManagerSourceValidation", () => { describe("isValidGitRepositoryUrl", () => { diff --git a/tsconfig.json b/tsconfig.json index a497695b6d..2a598ba9a4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,10 +20,7 @@ "useDefineForClassFields": true, "useUnknownInCatchVariables": false, "baseUrl": ".", - "paths": { - "@package-manager": ["src/services/package-manager"], - "@package-manager/*": ["src/services/package-manager/*"] - } + "paths": {} }, "include": ["src/**/*", "scripts/**/*", ".changeset/**/*"], "exclude": ["node_modules", ".vscode-test", "webview-ui"] diff --git a/webview-ui/src/components/package-manager/PackageManagerView.tsx b/webview-ui/src/components/package-manager/PackageManagerView.tsx index 4f764cf12d..29764895bc 100644 --- a/webview-ui/src/components/package-manager/PackageManagerView.tsx +++ b/webview-ui/src/components/package-manager/PackageManagerView.tsx @@ -6,7 +6,7 @@ import { PackageManagerSource } from "../../../../src/services/package-manager/t import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "cmdk" import { isFilterActive as checkFilterActive } from "./selectors" import { PackageManagerItemCard } from "./components/PackageManagerItemCard" -import { useStateManager } from "./state/useStateManager" +import { useStateManager } from "./useStateManager" interface PackageManagerViewProps { onDone?: () => void diff --git a/webview-ui/src/components/package-manager/state/PackageManagerViewStateManager.ts b/webview-ui/src/components/package-manager/PackageManagerViewStateManager.ts similarity index 90% rename from webview-ui/src/components/package-manager/state/PackageManagerViewStateManager.ts rename to webview-ui/src/components/package-manager/PackageManagerViewStateManager.ts index 76b2c70458..0f63e74d9e 100644 --- a/webview-ui/src/components/package-manager/state/PackageManagerViewStateManager.ts +++ b/webview-ui/src/components/package-manager/PackageManagerViewStateManager.ts @@ -1,6 +1,6 @@ -import { PackageManagerItem, PackageManagerSource } from "@package-manager/types" -import { vscode } from "@/utils/vscode" -import { WebviewMessage } from "@shared/WebviewMessage" +import { PackageManagerItem, PackageManagerSource } from "../../../../src/services/package-manager/types" +import { vscode } from "../../utils/vscode" +import { WebviewMessage } from "../../../../src/shared/WebviewMessage" export interface ViewState { allItems: PackageManagerItem[] @@ -219,8 +219,15 @@ export class PackageManagerViewStateManager { }) if (isActive) { - // In test environment, execute filter immediately - if (process.env.NODE_ENV === "test") { + // Always use debounce + if (this.filterTimeoutId) { + console.log("Clearing existing filter timeout") + clearTimeout(this.filterTimeoutId) + } + + console.log("Setting up new filter timeout") + this.filterTimeoutId = setTimeout(() => { + console.log("Filter timeout executed, sending message") vscode.postMessage({ type: "filterPackageManagerItems", filters: { @@ -229,27 +236,8 @@ export class PackageManagerViewStateManager { tags: this.state.filters.tags.length > 0 ? this.state.filters.tags : undefined, }, } as WebviewMessage) - } else { - // In production, use debounce - if (this.filterTimeoutId) { - console.log("Clearing existing filter timeout") - clearTimeout(this.filterTimeoutId) - } - - console.log("Setting up new filter timeout") - this.filterTimeoutId = setTimeout(() => { - console.log("Filter timeout executed, sending message") - vscode.postMessage({ - type: "filterPackageManagerItems", - filters: { - type: this.state.filters.type || undefined, - search: this.state.filters.search || undefined, - tags: this.state.filters.tags.length > 0 ? this.state.filters.tags : undefined, - }, - } as WebviewMessage) - this.filterTimeoutId = undefined - }, this.FILTER_DEBOUNCE) - } + this.filterTimeoutId = undefined + }, this.FILTER_DEBOUNCE) } console.log("=== UPDATE_FILTERS Finished ===") break diff --git a/webview-ui/src/components/package-manager/state/__tests__/PackageManagerViewStateManager.test.ts b/webview-ui/src/components/package-manager/__tests__/PackageManagerViewStateManager.test.ts similarity index 98% rename from webview-ui/src/components/package-manager/state/__tests__/PackageManagerViewStateManager.test.ts rename to webview-ui/src/components/package-manager/__tests__/PackageManagerViewStateManager.test.ts index 98b6a810e2..7ce6a0fb0e 100644 --- a/webview-ui/src/components/package-manager/state/__tests__/PackageManagerViewStateManager.test.ts +++ b/webview-ui/src/components/package-manager/__tests__/PackageManagerViewStateManager.test.ts @@ -1,6 +1,10 @@ import { PackageManagerViewStateManager } from "../PackageManagerViewStateManager" -import { vscode } from "@/utils/vscode" -import { ComponentType, PackageManagerItem, PackageManagerSource } from "@package-manager/types" +import { vscode } from "../../../utils/vscode" +import { + ComponentType, + PackageManagerItem, + PackageManagerSource, +} from "../../../../../src/services/package-manager/types" const createTestItem = (overrides = {}): PackageManagerItem => ({ name: "test", @@ -22,7 +26,7 @@ const createTestSources = (): PackageManagerSource[] => [ ] // Mock vscode.postMessage -jest.mock("@/utils/vscode", () => ({ +jest.mock("../../../utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, diff --git a/webview-ui/src/components/package-manager/state/useStateManager.ts b/webview-ui/src/components/package-manager/useStateManager.ts similarity index 100% rename from webview-ui/src/components/package-manager/state/useStateManager.ts rename to webview-ui/src/components/package-manager/useStateManager.ts diff --git a/webview-ui/tsconfig.json b/webview-ui/tsconfig.json index b2444be307..ca80c07982 100644 --- a/webview-ui/tsconfig.json +++ b/webview-ui/tsconfig.json @@ -18,7 +18,6 @@ "baseUrl": ".", "paths": { "@/*": ["./src/*"], - "@package-manager/*": ["../src/services/package-manager/*"], "@shared/*": ["../src/shared/*"] } },