11import type { CatalogsInfo , PackageManager , ResolvedDependencyInfo } from '#types/context'
22import type { DependencyInfo , PackageManifestInfo , WorkspaceCatalogInfo } from '#types/extractor'
3- import type { MemoizeOptions } from '#utils/memoize '
3+ import type { CacheOptions } from 'ocache '
44import type { WorkspaceFolder } from 'vscode'
5+ import { getPackageInfo } from '#api/package'
56import { logger } from '#state'
6- import { getPackageInfo } from '#utils/api/package'
77import { isOffsetInRange } from '#utils/ast'
88import { resolveDependencySpec } from '#utils/dependency'
99import { getDocumentText , isPackageManifestPath , isWorkspaceFilePath } from '#utils/file'
10- import { memoize } from '#utils/memoize'
1110import { resolveExactVersion } from '#utils/package'
1211import { detectPackageManager , workspaceFileMapping } from '#utils/package-manager'
1312import { lazyInit } from '#utils/shared'
13+ import { defineCachedFunction } from 'ocache'
1414import { Uri , workspace } from 'vscode'
1515import { accessOk } from 'vscode-find-up'
1616import { getExtractor } from './extractors'
@@ -23,6 +23,7 @@ class WorkspaceContext {
2323 folder : WorkspaceFolder
2424 packageManager : PackageManager = 'npm'
2525 #catalogs?: PromiseWithResolvers < CatalogsInfo | undefined >
26+ #invalidatedPaths = new Set < string > ( )
2627
2728 private constructor ( folder : WorkspaceFolder ) {
2829 this . folder = folder
@@ -53,11 +54,17 @@ class WorkspaceContext {
5354 }
5455 }
5556
56- #memoizeOptions: MemoizeOptions < Uri > = {
57+ #cacheOptions: CacheOptions < any , [ Uri ] > = {
5758 getKey : ( uri ) => uri . path ,
58- ttl : false ,
59- maxSize : Number . POSITIVE_INFINITY ,
60- fallbackToCachedOnError : false ,
59+ maxAge : 0 ,
60+ swr : false ,
61+ staleMaxAge : 0 ,
62+ shouldInvalidateCache : ( uri ) => this . #invalidatedPaths. delete ( uri . path ) ,
63+ }
64+
65+ invalidateDependencyInfo ( uri : Uri ) {
66+ const path = uri . path
67+ this . #invalidatedPaths. add ( path )
6168 }
6269
6370 #createResolvedDependencyInfo( dependency : DependencyInfo , catalogs ?: CatalogsInfo ) : ResolvedDependencyInfo {
@@ -87,9 +94,9 @@ class WorkspaceContext {
8794 }
8895 }
8996
90- loadPackageManifestInfo = memoize <
91- Uri ,
92- Promise < WithResolvedDependencyInfo < PackageManifestInfo > | undefined >
97+ loadPackageManifestInfo = defineCachedFunction <
98+ WithResolvedDependencyInfo < PackageManifestInfo > | undefined ,
99+ [ Uri ]
93100 > ( async ( uri ) => {
94101 const path = uri . path
95102 if ( ! isPackageManifestPath ( path ) )
@@ -113,11 +120,11 @@ class WorkspaceContext {
113120 ...info ,
114121 dependencies : info . dependencies . map ( ( dep ) => this . #createResolvedDependencyInfo( dep , catalogs ) ) ,
115122 }
116- } , this . #memoizeOptions )
123+ } , this . #cacheOptions )
117124
118- loadWorkspaceCatalogInfo = memoize <
119- Uri ,
120- Promise < WithResolvedDependencyInfo < WorkspaceCatalogInfo > | undefined >
125+ loadWorkspaceCatalogInfo = defineCachedFunction <
126+ WithResolvedDependencyInfo < WorkspaceCatalogInfo > | undefined ,
127+ [ Uri ]
121128 > ( async ( uri ) => {
122129 const path = uri . path
123130 if ( ! isWorkspaceFilePath ( path ) )
@@ -138,20 +145,28 @@ class WorkspaceContext {
138145 ...info ,
139146 dependencies : info . dependencies . map ( ( dep ) => this . #createResolvedDependencyInfo( dep ) ) ,
140147 }
141- } , this . #memoizeOptions )
148+ } , this . #cacheOptions )
142149}
143150
144- const getWorkspaceContextByFolder = memoize < WorkspaceFolder , Promise < WorkspaceContext | undefined > > ( async ( folder ) => {
151+ const invalidatedFolderPaths = new Set < string > ( )
152+
153+ const getWorkspaceContextByFolder = defineCachedFunction <
154+ WorkspaceContext | undefined ,
155+ [ WorkspaceFolder ]
156+ > ( async ( folder ) => {
145157 logger . info ( `[workspace-context] built ${ folder . uri . path } ` )
146158 return await WorkspaceContext . create ( folder )
147159} , {
160+ name : 'workspace-context' ,
148161 getKey : ( folder ) => folder . uri . path ,
149- ttl : false ,
150- fallbackToCachedOnError : false ,
162+ swr : false ,
163+ maxAge : 0 ,
164+ staleMaxAge : 0 ,
165+ shouldInvalidateCache : ( folder ) => invalidatedFolderPaths . delete ( folder . uri . path ) ,
151166} )
152167
153168export function deleteWorkspaceContextCache ( folder : WorkspaceFolder ) {
154- getWorkspaceContextByFolder . delete ( folder )
169+ invalidatedFolderPaths . add ( folder . uri . path )
155170}
156171
157172export async function getWorkspaceContext ( uri : Uri ) {
0 commit comments