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;
 }
Ejemplo n.º 2
0
 private function _parseDependencies($dependency)
 {
     if (in_array($dependency, $this->_parsed, true)) {
         return array();
     }
     $this->_parsed[] = $dependency;
     $ret = array();
     $src = $dependency->getContentsSource();
     if ($src['type'] == 'file') {
         $cacheId = str_replace(array('/', '.', '-', '$'), '_', $src['file']) . '__' . md5_file($src['file']);
     } else {
         if ($src['type'] == 'contents') {
             $cacheId = md5($src['contents']);
         } else {
             throw new Kwf_Exception_NotYetImplemented();
         }
     }
     $cacheId .= "v2";
     //versioned cache id as clear-cache doesn't clear it
     $sourceChanged = false;
     $deps = array();
     $depBrowserAlternatives = array();
     $cachedData = self::_getCache()->load($cacheId);
     if ($cachedData !== false) {
         $deps = $cachedData['deps'];
         $depBrowserAlternatives = $cachedData['alternatives'];
         $sourceChanged = $cachedData['sourceChanged'];
     } else {
         if ($src['type'] == 'file') {
             $contents = file_get_contents($src['file']);
         } else {
             if ($src['type'] == 'contents') {
                 $contents = $src['contents'];
             }
         }
         $useBabel = preg_match("/\\bimport\\s+(?:.+\\s+from\\s+)?[\\'\"]([^\"\\']+)[\"\\']/", $contents);
         if ($useBabel) {
             $src['type'] = 'contents';
             $src['contents'] = $dependency->getContentsPacked()->getFileContents();
             //we have to use complied contents as babel adds require() statements
         }
         if ($src['type'] == 'file') {
             $parsedFile = Kwf_Assets_CommonJs_ModuleDepsParser::parse($src['file']);
             $deps = $parsedFile['deps'];
         } else {
             if ($src['type'] == 'contents') {
                 $temp = tempnam('temp/', 'commonjs');
                 file_put_contents($temp, $src['contents']);
                 $parsedFile = Kwf_Assets_CommonJs_ModuleDepsParser::parse($temp);
                 $deps = $parsedFile['deps'];
                 unlink($temp);
             }
         }
         if (file_exists("node_modules/" . (string) $dependency)) {
             $dep = (string) $dependency;
             $package = json_decode(file_get_contents("node_modules/" . substr($dep, 0, strpos($dep, "/")) . '/package.json'), true);
             if (isset($package['browser'])) {
                 if (is_string($package['browser'])) {
                     $depBrowserAlternatives[$package['main']] = $package['browser'];
                 } else {
                     foreach ($package['browser'] as $key => $value) {
                         $depBrowserAlternatives[$key] = $value;
                     }
                 }
             }
         }
         $sourceChanged = $parsedFile['source'] != $contents;
         self::_getCache()->save(array('deps' => $deps, 'alternatives' => $depBrowserAlternatives, 'sourceChanged' => $sourceChanged), $cacheId);
     }
     if ($sourceChanged) {
         $dependency->addFilter(new Kwf_Assets_CommonJs_ModuleDepsFilter());
     }
     foreach ($deps as $depName) {
         $dep = $depName;
         if ($depBrowserAlternatives) {
             if (array_key_exists($dep, $depBrowserAlternatives)) {
                 $dep = $depBrowserAlternatives[$dep];
             }
         }
         if (substr($dep, 0, 2) == './') {
             $fn = $dependency->getFileNameWithType();
             $dir = substr($fn, 0, strrpos($fn, '/') + 1);
             $dep = $dir . substr($dep, 2);
         } else {
             if (substr($dep, 0, 3) == '../') {
                 $fn = $dependency->getFileNameWithType();
                 $dir = substr($fn, 0, strrpos($fn, '/'));
                 while (substr($dep, 0, 3) == '../') {
                     $dep = substr($dep, 3);
                     $dir = substr($dir, 0, strrpos($dir, '/'));
                 }
                 $dep = $dir . '/' . $dep;
             }
         }
         $d = $this->_providerList->findDependency($dep);
         if (!$d) {
             throw new Kwf_Exception("Can't resolve dependency: require '{$depName}' => '{$dep}' for {$dependency}");
         }
         $ret[$depName] = $d;
         $requires = $d->getDependencies(Kwf_Assets_Dependency_Abstract::DEPENDENCY_TYPE_REQUIRES);
         foreach ($requires as $index => $r) {
             if ($r->getMimeType() == 'text/javascript') {
                 unset($requires[$index]);
             }
         }
         $d->setDependencies(Kwf_Assets_Dependency_Abstract::DEPENDENCY_TYPE_REQUIRES, $requires);
         foreach ($this->_parseDependencies($d) as $index => $i) {
             $d->addDependency(Kwf_Assets_Dependency_Abstract::DEPENDENCY_TYPE_COMMONJS, $i, $index);
         }
     }
     return $ret;
 }