Skip to content

Commit 7f94502

Browse files
SkyZeroZxatscott
authored andcommitted
feat(compiler-cli): Adds warning for prefetch without main defer trigger
Emit a warning when an `@defer` block uses `prefetch` triggers but does not define an explicit main trigger. Closes #52746
1 parent b19fda0 commit 7f94502

3 files changed

Lines changed: 43 additions & 2 deletions

File tree

packages/compiler-cli/src/ngtsc/typecheck/extended/checks/defer_trigger_misconfiguration/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,19 @@ class DeferTriggerMisconfiguration extends TemplateCheckWithVisitor<ErrorCode.DE
135135
}
136136
}
137137

138+
// `prefetch` without an explicit main trigger defaults the main trigger to `idle`,
139+
if (mains.length === 0 && prefetches.length > 0) {
140+
const msg =
141+
`Define a main trigger when using 'prefetch' triggers. ` +
142+
`Without an explicit main trigger, @defer defaults to 'idle' and prefetch may have no effect.`;
143+
diags.push(
144+
ctx.makeTemplateDiagnostic(
145+
node.sourceSpan,
146+
formatExtendedError(ErrorCode.DEFER_TRIGGER_MISCONFIGURATION, msg),
147+
),
148+
);
149+
}
150+
138151
// If there is exactly one main and at least one prefetch, compare them.
139152
if (mains.length === 1 && prefetches.length > 0) {
140153
const main = mains[0];

packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/defer_trigger_misconfiguration/defer_trigger_misconfiguration_spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,33 @@ runInEachFileSystem(() => {
180180
expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning);
181181
expect(diags[0].code).toBe(ngErrorCode(ErrorCode.DEFER_TRIGGER_MISCONFIGURATION));
182182
});
183+
184+
it('should emit when prefetch trigger is configured without a main trigger', () => {
185+
const diags = getDiags(`@defer (prefetch on viewport(ref)) { <div></div> }`);
186+
expect(diags.length).toBe(1);
187+
expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning);
188+
expect(diags[0].code).toBe(ngErrorCode(ErrorCode.DEFER_TRIGGER_MISCONFIGURATION));
189+
});
190+
191+
it('should emit when prefetch timer is configured without a main trigger', () => {
192+
const diags = getDiags(`@defer (prefetch on timer(500ms)) { <div></div> }`);
193+
expect(diags.length).toBe(1);
194+
expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning);
195+
expect(diags[0].code).toBe(ngErrorCode(ErrorCode.DEFER_TRIGGER_MISCONFIGURATION));
196+
});
197+
198+
it('should emit when prefetch idle is configured without a main trigger', () => {
199+
const diags = getDiags(`@defer (prefetch on idle(500)) { <div></div> }`);
200+
expect(diags.length).toBe(1);
201+
expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning);
202+
expect(diags[0].code).toBe(ngErrorCode(ErrorCode.DEFER_TRIGGER_MISCONFIGURATION));
203+
});
204+
205+
it('should emit when prefetch when is configured without a main trigger', () => {
206+
const diags = getDiags(`@defer (prefetch when true) { <div></div> }`);
207+
expect(diags.length).toBe(1);
208+
expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning);
209+
expect(diags[0].code).toBe(ngErrorCode(ErrorCode.DEFER_TRIGGER_MISCONFIGURATION));
210+
});
183211
});
184212
});

packages/language-service/test/quick_info_spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ describe('quick info', () => {
770770

771771
it('prefetch (when)', () => {
772772
expectQuickInfo({
773-
templateOverride: `@defer (prefet¦ch when title) { }`,
773+
templateOverride: `@defer (on idle; prefet¦ch when title) { }`,
774774
expectedSpanText: 'prefetch',
775775
expectedDisplayString: '(keyword) prefetch',
776776
});
@@ -794,7 +794,7 @@ describe('quick info', () => {
794794

795795
it('prefetch (on)', () => {
796796
expectQuickInfo({
797-
templateOverride: `@defer (prefet¦ch on immediate) { }`,
797+
templateOverride: `@defer (on idle; prefet¦ch on immediate) { }`,
798798
expectedSpanText: 'prefetch',
799799
expectedDisplayString: '(keyword) prefetch',
800800
});

0 commit comments

Comments
 (0)