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; }
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; }