*/ function packageComponentNames(): array { return collect(File::files(LivewireMaterialServiceProvider::componentPath())) ->map(fn (SplFileInfo $file): string => $file->getBasename('.blade.php')) ->sortByDesc(fn (string $name): int => strlen($name)) ->values() ->all(); } it('refers to its own components through its namespace, which no prefix or app component changes', function () { $names = implode('|', array_map(fn (string $name): string => preg_quote($name, '/'), packageComponentNames())); $unqualified = collect(File::allFiles(__DIR__.'/../../resources/views')) ->filter(fn (SplFileInfo $file): bool => str_ends_with($file->getFilename(), '.blade.php')) ->flatMap(function (SplFileInfo $file) use ($names): array { // Comments document usage as an application writes it, and the showcase's examples // are that usage; neither is compiled as the package's own markup. An example heredoc // ends `BLADE,` as an array's value (most sections) or `BLADE;` assigned to its own // variable (a Layout page with a single example of its own, plan step 38). $source = preg_replace(['/\{\{--.*?--\}\}/s', "/<<<'BLADE'.*?^\\s*BLADE[,;]/sm"], '', $file->getContents()); preg_match_all('/<\/?x-('.$names.')(?=[\s\/>])/', $source, $matches); return array_map(fn (string $tag): string => $file->getRelativePathname().': '.$tag, $matches[0]); }) ->values(); expect($unqualified->all())->toBe([]); }); it('renders components that use others under a prefix', function () { config(['livewire-material.prefix' => 'm']); Blade::anonymousComponentPath(LivewireMaterialServiceProvider::componentPath(), 'm'); expect(Blade::render('')) ->toContain('aria-label="Close"') ->toContain('role="separator"') ->toContain('data-md-field-clear'); }); it('is not shadowed by an application component of the same name', function () { $views = sys_get_temp_dir().'/livewire-material-shadow-'.uniqid(); File::ensureDirectoryExists($views.'/components'); File::put($views.'/components/button.blade.php', 'the application\'s button'); View::getFinder()->prependLocation($views); try { expect(Blade::render(''))->toContain('the application\'s button') ->and(Blade::render(''))->not->toContain('the application\'s button') ->toContain('aria-label="Close"'); } finally { File::deleteDirectory($views); } }); it('shows the showcase\'s examples as an application with a prefix writes them', function () { config(['livewire-material.prefix' => 'm']); Blade::anonymousComponentPath(LivewireMaterialServiceProvider::componentPath(), 'm'); expect(Blade::render('', ['code' => ''])) ->toContain('<x-m::button label="Save" />') ->toContain('Save'); });