| 351 | } |
| 352 | |
| 353 | export class DeferredBlock extends BlockNode implements Node { |
| 354 | readonly triggers: Readonly<DeferredBlockTriggers>; |
| 355 | readonly prefetchTriggers: Readonly<DeferredBlockTriggers>; |
| 356 | readonly hydrateTriggers: Readonly<DeferredBlockTriggers>; |
| 357 | private readonly definedTriggers: (keyof DeferredBlockTriggers)[]; |
| 358 | private readonly definedPrefetchTriggers: (keyof DeferredBlockTriggers)[]; |
| 359 | private readonly definedHydrateTriggers: (keyof DeferredBlockTriggers)[]; |
| 360 | |
| 361 | constructor( |
| 362 | public children: Node[], |
| 363 | triggers: DeferredBlockTriggers, |
| 364 | prefetchTriggers: DeferredBlockTriggers, |
| 365 | hydrateTriggers: DeferredBlockTriggers, |
| 366 | public placeholder: DeferredBlockPlaceholder | null, |
| 367 | public loading: DeferredBlockLoading | null, |
| 368 | public error: DeferredBlockError | null, |
| 369 | nameSpan: ParseSourceSpan, |
| 370 | sourceSpan: ParseSourceSpan, |
| 371 | public mainBlockSpan: ParseSourceSpan, |
| 372 | startSourceSpan: ParseSourceSpan, |
| 373 | endSourceSpan: ParseSourceSpan | null, |
| 374 | public i18n?: I18nMeta, |
| 375 | ) { |
| 376 | super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan); |
| 377 | this.triggers = triggers; |
| 378 | this.prefetchTriggers = prefetchTriggers; |
| 379 | this.hydrateTriggers = hydrateTriggers; |
| 380 | // We cache the keys since we know that they won't change and we |
| 381 | // don't want to enumarate them every time we're traversing the AST. |
| 382 | this.definedTriggers = Object.keys(triggers) as (keyof DeferredBlockTriggers)[]; |
| 383 | this.definedPrefetchTriggers = Object.keys(prefetchTriggers) as (keyof DeferredBlockTriggers)[]; |
| 384 | this.definedHydrateTriggers = Object.keys(hydrateTriggers) as (keyof DeferredBlockTriggers)[]; |
| 385 | } |
| 386 | |
| 387 | visit<Result>(visitor: Visitor<Result>): Result { |
| 388 | return visitor.visitDeferredBlock(this); |
| 389 | } |
| 390 | |
| 391 | visitAll(visitor: Visitor<unknown>): void { |
| 392 | // Visit the hydrate triggers first to match their insertion order. |
| 393 | this.visitTriggers(this.definedHydrateTriggers, this.hydrateTriggers, visitor); |
| 394 | this.visitTriggers(this.definedTriggers, this.triggers, visitor); |
| 395 | this.visitTriggers(this.definedPrefetchTriggers, this.prefetchTriggers, visitor); |
| 396 | visitAll(visitor, this.children); |
| 397 | const remainingBlocks = [this.placeholder, this.loading, this.error].filter( |
| 398 | (x) => x !== null, |
| 399 | ) as Array<Node>; |
| 400 | visitAll(visitor, remainingBlocks); |
| 401 | } |
| 402 | |
| 403 | private visitTriggers( |
| 404 | keys: (keyof DeferredBlockTriggers)[], |
| 405 | triggers: DeferredBlockTriggers, |
| 406 | visitor: Visitor, |
| 407 | ) { |
| 408 | visitAll( |
| 409 | visitor, |
| 410 | keys.map((k) => triggers[k]!), |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…