BarefootJS
view release on metacpan or search on metacpan
t/manifest_components.t view on Meta::CPAN
is $backend->calls->[-1]{vars}{open}, 0,
'omitted prop falls back to the component default';
# Caller-supplied prop wins.
$bf->render_child('toast', open => 1);
is $backend->calls->[-1]{vars}{open}, 1, 'caller prop overrides the default';
};
subtest 'signal_init override applies per component key' => sub {
my ($bf, $backend) = new_bf();
$bf->register_components_from_manifest(
{ 'ui/toast/index' => $TOAST_ENTRY },
signal_init => { toast => sub { (open => 'forced') } },
);
$bf->render_child('toast');
is $backend->calls->[-1]{vars}{open}, 'forced',
'signal_init keyed by the snake_case component name wins over ssrDefaults';
$bf->render_child('toast_title');
is $backend->calls->[-1]{template}, 'ui/toast/ToastTitle',
'sibling components without an override still render';
};
subtest 'manifests without a components map keep the dir-name registration' => sub {
# Older builds emit no `components` map; the single-component
# convention (dir name == snake_cased component name) must keep working.
my ($bf, $backend) = new_bf();
$bf->register_components_from_manifest({
'ui/button/index' => {
markedTemplate => 'templates/ui/button/index.html.ep',
ssrDefaults => { variant => { propName => 'variant', value => 'default' } },
},
});
my $html = $bf->render_child('button');
is $html, '<rendered:ui/button/index>', 'dir-name key still renders';
is $backend->calls->[-1]{vars}{variant}, 'default', 'entry ssrDefaults still seed';
};
subtest 'a components row without a markedTemplate is skipped, siblings survive' => sub {
my ($bf, $backend) = new_bf();
my $entry = {
%$TOAST_ENTRY,
components => {
%{ $TOAST_ENTRY->{components} },
Broken => {}, # no markedTemplate
},
};
$bf->register_components_from_manifest({ 'ui/toast/index' => $entry });
like dies { $bf->render_child('broken') }, qr/No renderer registered/,
'template-less row registers nothing';
is $bf->render_child('toast_title'), '<rendered:ui/toast/ToastTitle>',
'sibling components still registered';
};
subtest '_snake_case mirrors the Mojo adapter toTemplateName' => sub {
is BarefootJS::_snake_case('Toast'), 'toast', 'single word';
is BarefootJS::_snake_case('ToastProvider'), 'toast_provider', 'two words';
is BarefootJS::_snake_case('DropdownMenu'), 'dropdown_menu', 'kebab-dir module component';
is BarefootJS::_snake_case('InputOTP'), 'input_o_t_p', 'acronym splits per capital';
};
done_testing;
( run in 2.271 seconds using v1.01-cache-2.11-cpan-0b5f733616e )