Skip to content

Commit d7c4f56

Browse files
crisbetoalxhub
authored andcommitted
fix(compiler): allow decimals in defer block time values (angular#52433)
Fixes that our regex for parsing time values in defer blocks didn't allow for decimals. This isn't relevant for times in milliseconds, but it can be convenient to write something like `on timer(1.5s)`. PR Close angular#52433
1 parent 75725fb commit d7c4f56

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

packages/compiler/src/render3/r3_deferred_triggers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {BindingParser} from '../template_parser/binding_parser';
1515
import * as t from './r3_ast';
1616

1717
/** Pattern for a timing value in a trigger. */
18-
const TIME_PATTERN = /^\d+(ms|s)?$/;
18+
const TIME_PATTERN = /^\d+\.?\d*(ms|s)?$/;
1919

2020
/** Pattern for a separator between keywords in a trigger expression. */
2121
const SEPARATOR_PATTERN = /^\s$/;
@@ -440,5 +440,5 @@ export function parseDeferredTime(value: string): number|null {
440440
}
441441

442442
const [time, units] = match;
443-
return parseInt(time) * (units === 's' ? 1000 : 1);
443+
return parseFloat(time) * (units === 's' ? 1000 : 1);
444444
}

packages/compiler/test/render3/r3_template_transform_spec.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -807,15 +807,23 @@ describe('R3 template transform', () => {
807807
]);
808808
});
809809

810-
it('should parse a deferred block with a timeout set in seconds', () => {
810+
it('should parse a deferred block with a timer set in seconds', () => {
811811
expectFromHtml('@defer (on timer(10s)){hello}').toEqual([
812812
['DeferredBlock'],
813813
['TimerDeferredTrigger', 10000],
814814
['Text', 'hello'],
815815
]);
816816
});
817817

818-
it('should parse a deferred block with a timeout that has no units', () => {
818+
it('should parse a deferred block with a timer with a decimal point', () => {
819+
expectFromHtml('@defer (on timer(1.5s)){hello}').toEqual([
820+
['DeferredBlock'],
821+
['TimerDeferredTrigger', 1500],
822+
['Text', 'hello'],
823+
]);
824+
});
825+
826+
it('should parse a deferred block with a timer that has no units', () => {
819827
expectFromHtml('@defer (on timer(100)){hello}').toEqual([
820828
['DeferredBlock'],
821829
['TimerDeferredTrigger', 100],
@@ -883,25 +891,25 @@ describe('R3 template transform', () => {
883891
it('should parse a loading block with parameters', () => {
884892
expectFromHtml(
885893
'@defer{<calendar-cmp [date]="current"/>}' +
886-
'@loading (after 100ms; minimum 1s){Loading...}')
894+
'@loading (after 100ms; minimum 1.5s){Loading...}')
887895
.toEqual([
888896
['DeferredBlock'],
889897
['Element', 'calendar-cmp'],
890898
['BoundAttribute', 0, 'date', 'current'],
891-
['DeferredBlockLoading', 'after 100ms', 'minimum 1000ms'],
899+
['DeferredBlockLoading', 'after 100ms', 'minimum 1500ms'],
892900
['Text', 'Loading...'],
893901
]);
894902
});
895903

896904
it('should parse a placeholder block with parameters', () => {
897905
expectFromHtml(
898906
'@defer {<calendar-cmp [date]="current"/>}' +
899-
'@placeholder (minimum 1s){Placeholder...}')
907+
'@placeholder (minimum 1.5s){Placeholder...}')
900908
.toEqual([
901909
['DeferredBlock'],
902910
['Element', 'calendar-cmp'],
903911
['BoundAttribute', 0, 'date', 'current'],
904-
['DeferredBlockPlaceholder', 'minimum 1000ms'],
912+
['DeferredBlockPlaceholder', 'minimum 1500ms'],
905913
['Text', 'Placeholder...'],
906914
]);
907915
});

0 commit comments

Comments
 (0)