| 370 | } |
| 371 | |
| 372 | export class DeferredBlock extends BlockNode implements Node { |
| 373 | readonly triggers: Readonly<DeferredBlockTriggers>; |
| 374 | readonly prefetchTriggers: Readonly<DeferredBlockTriggers>; |
| 375 | readonly hydrateTriggers: Readonly<DeferredBlockTriggers>; |
| 376 | private readonly definedTriggers: (keyof DeferredBlockTriggers)[]; |
| 377 | private readonly definedPrefetchTriggers: (keyof DeferredBlockTriggers)[]; |
| 378 | private readonly definedHydrateTriggers: (keyof DeferredBlockTriggers)[]; |
| 379 | |
| 380 | constructor( |
| 381 | public children: Node[], |
| 382 | triggers: DeferredBlockTriggers, |
| 383 | prefetchTriggers: DeferredBlockTriggers, |
| 384 | hydrateTriggers: DeferredBlockTriggers, |
| 385 | public placeholder: DeferredBlockPlaceholder | null, |
| 386 | public loading: DeferredBlockLoading | null, |
| 387 | public error: DeferredBlockError | null, |
| 388 | nameSpan: ParseSourceSpan, |
| 389 | sourceSpan: ParseSourceSpan, |
| 390 | public mainBlockSpan: ParseSourceSpan, |
| 391 | startSourceSpan: ParseSourceSpan, |
| 392 | endSourceSpan: ParseSourceSpan | null, |
| 393 | public i18n?: I18nMeta, |
| 394 | ) { |
| 395 | super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan); |
| 396 | this.triggers = triggers; |
| 397 | this.prefetchTriggers = prefetchTriggers; |
| 398 | this.hydrateTriggers = hydrateTriggers; |
| 399 | // We cache the keys since we know that they won't change and we |
| 400 | // don't want to enumarate them every time we're traversing the AST. |
| 401 | this.definedTriggers = Object.keys(triggers) as (keyof DeferredBlockTriggers)[]; |
| 402 | this.definedPrefetchTriggers = Object.keys(prefetchTriggers) as (keyof DeferredBlockTriggers)[]; |
| 403 | this.definedHydrateTriggers = Object.keys(hydrateTriggers) as (keyof DeferredBlockTriggers)[]; |
| 404 | } |
| 405 | |
| 406 | visit<Result>(visitor: Visitor<Result>): Result { |
| 407 | return visitor.visitDeferredBlock(this); |
| 408 | } |
| 409 | |
| 410 | visitAll(visitor: Visitor<unknown>): void { |
| 411 | // Visit the hydrate triggers first to match their insertion order. |
| 412 | this.visitTriggers(this.definedHydrateTriggers, this.hydrateTriggers, visitor); |
| 413 | this.visitTriggers(this.definedTriggers, this.triggers, visitor); |
| 414 | this.visitTriggers(this.definedPrefetchTriggers, this.prefetchTriggers, visitor); |
| 415 | visitAll(visitor, this.children); |
| 416 | const remainingBlocks = [this.placeholder, this.loading, this.error].filter( |
| 417 | (x) => x !== null, |
| 418 | ) as Array<Node>; |
| 419 | visitAll(visitor, remainingBlocks); |
| 420 | } |
| 421 | |
| 422 | private visitTriggers( |
| 423 | keys: (keyof DeferredBlockTriggers)[], |
| 424 | triggers: DeferredBlockTriggers, |
| 425 | visitor: Visitor, |
| 426 | ) { |
| 427 | visitAll( |
| 428 | visitor, |
| 429 | keys.map((k) => triggers[k]!), |
nothing calls this directly
no outgoing calls
no test coverage detected