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.
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);
|
|
},
|
|
};
|
|
};
|