public static function run($pluginsInitCode, Kwf_SourceMaps_SourceMap $sourcemap) { $js = "\n require('es6-promise').polyfill(); //required for older nodejs\n var postcss = require('postcss');\n var plugins = [];\n " . $pluginsInitCode . "\n var instance = postcss( plugins );\n var css = '';\n process.stdin.setEncoding('utf-8')\n process.stdin.on('data', function(buf) { css += buf.toString(); });\n process.stdin.on('end', function() {\n instance.process(css).then(function (result) {\n process.stdout.write(result.css);\n }).catch(function(e) {\n console.log(e);\n process.exit(1);\n });\n });\n process.stdin.resume();\n "; $runfile = tempnam("temp/", 'postcss'); file_put_contents($runfile, $js); putenv("NODE_PATH=" . getcwd() . "/node_modules" . PATH_SEPARATOR . getcwd() . "/" . KWF_PATH . PATH_SEPARATOR . getcwd() . "/"); $cmd = getcwd() . "/" . VENDOR_PATH . "/bin/node " . $runfile; $cmd .= " 2>&1"; $process = new Symfony\Component\Process\Process($cmd); $mapData = $sourcemap->getMapContentsData(false); $hasSourcemap = !!$mapData->mappings; if ($hasSourcemap) { $process->setInput($sourcemap->getFileContentsInlineMap(false)); } else { $process->setInput($sourcemap->getFileContents()); } if ($process->run() !== 0) { throw new Kwf_Exception("Process '{$cmd}' failed with " . $process->getExitCode() . "\n" . $process->getOutput()); } putenv("NODE_PATH="); unlink($runfile); $out = $process->getOutput(); if (Kwf_SourceMaps_SourceMap::hasInline($out)) { $ret = Kwf_SourceMaps_SourceMap::createFromInline($out); } else { $ret = Kwf_SourceMaps_SourceMap::createEmptyMap($out); $ret->setMimeType('text/css'); } $ret->setSources($sourcemap->getSources()); return $ret; }
public function filter(Kwf_SourceMaps_SourceMap $sourcemap) { $temp = tempnam('temp/', 'commonjs'); file_put_contents($temp, $sourcemap->getFileContents()); $parsedFile = Kwf_Assets_CommonJs_ModuleDepsParser::parse($temp); unlink($temp); $newSourceMap = Kwf_SourceMaps_SourceMap::createEmptyMap($parsedFile['source']); if (isset($sourcemap->getMapContentsData(false)->{'_x_org_koala-framework_trlData'})) { $newSourceMap->getMapContentsData(false)->{'_x_org_koala-framework_trlData'} = $sourcemap->getMapContentsData(false)->{'_x_org_koala-framework_trlData'}; } if (isset($sourcemap->getMapContentsData(false)->{'_x_org_koala-framework_masterFiles'})) { $newSourceMap->getMapContentsData(false)->{'_x_org_koala-framework_masterFiles'} = $sourcemap->getMapContentsData(false)->{'_x_org_koala-framework_masterFiles'}; } return $newSourceMap; }
public function testStringReplaceMultipleInOneLine() { $map = new Kwf_SourceMaps_SourceMap(Kwf_SourceMaps_TestData::$testMap, Kwf_SourceMaps_TestData::$testGeneratedCode); $map->stringReplace('a', 'xbbbbxxxxxxxx'); //0 1 2 3 4 //1234567890123456789012345678901234567890123 // ONE.foo=function(a){return baz(a);}; $s = " ONE.foo=function(xbbbbxxxxxxxx){return bxbbbbxxxxxxxxz(xbbbbxxxxxxxx);};\n" . " TWO.inc=function(xbbbbxxxxxxxx){return xbbbbxxxxxxxx+1;};"; $this->assertEquals($map->getFileContents(), $s); $mappings = $map->getMappings(); $this->assertEquals($mappings[3], array('generatedLine' => 1, 'generatedColumn' => 18, 'originalSource' => '/the/root/one.js', 'originalLine' => 1, 'originalColumn' => 21, 'originalName' => 'bar')); $this->assertEquals($mappings[4], array('generatedLine' => 1, 'generatedColumn' => 21 + 12, 'originalSource' => '/the/root/one.js', 'originalLine' => 2, 'originalColumn' => 3, 'originalName' => null)); $this->assertEquals($mappings[5], array('generatedLine' => 1, 'generatedColumn' => 28 + 12, 'originalSource' => '/the/root/one.js', 'originalLine' => 2, 'originalColumn' => 10, 'originalName' => 'baz')); $this->assertEquals($mappings[6], array('generatedLine' => 1, 'generatedColumn' => 32 + 12 + 12, 'originalSource' => '/the/root/one.js', 'originalLine' => 2, 'originalColumn' => 14, 'originalName' => 'bar')); $this->assertEquals($mappings[10], array('generatedLine' => 2, 'generatedColumn' => 18, 'originalSource' => '/the/root/two.js', 'originalLine' => 1, 'originalColumn' => 21, 'originalName' => 'n')); $this->assertEquals($mappings[11], array('generatedLine' => 2, 'generatedColumn' => 21 + 12, 'originalSource' => '/the/root/two.js', 'originalLine' => 2, 'originalColumn' => 3, 'originalName' => null)); $this->assertEquals($mappings[12], array('generatedLine' => 2, 'generatedColumn' => 28 + 12, 'originalSource' => '/the/root/two.js', 'originalLine' => 2, 'originalColumn' => 10, 'originalName' => 'n')); }
public function testConcatThree() { $map1 = new Kwf_SourceMaps_SourceMap(Kwf_SourceMaps_TestData::$testMap, Kwf_SourceMaps_TestData::$testGeneratedCode); $map2 = new Kwf_SourceMaps_SourceMap(Kwf_SourceMaps_TestData::$testMap, Kwf_SourceMaps_TestData::$testGeneratedCode); $map3 = new Kwf_SourceMaps_SourceMap(Kwf_SourceMaps_TestData::$testMap, Kwf_SourceMaps_TestData::$testGeneratedCode); $map1->concat($map2); $map1->concat($map3); $mappings = $map1->getMappings(); $this->assertEquals(13 * 3, count($mappings)); $this->assertEquals($mappings[0], array('generatedLine' => 1, 'generatedColumn' => 1, 'originalSource' => '/the/root/one.js', 'originalLine' => 1, 'originalColumn' => 1, 'originalName' => null)); $this->assertEquals($mappings[12], array('generatedLine' => 2, 'generatedColumn' => 28, 'originalSource' => '/the/root/two.js', 'originalLine' => 2, 'originalColumn' => 10, 'originalName' => 'n')); $mappingsOffs = 13 * 2; $genLineOffs = 2 * 2; $this->assertEquals($mappings[$mappingsOffs + 0], array('generatedLine' => $genLineOffs + 1, 'generatedColumn' => 1, 'originalSource' => '/the/root/one.js', 'originalLine' => 1, 'originalColumn' => 1, 'originalName' => null)); $this->assertEquals($mappings[$mappingsOffs + 12], array('generatedLine' => $genLineOffs + 2, 'generatedColumn' => 28, 'originalSource' => '/the/root/two.js', 'originalLine' => 2, 'originalColumn' => 10, 'originalName' => 'n')); $contents = $map1->getFileContents(); $contents = explode("\n", $contents); $this->assertEquals(2 * 3, count($contents)); }