diff --git a/Themes/VuetifyCore/Cli/FooterSectionWriter.php b/Themes/VuetifyCore/Cli/FooterSectionWriter.php index 1540f81..60bd741 100644 --- a/Themes/VuetifyCore/Cli/FooterSectionWriter.php +++ b/Themes/VuetifyCore/Cli/FooterSectionWriter.php @@ -1,63 +1,63 @@ -wf; - } - public function __construct(VuetifyThemeClassWriter $writer) { - parent::__construct('FooterSection', $writer->getPath(), $writer->getNamespace()); - - $this->addUseStatement(WebPage::class); - $this->addUseStatement(HTMLNode::class); - $this->wf = $writer->getWireframe(); - - - } - - public function writeClassBody() { - $this->append([ - "/**", - " * Creates new instance of the class.", - " */", - $this->f('__construct',[ - 'page' => 'WebPage' - ]) - ], 1); - $wireframe = $this->getWireframe(); - //if ($wireframe == 'Base' || $wireframe == 'Extended Toolbar' || $wireframe == 'System Bar') { - $this->append('parent::__construct(\'v-footer\');', 2); - //} - $this->append('//TODO: Add components to the footer.', 2); - $this->append('}', 1); - $this->append('}'); - } - - public function writeClassComment() { - $this->append([ - '/**', - ' * This class represents footer section of the theme.', - ' */' - ]); - } - - public function writeClassDeclaration() { - $this->append("class ".$this->getName().' extends HTMLNode {'); - } - -} +wf; + } + public function __construct(VuetifyThemeClassWriter $writer) { + parent::__construct('FooterSection', $writer->getPath(), $writer->getNamespace()); + + $this->addUseStatement(WebPage::class); + $this->addUseStatement(HTMLNode::class); + $this->wf = $writer->getWireframe(); + + + } + + public function writeClassBody() { + $this->append([ + "/**", + " * Creates new instance of the class.", + " */", + ], 1); + $this->f('__construct',[ + 'page' => 'WebPage' + ]); + $wireframe = $this->getWireframe(); + //if ($wireframe == 'Base' || $wireframe == 'Extended Toolbar' || $wireframe == 'System Bar') { + $this->append('parent::__construct(\'v-footer\');', 2); + //} + $this->append('//TODO: Add components to the footer.', 2); + $this->append('}', 1); + $this->append('}'); + } + + public function writeClassComment() { + $this->append([ + '/**', + ' * This class represents footer section of the theme.', + ' */' + ]); + } + + public function writeClassDeclaration() { + $this->append("class ".$this->getName().' extends HTMLNode {'); + } + +} diff --git a/Themes/VuetifyCore/Cli/HeadSectionWriter.php b/Themes/VuetifyCore/Cli/HeadSectionWriter.php index 47c1206..ea68316 100644 --- a/Themes/VuetifyCore/Cli/HeadSectionWriter.php +++ b/Themes/VuetifyCore/Cli/HeadSectionWriter.php @@ -1,50 +1,50 @@ -getPath(), $writer->getNamespace()); - $this->addUseStatement(WebPage::class); - $this->addUseStatement(HeadNode::class); - $this->addUseStatement(VueHeadSectionV2::class); - } - public function writeClassBody() { - - $this->append([ - "/**", - " * Creates new instance of the class.", - " */", - $this->f('__construct',[ - 'page' => 'WebPage' - ]) - ], 1); - $this->append([ - 'parent::__construct();', - '//TODO: Add any extra JS or Css files here in addition to meta tags.', - ], 2); - $this->append('}', 1); - $this->append('}'); - } - - public function writeClassComment() { - $this->append('/**'); - $this->append(' * This class represents head section the theme.'); - $this->append(' */'); - } - - public function writeClassDeclaration() { - $this->append("class ".$this->getName().' extends VueHeadSectionV2 {'); - } - -} +getPath(), $writer->getNamespace()); + $this->addUseStatement(WebPage::class); + $this->addUseStatement(HeadNode::class); + $this->addUseStatement(VueHeadSectionV2::class); + } + public function writeClassBody() { + + $this->append([ + "/**", + " * Creates new instance of the class.", + " */", + ], 1); + $this->f('__construct',[ + 'page' => 'WebPage' + ]); + $this->append([ + 'parent::__construct();', + '//TODO: Add any extra JS or Css files here in addition to meta tags.', + ], 2); + $this->append('}', 1); + $this->append('}'); + } + + public function writeClassComment() { + $this->append('/**'); + $this->append(' * This class represents head section the theme.'); + $this->append(' */'); + } + + public function writeClassDeclaration() { + $this->append("class ".$this->getName().' extends VueHeadSectionV2 {'); + } + +} diff --git a/Themes/VuetifyCore/Cli/HeaderSectionWriter.php b/Themes/VuetifyCore/Cli/HeaderSectionWriter.php index 6416a58..6081da1 100644 --- a/Themes/VuetifyCore/Cli/HeaderSectionWriter.php +++ b/Themes/VuetifyCore/Cli/HeaderSectionWriter.php @@ -1,81 +1,81 @@ -wf; - } - public function __construct(VuetifyThemeClassWriter $writer) { - parent::__construct('HeaderSection', $writer->getPath(), $writer->getNamespace()); - - $this->addUseStatement(WebPage::class); - $this->addUseStatement(HTMLNode::class); - $this->wf = $writer->getWireframe(); - - } - - public function writeClassBody() { - $wireframe = $this->getWireframe(); - $this->append([ - "/**", - " * Creates new instance of the class.", - " */", - $this->f('__construct',[ - 'page' => 'WebPage' - ]) - ], 1); - - if ($wireframe == 'Side Navigation' || $wireframe == 'Base' || $wireframe == 'System Bar' || $wireframe == 'Inbox') { - $this->append('parent::__construct(\'v-app-bar\', [', 2); - $this->append("'app'", 3); - $this->append(']);', 2); - $this->append("\$this->addChild('v-app-bar-nav-icon', [", 2); - $this->append("'@click' => \"drawer = !drawer\",", 3); - $this->append("'class' => \"d-sm-flex d-md-none\",", 3); - $this->append("'id' => \"nav-menu-icon\",", 3); - $this->append("]);", 2); - $this->append("\$this->addChild('v-toolbar-title')->text(\$page->getWebsiteName());", 2); - } else if ($wireframe == 'Extended Toolbar') { - $this->append('parent::__construct(\'v-app-bar\', [', 2); - $this->append("'app', 'shrink-on-scroll'", 3); - $this->append(']);', 2); - $this->append("\$this->addChild('v-app-bar-nav-icon', [", 2); - $this->append("'@click' => \"drawer = !drawer\",", 3); - $this->append("'class' => \"d-sm-flex d-md-none\",", 3); - $this->append("'id' => \"nav-menu-icon\",", 3); - $this->append("]);", 2); - $this->append("\$this->addChild('v-toolbar-title')->text(\$page->getWebsiteName());", 2); - $this->append("\$this->addChild('v-spacer');", 2); - $this->append("\$this->addChild('v-btn', ['icon'])->addChild('v-icon')->text('mdi-dots-vertical');", 2); - } - $this->append('//TODO: Add components to the header.', 2); - $this->append('}', 1); - $this->append('}'); - } - - public function writeClassComment() { - $this->append('/**'); - $this->append(' * This class represents header section the theme.'); - $this->append(' */'); - } - - public function writeClassDeclaration() { - $this->append("class ".$this->getName().' extends HTMLNode {'); - } - -} +wf; + } + public function __construct(VuetifyThemeClassWriter $writer) { + parent::__construct('HeaderSection', $writer->getPath(), $writer->getNamespace()); + + $this->addUseStatement(WebPage::class); + $this->addUseStatement(HTMLNode::class); + $this->wf = $writer->getWireframe(); + + } + + public function writeClassBody() { + $wireframe = $this->getWireframe(); + $this->append([ + "/**", + " * Creates new instance of the class.", + " */", + ], 1); + $this->f('__construct',[ + 'page' => 'WebPage' + ]); + + if ($wireframe == 'Side Navigation' || $wireframe == 'Base' || $wireframe == 'System Bar' || $wireframe == 'Inbox') { + $this->append('parent::__construct(\'v-app-bar\', [', 2); + $this->append("'app'", 3); + $this->append(']);', 2); + $this->append("\$this->addChild('v-app-bar-nav-icon', [", 2); + $this->append("'@click' => \"drawer = !drawer\",", 3); + $this->append("'class' => \"d-sm-flex d-md-none\",", 3); + $this->append("'id' => \"nav-menu-icon\",", 3); + $this->append("]);", 2); + $this->append("\$this->addChild('v-toolbar-title')->text(\$page->getWebsiteName());", 2); + } else if ($wireframe == 'Extended Toolbar') { + $this->append('parent::__construct(\'v-app-bar\', [', 2); + $this->append("'app', 'shrink-on-scroll'", 3); + $this->append(']);', 2); + $this->append("\$this->addChild('v-app-bar-nav-icon', [", 2); + $this->append("'@click' => \"drawer = !drawer\",", 3); + $this->append("'class' => \"d-sm-flex d-md-none\",", 3); + $this->append("'id' => \"nav-menu-icon\",", 3); + $this->append("]);", 2); + $this->append("\$this->addChild('v-toolbar-title')->text(\$page->getWebsiteName());", 2); + $this->append("\$this->addChild('v-spacer');", 2); + $this->append("\$this->addChild('v-btn', ['icon'])->addChild('v-icon')->text('mdi-dots-vertical');", 2); + } + $this->append('//TODO: Add components to the header.', 2); + $this->append('}', 1); + $this->append('}'); + } + + public function writeClassComment() { + $this->append('/**'); + $this->append(' * This class represents header section the theme.'); + $this->append(' */'); + } + + public function writeClassDeclaration() { + $this->append("class ".$this->getName().' extends HTMLNode {'); + } + +} diff --git a/Themes/VuetifyCore/Cli/SideSectionWriter.php b/Themes/VuetifyCore/Cli/SideSectionWriter.php index 765131d..26a6cab 100644 --- a/Themes/VuetifyCore/Cli/SideSectionWriter.php +++ b/Themes/VuetifyCore/Cli/SideSectionWriter.php @@ -1,98 +1,98 @@ -getPath(), $writer->getNamespace()); - - $this->addUseStatement(WebPage::class); - $this->addUseStatement(HTMLNode::class); - - $this->wf = $writer->getWireframe(); - } - public function getWireframe() : string { - return $this->wf; - } - public function writeClassBody() { - $this->append([ - "/**", - " * Creates new instance of the class.", - " */", - $this->f('__construct',[ - 'page' => 'WebPage' - ]) - ], 1); - $wireframe = $this->getWireframe(); - - if ($wireframe == 'Base' - || $wireframe == 'Extended Toolbar' - || $wireframe == 'System Bar') { - $this->append('parent::__construct(\'v-navigation-drawer\', [', 2); - $this->append("'app', 'v-model' => 'drawer'", 3); - $this->append(']);', 2); - } else if ($wireframe == 'Side Navigation') { - $this->append('parent::__construct(\'v-navigation-drawer\', [', 2); - $this->append("'app', 'mini-variant', 'v-model' => 'drawer',", 3); - $this->append("'class' => 'pt-4', 'color' => 'grey lighten-3'", 3); - $this->append(']);', 2); - $this->append("\$this->addChild('v-avatar', [", 2); - $this->append("'v-for' => 'n in 6',", 3); - $this->append("':key' => 'n',", 3); - $this->append("':color' => \"`grey \\\${n === 1 ? 'darken' : 'lighten'}-1`\",", 3); - $this->append("':size' => 'n === 1 ? 36 : 20',", 3); - $this->append("'class' => 'd-block text-center mx-auto mb-9',", 3); - $this->append("]);", 2); - } else if ($wireframe == 'Inbox') { - $this->append('parent::__construct(\'v-navigation-drawer\', [', 2); - $this->append("'app', 'v-model' => 'drawer'", 3); - $this->append(']);', 2); - $this->append("\$this->addChild('v-sheet', [", 2); - $this->append("'color' => 'grey lighten-4',", 3); - $this->append("'class' => 'pa-4',", 3); - $this->append("])->addChild('v-avatar', [", 2); - $this->append("'color' => 'grey darken-1',", 3); - $this->append("'class' => 'mb-4',", 3); - $this->append("'size' => '64',", 3); - $this->append("])->getParent()->addChild('div')->text('my-email@xyz.com');", 2); - $this->append("\$this->addChild('v-divider');", 2); - $this->append("\$this->addChild('v-list')", 2); - $this->append("->addChild('v-list-item', [", 3); - $this->append("'v-for' => \"[icon, text] in inbox_links\"", 4); - $this->append("])->addChild('v-list-item-icon')", 3); - $this->append("->addChild('v-icon')->text('{{ icon }}')", 3); - $this->append("->getParent()->getParent()->addChild('v-list-item-content')", 3); - $this->append("->addChild('v-list-item-title')->text('{{ text }}');", 3); - } - - - $this->append('//TODO: Add components to the footer.', 2); - $this->append('}', 1); - $this->append('}'); - } - - public function writeClassComment() { - $this->append('/**'); - $this->append(' * This class represents side section of the theme.'); - $this->append(' */'); - } - - public function writeClassDeclaration() { - $this->append("class ".$this->getName().' extends HTMLNode {'); - } - -} +getPath(), $writer->getNamespace()); + + $this->addUseStatement(WebPage::class); + $this->addUseStatement(HTMLNode::class); + + $this->wf = $writer->getWireframe(); + } + public function getWireframe() : string { + return $this->wf; + } + public function writeClassBody() { + $this->append([ + "/**", + " * Creates new instance of the class.", + " */", + ], 1); + $this->f('__construct',[ + 'page' => 'WebPage' + ]); + $wireframe = $this->getWireframe(); + + if ($wireframe == 'Base' + || $wireframe == 'Extended Toolbar' + || $wireframe == 'System Bar') { + $this->append('parent::__construct(\'v-navigation-drawer\', [', 2); + $this->append("'app', 'v-model' => 'drawer'", 3); + $this->append(']);', 2); + } else if ($wireframe == 'Side Navigation') { + $this->append('parent::__construct(\'v-navigation-drawer\', [', 2); + $this->append("'app', 'mini-variant', 'v-model' => 'drawer',", 3); + $this->append("'class' => 'pt-4', 'color' => 'grey lighten-3'", 3); + $this->append(']);', 2); + $this->append("\$this->addChild('v-avatar', [", 2); + $this->append("'v-for' => 'n in 6',", 3); + $this->append("':key' => 'n',", 3); + $this->append("':color' => \"`grey \\\${n === 1 ? 'darken' : 'lighten'}-1`\",", 3); + $this->append("':size' => 'n === 1 ? 36 : 20',", 3); + $this->append("'class' => 'd-block text-center mx-auto mb-9',", 3); + $this->append("]);", 2); + } else if ($wireframe == 'Inbox') { + $this->append('parent::__construct(\'v-navigation-drawer\', [', 2); + $this->append("'app', 'v-model' => 'drawer'", 3); + $this->append(']);', 2); + $this->append("\$this->addChild('v-sheet', [", 2); + $this->append("'color' => 'grey lighten-4',", 3); + $this->append("'class' => 'pa-4',", 3); + $this->append("])->addChild('v-avatar', [", 2); + $this->append("'color' => 'grey darken-1',", 3); + $this->append("'class' => 'mb-4',", 3); + $this->append("'size' => '64',", 3); + $this->append("])->getParent()->addChild('div')->text('my-email@xyz.com');", 2); + $this->append("\$this->addChild('v-divider');", 2); + $this->append("\$this->addChild('v-list')", 2); + $this->append("->addChild('v-list-item', [", 3); + $this->append("'v-for' => \"[icon, text] in inbox_links\"", 4); + $this->append("])->addChild('v-list-item-icon')", 3); + $this->append("->addChild('v-icon')->text('{{ icon }}')", 3); + $this->append("->getParent()->getParent()->addChild('v-list-item-content')", 3); + $this->append("->addChild('v-list-item-title')->text('{{ text }}');", 3); + } + + + $this->append('//TODO: Add components to the footer.', 2); + $this->append('}', 1); + $this->append('}'); + } + + public function writeClassComment() { + $this->append('/**'); + $this->append(' * This class represents side section of the theme.'); + $this->append(' */'); + } + + public function writeClassDeclaration() { + $this->append("class ".$this->getName().' extends HTMLNode {'); + } + +} diff --git a/Themes/VuetifyCore/Cli/SysBarWriter.php b/Themes/VuetifyCore/Cli/SysBarWriter.php index 550e655..0792b17 100644 --- a/Themes/VuetifyCore/Cli/SysBarWriter.php +++ b/Themes/VuetifyCore/Cli/SysBarWriter.php @@ -1,62 +1,62 @@ -getPath(), $writer->getNamespace()); - - $this->addUseStatement(WebPage::class); - $this->addUseStatement(HTMLNode::class); - $this->wf = $writer->getWireframe(); - } - public function getWireframe() : string { - return $this->wf; - } - public function writeClassBody() { - $this->append([ - "/**", - " * Creates new instance of the class.", - " */", - $this->f('__construct',[ - 'page' => 'WebPage' - ]) - ], 1); - $wireframe = $this->getWireframe(); - - $this->append('parent::__construct(\'v-system-bar\', [', 2); - $this->append("'app'", 3); - $this->append(']);', 2); - $this->append("\$this->addChild('v-spacer');", 2); - $this->append("\$this->addChild('v-icon')->text('mdi-square');", 2); - $this->append("\$this->addChild('v-icon')->text('mdi-circle');", 2); - $this->append("\$this->addChild('v-icon')->text('mdi-triangle');", 2); - $this->append('}', 1); - $this->append('}'); - } - - public function writeClassComment() { - $this->append('/**'); - $this->append(' * This class represents system bar section of the theme.'); - $this->append(' */'); - } - - public function writeClassDeclaration() { - $this->append("class ".$this->getName().' extends HTMLNode {'); - } - -} +getPath(), $writer->getNamespace()); + + $this->addUseStatement(WebPage::class); + $this->addUseStatement(HTMLNode::class); + $this->wf = $writer->getWireframe(); + } + public function getWireframe() : string { + return $this->wf; + } + public function writeClassBody() { + $this->append([ + "/**", + " * Creates new instance of the class.", + " */", + ], 1); + $this->f('__construct',[ + 'page' => 'WebPage' + ]); + $wireframe = $this->getWireframe(); + + $this->append('parent::__construct(\'v-system-bar\', [', 2); + $this->append("'app'", 3); + $this->append(']);', 2); + $this->append("\$this->addChild('v-spacer');", 2); + $this->append("\$this->addChild('v-icon')->text('mdi-square');", 2); + $this->append("\$this->addChild('v-icon')->text('mdi-circle');", 2); + $this->append("\$this->addChild('v-icon')->text('mdi-triangle');", 2); + $this->append('}', 1); + $this->append('}'); + } + + public function writeClassComment() { + $this->append('/**'); + $this->append(' * This class represents system bar section of the theme.'); + $this->append(' */'); + } + + public function writeClassDeclaration() { + $this->append("class ".$this->getName().' extends HTMLNode {'); + } + +} diff --git a/Themes/VuetifyCore/Cli/VuetifyThemeClassWriter.php b/Themes/VuetifyCore/Cli/VuetifyThemeClassWriter.php index 79ed280..4f63588 100644 --- a/Themes/VuetifyCore/Cli/VuetifyThemeClassWriter.php +++ b/Themes/VuetifyCore/Cli/VuetifyThemeClassWriter.php @@ -1,150 +1,150 @@ -wireframe = $classInfoArr['wireframe']; - $ns = $this->getNamespace(); - - $this->addUseStatement(VuetifyThemeCore::class); - $this->addUseStatement(HTMLNode::class); - $this->addUseStatement(HeadNode::class); - - $this->addUseStatement($ns.'\\AsideSection'); - $this->addUseStatement($ns.'\\FooterSection'); - $this->addUseStatement($ns.'\\HeadSection'); - $this->addUseStatement($ns.'\\HeaderSection'); - - - } - public function getWireframe() { - return $this->wireframe; - } - private function writeAside() { - $writer = new SideSectionWriter($this); - $writer->writeClass(); - } - private function writeFooter() { - $writer = new FooterSectionWriter($this); - $writer->writeClass(); - } - private function writeHead() { - $writer = new HeadSectionWriter($this); - $writer->writeClass(); - } - private function writeHeader() { - $writer = new HeaderSectionWriter($this); - $writer->writeClass(); - } - private function writeSysBar() { - $writer = new SysBarWriter($this); - $writer->writeClass(); - } - - public function writeClassBody() { - $this->append([ - "/**", - " * Creates new instance of the class.", - " */", - $this->f('__construct') - ], 1); - - $this->append([ - "parent::__construct('Super Theme');", - '//TODO: Set the properties of your theme.', - '//$this->setName(\'Super Theme\');', - '//$this->setVersion(\'1.0\');', - '//$this->setAuthor(\'Me\');', - '//$this->setDescription(\'My Super Cool Theme.\');', - '//$this->setAuthorUrl(\'https://me.com\');', - '//$this->setLicenseName(\'MIT\');', - '//$this->setLicenseUrl(\'https://opensource.org/licenses/MIT\');', - '//$this->setCssDirName(\'css\');', - '//$this->setJsDirName(\'js\');', - '//$this->setImagesDirName(\'images\');' - ], 2); - - if ($this->getWireframe() == 'System Bar' || $this->getWireframe() == 'Inbox') { - $this->append('$this->setAfterLoaded(function ('.$this->getName().' $theme) {', 2); - $this->append("\$theme->getPage()->getChildByID('app')->insert(new SystemBarSection(\$theme->getPage()), 0);;", 3); - $this->append('});', 2); - $this->writeSysBar(); - } - $this->append('}', 1); - - $this->append([ - '/**', - " * Returns an object of type 'HTMLNode' that represents aside section of the page. ", - ' *', - " * @return HTMLNode|null An object of type 'HTMLNode'. If the theme has no aside", - ' * section, the method might return null.', - ' */', - $this->f('getAsideNode', [], 'HTMLNode') - ], 1); - $this->append('return new AsideSection($this->getPage());', 2); - $this->append('}', 1); - $this->writeAside(); - - $this->append([ - '/**', - " * Returns an object of type 'HTMLNode' that represents footer section of the page.", - ' *', - " * @return HTMLNode|null An object of type 'HTMLNode'. If the theme has no footer", - ' * section, the method might return null.', - ' */', - $this->f('getFooterNode', [], 'HTMLNode') - ], 1); - $this->append('return new FooterSection($this->getPage());', 2); - $this->append('}', 1); - $this->writeFooter(); - - $this->append([ - '/**', - " * Returns an object of type HeadNode that represents HTML <head> node.", - ' *', - " * @return HeadNode", - ' */', - $this->f('getHeadNode', [], 'HeadNode') - ], 1); - $this->append('return new HeadSection($this->getPage());', 2); - $this->append('}', 1); - $this->writeHead(); - - $this->append([ - '/**', - " * Returns an object of type HTMLNode that represents header section of the page.", - ' *', - " * @return HTMLNode|null @return HTMLNode|null An object of type 'HTMLNode'. If the theme has no header", - ' * section, the method might return null.', - ' */', - $this->f('getHeaderNode', [], 'HTMLNode') - ], 1); - $this->append('return new HeaderSection($this->getPage());', 2); - $this->append('}', 1); - $this->writeHeader(); - $this->append('}'); - } - - public function writeClassComment() { - - } - - public function writeClassDeclaration() { - $this->append("class ".$this->getName().' extends VuetifyThemeCore {'); - } - -} +wireframe = $classInfoArr['wireframe']; + $ns = $this->getNamespace(); + + $this->addUseStatement(VuetifyThemeCore::class); + $this->addUseStatement(HTMLNode::class); + $this->addUseStatement(HeadNode::class); + + $this->addUseStatement($ns.'\\AsideSection'); + $this->addUseStatement($ns.'\\FooterSection'); + $this->addUseStatement($ns.'\\HeadSection'); + $this->addUseStatement($ns.'\\HeaderSection'); + + + } + public function getWireframe() { + return $this->wireframe; + } + private function writeAside() { + $writer = new SideSectionWriter($this); + $writer->writeClass(); + } + private function writeFooter() { + $writer = new FooterSectionWriter($this); + $writer->writeClass(); + } + private function writeHead() { + $writer = new HeadSectionWriter($this); + $writer->writeClass(); + } + private function writeHeader() { + $writer = new HeaderSectionWriter($this); + $writer->writeClass(); + } + private function writeSysBar() { + $writer = new SysBarWriter($this); + $writer->writeClass(); + } + + public function writeClassBody() { + $this->append([ + "/**", + " * Creates new instance of the class.", + " */", + ], 1); + $this->f('__construct'); + + $this->append([ + "parent::__construct('Super Theme');", + '//TODO: Set the properties of your theme.', + '//$this->setName(\'Super Theme\');', + '//$this->setVersion(\'1.0\');', + '//$this->setAuthor(\'Me\');', + '//$this->setDescription(\'My Super Cool Theme.\');', + '//$this->setAuthorUrl(\'https://me.com\');', + '//$this->setLicenseName(\'MIT\');', + '//$this->setLicenseUrl(\'https://opensource.org/licenses/MIT\');', + '//$this->setCssDirName(\'css\');', + '//$this->setJsDirName(\'js\');', + '//$this->setImagesDirName(\'images\');' + ], 2); + + if ($this->getWireframe() == 'System Bar' || $this->getWireframe() == 'Inbox') { + $this->append('$this->setAfterLoaded(function ('.$this->getName().' $theme) {', 2); + $this->append("\$theme->getPage()->getChildByID('app')->insert(new SystemBarSection(\$theme->getPage()), 0);;", 3); + $this->append('});', 2); + $this->writeSysBar(); + } + $this->append('}', 1); + + $this->append([ + '/**', + " * Returns an object of type 'HTMLNode' that represents aside section of the page. ", + ' *', + " * @return HTMLNode|null An object of type 'HTMLNode'. If the theme has no aside", + ' * section, the method might return null.', + ' */', + ], 1); + $this->f('getAsideNode', [], 'HTMLNode'); + $this->append('return new AsideSection($this->getPage());', 2); + $this->append('}', 1); + $this->writeAside(); + + $this->append([ + '/**', + " * Returns an object of type 'HTMLNode' that represents footer section of the page.", + ' *', + " * @return HTMLNode|null An object of type 'HTMLNode'. If the theme has no footer", + ' * section, the method might return null.', + ' */', + ], 1); + $this->f('getFooterNode', [], 'HTMLNode'); + $this->append('return new FooterSection($this->getPage());', 2); + $this->append('}', 1); + $this->writeFooter(); + + $this->append([ + '/**', + " * Returns an object of type HeadNode that represents HTML <head> node.", + ' *', + " * @return HeadNode", + ' */', + ], 1); + $this->f('getHeadNode', [], 'HeadNode'); + $this->append('return new HeadSection($this->getPage());', 2); + $this->append('}', 1); + $this->writeHead(); + + $this->append([ + '/**', + " * Returns an object of type HTMLNode that represents header section of the page.", + ' *', + " * @return HTMLNode|null @return HTMLNode|null An object of type 'HTMLNode'. If the theme has no header", + ' * section, the method might return null.', + ' */', + ], 1); + $this->f('getHeaderNode', [], 'HTMLNode'); + $this->append('return new HeaderSection($this->getPage());', 2); + $this->append('}', 1); + $this->writeHeader(); + $this->append('}'); + } + + public function writeClassComment() { + + } + + public function writeClassDeclaration() { + $this->append("class ".$this->getName().' extends VuetifyThemeCore {'); + } + +} diff --git a/composer.json b/composer.json index 95b838c..e26ac7c 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ } ], "require": { - "webfiori/framework": "dev-main" + "webfiori/framework": "v3.0.0-RC0" }, "require-dev": { "phpunit/phpunit": "^10", diff --git a/composer.lock b/composer.lock index 5529e0b..a939117 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fbb352c9a2bed0bdbc2c0bacf7fccb05", + "content-hash": "58f7cb7896bf6e76630dcfd129bef294", "packages": [ { "name": "webfiori/cache", @@ -47,16 +47,16 @@ }, { "name": "webfiori/cli", - "version": "v2.0.1", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/WebFiori/cli.git", - "reference": "d7772d9ace6ca922dcaef04ae0c2450b90102b3c" + "reference": "73a332e077a4df0fae11dbffd55fe3d71b140e6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/cli/zipball/d7772d9ace6ca922dcaef04ae0c2450b90102b3c", - "reference": "d7772d9ace6ca922dcaef04ae0c2450b90102b3c", + "url": "https://api.github.com/repos/WebFiori/cli/zipball/73a332e077a4df0fae11dbffd55fe3d71b140e6a", + "reference": "73a332e077a4df0fae11dbffd55fe3d71b140e6a", "shasum": "" }, "require": { @@ -95,9 +95,9 @@ ], "support": { "issues": "https://github.com/WebFiori/cli/issues", - "source": "https://github.com/WebFiori/cli/tree/v2.0.1" + "source": "https://github.com/WebFiori/cli/tree/v2.1.0" }, - "time": "2025-10-06T14:09:41+00:00" + "time": "2026-01-12T21:06:54+00:00" }, { "name": "webfiori/collections", @@ -145,21 +145,19 @@ }, { "name": "webfiori/database", - "version": "1.1.0", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/WebFiori/database.git", - "reference": "d13abfcb63d238a95c4b0c177eaf1eb2e5015415" + "reference": "8bc8c02366c40e2f6ce5576d1a8e7ba66c9450e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/database/zipball/d13abfcb63d238a95c4b0c177eaf1eb2e5015415", - "reference": "d13abfcb63d238a95c4b0c177eaf1eb2e5015415", + "url": "https://api.github.com/repos/WebFiori/database/zipball/8bc8c02366c40e2f6ce5576d1a8e7ba66c9450e3", + "reference": "8bc8c02366c40e2f6ce5576d1a8e7ba66c9450e3", "shasum": "" }, "require": { - "ext-mysqli": "*", - "ext-sqlsrv": "*", "php": ">=8.1", "webfiori/jsonx": "*" }, @@ -187,9 +185,9 @@ ], "support": { "issues": "https://github.com/WebFiori/database/issues", - "source": "https://github.com/WebFiori/database/tree/v1.1.0" + "source": "https://github.com/WebFiori/database/tree/v2.0.2" }, - "time": "2025-09-29T16:28:23+00:00" + "time": "2026-04-13T19:56:24+00:00" }, { "name": "webfiori/err", @@ -296,16 +294,16 @@ }, { "name": "webfiori/framework", - "version": "dev-main", + "version": "3.0.0-RC0", "source": { "type": "git", "url": "https://github.com/WebFiori/framework.git", - "reference": "22433ff2b3e87a952adc1356bc4776850e80a405" + "reference": "54e891d8132597138cdef5fd2e1f92b5ea6630c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/framework/zipball/22433ff2b3e87a952adc1356bc4776850e80a405", - "reference": "22433ff2b3e87a952adc1356bc4776850e80a405", + "url": "https://api.github.com/repos/WebFiori/framework/zipball/54e891d8132597138cdef5fd2e1f92b5ea6630c4", + "reference": "54e891d8132597138cdef5fd2e1f92b5ea6630c4", "shasum": "" }, "require": { @@ -315,20 +313,20 @@ "ext-openssl": "*", "php": ">=8.1", "webfiori/cache": "v2.0.*", - "webfiori/cli": "v2.0.*", + "webfiori/cli": "v2.1.*", "webfiori/collections": "v2.0.*", - "webfiori/database": "v1.1.*", + "webfiori/database": "v2.0.*", "webfiori/err": "v2.0.*", "webfiori/file": "v2.0.*", - "webfiori/http": "v4.0.*", + "webfiori/http": "v5.0.*", "webfiori/jsonx": "v4.0.*", "webfiori/mailer": "v2.1.*", "webfiori/ui": "v4.0.*" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", "phpunit/phpunit": "^10.0" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -359,45 +357,32 @@ ], "support": { "issues": "https://github.com/webfiori/framework/issues", - "source": "https://github.com/webfior/framework" + "source": "https://github.com/webfiori/framework" }, - "funding": [ - { - "url": "https://paypal.me/IbrahimBinAlshikh", - "type": "custom" - }, - { - "url": "https://www.buymeacoffee.com/ibrahimdev", - "type": "custom" - }, - { - "url": "https://ko-fi.com/ibrahimdev", - "type": "ko_fi" - } - ], - "time": "2025-10-09T12:35:04+00:00" + "time": "2026-04-08T22:38:43+00:00" }, { "name": "webfiori/http", - "version": "4.0.0", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/WebFiori/http.git", - "reference": "b9eb529784cbec7a9c74fdf6a30efe0098f11ca8" + "reference": "2958177698151be6387ec26112868f4428b393ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/http/zipball/b9eb529784cbec7a9c74fdf6a30efe0098f11ca8", - "reference": "b9eb529784cbec7a9c74fdf6a30efe0098f11ca8", + "url": "https://api.github.com/repos/WebFiori/http/zipball/2958177698151be6387ec26112868f4428b393ba", + "reference": "2958177698151be6387ec26112868f4428b393ba", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": ">=7.0", + "php": ">=8.1", "webfiori/jsonx": "4.0.x" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^3.92", "phpunit/phpunit": "^10.0" }, "type": "library", @@ -423,34 +408,30 @@ ], "support": { "issues": "https://github.com/WebFiori/http/issues", - "source": "https://github.com/WebFiori/http/tree/v4.0.0" + "source": "https://github.com/WebFiori/http/tree/v5.0.5" }, - "funding": [ - { - "url": "https://paypal.me/IbrahimBinAlshikh", - "type": "custom" - } - ], - "time": "2025-08-06T20:32:03+00:00" + "time": "2026-03-05T12:03:16+00:00" }, { "name": "webfiori/jsonx", - "version": "4.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/WebFiori/json.git", - "reference": "d1605b5025ffec5a48a4b0330208c09631900a03" + "reference": "ad983ac6683ff0d12e1ef57546fbb68dd4d317ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/json/zipball/d1605b5025ffec5a48a4b0330208c09631900a03", - "reference": "d1605b5025ffec5a48a4b0330208c09631900a03", + "url": "https://api.github.com/repos/WebFiori/json/zipball/ad983ac6683ff0d12e1ef57546fbb68dd4d317ad", + "reference": "ad983ac6683ff0d12e1ef57546fbb68dd4d317ad", "shasum": "" }, "require": { - "php": ">=8.0" + "ext-json": "*", + "php": ">=8.1" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^3.92", "phpunit/phpunit": "^10.0" }, "type": "library", @@ -471,7 +452,7 @@ ], "support": { "issues": "https://github.com/WebFiori/json/issues", - "source": "https://github.com/WebFiori/json/tree/v4.0.0" + "source": "https://github.com/WebFiori/json/tree/v4.0.1" }, "funding": [ { @@ -479,7 +460,7 @@ "type": "custom" } ], - "time": "2025-08-03T15:19:48+00:00" + "time": "2026-03-04T10:29:17+00:00" }, { "name": "webfiori/mailer", @@ -869,6 +850,75 @@ ], "time": "2024-05-06T16:37:16+00:00" }, + { + "name": "ergebnis/agent-detector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/agent-detector.git", + "reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64", + "reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64", + "shasum": "" + }, + "require": { + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.50.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.2", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.24.0", + "ergebnis/rector-rules": "^1.16.0", + "fakerphp/faker": "^1.24.1", + "infection/infection": "^0.26.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.46", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "phpunit/phpunit": "^9.6.34", + "rector/rector": "^2.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\AgentDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a detector for detecting the presence of an agent.", + "homepage": "https://github.com/ergebnis/agent-detector", + "support": { + "issues": "https://github.com/ergebnis/agent-detector/issues", + "security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/agent-detector" + }, + "time": "2026-04-10T13:45:13+00:00" + }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -979,22 +1029,23 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.88.2", + "version": "v3.95.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99" + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a8d15584bafb0f0d9d938827840060fd4a3ebc99", - "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065", + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065", "shasum": "" }, "require": { "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", + "ergebnis/agent-detector": "^1.1.1", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", @@ -1003,34 +1054,34 @@ "php": "^7.4 || ^8.0", "react/child-process": "^0.6.6", "react/event-loop": "^1.5", - "react/promise": "^3.3", "react/socket": "^1.16", "react/stream": "^1.4", - "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", - "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0", - "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0", - "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0", - "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0", - "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", + "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.33", "symfony/polyfill-php80": "^1.33", "symfony/polyfill-php81": "^1.33", "symfony/polyfill-php84": "^1.33", - "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2", - "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0" + "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31.0", - "justinrainbow/json-schema": "^6.5", - "keradus/cli-executor": "^2.2", + "facile-it/paraunit": "^1.3.1 || ^2.8.0", + "infection/infection": "^0.32.6", + "justinrainbow/json-schema": "^6.8.0", + "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.8", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", - "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2", - "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2" + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55", + "symfony/polyfill-php85": "^1.33", + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -1045,7 +1096,7 @@ "PhpCsFixer\\": "src/" }, "exclude-from-classmap": [ - "src/Fixer/Internal/*" + "src/**/Internal/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1071,7 +1122,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.88.2" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1" }, "funding": [ { @@ -1079,7 +1130,7 @@ "type": "github" } ], - "time": "2025-09-27T00:24:15+00:00" + "time": "2026-04-12T17:00:09+00:00" }, { "name": "myclabs/deep-copy", @@ -1143,16 +1194,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.6.1", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -1195,9 +1246,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2025-08-13T20:13:15+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -1640,16 +1691,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.58", + "version": "10.5.63", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca" + "reference": "33198268dad71e926626b618f3ec3966661e4d90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e24fb46da450d8e6a5788670513c1af1424f16ca", - "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", + "reference": "33198268dad71e926626b618f3ec3966661e4d90", "shasum": "" }, "require": { @@ -1670,7 +1721,7 @@ "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.4", + "sebastian/comparator": "^5.0.5", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.4", @@ -1721,7 +1772,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.58" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" }, "funding": [ { @@ -1745,7 +1796,7 @@ "type": "tidelift" } ], - "time": "2025-09-28T12:04:46+00:00" + "time": "2026-01-27T05:48:37+00:00" }, { "name": "psr/container", @@ -1974,16 +2025,16 @@ }, { "name": "react/child-process", - "version": "v0.6.6", + "version": "v0.6.7", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", "shasum": "" }, "require": { @@ -2037,7 +2088,7 @@ ], "support": { "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" }, "funding": [ { @@ -2045,20 +2096,20 @@ "type": "open_collective" } ], - "time": "2025-01-01T16:37:48+00:00" + "time": "2025-12-23T15:25:20+00:00" }, { "name": "react/dns", - "version": "v1.13.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", "shasum": "" }, "require": { @@ -2113,7 +2164,7 @@ ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.13.0" + "source": "https://github.com/reactphp/dns/tree/v1.14.0" }, "funding": [ { @@ -2121,20 +2172,20 @@ "type": "open_collective" } ], - "time": "2024-06-13T14:18:03+00:00" + "time": "2025-11-18T19:34:28+00:00" }, { "name": "react/event-loop", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", "shasum": "" }, "require": { @@ -2185,7 +2236,7 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" }, "funding": [ { @@ -2193,7 +2244,7 @@ "type": "open_collective" } ], - "time": "2023-11-13T13:48:05+00:00" + "time": "2025-11-17T20:46:25+00:00" }, { "name": "react/promise", @@ -2270,16 +2321,16 @@ }, { "name": "react/socket", - "version": "v1.16.0", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", "shasum": "" }, "require": { @@ -2338,7 +2389,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.16.0" + "source": "https://github.com/reactphp/socket/tree/v1.17.0" }, "funding": [ { @@ -2346,7 +2397,7 @@ "type": "open_collective" } ], - "time": "2024-07-26T10:38:09+00:00" + "time": "2025-11-19T20:47:34+00:00" }, { "name": "react/stream", @@ -2596,16 +2647,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.4", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { @@ -2661,7 +2712,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { @@ -2681,7 +2732,7 @@ "type": "tidelift" } ], - "time": "2025-09-07T05:25:07+00:00" + "time": "2026-01-24T09:25:16+00:00" }, { "name": "sebastian/complexity", @@ -3381,47 +3432,39 @@ }, { "name": "symfony/console", - "version": "v6.4.26", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f" + "reference": "5b66d385dc58f69652e56f78a4184615e3f2b7f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f", - "reference": "492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f", + "url": "https://api.github.com/repos/symfony/console/zipball/5b66d385dc58f69652e56f78a4184615e3f2b7f7", + "reference": "5b66d385dc58f69652e56f78a4184615e3f2b7f7", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/string": "^7.4|^8.0" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -3455,7 +3498,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.26" + "source": "https://github.com/symfony/console/tree/v8.0.8" }, "funding": [ { @@ -3475,7 +3518,7 @@ "type": "tidelift" } ], - "time": "2025-09-26T12:13:46+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3546,24 +3589,24 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.4.25", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b0cf3162020603587363f0551cd3be43958611ff" + "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b0cf3162020603587363f0551cd3be43958611ff", - "reference": "b0cf3162020603587363f0551cd3be43958611ff", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f662acc6ab22a3d6d716dcb44c381c6002940df6", + "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/security-http": "<7.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -3572,13 +3615,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -3606,7 +3650,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.25" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.8" }, "funding": [ { @@ -3626,7 +3670,7 @@ "type": "tidelift" } ], - "time": "2025-08-13T09:41:44+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3706,25 +3750,25 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.24", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8" + "reference": "66b769ae743ce2d13e435528fbef4af03d623e5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/66b769ae743ce2d13e435528fbef4af03d623e5a", + "reference": "66b769ae743ce2d13e435528fbef4af03d623e5a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -3752,7 +3796,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.24" + "source": "https://github.com/symfony/filesystem/tree/v8.0.8" }, "funding": [ { @@ -3772,27 +3816,27 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/finder", - "version": "v6.4.24", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "73089124388c8510efb8d2d1689285d285937b08" + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08", - "reference": "73089124388c8510efb8d2d1689285d285937b08", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.4" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -3820,7 +3864,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.24" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, "funding": [ { @@ -3840,24 +3884,24 @@ "type": "tidelift" } ], - "time": "2025-07-15T12:02:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.4.25", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "d28e7e2db8a73e9511df892d36445f61314bbebe" + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d28e7e2db8a73e9511df892d36445f61314bbebe", - "reference": "d28e7e2db8a73e9511df892d36445f61314bbebe", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b48bce0a70b914f6953dafbd10474df232ed4de8", + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -3891,7 +3935,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.25" + "source": "https://github.com/symfony/options-resolver/tree/v8.0.8" }, "funding": [ { @@ -3911,20 +3955,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T17:06:28+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -3974,7 +4018,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0" }, "funding": [ { @@ -3994,20 +4038,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df", "shasum": "" }, "require": { @@ -4056,7 +4100,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0" }, "funding": [ { @@ -4076,11 +4120,11 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -4141,7 +4185,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0" }, "funding": [ { @@ -4165,16 +4209,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -4226,7 +4270,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0" }, "funding": [ { @@ -4246,20 +4290,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -4310,7 +4354,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.36.0" }, "funding": [ { @@ -4330,11 +4374,11 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -4390,7 +4434,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.36.0" }, "funding": [ { @@ -4414,16 +4458,16 @@ }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { @@ -4470,7 +4514,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.36.0" }, "funding": [ { @@ -4490,24 +4534,24 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-04-10T18:47:49+00:00" }, { "name": "symfony/process", - "version": "v6.4.26", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "48bad913268c8cafabbf7034b39c8bb24fbc5ab8" + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/48bad913268c8cafabbf7034b39c8bb24fbc5ab8", - "reference": "48bad913268c8cafabbf7034b39c8bb24fbc5ab8", + "url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -4535,7 +4579,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.26" + "source": "https://github.com/symfony/process/tree/v8.0.8" }, "funding": [ { @@ -4555,20 +4599,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -4622,7 +4666,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -4633,29 +4677,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.24", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + "reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/85954ed72d5440ea4dc9a10b7e49e01df766ffa3", + "reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -4684,7 +4732,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + "source": "https://github.com/symfony/stopwatch/tree/v8.0.8" }, "funding": [ { @@ -4704,37 +4752,38 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/string", - "version": "v6.4.26", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5621f039a71a11c87c106c1c598bdcd04a19aeea" + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5621f039a71a11c87c106c1c598bdcd04a19aeea", - "reference": "5621f039a71a11c87c106c1c598bdcd04a19aeea", + "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963", + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4773,7 +4822,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.26" + "source": "https://github.com/symfony/string/tree/v8.0.8" }, "funding": [ { @@ -4793,20 +4842,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T14:32:46+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -4835,7 +4884,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -4843,17 +4892,17 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": { - "webfiori/framework": 20 + "webfiori/framework": 5 }, "prefer-stable": false, "prefer-lowest": false, "platform": {}, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/tests/Themes/VuetifyCore/HeadSectionTest.php b/tests/Themes/VuetifyCore/HeadSectionTest.php new file mode 100644 index 0000000..4a75415 --- /dev/null +++ b/tests/Themes/VuetifyCore/HeadSectionTest.php @@ -0,0 +1,88 @@ +getChildByID('ajaxrequest-helper'); + $this->assertNotNull($node); + } + /** + * @test + */ + public function testCommonHeadHasFavicon() { + $head = new CommonHead(); + $node = $head->getChildByID('favicon'); + $this->assertNotNull($node); + } + /** + * @test + */ + public function testCommonHeadHasMaterialDesignIcons() { + $head = new CommonHead(); + $node = $head->getChildByID('MaterialDesign-Webfont'); + $this->assertNotNull($node); + } + /** + * @test + */ + public function testCommonHeadGTM() { + $head = new CommonHead(); + $this->assertNull($head->getGTM()); + $head->setGTM('GTM-XXXXX'); + $this->assertEquals('GTM-XXXXX', $head->getGTM()); + } + /** + * @test + */ + public function testCommonHeadGoogleSiteVerification() { + $head = new CommonHead(); + $this->assertNull($head->getGoogleSiteVerification()); + $head->setGoogleSiteVerification('abc123'); + $this->assertEquals('abc123', $head->getGoogleSiteVerification()); + } + /** + * @test + */ + public function testV2HeadHasVueScript() { + $node = self::$v2Head->getChildByID('vue-script'); + $this->assertNotNull($node); + $this->assertEquals('2.7.16', $node->getAttribute('version')); + } + /** + * @test + */ + public function testV2HeadHasVuetifyCSS() { + $node = self::$v2Head->getChildByID('vuetify-css'); + $this->assertNotNull($node); + $this->assertEquals('2.7.2', $node->getAttribute('version')); + } + /** + * @test + */ + public function testV2HeadHasVuetifyScript() { + $node = self::$v2Head->getChildByID('vuetify-script'); + $this->assertNotNull($node); + $this->assertEquals('2.7.2', $node->getAttribute('version')); + } + /** + * @test + */ + public function testV2HeadHasSRI() { + $node = self::$v2Head->getChildByID('vue-script'); + $this->assertNotNull($node->getAttribute('integrity')); + $this->assertEquals('anonymous', $node->getAttribute('crossorigin')); + } +} diff --git a/tests/Themes/VuetifyCore/VuetifyThemeCoreTest.php b/tests/Themes/VuetifyCore/VuetifyThemeCoreTest.php new file mode 100644 index 0000000..c3ecaf3 --- /dev/null +++ b/tests/Themes/VuetifyCore/VuetifyThemeCoreTest.php @@ -0,0 +1,63 @@ +assertEquals('app', $theme->getAppID()); + } + /** + * @test + */ + public function testSetAppID() { + $theme = new ConcreteTheme(); + $theme->setAppID('my-app'); + $this->assertEquals('my-app', $theme->getAppID()); + } + /** + * @test + */ + public function testSetAppIDEmpty() { + $theme = new ConcreteTheme(); + $theme->setAppID('custom'); + $theme->setAppID(''); + $this->assertEquals('custom', $theme->getAppID()); + } + /** + * @test + */ + public function testSetAppIDSpaces() { + $theme = new ConcreteTheme(); + $theme->setAppID(' '); + $this->assertEquals('app', $theme->getAppID()); + } + /** + * @test + */ + public function testThemeProperties() { + $theme = new ConcreteTheme(); + $this->assertEquals('1.2.5', $theme->getVersion()); + $this->assertEquals('Ibrahim BinAlshikh', $theme->getAuthor()); + $this->assertEquals('MIT', $theme->getLicenseName()); + $this->assertEquals('https://opensource.org/licenses/MIT', $theme->getLicenseUrl()); + $this->assertEquals('https://ibrahim-binalshikh.me', $theme->getAuthorUrl()); + } +} diff --git a/tests/Themes/VuetifyCore/VuetifyWebPageTest.php b/tests/Themes/VuetifyCore/VuetifyWebPageTest.php new file mode 100644 index 0000000..3cf276c --- /dev/null +++ b/tests/Themes/VuetifyCore/VuetifyWebPageTest.php @@ -0,0 +1,104 @@ +assertInstanceOf(\WebFiori\Json\Json::class, $page->getJson()); + } + /** + * @test + */ + public function testAddToJson() { + $page = new VuetifyWebPage(); + $page->addToJson(['foo' => 'bar', 'num' => 42]); + $json = $page->getJson(); + $this->assertEquals('bar', $json->get('foo')); + $this->assertEquals(42, $json->get('num')); + } + /** + * @test + */ + public function testAddToJsonMultipleCalls() { + $page = new VuetifyWebPage(); + $page->addToJson(['a' => 1]); + $page->addToJson(['b' => 2]); + $json = $page->getJson(); + $this->assertEquals(1, $json->get('a')); + $this->assertEquals(2, $json->get('b')); + } + /** + * @test + */ + public function testToVItemsWithArray() { + $page = new VuetifyWebPage(); + $items = $page->toVItems(['key1' => 'Label 1', 'key2' => 'Label 2']); + $this->assertCount(2, $items); + $this->assertEquals('Label 1', $items[0]->get('text')); + $this->assertEquals('key1', $items[0]->get('value')); + $this->assertEquals('Label 1', $items[0]->get('title')); + $this->assertEquals('key1', $items[0]->get('key')); + $this->assertEquals('Label 2', $items[1]->get('text')); + $this->assertEquals('key2', $items[1]->get('value')); + } + /** + * @test + */ + public function testToVItemsWithExtraAttrs() { + $page = new VuetifyWebPage(); + $items = $page->toVItems( + ['a' => 'A', 'b' => 'B'], + ['a' => ['disabled' => true, 'color' => 'red']] + ); + $this->assertCount(2, $items); + $this->assertTrue($items[0]->get('disabled')); + $this->assertEquals('red', $items[0]->get('color')); + // 'b' has no extra attrs + $this->assertNull($items[1]->get('disabled')); + } + /** + * @test + */ + public function testToVItemsEmptyArray() { + $page = new VuetifyWebPage(); + $items = $page->toVItems([]); + $this->assertCount(0, $items); + } + /** + * @test + */ + public function testGetPrimaryVueFilePath() { + $page = new VuetifyWebPage(); + $path = $page->getPrimaryVueFilePath(); + // Class is VuetifyWebPage in namespace Themes\VuetifyCore + // APP_DIR is 'App', so pagesFolder = 'App\pages' + // The path should contain .js extension and be kebab-case + $this->assertStringEndsWith('.js', $path); + $this->assertStringContainsString('vuetify-web-page.js', $path); + } + /** + * @test + */ + public function testRenderIncludesJsonData() { + $page = new VuetifyWebPage(); + $page->addToJson(['testKey' => 'testValue']); + $html = $page->render(false, true); + $this->assertStringContainsString('server-json-data', $html); + $this->assertStringContainsString('testKey', $html); + $this->assertStringContainsString('testValue', $html); + } + /** + * @test + */ + public function testRenderIncludesVueInitScript() { + $page = new VuetifyWebPage(); + $html = $page->render(false, true); + $this->assertStringContainsString('vue-init', $html); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index d852d98..0ebadbf 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,11 +1,16 @@