$record ExtensionInventory 레코드 * @return array 수집 컨텍스트 */ public function build(array $record): array { // 선언형 표면을 먼저 모은다 — 발행 훅의 1차 출처가 그 안의 `getHooks()` 선언이다. $surface = $this->surface->collect($record); $declaredHooks = $surface['values']['getHooks'] ?? []; // 편집기 스펙 수집기는 레이아웃 목록을 받아 "프리뷰 샘플이 없는 data_source" 를 // 판정한다. 레이아웃 경로 규약(모듈·플러그인 `resources/layouts/` ↔ 템플릿 // `layouts/`)은 FrontendInventory 가 단독으로 소유하므로, 그 결과를 넘겨 분기가 // 두 곳에 생기지 않게 한다. $frontend = $this->frontend->collect($record); $layoutRelFiles = array_map( static fn (array $layout): string => $layout['relFile'], $frontend['layouts'], ); return [ 'record' => $record, 'surface' => $surface, 'hooks' => $this->hooks->collect($record, is_array($declaredHooks) ? $declaredHooks : []), 'data' => $this->data->collect($record), 'frontend' => $frontend, 'tests' => $this->tests->collect($record), 'deps' => $this->deps->collect($record), 'editorSpec' => $this->editorSpec->collect($record, $layoutRelFiles), ]; } }