Skip to content

Commit c6f98c7

Browse files
SkyZeroZxthePunderWoman
authored andcommitted
feat(language-service): Add support for idle timeout in defer blocks
Extends language service parsing and validation to support `@defer on idle(300)`
1 parent 98eb24c commit c6f98c7

3 files changed

Lines changed: 20 additions & 1 deletion

File tree

packages/language-service/src/quick_info_built_ins.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ const BUILT_IN_NAMES_TO_DOC_MAP: {
170170
displayInfoKind: DisplayInfoKind.KEYWORD,
171171
},
172172
'idle': {
173-
docString: triggerDescriptionPreamble + `the browser reports idle state (default).`,
173+
docString:
174+
triggerDescriptionPreamble + `the browser reports idle state. Accepts an optional timeout.`,
174175
links: ['[Reference](https://angular.dev/guide/templates/defer#on-idle)'],
175176
displayInfoKind: DisplayInfoKind.TRIGGER,
176177
},

packages/language-service/test/grp3/quick_info_spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,14 @@ describe('quick info', () => {
734734
});
735735
});
736736

737+
it('idle with timeout', () => {
738+
expectQuickInfo({
739+
templateOverride: `@defer (on i¦dle(500ms)) { } `,
740+
expectedSpanText: 'idle',
741+
expectedDisplayString: '(trigger) idle',
742+
});
743+
});
744+
737745
it('hover', () => {
738746
expectQuickInfo({
739747
templateOverride: `@defer (on hov¦er(x)) { } <div #x></div> `,

packages/language-service/test/legacy/template_target_spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import {
4242
TmplAstSwitchExhaustiveCheck as SwitchExhaustiveCheck,
4343
TmplAstTemplate as Template,
4444
TmplAstTextAttribute as TextAttribute,
45+
TmplAstIdleDeferredTrigger as IdleDeferredTrigger,
4546
TmplAstTimerDeferredTrigger as TimerDeferredTrigger,
4647
TmplAstVariable as Variable,
4748
} from '@angular/compiler';
@@ -1239,6 +1240,15 @@ describe('blocks', () => {
12391240
expect((node as TimerDeferredTrigger).delay).toBe(2000);
12401241
});
12411242

1243+
it('should visit idle on conditions on defer blocks with timeout', () => {
1244+
const {nodes, position} = parse(` @defer (on idle(5¦00ms)) { } `);
1245+
const {context} = getTargetAtPosition(nodes, position)!;
1246+
const {node} = context as SingleNodeTarget;
1247+
expect(isTemplateNode(node!)).toBe(true);
1248+
expect(node).toBeInstanceOf(IdleDeferredTrigger);
1249+
expect((node as IdleDeferredTrigger).timeout).toBe(500);
1250+
});
1251+
12421252
// TODO: Should the parser ingest a property read for `localRef`, instead of a string?
12431253
// (Talk to Kristiyan?)
12441254
// xit('should visit on conditions on defer blocks', () => {

0 commit comments

Comments
 (0)