UNPKG

@angular/language-service

Version:
393 lines (392 loc) • 16.6 kB
/** * @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 */ /** * @module * @description * Entry point for all public APIs of the language service package. */ import type ts from 'typescript'; export interface PluginConfig { /** * If true, return only Angular results. Otherwise, return Angular + TypeScript * results. */ angularOnly: boolean; /** * If true, enable `strictTemplates` in Angular compiler options regardless * of its value in tsconfig.json. */ forceStrictTemplates?: true; /** * If false, disables parsing control flow blocks in the compiler. Should be used only when older * versions of Angular that do not support blocks (pre-v17) used with the language service. */ enableBlockSyntax?: false; /** * Version of `@angular/core` that was detected in the user's workspace. */ angularCoreVersion?: string; /** * If false, disables parsing of `@let` declarations in the compiler. */ enableLetSyntax?: false; /** * Whether selectorless is enabled. */ enableSelectorless?: true; /** * A list of diagnostic codes that should be supressed in the language service. */ suppressAngularDiagnosticCodes?: number[]; } export type GetTcbResponse = { /** * The filename of the SourceFile this typecheck block belongs to. * The filename is entirely opaque and unstable, useful only for debugging * purposes. */ fileName: string; /** The content of the SourceFile this typecheck block belongs to. */ content: string; /** * Spans over node(s) in the typecheck block corresponding to the * TS code generated for template node under the current cursor position. * * When the cursor position is over a source for which there is no generated * code, `selections` is empty. */ selections: ts.TextSpan[]; }; export type GetComponentLocationsForTemplateResponse = ts.DocumentSpan[]; export type GetTemplateLocationForComponentResponse = ts.DocumentSpan | undefined; /** * Function that can be invoked to show progress when computing * refactoring edits. * * Useful for refactorings which take a long time to compute edits for. */ export type ApplyRefactoringProgressFn = (percentage: number, updateMessage: string) => void; /** Interface describing the result for computing edits of a refactoring. */ export interface ApplyRefactoringResult extends Omit<ts.RefactorEditInfo, 'notApplicableReason'> { errorMessage?: string; warningMessage?: string; } /** * Angular-specific LSP SymbolKind values for template symbols. * These are used for symbols that don't have a direct TypeScript ScriptElementKind mapping. * Values match LSP SymbolKind enum: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#symbolKind */ export declare enum AngularSymbolKind { Namespace = 3, Class = 5, Array = 18, Object = 19, Struct = 23, Event = 24 } /** * A document symbol representing an Angular template element. * This uses TypeScript's NavigationTree structure so it can be merged with TS symbols. */ export interface TemplateDocumentSymbol { /** Display name for the symbol */ text: string; /** Kind of symbol (using TypeScript's ScriptElementKind for compatibility) */ kind: ts.ScriptElementKind; /** * Optional LSP SymbolKind override for Angular-specific symbol types. * When set, this takes precedence over the default ScriptElementKind mapping. */ lspKind?: AngularSymbolKind; /** Span covering the entire symbol */ spans: ts.TextSpan[]; /** Span for just the name (used for selection) */ nameSpan?: ts.TextSpan; /** Child symbols */ childItems?: TemplateDocumentSymbol[]; /** * The name of the class this template belongs to. * Only set for root-level symbols in TypeScript files with inline templates. * Used to merge template symbols into the correct component class when * multiple components exist in the same file. */ className?: string; } /** * Options for customizing document symbols behavior. */ export interface DocumentSymbolsOptions { /** * Show all implicit @for loop variables ($index, $count, $first, $last, $even, $odd). * When false (default), only explicitly aliased variables like `let i = $index` are shown. */ showImplicitForVariables?: boolean; } /** * Result for linked editing ranges containing the ranges and optional word pattern. */ export interface LinkedEditingRanges { /** The ranges that should be edited together. */ ranges: ts.TextSpan[]; /** An optional word pattern to describe valid tag names. */ wordPattern?: string; } /** * A display part for interactive inlay hints. * When clicked, can navigate to the definition of the type/parameter. */ export interface InlayHintDisplayPart { /** The text to display */ text: string; /** Optional navigation target span */ span?: { /** Start offset in the target file */ start: number; /** Length of the span */ length: number; }; /** Optional target file path for navigation */ file?: string; } /** * Represents an Angular-specific inlay hint to be displayed in the editor. */ export interface AngularInlayHint { /** Offset position where the hint should appear */ position: number; /** * The text to display. * For non-interactive hints, this contains the full hint text. * For interactive hints, this may be empty and displayParts is used instead. */ text: string; /** Kind of hint: 'Type' for type annotations, 'Parameter' for parameter names */ kind: 'Type' | 'Parameter'; /** Whether to add padding before the hint */ paddingLeft?: boolean; /** Whether to add padding after the hint */ paddingRight?: boolean; /** Optional tooltip documentation */ tooltip?: string; /** * Display parts for interactive hints. * When present, these parts can be clicked to navigate to type/parameter definitions. * Used when interactiveInlayHints is enabled. */ displayParts?: InlayHintDisplayPart[]; } /** * Configuration for which Angular inlay hints to show. * These options are designed to align with TypeScript's inlay hints configuration * where applicable to Angular templates. */ export interface InlayHintsConfig { /** Show type hints for @for loop variables: `@for (item: Item of items)` */ forLoopVariableTypes?: boolean; /** * Show type hints for @if alias variables: `@if (data; as result: Data)` * * Can be a boolean to enable/disable all @if alias hints, or an object for fine-grained control: * - `simpleExpressions`: Show hints for simple variable references like `@if (data; as result)` * - `complexExpressions`: Show hints for complex expressions like `@if (data == 2; as b)` or `@if (data.prop; as p)` * * When set to true, shows hints for all @if aliases. * When set to 'complex', only shows hints for complex expressions (property access, comparisons, calls, etc.) */ ifAliasTypes?: boolean | 'complex' | { /** Show hints for simple variable references: @if (data; as result). Default: true */ simpleExpressions?: boolean; /** Show hints for complex expressions: @if (data.prop; as p), @if (a == b; as c). Default: true */ complexExpressions?: boolean; }; /** Show type hints for @let declarations: `@let count: number = items.length` */ letDeclarationTypes?: boolean; /** Show type hints for template reference variables: `#ref: HTMLInputElement` */ referenceVariableTypes?: boolean; /** * Suppress hints when variable name matches the type name (case-insensitive). * Equivalent to TypeScript's `includeInlayVariableTypeHintsWhenTypeMatchesName`. * When false, skips hints like `@let user: User = getUser()` where name matches type. * @default true */ variableTypeHintsWhenTypeMatchesName?: boolean; /** * Show type hints for arrow function parameters in templates. * Equivalent to TypeScript's `includeInlayFunctionParameterTypeHints`. * * When enabled, shows: `(a: number, b: string) => a + b` where types are inferred. * @default true */ arrowFunctionParameterTypes?: boolean; /** * Show return type hints for arrow functions in templates. * Equivalent to TypeScript's `includeInlayFunctionLikeReturnTypeHints`. * * When enabled, shows: `(a, b): number => a + b` where return type is inferred. * @default true */ arrowFunctionReturnTypes?: boolean; /** * Show parameter name hints for function/method arguments in expressions. * Equivalent to TypeScript's `includeInlayParameterNameHints`. * * When enabled, shows: `handleClick(event: $event)` where 'event' is the parameter name. * Options: * - 'none': No parameter name hints * - 'literals': Only for literal arguments (strings, numbers, booleans) * - 'all': For all arguments * @default 'all' */ parameterNameHints?: 'none' | 'literals' | 'all'; /** * Show parameter hints even when argument name matches parameter name. * Equivalent to TypeScript's `includeInlayParameterNameHintsWhenArgumentMatchesName`. * When false, skips hints like `onClick(event)` where arg name matches param name. * @default false */ parameterNameHintsWhenArgumentMatchesName?: boolean; /** * Show type hints for event binding $event parameter. * Works with @Output() EventEmitter<T>, output() OutputEmitterRef<T>, and model() changes. * Example: `(click: MouseEvent)`, `(valueChange: string)` * * Can be a boolean to enable/disable all event hints, or an object for fine-grained control: * - `nativeEvents`: Show hints for native HTML events (click, input, etc.) * - `componentEvents`: Show hints for custom component/directive events * - `animationEvents`: Show hints for animation events (@trigger.done) */ eventParameterTypes?: boolean | { /** Show hints for native HTML events (click, input, keydown, etc.). Default: true */ nativeEvents?: boolean; /** Show hints for custom component/directive output events. Default: true */ componentEvents?: boolean; /** Show hints for animation events (@trigger.start, @trigger.done). Default: true */ animationEvents?: boolean; }; /** Show type hints for pipe output types: `{{ value | async: Observable<T> }}` */ pipeOutputTypes?: boolean; /** * Show type hints for property/input binding types. * Works with @Input(), input(), input.required(), and model() inputs. * Example: `[disabled: boolean]="isDisabled"` * * Can be a boolean to enable/disable all property hints, or an object for fine-grained control: * - `nativeProperties`: Show hints for native DOM properties ([disabled], [hidden], etc.) * - `componentInputs`: Show hints for component/directive @Input() and input() bindings */ propertyBindingTypes?: boolean | { /** Show hints for native DOM properties. Default: true */ nativeProperties?: boolean; /** Show hints for component/directive inputs. Default: true */ componentInputs?: boolean; }; /** * Show WritableSignal<T> type for two-way bindings with model() signals. * When true: `[(checked: WritableSignal<boolean>)]="checkboxSignal"` * When false: `[(checked: boolean)]="checkboxSignal"` * @default true */ twoWayBindingSignalTypes?: boolean; /** * Add visual indicator for input.required() bindings. * Options: * - 'none': No special indicator * - 'asterisk': Add asterisk suffix `[user*: User]` * - 'exclamation': Add exclamation suffix `[user: User!]` * @default 'none' */ requiredInputIndicator?: 'none' | 'asterisk' | 'exclamation'; /** * Enable clickable hints that navigate to type/parameter definitions. * Equivalent to TypeScript's `interactiveInlayHints`. * @default false */ interactiveInlayHints?: boolean; /** * Show type hints for @HostListener argument expressions. * Example: `@HostListener('click', ['$event.target: EventTarget | null', '$event.clientX: number'])` * * When enabled, shows the inferred type for each expression passed in the decorator arguments. * @default true */ hostListenerArgumentTypes?: boolean; /** * Show type hints for @switch block expressions. * Example: `@switch (status: Status) { @case (Status.Active) { ... } }` * * When enabled, shows the inferred type of the switch expression value. * @default true */ switchExpressionTypes?: boolean; /** * Show type hints for @defer block trigger expressions. * Example: `@defer (when isVisible: boolean) { ... }` * * When enabled, shows the inferred type for 'when' trigger conditions. * @default true */ deferTriggerTypes?: boolean; } /** * `NgLanguageService` describes an instance of an Angular language service, * whose API surface is a strict superset of TypeScript's language service. */ export interface NgLanguageService extends ts.LanguageService { /** * Triggers the Angular compiler's analysis pipeline without performing * per-file type checking. This is a lighter alternative to calling * `getSemanticDiagnostics()` when the goal is only to ensure that the * Angular project has been analyzed (e.g. during project initialization). */ ensureProjectAnalyzed(): void; getTcb(fileName: string, position: number): GetTcbResponse | undefined; /** * Gets linked editing ranges for synchronized editing of HTML tag pairs. * * When the cursor is on an element tag name, returns both the opening and closing * tag name spans so they can be edited simultaneously. This overrides TypeScript's * built-in method which only works for JSX/TSX. * * @param fileName The file to check * @param position The cursor position in the file * @returns LinkedEditingRanges if on a tag name, undefined otherwise */ getLinkedEditingRangeAtPosition(fileName: string, position: number): LinkedEditingRanges | undefined; getComponentLocationsForTemplate(fileName: string): GetComponentLocationsForTemplateResponse; getTemplateLocationForComponent(fileName: string, position: number): GetTemplateLocationForComponentResponse; getTypescriptLanguageService(): ts.LanguageService; /** * Provide Angular-specific inlay hints for templates. * * Returns hints for: * - @for loop variable types: `@for (user: User of users)` * - @if alias types: `@if (data; as result: ApiResult)` * - Event parameter types: `(click)="onClick($event: MouseEvent)"` * - Pipe output types * - @let declaration types * * @param fileName The file to get inlay hints for * @param span The text span to get hints within * @param config Optional configuration for which hints to show */ getAngularInlayHints(fileName: string, span: ts.TextSpan, config?: InlayHintsConfig): AngularInlayHint[]; /** * Gets document symbols for Angular templates, including control flow blocks, * elements, components, template references, and @let declarations. * Returns symbols in NavigationTree format for compatibility with TypeScript. * * @param fileName The file path to get template symbols for * @param options Optional configuration for document symbols behavior */ getTemplateDocumentSymbols(fileName: string, options?: DocumentSymbolsOptions): TemplateDocumentSymbol[]; applyRefactoring(fileName: string, positionOrRange: number | ts.TextRange, refactorName: string, reportProgress: ApplyRefactoringProgressFn): Promise<ApplyRefactoringResult | undefined>; hasCodeFixesForErrorCode(errorCode: number): boolean; getTokenTypeFromClassification(classification: number): number | undefined; getTokenModifierFromClassification(classification: number): number; } export declare function isNgLanguageService(ls: ts.LanguageService | NgLanguageService): ls is NgLanguageService;