mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
This addresses a potential memory leak in plugin-factory.ts.
The require call inside the create function reloads the entire language
service module for every new project, which is inefficient and could be a cause of the memory leak during branch
switching. This ensures the module is loaded only once and the same
instance is shared across all projects.
(cherry picked from commit 4405725943)
34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.dev/license
|
|
*/
|
|
|
|
// Note: use a type-only import to prevent TypeScript from being bundled in.
|
|
import type ts from 'typescript';
|
|
|
|
import {NgLanguageService, PluginConfig} from './api';
|
|
|
|
interface PluginModule extends ts.server.PluginModule {
|
|
create(createInfo: ts.server.PluginCreateInfo): NgLanguageService;
|
|
onConfigurationChanged?(config: PluginConfig): void;
|
|
}
|
|
|
|
export const factory: ts.server.PluginModuleFactory = (tsModule): PluginModule => {
|
|
let plugin: PluginModule;
|
|
|
|
return {
|
|
create(info: ts.server.PluginCreateInfo): NgLanguageService {
|
|
plugin ??= require(`@angular/language-service/bundles/language-service.js`)(tsModule);
|
|
return plugin.create(info);
|
|
},
|
|
getExternalFiles(project: ts.server.Project): string[] {
|
|
return plugin?.getExternalFiles?.(project, tsModule.typescript.ProgramUpdateLevel.Full) ?? [];
|
|
},
|
|
onConfigurationChanged(config: PluginConfig): void {
|
|
plugin?.onConfigurationChanged?.(config);
|
|
},
|
|
};
|
|
};
|