setName('development:build-tracker-js'); $this->setDescription('Minifies tracker JavaScript for Matomo core or a single plugin.'); $this->addRequiredValueOption('plugin', null, 'The plugin to minify. If not supplied, minifies core tracker JS.'); } public function isEnabled() { return \Piwik\Development::isEnabled(); } protected function doExecute(): int { $plugin = $this->getInput()->getOption('plugin'); if ($plugin && !Manager::getInstance()->isPluginInFilesystem($plugin)) { throw new \InvalidArgumentException("Invalid plugin '$plugin'"); } $this->installYuiCompressorIfNeeded(); $this->compress($plugin); return self::SUCCESS; } private function compress($plugin) { $output = $this->getOutput(); $output->writeln("Minifying..."); $jsPath = PIWIK_INCLUDE_PATH . '/js'; if (!$plugin) { $command = "cd $jsPath && sed '//,/<\\/DEBUG>/d' < piwik.js | sed 's/eval/replacedEvilString/' | java -jar yuicompressor-2.4.8.jar --type js --line-break 1000 | sed 's/replacedEvilString/eval/' | sed 's/^[/][*]/\\/*!/' > piwik.min.js && cp piwik.min.js ../piwik.js && cp piwik.min.js ../matomo.js"; if ($output->isVerbose()) { $output->writeln("Command: $command"); } passthru($command); return; } $pluginTrackerJs = PIWIK_INCLUDE_PATH . '/plugins/' . $plugin . '/tracker.js'; $pluginTrackerMinJs = PIWIK_INCLUDE_PATH . '/plugins/' . $plugin . '/tracker.min.js'; $command = "cd $jsPath && cat $pluginTrackerJs | java -jar yuicompressor-2.4.8.jar --type js --line-break 1000 | sed 's/^[/][*]/\\/*!/' > $pluginTrackerMinJs"; if ($output->isVerbose()) { $output->writeln("Command: $command"); } passthru($command); $output->writeln("Done."); } private function installYuiCompressorIfNeeded() { $zipPath = PIWIK_INCLUDE_PATH . '/js/yuicompressor-2.4.8.zip'; $jarPath = PIWIK_INCLUDE_PATH . '/js/yuicompressor-2.4.8.jar'; if (is_file($jarPath)) { return; } $this->getOutput()->writeln("Downloading YUI compressor..."); Http::fetchRemoteFile(self::YUI_COMPRESSOR_URL, $zipPath); $unzip = Unzip::factory('PclZip', $zipPath); $unzip->extract(PIWIK_INCLUDE_PATH . '/js/'); } }