Resolve the package's own components through its namespace
Package views now write <x-livewire-material::button>, so a configured prefix (which Blade spells <x-m::button>) and an application component of the same name can no longer break or shadow them. The showcase rewrites its examples to the configured prefix. Adds the README, and waits for the adaptive rail to hear a resize before the navigation tests press its menu button. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
This commit is contained in:
co-authored by
Claude Opus 5
parent
8f174520eb
commit
1e580c573e
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use NoNameWeb\LivewireMaterial\LivewireMaterialServiceProvider;
|
||||
|
||||
/**
|
||||
* The package's own component names, longest first.
|
||||
*
|
||||
* @return list<string>
|
||||
*/
|
||||
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.
|
||||
$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('<x-m::drawer title="Share" with-close-button separator><x-m::input label="Name" clearable /></x-m::drawer>'))
|
||||
->toContain('aria-label="Close"')
|
||||
->toContain('role="separator"')
|
||||
->toContain('data-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', '<span>the application\'s button</span>');
|
||||
View::getFinder()->prependLocation($views);
|
||||
|
||||
try {
|
||||
expect(Blade::render('<x-button />'))->toContain('the application\'s button')
|
||||
->and(Blade::render('<x-drawer title="Share" with-close-button />'))->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('<x-showcase::example title="Buttons" :code="$code" />', ['code' => '<x-button label="Save" />']))
|
||||
->toContain('<x-m::button label="Save" />')
|
||||
->toContain('Save</span>');
|
||||
});
|
||||
Reference in New Issue
Block a user