├── src ├── assets │ ├── images │ │ └── favicon.ico │ ├── logo │ │ ├── composer.png │ │ ├── npm.svg │ │ └── bower.svg │ ├── css │ │ └── site.css │ └── AppAsset.php ├── views │ ├── widgets │ │ └── PoweredBy.php │ ├── package │ │ ├── wrong-name.php │ │ ├── search.php │ │ ├── not-found.php │ │ ├── fetch-error.php │ │ ├── details.php │ │ ├── versions.php │ │ └── _search_item.php │ ├── site │ │ ├── contact.php │ │ ├── index.php │ │ └── about.php │ └── menus │ │ └── main-search.php ├── config │ ├── hidev.php │ ├── params.php │ ├── packages.list │ ├── goals.yml │ ├── web.php │ ├── console.php │ ├── common.php │ └── bower.list ├── exceptions │ ├── PermanentProblemExceptionInterface.php │ ├── UpdateRateLimitException.php │ ├── PackageNotExistsException.php │ ├── CorruptedPackageException.php │ └── AssetFileStorageException.php ├── menus │ ├── FooterMenu.php │ ├── NavbarMenu.php │ └── MainMenu.php ├── migrations │ ├── m170307_170300_queue_timeout.php │ ├── m170424_144100_package_avoiding.php │ ├── m161130_163000_package.php │ ├── m161129_140000_queue.php │ └── m170920_170000_queue_updated.php ├── controllers │ ├── SiteController.php │ └── PackageController.php ├── models │ ├── Release.php │ └── AssetPackage.php ├── components │ ├── PackageUtil.php │ ├── StorageInterface.php │ └── Storage.php ├── log │ ├── StdoutTarget.php │ └── YiiLogIO.php ├── commands │ ├── CollectDependenciesCommand.php │ ├── AbstractPackageCommand.php │ └── PackageUpdateCommand.php ├── librariesio │ ├── Project.php │ ├── LibrariesioRepository.php │ └── ProjectDataProvider.php ├── console │ ├── BowerPackageController.php │ ├── AssetPackageController.php │ ├── MaintenanceController.php │ └── QueueController.php ├── repositories │ └── PackageRepository.php └── registry │ └── RegistryFactory.php ├── .github └── ISSUE_TEMPLATE.md ├── version ├── docs ├── asset-packagist.png └── readme │ ├── Acknowledgments.md │ ├── Installation.md │ └── Usage.md ├── .scrutinizer.yml ├── tests ├── _bootstrap.php └── unit │ └── models │ ├── StorageTest.php │ └── AssetPackageTest.php ├── .travis.yml ├── hidev.yml ├── phpunit.xml.dist ├── .gitignore ├── chkipper.json ├── LICENSE ├── .php_cs ├── README.md ├── composer.json ├── CHANGELOG.md └── history.md /src/assets/images/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Please provide your `composer.json` if appropriate. 2 | -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | asset-packagist 1.0.1 2018-05-29 07:27:35 +0000 c98c9fa3823615a41d98cae59e69ffc8c139de9c 2 | -------------------------------------------------------------------------------- /docs/asset-packagist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hiqdev/asset-packagist/HEAD/docs/asset-packagist.png -------------------------------------------------------------------------------- /src/assets/logo/composer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hiqdev/asset-packagist/HEAD/src/assets/logo/composer.png -------------------------------------------------------------------------------- /src/views/widgets/PoweredBy.php: -------------------------------------------------------------------------------- 1 | Not even doubt, powered by Yii Framework 2 | -------------------------------------------------------------------------------- /.scrutinizer.yml: -------------------------------------------------------------------------------- 1 | checks: 2 | php: 3 | code_rating: true 4 | duplication: true 5 | tools: 6 | php_code_coverage: 7 | enabled: true 8 | external_code_coverage: 9 | timeout: 600 10 | -------------------------------------------------------------------------------- /docs/readme/Acknowledgments.md: -------------------------------------------------------------------------------- 1 | This project uses Francois Pluchino's [composer-asset-plugin] to convert Bower and NPM packages to composer format. 2 | 3 | [composer-asset-plugin]: https://github.com/fxpio/composer-asset-plugin 4 | -------------------------------------------------------------------------------- /src/assets/logo/npm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/readme/Installation.md: -------------------------------------------------------------------------------- 1 | You don't need to install anything to use Asset Packagist! 2 | 3 | If you want to setup your own version of Asset Packagist 4 | please see installation instruction at [hiqdev/asset-packagist.dev] 5 | 6 | [hiqdev/asset-packagist.dev]: https://github.com/hiqdev/asset-packagist.dev 7 | -------------------------------------------------------------------------------- /src/config/hidev.php: -------------------------------------------------------------------------------- 1 | [ 13 | 'include' => [ 14 | __DIR__ . '/goals.yml', 15 | ], 16 | ], 17 | ]; 18 | -------------------------------------------------------------------------------- /src/exceptions/PermanentProblemExceptionInterface.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | ```php 13 | "repositories": [ 14 | { 15 | "type": "composer", 16 | "url": "https://asset-packagist.org" 17 | } 18 | ] 19 | ``` 20 | 21 | More information can be found on [about page](https://asset-packagist.org/site/about). 22 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | php: 3 | - 7.1 4 | dist: trusty 5 | cache: 6 | directories: 7 | - $HOME/.composer/cache 8 | before_install: 9 | - 'composer self-update' 10 | - 'composer --version' 11 | - 'composer install --no-interaction' 12 | - './vendor/bin/hidev --version' 13 | - './vendor/bin/hidev travis/before-install' 14 | sudo: false 15 | install: 16 | - './vendor/bin/hidev travis/install' 17 | script: 18 | - './vendor/bin/hidev travis/script' 19 | after_script: 20 | - './vendor/bin/hidev travis/after-script' 21 | -------------------------------------------------------------------------------- /src/exceptions/UpdateRateLimitException.php: -------------------------------------------------------------------------------- 1 | '@hiqdev/assetpackagist/assets/images/favicon.ico', 13 | 14 | 'db.hostname' => 'localhost', 15 | 'db.name' => 'asset_packagist', 16 | 'db.username' => 'asset-packagist', 17 | 'db.password' => '', 18 | 19 | 'librariesio.api_key' => '', 20 | ]; 21 | -------------------------------------------------------------------------------- /src/exceptions/CorruptedPackageException.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class m170307_170300_queue_timeout extends M170307170300Later 21 | { 22 | public $tableName = '{{%queue}}'; 23 | } 24 | -------------------------------------------------------------------------------- /hidev.yml: -------------------------------------------------------------------------------- 1 | package: 2 | type: yii2-extension 3 | name: asset-packagist 4 | title: Asset Packagist 5 | keywords: composer, bower, npm, asset, packagist 6 | description: | 7 | ![Composer](https://raw.githubusercontent.com/hiqdev/asset-packagist/master/docs/asset-packagist.png) 8 | 9 | ## Composer + Bower + NPM = friends forever! 10 | 11 | This package is the core part of https://asset-packagist.org/ project. 12 | 13 | Asset Packagist allows installation of Bower and NPM packages as native 14 | Composer packages. 15 | 16 | **NO** plugins and **NO** Node.js are required. 17 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ./tests/unit/ 6 | 7 | 8 | 9 | 10 | ./src/ 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # hidev internals 2 | /.hidev/composer.json 3 | /.hidev/composer.lock 4 | /.hidev/runtime 5 | /.hidev/vendor 6 | 7 | # local config 8 | /.env 9 | /hidev-local.yml 10 | 11 | # IDE & OS files 12 | .*.swp 13 | .DS_Store 14 | .buildpath 15 | .idea 16 | .project 17 | .settings 18 | Thumbs.db 19 | nbproject 20 | 21 | # WebApp directories 22 | /runtime/* 23 | /web/assets/* 24 | 25 | # composer internals 26 | /composer.lock 27 | /vendor 28 | 29 | # php-cs-fixer cache 30 | .php_cs.cache 31 | 32 | # phpunit generated files 33 | coverage.clover 34 | 35 | # PHARs 36 | chkipper.phar 37 | composer.phar 38 | php-cs-fixer.phar 39 | phpunit-skelgen.phar 40 | phpunit.phar 41 | 42 | # Binaries 43 | ocular.phar 44 | -------------------------------------------------------------------------------- /src/menus/NavbarMenu.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | class NavbarMenu extends \hiqdev\thememanager\menus\NavbarMenu 18 | { 19 | public function items() 20 | { 21 | return array_merge(parent::items(), [ 22 | 'search' => [ 23 | 'label' => $this->render('main-search'), 24 | ], 25 | ]); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/views/package/wrong-name.php: -------------------------------------------------------------------------------- 1 | title = 'Not found'; 11 | 12 | ?> 13 | 14 |
15 |

16 | title ?> 17 |

18 | 19 |

Try one of the following links:

20 | 24 |
25 | -------------------------------------------------------------------------------- /src/views/site/contact.php: -------------------------------------------------------------------------------- 1 | title = 'Contact'; 9 | $this->params['subtitle'] = 'GitHub issues is the preferred way'; 10 | $this->params['breadcrumbs'][] = $this->title; 11 | 12 | ?> 13 |
14 |

title) ?>

15 | 16 |

17 | You can contact us in several ways: 18 |

19 | 20 | 24 |
25 | -------------------------------------------------------------------------------- /src/assets/AppAsset.php: -------------------------------------------------------------------------------- 1 | title = 'Results for "' . $query . '"'; 15 | $this->params['searchQuery'] = $query; 16 | $this->params['searchPlatform'] = $platform; 17 | $this->params['subtitle'] = $query; 18 | $this->params['breadcrumbs'][] = $this->title; 19 | 20 | ?> 21 | 28 | -------------------------------------------------------------------------------- /tests/unit/models/StorageTest.php: -------------------------------------------------------------------------------- 1 | object = new Storage(); 25 | } 26 | 27 | protected function tearDown() 28 | { 29 | } 30 | 31 | public function testInstance() 32 | { 33 | $this->assertInstanceOf(Storage::class, $this->object); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/views/package/not-found.php: -------------------------------------------------------------------------------- 1 | title = 'Oops... Package was not found'; 10 | 11 | ?> 12 |
13 |

title ?>

14 | 15 | getType() === 'npm') { 18 | $link = Html::a('npmjs.com', 'https://npmjs.com/search?q=' . $package->getName(), ['target' => '_blank']); 19 | } elseif ($package->getType() === 'bower') { 20 | $link = Html::a('bower.io', 'https://bower.io/search?q=' . $package->getName(), ['target' => '_blank']); 21 | } 22 | 23 | ?> 24 | 25 |

Could you ensure this package exists on ?

26 |

In case it exists, but still can not be obtained by asset-packagist — 27 | 28 |

29 | -------------------------------------------------------------------------------- /src/migrations/m170424_144100_package_avoiding.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class m170424_144100_package_avoiding extends Migration 21 | { 22 | public function up() 23 | { 24 | $this->addColumn('package', 'is_avoided', $this->boolean()->defaultExpression('false')); 25 | 26 | $this->createIndex('package-is_avoided-idx', 'package', 'is_avoided'); 27 | } 28 | 29 | public function down() 30 | { 31 | $this->dropColumn('package', 'is_avoided'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/exceptions/AssetFileStorageException.php: -------------------------------------------------------------------------------- 1 | package = $package; 28 | } 29 | 30 | /** 31 | * @return AssetPackage 32 | */ 33 | public function getPackage() 34 | { 35 | return $this->package; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tests/unit/models/AssetPackageTest.php: -------------------------------------------------------------------------------- 1 | object = new AssetPackage($this->type, $this->name); 28 | } 29 | 30 | protected function tearDown() 31 | { 32 | } 33 | 34 | public function testGetFullName() 35 | { 36 | $this->assertSame($this->type . '-asset/' . $this->name, $this->object->getFullName()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/views/package/fetch-error.php: -------------------------------------------------------------------------------- 1 | title = 'Package update failed'; 11 | 12 | ?> 13 |
14 |

title ?>

15 | 16 | 17 |
getMessage() ?>
18 | 19 | 20 | getType() === 'npm') { 23 | $link = Html::a('npmjs.com', 'https://npmjs.com/search?q=' . $package->getName(), ['target' => '_blank']); 24 | } elseif ($package->getType() === 'bower') { 25 | $link = Html::a('bower.io', 'https://bower.io/search?q=' . $package->getName(), ['target' => '_blank']); 26 | } 27 | 28 | ?> 29 | 30 |

Could you ensure this package exists on ?

31 |

Think asset-packagist is guilty? 32 |

33 | -------------------------------------------------------------------------------- /src/menus/MainMenu.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class MainMenu extends \hiqdev\yii2\menus\Menu 21 | { 22 | public function items() 23 | { 24 | return [ 25 | 'about' => [ 26 | 'label' => Yii::t('hisite', 'About'), 27 | 'url' => ['/site/about'], 28 | ], 29 | 'contact' => [ 30 | 'label' => Yii::t('hisite', 'Contact'), 31 | 'url' => ['/site/contact'], 32 | ], 33 | 'github' => [ 34 | 'label' => 'GitHub', 35 | 'url' => 'https://github.com/hiqdev/asset-packagist', 36 | ], 37 | ]; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/config/goals.yml: -------------------------------------------------------------------------------- 1 | deploy: 2 | after: 3 | - asset-storage/create 4 | - asset-storage/chmod 5 | - migrate/up 6 | 7 | asset-storage: 8 | create: 9 | class: directory 10 | path: '@storage' 11 | lock: 12 | once: true 13 | template: empty 14 | chmod: '0664' 15 | lastid: 16 | once: true 17 | template: empty 18 | chmod: '0664' 19 | packages.json: 20 | once: true 21 | template: empty 22 | chmod: '0664' 23 | p: 24 | chmod: '0775' 25 | 26 | clean: 27 | class: command 28 | path: '@storage' 29 | sudo: true 30 | command: rm -rf lock lastid packages.json p 31 | 32 | chmod: 33 | class: command 34 | path: '@storage' 35 | sudo: true 36 | commands: | 37 | chown -R www-data lock lastid packages.json p 38 | chmod -R g+w,o-w lock lastid packages.json p 39 | -------------------------------------------------------------------------------- /src/controllers/SiteController.php: -------------------------------------------------------------------------------- 1 | [ 19 | 'class' => \yii\web\ErrorAction::class, 20 | ], 21 | 'captcha' => [ 22 | 'class' => \yii\captcha\CaptchaAction::class, 23 | 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, 24 | ], 25 | ]; 26 | } 27 | 28 | public function actionIndex() 29 | { 30 | return $this->render('index'); 31 | } 32 | 33 | public function actionAbout() 34 | { 35 | return $this->render('about'); 36 | } 37 | 38 | public function actionContact() 39 | { 40 | return $this->render('contact'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/migrations/m161130_163000_package.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class m161130_163000_package extends Migration 21 | { 22 | public $tableName = '{{%package}}'; 23 | public $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; 24 | 25 | public function up() 26 | { 27 | $this->createTable($this->tableName, [ 28 | 'type' => $this->string()->notNull(), 29 | 'name' => $this->string()->notNull(), 30 | 'last_update' => $this->integer(), 31 | 'PRIMARY KEY (type, name)', 32 | ], $this->tableOptions); 33 | } 34 | 35 | public function down() 36 | { 37 | $this->dropTable($this->tableName); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/models/Release.php: -------------------------------------------------------------------------------- 1 | dist) || !empty($this->source); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /chkipper.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hiqdev/asset-packagist", 3 | "authors": { 4 | "hiqsol": { 5 | "name": "Andrii Vasyliev", 6 | "role": "Project lead", 7 | "email": "sol@hiqdev.com", 8 | "github": "https://github.com/hiqsol", 9 | "homepage": "http://hipanel.com/" 10 | }, 11 | "SilverFire": { 12 | "name": "Dmitry Naumenko", 13 | "role": "Lead backend developer", 14 | "email": "d.naumenko.a@gmail.com", 15 | "github": "https://github.com/SilverFire", 16 | "homepage": "http://silverfire.me/" 17 | }, 18 | "tafid": { 19 | "name": "Andrey Klochok", 20 | "role": "Lead frontend developer", 21 | "email": "andreyklochok@gmail.com", 22 | "github": "https://github.com/tafid", 23 | "homepage": "http://hiqdev.com/" 24 | }, 25 | "BladeRoot": { 26 | "name": "Yuriy Myronchuk", 27 | "role": "QA Lead", 28 | "email": "bladeroot@gmail.com", 29 | "github": "https://github.com/BladeRoot", 30 | "homepage": "http://hiqdev.com/" 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/components/PackageUtil.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class m161129_140000_queue extends Migration 21 | { 22 | public $tableName = '{{%queue}}'; 23 | public $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; 24 | 25 | public function up() 26 | { 27 | $this->createTable($this->tableName, [ 28 | 'id' => $this->primaryKey(), 29 | 'channel' => $this->string()->notNull(), 30 | 'job' => $this->binary()->notNull(), 31 | 'created_at' => $this->integer()->notNull(), 32 | 'started_at' => $this->integer(), 33 | 'finished_at' => $this->integer(), 34 | ], $this->tableOptions); 35 | 36 | $this->createIndex('channel', $this->tableName, 'channel'); 37 | $this->createIndex('started_at', $this->tableName, 'started_at'); 38 | } 39 | 40 | public function down() 41 | { 42 | $this->dropTable($this->tableName); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/config/web.php: -------------------------------------------------------------------------------- 1 | 'hiqdev\assetpackagist\controllers', 13 | 'components' => [ 14 | 'urlManager' => [ 15 | 'rules' => [ 16 | '/package/' => '/package/detail', 17 | ], 18 | ], 19 | 'themeManager' => [ 20 | 'pathMap' => [ 21 | '$themedViewPaths' => ['@hiqdev/assetpackagist/views'], 22 | ], 23 | 'assets' => [ 24 | \hiqdev\assetpackagist\assets\AppAsset::class, 25 | ], 26 | ], 27 | ], 28 | 'container' => [ 29 | 'singletons' => [ 30 | \hiqdev\thememanager\menus\AbstractNavbarMenu::class => [ 31 | 'class' => \hiqdev\assetpackagist\menus\NavbarMenu::class, 32 | ], 33 | \hiqdev\thememanager\menus\AbstractMainMenu::class => [ 34 | 'class' => \hiqdev\assetpackagist\menus\MainMenu::class, 35 | ], 36 | \hiqdev\thememanager\menus\AbstractFooterMenu::class => [ 37 | 'class' => \hiqdev\assetpackagist\menus\FooterMenu::class, 38 | ], 39 | ], 40 | ], 41 | ]; 42 | -------------------------------------------------------------------------------- /src/log/StdoutTarget.php: -------------------------------------------------------------------------------- 1 | messages as $message) { 27 | list($text, $level, $category, $timestamp) = $message; 28 | if (!is_string($text)) { 29 | // exceptions may not be serializable if in the call stack somewhere is a Closure 30 | if ($text instanceof \Throwable || $text instanceof \Exception) { 31 | $text = (string) $text; 32 | } else { 33 | $text = VarDumper::export($text); 34 | } 35 | } 36 | 37 | $string = "[$level][$category] $text"; 38 | 39 | if ($level === Logger::LEVEL_ERROR) { 40 | Console::stderr($string); 41 | } else { 42 | Console::stdout($string); 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/log/YiiLogIO.php: -------------------------------------------------------------------------------- 1 | ['log'], 13 | 'controllerMap' => [ 14 | 'asset-package' => [ 15 | 'class' => \hiqdev\assetpackagist\console\AssetPackageController::class, 16 | ], 17 | 'bower-package' => [ 18 | 'class' => \hiqdev\assetpackagist\console\BowerPackageController::class, 19 | ], 20 | 'queue' => [ 21 | 'class' => \hiqdev\assetpackagist\console\QueueController::class, 22 | ], 23 | 'maintenance' => [ 24 | 'class' => \hiqdev\assetpackagist\console\MaintenanceController::class, 25 | ], 26 | 'migrate' => [ 27 | 'class' => \yii\console\controllers\MigrateController::class, 28 | 'migrationNamespaces' => [ 29 | 'hiqdev\assetpackagist\migrations', 30 | ], 31 | 'migrationPath' => null, 32 | ], 33 | ], 34 | 'components' => [ 35 | 'log' => [ 36 | 'flushInterval' => 1, 37 | 'targets' => [ 38 | [ 39 | 'class' => \hiqdev\assetpackagist\log\StdoutTarget::class, 40 | 'categories' => ['hiqdev\assetpackagist\commands\*'], 41 | 'exportInterval' => 1, 42 | 'logVars' => [], 43 | ], 44 | ], 45 | ], 46 | ], 47 | ]; 48 | -------------------------------------------------------------------------------- /src/commands/CollectDependenciesCommand.php: -------------------------------------------------------------------------------- 1 | beforeRun(); 26 | 27 | $package = $this->package; 28 | $requires = []; 29 | 30 | foreach ($package->getReleases() as $release) { 31 | if (!isset($release['require'])) { 32 | continue; 33 | } 34 | 35 | foreach ($release['require'] as $name => $version) { 36 | $requires[$name] = true; 37 | } 38 | } 39 | 40 | foreach (array_keys($requires) as $name) { 41 | $assetPackage = AssetPackage::fromFullName($name); 42 | 43 | if ($this->packageRepository->exists($assetPackage)) { 44 | Yii::trace(Console::renderColoredString('Package %N' . $assetPackage->getFullName() . "%n already exists. Skipping.\n"), __CLASS__); 45 | continue; 46 | } 47 | 48 | $queue->push(Yii::createObject(PackageUpdateCommand::class, [$assetPackage])); 49 | Yii::trace(Console::renderColoredString('Created update command for %Y' . $assetPackage->getFullName() . "%n package\n"), __CLASS__); 50 | } 51 | 52 | $this->afterRun(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/views/menus/main-search.php: -------------------------------------------------------------------------------- 1 | registerCss(' 6 | /* Important styles, do not remove */ 7 | #query { 8 | width: 60%; 9 | } 10 | #platform { 11 | width: 39%; 12 | } 13 | @media (min-width: 768px) { 14 | #query { 15 | width: 270px; 16 | } 17 | #platform { 18 | width: 100px; 19 | } 20 | } 21 | @media (min-width: 1024px) { 22 | #query { 23 | width: 450px; 24 | } 25 | #platform { 26 | width: 100px; 27 | } 28 | } 29 | '); 30 | 31 | ?> 32 | 33 | 'search-form', 'class' => 'navbar-form navbar-right', 'autocomplete' => 'off']) ?> 34 |
35 |
36 | params['searchQuery']) ? $this->params['searchQuery'] : ''), [ 37 | 'id' => 'query', 38 | 'required' => true, 39 | 'autocomplete' => false, 40 | 'placeholder' => 'package name to search, powered by libraries.io', 41 | 'class' => 'form-control', 42 | 'autofocus' => true, 43 | 'tabindex' => 1, 44 | ]) ?> 45 | params['searchPlatform']) ? $this->params['searchPlatform'] : 'bower,npm'), [ 46 | 'bower,npm' => 'Any', 47 | 'bower' => 'Bower', 48 | 'npm' => 'NPM', 49 | ], [ 50 | 'id' => 'platform', 51 | 'class' => 'form-control', 52 | 'tabindex' => 2, 53 | ]) ?> 54 | 55 | 58 | 59 |
60 |
61 | 62 | -------------------------------------------------------------------------------- /src/migrations/m170920_170000_queue_updated.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class m170920_170000_queue_updated extends Migration 21 | { 22 | public $tableName = '{{%queue}}'; 23 | 24 | public function up() 25 | { 26 | $this->dropTable($this->tableName); 27 | $this->createTable($this->tableName, [ 28 | 'id' => $this->primaryKey(), 29 | 'channel' => $this->string()->notNull(), 30 | 'job' => $this->binary()->notNull(), 31 | 'pushed_at' => $this->integer()->notNull(), 32 | 'ttr' => $this->integer()->notNull(), 33 | 'delay' => $this->integer()->notNull(), 34 | 'priority' => $this->integer()->unsigned()->notNull()->defaultValue(1024), 35 | 'reserved_at' => $this->integer(), 36 | 'attempt' => $this->integer(), 37 | 'done_at' => $this->integer(), 38 | ]); 39 | $this->createIndex('channel', $this->tableName, 'channel'); 40 | $this->createIndex('reserved_at', $this->tableName, 'reserved_at'); 41 | $this->createIndex('priority', $this->tableName, 'priority'); 42 | } 43 | 44 | public function down() 45 | { 46 | $this->dropTable($this->tableName); 47 | $this->createTable($this->tableName, [ 48 | 'id' => $this->primaryKey(), 49 | 'channel' => $this->string()->notNull(), 50 | 'job' => $this->binary()->notNull(), 51 | 'created_at' => $this->integer()->notNull(), 52 | 'started_at' => $this->integer(), 53 | 'finished_at' => $this->integer(), 54 | ]); 55 | $this->createIndex('channel', $this->tableName, 'channel'); 56 | $this->createIndex('started_at', $this->tableName, 'started_at'); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /.php_cs: -------------------------------------------------------------------------------- 1 | setUsingCache(true) 14 | ->setRiskyAllowed(true) 15 | ->setRules(array( 16 | '@Symfony' => true, 17 | 'header_comment' => [ 18 | 'header' => $header, 19 | 'separate' => 'bottom', 20 | 'location' => 'after_declare_strict', 21 | 'commentType' => 'PHPDoc', 22 | ], 23 | 'binary_operator_spaces' => [ 24 | 'align_double_arrow' => null, 25 | 'align_equals' => null, 26 | ], 27 | 'concat_space' => ['spacing' => 'one'], 28 | 'array_syntax' => ['syntax' => 'short'], 29 | 'phpdoc_no_alias_tag' => ['replacements' => ['type' => 'var']], 30 | 'blank_line_before_return' => false, 31 | 'phpdoc_align' => false, 32 | 'phpdoc_scalar' => false, 33 | 'phpdoc_separation' => false, 34 | 'phpdoc_to_comment' => false, 35 | 'method_argument_space' => false, 36 | 'ereg_to_preg' => true, 37 | 'blank_line_after_opening_tag' => true, 38 | 'single_blank_line_before_namespace' => true, 39 | 'ordered_imports' => true, 40 | 'phpdoc_order' => true, 41 | 'pre_increment' => true, 42 | 'strict_comparison' => true, 43 | 'strict_param' => true, 44 | 'no_multiline_whitespace_before_semicolons' => true, 45 | )) 46 | ->setFinder( 47 | PhpCsFixer\Finder::create() 48 | ->in(__DIR__) 49 | ->notPath('vendor') 50 | ->notPath('runtime') 51 | ->notPath('web/assets') 52 | ) 53 | ; 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Asset Packagist 2 | 3 | [![Latest Stable Version](https://poser.pugx.org/hiqdev/asset-packagist/v/stable)](https://packagist.org/packages/hiqdev/asset-packagist) 4 | [![Total Downloads](https://poser.pugx.org/hiqdev/asset-packagist/downloads)](https://packagist.org/packages/hiqdev/asset-packagist) 5 | [![Build Status](https://img.shields.io/travis/hiqdev/asset-packagist.svg)](https://travis-ci.org/hiqdev/asset-packagist) 6 | [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/hiqdev/asset-packagist.svg)](https://scrutinizer-ci.com/g/hiqdev/asset-packagist/) 7 | [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/hiqdev/asset-packagist.svg)](https://scrutinizer-ci.com/g/hiqdev/asset-packagist/) 8 | 9 | ![Composer](https://raw.githubusercontent.com/hiqdev/asset-packagist/master/docs/asset-packagist.png) 10 | 11 | ## Composer + Bower + NPM = friends forever! 12 | 13 | This package is the core part of https://asset-packagist.org/ project. 14 | 15 | Asset Packagist allows installation of Bower and NPM packages as native 16 | Composer packages. 17 | 18 | **NO** plugins and **NO** Node.js are required. 19 | 20 | ## Installation 21 | 22 | You don't need to install anything to use Asset Packagist! 23 | 24 | If you want to setup your own version of Asset Packagist 25 | please see installation instruction at [hiqdev/asset-packagist.dev] 26 | 27 | [hiqdev/asset-packagist.dev]: https://github.com/hiqdev/asset-packagist.dev 28 | 29 | ## Usage 30 | 31 | List required packages like the following: 32 | 33 | ```php 34 | "require": { 35 | "bower-asset/bootstrap": "^3.3", 36 | "npm-asset/jquery": "^2.2" 37 | } 38 | ``` 39 | 40 | And add these lines:

41 | 42 | ```php 43 | "repositories": [ 44 | { 45 | "type": "composer", 46 | "url": "https://asset-packagist.org" 47 | } 48 | ] 49 | ``` 50 | 51 | More information can be found on [about page](https://asset-packagist.org/site/about). 52 | 53 | ## License 54 | 55 | This project is released under the terms of the BSD-3-Clause [license](LICENSE). 56 | Read more [here](http://choosealicense.com/licenses/bsd-3-clause). 57 | 58 | Copyright © 2016-2018, HiQDev (http://hiqdev.com/) 59 | 60 | ## Acknowledgments 61 | 62 | This project uses Francois Pluchino's [composer-asset-plugin] to convert Bower and NPM packages to composer format. 63 | 64 | [composer-asset-plugin]: https://github.com/fxpio/composer-asset-plugin 65 | -------------------------------------------------------------------------------- /src/librariesio/Project.php: -------------------------------------------------------------------------------- 1 | ['string']], 48 | ['rank', 'integer'], 49 | ['latest_release_published_at', 'datetime', 'timestampAttribute' => 'latest_release_published_at'], 50 | ['latest_release_number', 'string'], 51 | ['language', 'string'], 52 | ['status', 'string'], 53 | ['package_manager_url', 'url'], 54 | ['stars', 'integer'], 55 | ['forks', 'integer'], 56 | ['keywords', 'each', 'rule' => ['string']], 57 | ]; 58 | } 59 | 60 | public function getFullName() 61 | { 62 | $fullname = AssetPackage::buildFullName($this->platform, $this->name); 63 | return AssetPackage::normalizeName($fullname); 64 | } 65 | 66 | /** 67 | * Check the package exists in Asset-Packagist. 68 | * @return boolean 69 | */ 70 | public function isAvailable() 71 | { 72 | $package = AssetPackage::fromFullName($this->getFullName()); 73 | 74 | $repository = Yii::createObject(PackageRepository::class, []); 75 | 76 | return $repository->exists($package); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/config/common.php: -------------------------------------------------------------------------------- 1 | 'asset-packagist', 13 | 'name' => 'Asset Packagist', 14 | 'aliases' => [ 15 | '@storage' => '<<>>/web', 16 | '@runtime' => '<<>>/runtime', 17 | '@composer' => '<<>>', 18 | ], 19 | 'components' => [ 20 | 'db' => [ 21 | 'class' => \yii\db\Connection::class, 22 | 'dsn' => "mysql:host={$params['db.hostname']};dbname={$params['db.name']}", 23 | 'username' => $params['db.username'], 24 | 'password' => $params['db.password'], 25 | 'charset' => 'utf8', 26 | ], 27 | 'mutex' => [ 28 | 'class' => \yii\mutex\MysqlMutex::class, 29 | 'db' => 'db', 30 | ], 31 | 'queue' => [ 32 | 'class' => \yii\queue\db\Queue::class, 33 | 'db' => 'db', 34 | 'tableName' => '{{%queue}}', 35 | 'channel' => 'package', 36 | 'mutex' => 'mutex', 37 | 'deleteReleased' => true, 38 | ], 39 | 'packageStorage' => [ 40 | 'class' => \hiqdev\assetpackagist\components\Storage::class, 41 | ], 42 | 'registryFactory' => [ 43 | 'class' => hiqdev\assetpackagist\registry\RegistryFactory::class, 44 | ], 45 | 'librariesio' => [ 46 | 'class' => \hiqdev\assetpackagist\librariesio\LibrariesioRepository::class, 47 | 'apiKey' => $params['librariesio.api_key'], 48 | ], 49 | ], 50 | 'container' => [ 51 | 'singletons' => [ 52 | 'db' => function () { 53 | return Yii::$app->get('db'); 54 | }, 55 | \hiqdev\assetpackagist\repositories\PackageRepository::class => function ($container) { 56 | return new \hiqdev\assetpackagist\repositories\PackageRepository($container->get('db')); 57 | }, 58 | \hiqdev\assetpackagist\components\StorageInterface::class => function () { 59 | return Yii::$app->get('packageStorage'); 60 | }, 61 | \yii\queue\Queue::class => function () { 62 | return Yii::$app->get('queue'); 63 | } 64 | ], 65 | ], 66 | ]; 67 | -------------------------------------------------------------------------------- /src/views/package/details.php: -------------------------------------------------------------------------------- 1 | title = 'Search'; 15 | $this->params['searchQuery'] = $query; 16 | $this->params['subtitle'] = $query; 17 | $this->params['breadcrumbs'][] = $this->title; 18 | 19 | ?> 20 |
21 |

22 | getFullName()) ?> 23 | 24 | getType() === 'npm') { 26 | $link = 'https://npmjs.com/package/' . $package->getName(); 27 | } elseif ($package->getType() === 'bower') { 28 | $link = 'https://bower.io/search?q=' . $package->getName(); 29 | } 30 | echo Html::a( 31 | Yii::t('app', 'see on {registry}', ['registry' => Inflector::titleize($package->getType())]), 32 | $link 33 | ) ?> 34 | 35 |

36 | Inflector::titleize($package->getType()), 38 | ]), [ 39 | 'id' => 'fetch-btn', 40 | 'type' => 'button', 41 | 'class' => 'btn btn-success fetch-btn pull-right', 42 | 'data-loading-text' => Yii::t('app', 'Fetching for you...'), 43 | ]) ?> 44 | 45 | render('versions', ['package' => $package]); ?> 46 |
47 | 48 | Url::to(['update']), 51 | 'type' => 'post', 52 | 'data' => [ 53 | 'query' => $package->getFullName(), 54 | ], 55 | 'success' => new \yii\web\JsExpression("function (html) { 56 | versions.removeClass('updating').html(html); 57 | btn.button('reset'); 58 | }"), 59 | 'beforeSend' => new \yii\web\JsExpression("function (event) { 60 | versions.addClass('updating').html($('')); 61 | btn.button('loading'); 62 | }"), 63 | ]); 64 | 65 | $this->registerJs(<<registerJs("$('#fetch-btn').trigger('click')"); 75 | } 76 | -------------------------------------------------------------------------------- /src/commands/AbstractPackageCommand.php: -------------------------------------------------------------------------------- 1 | trigger(self::EVENT_BEFORE_RUN); 45 | } 46 | 47 | /** 48 | * Triggers event after run. 49 | */ 50 | public function afterRun() 51 | { 52 | $this->trigger(self::EVENT_AFTER_RUN); 53 | } 54 | 55 | /** 56 | * CollectDependenciesCommand constructor. 57 | * @param AssetPackage $package 58 | * @param PackageRepository $packageRepository 59 | * @param array $config 60 | */ 61 | public function __construct(AssetPackage $package, PackageRepository $packageRepository, $config = []) 62 | { 63 | parent::__construct($config); 64 | 65 | $this->fullName = $package->getFullName(); 66 | $this->package = $package; 67 | $this->packageRepository = $packageRepository; 68 | } 69 | 70 | /** 71 | * Serialize only the name of package for more performance. 72 | * 73 | * @void 74 | */ 75 | public function __sleep() 76 | { 77 | return ['fullName']; 78 | } 79 | 80 | /** 81 | * Reloads package on wake up to ensure it is up to date. 82 | * 83 | * @void 84 | */ 85 | public function __wakeup() 86 | { 87 | if ($this->fullName) { 88 | $this->package = AssetPackage::fromFullName($this->fullName); 89 | } 90 | $this->package->load(); 91 | $this->packageRepository = Yii::createObject(PackageRepository::class); 92 | } 93 | 94 | /** 95 | * @return AssetPackage 96 | */ 97 | public function getPackage() 98 | { 99 | return $this->package; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/console/BowerPackageController.php: -------------------------------------------------------------------------------- 1 | getComponents($skipCache); 31 | ArrayHelper::multisort($components, 'stars', SORT_DESC, SORT_NUMERIC); 32 | 33 | foreach (array_slice($components, 0, $count) as $component) { 34 | $result[] = 'bower-asset/' . $component['name']; 35 | echo Console::renderColoredString("%R{$component['stars']}%N - %g{$component['name']}%N"); 36 | Console::moveCursorTo(0); 37 | Console::clearLine(); 38 | } 39 | 40 | $componentsListPath = Yii::getAlias('@hiqdev/assetpackagist/config/bower.list'); 41 | file_put_contents($componentsListPath, implode("\n", $result)); 42 | 43 | echo Console::renderColoredString('Fetched %YBower%N components list. Found %G' . count($components) . "%N components.\n"); 44 | echo Console::renderColoredString('Only %bTOP-' . $count . "%N components were added to the packages list.\n"); 45 | echo Console::renderColoredString('See %G' . $componentsListPath . "%N\n"); 46 | } 47 | 48 | /** 49 | * Gets components array from bower API. 50 | * 51 | * @param bool $skipCache whether to skip using local cache 52 | * @return array 53 | */ 54 | private function getComponents($skipCache = false) 55 | { 56 | $url = 'http://bower-component-list.herokuapp.com'; 57 | $componentsFilePath = Yii::getAlias('@runtime/bower-cache/components.list'); 58 | 59 | if (!$skipCache && is_file($componentsFilePath) && (time() - filemtime($componentsFilePath) < 60 * 60 * 6)) { // 6 hours 60 | $raw = file_get_contents($componentsFilePath); 61 | } else { 62 | $result = (new \GuzzleHttp\Client())->request('GET', $url); 63 | $raw = $result->getBody(); 64 | FileHelper::createDirectory(dirname($componentsFilePath)); 65 | file_put_contents($componentsFilePath, $raw); 66 | } 67 | 68 | return Json::decode($raw); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hiqdev/asset-packagist", 3 | "type": "yii2-extension", 4 | "description": "Asset Packagist", 5 | "keywords": [ 6 | "composer", 7 | "bower", 8 | "npm", 9 | "asset", 10 | "packagist" 11 | ], 12 | "homepage": "https://github.com/hiqdev/asset-packagist", 13 | "license": "BSD-3-Clause", 14 | "support": { 15 | "email": "support@hiqdev.com", 16 | "source": "https://github.com/hiqdev/asset-packagist", 17 | "issues": "https://github.com/hiqdev/asset-packagist/issues", 18 | "wiki": "https://github.com/hiqdev/asset-packagist/wiki", 19 | "forum": "http://forum.hiqdev.com/" 20 | }, 21 | "authors": [ 22 | { 23 | "name": "Andrii Vasyliev", 24 | "role": "Project lead", 25 | "email": "sol@hiqdev.com", 26 | "homepage": "http://hipanel.com/" 27 | }, 28 | { 29 | "name": "Dmitry Naumenko", 30 | "role": "Lead backend developer", 31 | "email": "d.naumenko.a@gmail.com", 32 | "homepage": "http://silverfire.me/" 33 | }, 34 | { 35 | "name": "Andrey Klochok", 36 | "role": "Lead frontend developer", 37 | "email": "andreyklochok@gmail.com", 38 | "homepage": "http://hiqdev.com/" 39 | }, 40 | { 41 | "name": "Yuriy Myronchuk", 42 | "role": "QA Lead", 43 | "email": "bladeroot@gmail.com", 44 | "homepage": "http://hiqdev.com/" 45 | } 46 | ], 47 | "require": { 48 | "composer/composer": "^1.0", 49 | "fxp/composer-asset-plugin": "^1.4.2", 50 | "hiqdev/hidev": "<2.0 || dev-master", 51 | "hiqdev/hisite": "<2.0 || dev-master", 52 | "hiqdev/yii2-pnotify": "<2.0 || dev-master", 53 | "hiqdev/yii2-hiart-guzzle": "<2.0 || dev-master", 54 | "hiqdev/yii2-hiart-librariesio": "<2.0 || dev-master", 55 | "guzzlehttp/guzzle": "^6.0", 56 | "yiisoft/yii2-queue": "^2.0.2" 57 | }, 58 | "require-dev": { 59 | "yiisoft/yii2-debug": "^2.0", 60 | "hiqdev/hidev-php": "<2.0", 61 | "hiqdev/hidev-hiqdev": "<2.0" 62 | }, 63 | "autoload": { 64 | "psr-4": { 65 | "hiqdev\\assetpackagist\\": "src" 66 | } 67 | }, 68 | "extra": { 69 | "config-plugin": { 70 | "params": "src/config/params.php", 71 | "common": "src/config/common.php", 72 | "console": "src/config/console.php", 73 | "hidev": "src/config/hidev.php", 74 | "web": "src/config/web.php" 75 | } 76 | }, 77 | "repositories": [ 78 | { 79 | "type": "composer", 80 | "url": "https://asset-packagist.org" 81 | } 82 | ] 83 | } 84 | -------------------------------------------------------------------------------- /src/commands/PackageUpdateCommand.php: -------------------------------------------------------------------------------- 1 | beforeRun(); 27 | 28 | if (!$this->package->canBeUpdated()) { 29 | if (!$this->packageRepository->exists($this->package)) { 30 | $this->packageRepository->insert($this->package); 31 | } 32 | } else { 33 | try { 34 | $this->package->update(); 35 | $this->packageRepository->save($this->package); 36 | } catch (\Exception $e) { 37 | Yii::error('Failed to update package "' . $this->package->getFullName() . '": ' . $e->getMessage(), __CLASS__); 38 | $this->transformException($e); 39 | 40 | throw $e; 41 | } 42 | 43 | $queue->push(Yii::createObject(CollectDependenciesCommand::class, [$this->package])); 44 | } 45 | 46 | $this->afterRun(); 47 | } 48 | 49 | private function transformException(\Exception $e) 50 | { 51 | $avoidMarkers = [ 52 | 'file could not be downloaded (HTTP/1.1 404 Not Found)' => PackageNotExistsException::class, 53 | 'npm asset package must be present for create a VCS Repository' => CorruptedPackageException::class, 54 | 'Could not parse version constraint' => CorruptedPackageException::class, 55 | ]; 56 | 57 | foreach ($avoidMarkers as $marker => $exceptionClass) { 58 | if (!stripos($e->getMessage(), $marker)) { 59 | continue; 60 | } 61 | 62 | $newException = new $exceptionClass($e->getMessage(), 0, $e); 63 | 64 | if ( 65 | $newException instanceof PermanentProblemExceptionInterface 66 | && $this->packageRepository->exists($this->package) 67 | ) { 68 | Yii::warning('Package ' . $this->package->getFullName() . ' is marked as avoided', __CLASS__); 69 | $this->packageRepository->markAvoided($this->package); 70 | } 71 | 72 | throw $newException; 73 | } 74 | 75 | return false; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/views/site/index.php: -------------------------------------------------------------------------------- 1 | baseUrl . '/logo'; 9 | 10 | $this->title = Yii::$app->name; 11 | $this->params['noTitle'] = true; 12 | 13 | ?> 14 |
15 |
16 |
17 | 18 | 19 | 20 |

Composer + Bower + NPM = friends forever!

21 |
22 |
23 | 24 |
25 | 26 |
27 |
28 |

What is that?

29 | 30 |

This repository allows installation of Bower and NPM packages as native Composer packages.

31 |

NO plugins and NO Node.js are required.

32 | 33 |

At the moment we've added most popular Bower and NPM packages 4000+ each.

34 |

35 | In case Composer fails to install some asset package, 36 | use the search line at the top of the page to check specific package health. 37 |

38 |

For NPM scoped packages use `scope--package` instead of `@scope/package`, e.g. `npm-asset/pusher--chatkit`.

39 | 40 |

'btn btn-default']) ?> 41 |

42 |
43 |

Usage

44 | 45 |

List required packages like the following:

46 |
"require": {
47 |     "bower-asset/bootstrap": "^3.3",
48 |     "npm-asset/jquery": "^2.2"
49 | }
50 | 51 |

And add these lines:

52 |
"repositories": [
53 |     {
54 |         "type": "composer",
55 |         "url": "https://asset-packagist.org"
56 |     }
57 | ]
58 |
59 |
60 |

Why?

61 | 62 |

Got tired of fxp/composer-asset-plugin. 63 |

64 |

65 | It's a good project with nice idea and good implementation. 66 | But it has some issues: it slows down composer update a lot and 67 | requires global installation, so affects all projects. Also there are Travis 68 | and Scrutinizer integration special problems, that are a bit annoying. 69 |

70 | 71 |

Questions?

72 |

'btn btn-default']) ?> 73 |

74 |
75 | 76 |
77 |
78 | -------------------------------------------------------------------------------- /src/views/package/versions.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | getReleases(); 14 | 15 | hiqdev\assetpackagist\components\PackageUtil::sort($releases); 16 | 17 | $stability_colors = [ 18 | 'stable' => 'success', 19 | 'RC' => 'primary', 20 | 'beta' => 'info', 21 | 'alpha' => 'warning', 22 | 'dev' => 'default', 23 | ]; 24 | ?> 25 | 26 |
27 | 28 | 'package-ok', 30 | ]) ?> 31 | 32 | 33 |

34 | Last updated: formatter->asDateTime($package->getUpdateTime()) ?> (formatter->asRelativeTime($package->getUpdateTime()) ?>) 35 |
36 | Legend: 37 | $color) : ?> 38 | 'label label-' . $color]) . ' ' ?> 39 | 40 |

41 | 42 | session->hasFlash('rate-limited')) : ?> 43 | 47 | session->removeFlash('rate-limited') ?> 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | $release) : ?> 59 | 60 | 66 | 69 | 82 | 83 | 84 | 85 |
61 | 'label label-' . $stability_colors[$stability]]); 64 | ?> 65 | 67 | 68 | 70 | 81 |
86 |
87 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # hiqdev/asset-packagist 2 | 3 | ## [1.0.1] - 2018-05-29 4 | 5 | - Fixed executed jobs limit to follow `yiisoft/yii2-queue` API changes [@SilverFire] ([@SilverFire]) 6 | 7 | ## [1.0.0] - 2018-05-25 8 | 9 | - Fixed XSS vulnerabilities ([@SilverFire]) 10 | - Added patch version support for `bower-asset/angular` ([@hiqsol]) 11 | - Added redirect to package page when its full name given ([@hiqsol]) 12 | - Refactored internals: RegistryFactory, Mutex <- Locker, logging ([@hiqsol], [@edgardmessias]) 13 | - Updated documentation ([@hiqsol], [@SilverFire], [@edgardmessias]) 14 | - Fixed use of `hidev` ([@hiqsol]) 15 | - Implemented package management using queues with [zhuravljov/yii2-queue] ([@SilverFire], [@edgardmessias], [@hiqsol], [@zhuravljov]) 16 | - Improved look, moved search form to NavBar, added color by stability in package details page ([@hiqsol], [@edgardmessias], [@SilverFire], [@tafid]) 17 | - Added order for packages releases ([@edgardmessias], [@SilverFire]) 18 | - Added `version_normalized` ([@SilverFire], [@edgardmessias]) 19 | - Added providing `require` to support dependencies of bower/npm packages ([@hiqsol]) 20 | - Added DB layer to store packages and their properties ([@SilverFire]) 21 | - Added dependencies auto resolving for new packages ([@SilverFire]) 22 | - Added automatic package avoiding for corrupted packages, enhanced error handling ([@SilverFire]) 23 | - Fixed minor issues ([@SilverFire], [@hiqsol], [yatsenco@gmail.com], [@edgardmessias], [et.coder@gmail.com], [jo@surikat.pro]) 24 | 25 | ## [0.1.0] - 2016-05-31 26 | 27 | - Fixed minor issues for first release ([@hiqsol], [sam@rmcreative.ru]) 28 | - Implemented package details page ([@SilverFire]) 29 | - Added and improved texts and package description ([@hiqsol], [@SilverFire]) 30 | - Added Top-1000 Bower packages ([@SilverFire], [@hiqsol]) 31 | - Changed: rearranged config files to new scheme ([@hiqsol]) 32 | - Changed: redone to `hiqdev/asset-packagist` ([@hiqsol]) 33 | - Added list operations ([@hiqsol]) 34 | - Added search ([@hiqsol]) 35 | - Chandged: redone with `Storage` and `Locker` ([@hiqsol]) 36 | - Added basics ([@hiqsol]) 37 | 38 | ## [Development started] - 2016-04-02 39 | 40 | [zhuravljov/yii2-queue]: https://github.com/zhuravljov/yii2-queue 41 | [fxpio/composer-asset-plugin]: https://github.com/fxpio/composer-asset-plugin 42 | [@hiqsol]: https://github.com/hiqsol 43 | [sol@hiqdev.com]: https://github.com/hiqsol 44 | [@SilverFire]: https://github.com/SilverFire 45 | [d.naumenko.a@gmail.com]: https://github.com/SilverFire 46 | [@tafid]: https://github.com/tafid 47 | [andreyklochok@gmail.com]: https://github.com/tafid 48 | [@BladeRoot]: https://github.com/BladeRoot 49 | [bladeroot@gmail.com]: https://github.com/BladeRoot 50 | [@edgardmessias]: https://github.com/edgardmessias 51 | [edgardmessias@gmail.com]: https://github.com/edgardmessias 52 | [@zhuravljov]: https://github.com/zhuravljov 53 | [zhuravljov@gmail.com]: https://github.com/zhuravljov 54 | [Under development]: https://github.com/hiqdev/asset-packagist/compare/1.0.0...HEAD 55 | [0.1.0]: https://github.com/hiqdev/asset-packagist/releases/tag/0.1.0 56 | [1.0.0]: https://github.com/hiqdev/asset-packagist/compare/0.1.0...1.0.0 57 | [1.0.1]: https://github.com/hiqdev/asset-packagist/compare/1.0.0...1.0.1 58 | -------------------------------------------------------------------------------- /src/librariesio/LibrariesioRepository.php: -------------------------------------------------------------------------------- 1 | 0, 35 | * 'allow_redirects' => false, 36 | * 'proxy' => '192.168.16.1:10' 37 | * ]. 38 | * 39 | * @var array 40 | */ 41 | public $clientOptions = []; 42 | 43 | /** 44 | * The Guzzle client. 45 | * @var Client 46 | */ 47 | protected $client; 48 | 49 | public function init() 50 | { 51 | parent::init(); 52 | 53 | $this->clientOptions['base_uri'] = $this->baseUri; 54 | 55 | $this->client = new Client($this->clientOptions); 56 | } 57 | 58 | /** 59 | * Send request to server with api_key and return a Response. 60 | * @param string $method 61 | * @param string $uri 62 | * @param array $options 63 | * @throws \GuzzleHttp\Exception\BadResponseException 64 | * @return \GuzzleHttp\Psr7\Response 65 | */ 66 | public function request($method, $uri = '', array $options = []) 67 | { 68 | if (!isset($options['query'])) { 69 | $options['query'] = []; 70 | } 71 | if ($this->apiKey && !isset($options['query']['api_key'])) { 72 | $options['query']['api_key'] = $this->apiKey; 73 | } 74 | 75 | try { 76 | return $this->client->request($method, $uri, $options); 77 | } catch (\GuzzleHttp\Exception\BadResponseException $ex) { 78 | if ($ex->hasResponse()) { 79 | return $ex->getResponse(); 80 | } 81 | throw $ex; 82 | } 83 | } 84 | 85 | /** 86 | * Search package in https://libraries.io. 87 | * @see https://libraries.io/api/#project-search 88 | * @param array $query 89 | * @return \GuzzleHttp\Psr7\Response 90 | */ 91 | public function search($query = []) 92 | { 93 | return $this->request('GET', 'search', ['query' => $query]); 94 | } 95 | 96 | /** 97 | * Return the package info from https://libraries.io. 98 | * @see https://libraries.io/api/#project 99 | * @param string $platform 100 | * @param string $name 101 | * @return \GuzzleHttp\Psr7\Response 102 | */ 103 | public function getProject($platform, $name) 104 | { 105 | return $this->request('GET', $platform . '/' . $name); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/views/package/_search_item.php: -------------------------------------------------------------------------------- 1 | baseUrl . '/logo'; 10 | $package = new AssetPackage(strtolower($model->platform), $model->name); 11 | 12 | $url = Url::to(['package/detail', 'fullname' => $package->getNormalName()]); 13 | $url = str_replace('%2F', '/', $url); 14 | ?> 15 |
16 |
17 |

18 | 19 | getName() ?> 20 | getNormalName()) ?> 21 |

22 | description): ?> 23 |

description) ?>

24 | 25 | latest_release_number): ?> 26 |

27 | Latest Release: latest_release_number) ?> 28 | latest_release_published_at): ?> 29 | at formatter->asDateTime($model->latest_release_published_at) ?> 30 | (formatter->asRelativeTime($model->latest_release_published_at)?>) 31 | 32 |

33 | 34 | keywords)): ?> 35 |

36 | Keywords: 37 | 38 | keywords) ?> 41 | ', $keywords) ?> 42 | 43 |

44 | 45 |
46 |
47 | homepage): ?> 48 |

49 | 50 | Homepage 51 | 52 |

53 | 54 | repository_url): ?> 55 |

56 | 57 | Repository 58 | 59 |

60 | 61 | normalized_licenses)): ?> 62 |

63 | License: 64 | normalized_licenses) ?> 65 |

66 | 67 | isAvailable()): ?> 68 | Ready to use 69 | 70 | Fetch 71 | 72 |
73 |
74 | -------------------------------------------------------------------------------- /src/console/AssetPackageController.php: -------------------------------------------------------------------------------- 1 | packageRepository = $packageRepository; 36 | } 37 | 38 | /** 39 | * @param string $type the package type. Can be either `bower` or `npm` 40 | * @param string $name the package name 41 | * @return boolean Whether the update was successful 42 | */ 43 | public function actionUpdate($type, $name) 44 | { 45 | try { 46 | $package = new AssetPackage($type, $name); 47 | Yii::createObject(PackageUpdateCommand::class, [$package])->execute(Yii::$app->queue); 48 | echo 'updated ' . $package->getHash() . ' ' . $package->getFullName() . "\n"; 49 | 50 | return true; 51 | } catch (\Exception $e) { 52 | echo Console::renderColoredString("%Rfailed%N $type/$name:%n {$e->getMessage()}\n"); 53 | 54 | return false; 55 | } 56 | } 57 | 58 | public function actionUpdateList($file = STDIN) 59 | { 60 | $handler = is_resource($file) ? $file : fopen($file, 'r'); 61 | 62 | $errorPackages = []; 63 | 64 | while ($line = fgets($handler)) { 65 | list($full) = preg_split('/\s+/', trim($line)); 66 | list($type, $name) = AssetPackage::splitFullName($full); 67 | if (!$this->actionUpdate($type, $name)) { 68 | $errorPackages[] = $full; 69 | } 70 | } 71 | 72 | if (!is_resource($file)) { 73 | fclose($handler); 74 | } 75 | 76 | if (!empty($errorPackages)) { 77 | echo Console::renderColoredString("%RThe following packages were not updated due to unrecoverable errors:%n\n"); 78 | echo implode("\n", $errorPackages); 79 | } 80 | echo "\n"; 81 | } 82 | 83 | public function actionAddUpdateCommand($type, $name) 84 | { 85 | $package = new AssetPackage($type, $name); 86 | Yii::$app->queue->push(Yii::createObject(PackageUpdateCommand::class, [$package])); 87 | echo Console::renderColoredString("%GAdded%N $type/$name%n\n"); 88 | } 89 | 90 | public function actionUpdateAll() 91 | { 92 | $this->actionUpdateList(Yii::getAlias('@hiqdev/assetpackagist/config/packages.list')); 93 | } 94 | 95 | public function actionAvoid($type, $name) 96 | { 97 | $package = new AssetPackage($type, $name); 98 | $this->packageRepository->markAvoided($package); 99 | 100 | echo Console::renderColoredString("Package %N$type/$name%n is %Ravoided%n now\n"); 101 | } 102 | 103 | public function actionList() 104 | { 105 | $packages = Yii::$app->get('packageStorage')->listPackages(); 106 | ksort($packages); 107 | foreach ($packages as $name => $data) { 108 | echo "$name\n"; 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src/repositories/PackageRepository.php: -------------------------------------------------------------------------------- 1 | db = $db; 31 | } 32 | 33 | /** 34 | * @param AssetPackage $package 35 | * @return int 36 | */ 37 | public function save(AssetPackage $package) 38 | { 39 | if ($this->exists($package)) { 40 | return $this->update($package); 41 | } else { 42 | return $this->insert($package); 43 | } 44 | } 45 | 46 | /** 47 | * @param AssetPackage $package 48 | * @return int 49 | */ 50 | public function insert(AssetPackage $package) 51 | { 52 | return $this->db->createCommand()->insert('package', [ 53 | 'type' => $package->getType(), 54 | 'name' => $package->getName(), 55 | 'last_update' => $package->getUpdateTime(), 56 | ])->execute(); 57 | } 58 | 59 | /** 60 | * @param AssetPackage $package 61 | * @return int 62 | */ 63 | public function update(AssetPackage $package) 64 | { 65 | return $this->db->createCommand()->update('package', [ 66 | 'last_update' => $package->getUpdateTime(), 67 | ], $this->getWhereCondition($package))->execute(); 68 | } 69 | 70 | public function markAvoided(AssetPackage $package) 71 | { 72 | $this->db->createCommand()->update('package', [ 73 | 'is_avoided' => true, 74 | ], $this->getWhereCondition($package))->execute(); 75 | } 76 | 77 | public function isAvoided(AssetPackage $package) 78 | { 79 | return (new Query()) 80 | ->select('is_avoided') 81 | ->from('package') 82 | ->where($this->getWhereCondition($package)) 83 | ->scalar($this->db); 84 | } 85 | 86 | protected function getWhereCondition(AssetPackage $package) 87 | { 88 | return [ 89 | 'type' => $package->getType(), 90 | 'name' => $package->getName(), 91 | ]; 92 | } 93 | 94 | /** 95 | * @param AssetPackage $package 96 | * @return bool 97 | */ 98 | public function exists(AssetPackage $package) 99 | { 100 | return (new Query()) 101 | ->from('package') 102 | ->where($this->getWhereCondition($package)) 103 | ->exists($this->db); 104 | } 105 | 106 | /** 107 | * @return \hiqdev\assetpackagist\models\AssetPackage[] 108 | */ 109 | public function getExpiredForUpdate() 110 | { 111 | $rows = (new Query()) 112 | ->from('package') 113 | ->where(['<', 'last_update', time() - 60 * 60 * 24 * 7]) // Older than 7 days 114 | ->andWhere(['not', ['last_update' => null]]) 115 | ->andWhere(['is_avoided' => 0]) 116 | ->all(); 117 | 118 | return $this->hydrate($rows); 119 | } 120 | 121 | /** 122 | * @param array $rows 123 | * @return AssetPackage[] 124 | */ 125 | public function hydrate($rows) 126 | { 127 | $result = []; 128 | foreach ($rows as $row) { 129 | $result[] = new AssetPackage($row['type'], $row['name']); 130 | } 131 | 132 | return $result; 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/console/MaintenanceController.php: -------------------------------------------------------------------------------- 1 | packageStorage = $packageStorage; 47 | $this->packageRepository = $packageRepository; 48 | } 49 | 50 | /** 51 | * Synchronizes file system packages to the database. 52 | */ 53 | public function actionSyncToDb() 54 | { 55 | $packages = $this->packageStorage->listPackages(); 56 | 57 | foreach ($packages as $name => $data) { 58 | $message = "Package %N$name%n "; 59 | $package = AssetPackage::fromFullName($name); 60 | $package->load(); 61 | 62 | $message .= $this->packageRepository->exists($package) 63 | ? 'already exists. %BUpdated.%n' 64 | : 'does not exist. %GCreated.%n'; 65 | 66 | $this->packageRepository->save($package); 67 | 68 | $this->stdout(Console::renderColoredString($message . "\n")); 69 | } 70 | } 71 | 72 | /** 73 | * Updates expired packages. 74 | */ 75 | public function actionUpdateExpired() 76 | { 77 | $packages = $this->packageRepository->getExpiredForUpdate(); 78 | 79 | foreach ($packages as $package) { 80 | $package->load(); 81 | Yii::$app->queue->push(Yii::createObject(PackageUpdateCommand::class, [$package])); 82 | 83 | $message = 'Package %N' . $package->getFullName() . '%n'; 84 | $message .= ' was updated ' . Yii::$app->formatter->asRelativeTime($package->getUpdateTime()); 85 | $message .= ". %GAdded to queue for update%n\n"; 86 | $this->stdout(Console::renderColoredString($message)); 87 | } 88 | } 89 | 90 | public function actionCheckHashes() 91 | { 92 | $packages = $this->packageStorage->listPackages(); 93 | 94 | $i = 0; 95 | foreach ($packages as $name => $data) { 96 | if ($i++ % 10 === 0) { $this->stdout('.'); } 97 | if ($i % 1000 === 0) { $this->stdout(" [ $i ]\n"); } 98 | 99 | $package = AssetPackage::fromFullName($name); 100 | if ($this->packageRepository->isAvoided($package) 101 | || $this->packageStorage->checkIsSane($package) 102 | ) { 103 | continue; 104 | } 105 | 106 | Yii::$app->queue->push(Yii::createObject(PackageUpdateCommand::class, [$package])); 107 | 108 | $message = "\nPackage %N" . $package->getFullName() . '%n is corrupted. '; 109 | $message .= "%GAdded to queue for update%n\n"; 110 | $this->stdout(Console::renderColoredString($message)); 111 | } 112 | 113 | return 0; 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /src/console/QueueController.php: -------------------------------------------------------------------------------- 1 | queue = $queue; 49 | } 50 | 51 | public function init() 52 | { 53 | $this->attachEventHandlers(); 54 | } 55 | 56 | /** 57 | * Runs the queue. 58 | */ 59 | public function actionRun() 60 | { 61 | $this->queue->run(true); 62 | } 63 | 64 | /** 65 | * Test action to ensure that ErrorHandler flushes stack immediately. 66 | */ 67 | public function actionTestErrorHandler() 68 | { 69 | Yii::info(Console::renderColoredString('Lorem ipsum for time %y' . time() . '%n ' . "\n"), \hiqdev\assetpackagist\commands\CollectDependenciesCommand::class); 70 | sleep(1); 71 | } 72 | 73 | private function ensureLimits() 74 | { 75 | if ($this->executedJobsCount > static::MAX_EXECUTED_JOBS && function_exists('posix_kill')) { 76 | return 15; // SIGTERM 77 | } 78 | 79 | return null; 80 | } 81 | 82 | /** 83 | * Attaches handlers on Queue events. 84 | */ 85 | private function attachEventHandlers() 86 | { 87 | $out = function ($string) { 88 | $this->stdout(Console::renderColoredString($string)); 89 | }; 90 | 91 | Event::on(Queue::class, Queue::EVENT_BEFORE_EXEC, function ($event) use ($out) { 92 | /** @var JobEvent $event */ 93 | $out("%GNew job%n '" . get_class($event->job) . "'\n"); 94 | $this->executedJobsCount++; 95 | $this->ensureLimits(); 96 | }); 97 | 98 | Event::on(Queue::class, Queue::EVENT_AFTER_EXEC, function ($event) use ($out) { 99 | /** @var JobEvent $event */ 100 | $out("%GJob%n '" . get_class($event->job) . "' %Gis completed%n\n"); 101 | }); 102 | 103 | Event::on(Queue::class, Queue::EVENT_AFTER_ERROR, function ($event) use ($out) { 104 | /** @var ErrorEvent $event */ 105 | $out("%RJob '" . get_class($event->job) . "' finished with error:%n '" . $event->error . "'\n"); 106 | }); 107 | 108 | Event::on(Queue::class, CliQueue::EVENT_WORKER_LOOP, function (\yii\queue\cli\WorkerEvent $event) use ($out) { 109 | $exitCode = $this->ensureLimits(); 110 | if ($exitCode !== null) { 111 | $out('Reached limit of ' . static::MAX_EXECUTED_JOBS . " executed jobs. Stopping process.\n"); 112 | $event->exitCode = $exitCode; 113 | } 114 | }); 115 | 116 | Event::on(AbstractPackageCommand::class, AbstractPackageCommand::EVENT_BEFORE_RUN, function ($event) use ($out) { 117 | /** @var AbstractPackageCommand $command */ 118 | $command = $event->sender; 119 | $out('%g[' . get_class($command) . ']%n Working on package %N' . $command->getPackage()->getFullName() . "%n\n"); 120 | }); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/controllers/PackageController.php: -------------------------------------------------------------------------------- 1 | [ 29 | 'class' => VerbFilter::class, 30 | 'actions' => [ 31 | 'update' => ['post'], 32 | ], 33 | ], 34 | ]; 35 | } 36 | 37 | public function actionUpdate() 38 | { 39 | session_write_close(); 40 | $query = Yii::$app->request->post('query'); 41 | $package = $this->getAssetPackage($query); 42 | 43 | try { 44 | if (!$package->canBeUpdated()) { 45 | throw new UpdateRateLimitException(); 46 | } 47 | 48 | Yii::createObject(PackageUpdateCommand::class, [$package])->execute(Yii::$app->queue); 49 | } catch (UpdateRateLimitException $exception) { 50 | Yii::$app->session->addFlash('rate-limited', true); 51 | } catch (PackageNotExistsException $e) { 52 | return $this->renderPartial('not-found', ['package' => $package]); 53 | } catch (CorruptedPackageException $e) { 54 | return $this->renderPartial('fetch-error', ['package' => $package, 'exception' => $e]); 55 | } catch (Exception $e) { 56 | Yii::error([ 57 | 'UNKNOWN error during ' . $package->getFullName() . ' update', 58 | get_class($e), 59 | $e->getMessage(), 60 | ], __METHOD__); 61 | 62 | return $this->renderPartial('fetch-error', ['package' => $package]); 63 | } 64 | $package->load(); 65 | 66 | return $this->renderPartial('versions', ['package' => $package]); 67 | } 68 | 69 | public function actionSearch($query, $platform = null) 70 | { 71 | if (preg_match('/^(npm|bower)-asset\/[a-zA-Z0-9.-]+$/', $query)) { 72 | return $this->redirect("/package/$query"); 73 | } 74 | 75 | $activeQuery = \hiqdev\hiart\librariesio\models\Project::find()->where([ 76 | 'q' => $query, 77 | 'platforms' => in_array($platform, ['npm', 'bower'], true) ? $platform : 'bower,npm', 78 | ]); 79 | 80 | return $this->render('search', [ 81 | 'query' => $query, 82 | 'platform' => $platform, 83 | 'dataProvider' => new \yii\data\ActiveDataProvider([ 84 | 'query' => $activeQuery, 85 | ]), 86 | ]); 87 | } 88 | 89 | public function actionDetail($fullname) 90 | { 91 | try { 92 | $package = $this->getAssetPackage($fullname); 93 | $params = [ 94 | 'package' => $package, 95 | 'forceUpdate' => false, 96 | ]; 97 | 98 | if ($package->canAutoUpdate()) { 99 | $params['forceUpdate'] = true; 100 | } 101 | } catch (Exception $e) { 102 | return $this->render('wrong-name', ['query' => $fullname]); 103 | } 104 | 105 | return $this->render('details', $params); 106 | } 107 | 108 | /** 109 | * @param string $query 110 | * @return AssetPackage 111 | */ 112 | private static function getAssetPackage($query) 113 | { 114 | $package = AssetPackage::fromFullName(trim($query)); 115 | $package->load(); 116 | 117 | return $package; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/assets/logo/bower.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 17 | 18 | 23 | 24 | 30 | 36 | 39 | 43 | 45 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/registry/RegistryFactory.php: -------------------------------------------------------------------------------- 1 | YiiLogIO::class, 38 | ]; 39 | 40 | /** 41 | * @var ComposerConfig 42 | */ 43 | public $composerConfig; 44 | 45 | /** 46 | * @var RepositoryManager 47 | */ 48 | public $repositoryManager; 49 | 50 | /** 51 | * @var AssetConfig 52 | */ 53 | public $assetConfig; 54 | 55 | /** 56 | * @var RootPackage 57 | */ 58 | public $rootPackage; 59 | 60 | /** 61 | * @var InstallationManager 62 | */ 63 | public $installationManager; 64 | 65 | /** 66 | * @var VcsPackageFilter 67 | */ 68 | public $packageFilter; 69 | 70 | /** 71 | * @var AssetRepositoryManager 72 | */ 73 | public $assetRepositoryManager; 74 | 75 | public function init() 76 | { 77 | parent::init(); 78 | 79 | $this->io = Instance::ensure($this->io, IOInterface::class); 80 | 81 | /** 82 | * Factory::createConfig load the composer configuration in COMPOSER_HOME 83 | * First read COMPOSER_HOME/config.json and COMPOSER_HOME/auth.json. 84 | */ 85 | $this->composerConfig = Factory::createConfig($this->io); 86 | 87 | /** 88 | * Required to read authentication tokens (Ex. GitHub API) 89 | * See https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens. 90 | */ 91 | $this->io->loadConfiguration($this->composerConfig); 92 | 93 | /** 94 | * Create RepositoryManager with defaults repositories classes. 95 | */ 96 | $this->repositoryManager = RepositoryFactory::manager($this->io, $this->composerConfig); 97 | 98 | /** 99 | * Read fxp/composer-asset-plugin config 100 | * See https://github.com/fxpio/composer-asset-plugin/blob/master/Resources/doc/index.md 101 | * Note: The "COMPOSER_HOME/config.json" file is already the "config" key. 102 | */ 103 | $arrayConfig = []; 104 | if ($this->composerConfig->has('fxp-asset')) { 105 | $arrayConfig = $this->composerConfig->get('fxp-asset'); 106 | } 107 | 108 | /** 109 | * Enabling the fxp/composer-asset-plugin plugin 110 | * See activate method in https://github.com/fxpio/composer-asset-plugin/blob/master/FxpAssetPlugin.php. 111 | */ 112 | $this->assetConfig = new AssetConfig($arrayConfig); 113 | 114 | //Dummy Package 115 | $this->rootPackage = new RootPackage('asset-packagist', '0.0.0.0', '0.0.0'); 116 | $this->installationManager = new InstallationManager(); 117 | $this->packageFilter = new VcsPackageFilter($this->assetConfig, $this->rootPackage, $this->installationManager); 118 | $this->assetRepositoryManager = new AssetRepositoryManager($this->io, $this->repositoryManager, $this->assetConfig, $this->packageFilter); 119 | 120 | /** 121 | * Define default repositories for Bower and NPM. 122 | */ 123 | AssetPlugin::addRegistryRepositories($this->assetRepositoryManager, $this->packageFilter, $this->assetConfig); 124 | AssetPlugin::setVcsTypeRepositories($this->repositoryManager); 125 | } 126 | 127 | public function getRepository() 128 | { 129 | return new CompositeRepository($this->repositoryManager->getRepositories()); 130 | } 131 | 132 | public function getPool($minimumStability = 'dev') 133 | { 134 | $pool = new Pool($minimumStability); 135 | $pool->addRepository($this->getRepository()); 136 | return $pool; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /src/views/site/about.php: -------------------------------------------------------------------------------- 1 | title = 'About'; 5 | $this->params['subtitle'] = 'Composer + Bower + NPM = friends forever!'; 6 | $this->params['breadcrumbs'][] = $this->title; 7 | 8 | ?> 9 |
10 |

How it works

11 | 12 |

Asset Packagist provides information about Bower and NPM packages in a similar way to Packagist does it for 13 | Composer packages. 14 | So when you run composer for your project with enabled Asset Packagist repository composer knows all the 15 | available releases of bower-asset and npm-asset packages and knows how to download their files. 16 |

17 | 18 |

First we add Bower and NPM packages to our repository. Script collects package information and prepares JSON file 19 | in Packagist format. 20 | For example you can look what we have for Bower moment package: 21 |

22 | 23 |

https://asset-packagist.org/p/bower-asset/moment/latest.json 24 |

25 | 26 |

The file contains description of all of the versions of the package in the following format:

27 | 28 |

 29 |     "2.13.0.0": {
 30 |       "uid": 1000600,
 31 |       "name": "bower-asset/moment",
 32 |       "version": "2.13.0.0",
 33 |       "type": "bower-asset",
 34 |       "dist": {
 35 |         "type": "zip",
 36 |         "url": "https://api.github.com/repos/moment/moment/zipball/d6651c21c6131fbb5db891b60971357739015688",
 37 |         "reference": "d6651c21c6131fbb5db891b60971357739015688"
 38 |       },
 39 |       "source": {
 40 |         "type": "git",
 41 |         "url": "https://github.com/moment/moment.git",
 42 |         "reference": "d6651c21c6131fbb5db891b60971357739015688"
 43 |       }
 44 |     },
 45 |     
46 | 47 |

So when you run composer it downloads info about packages provided by Asset Packagist repository, then composer 48 | resolves dependencies and finds proper versions of required packages, then it downloads packages files to vendor 49 | directory of your project (actually composer doesn't care if these are PHP or JS or whatever files).

50 | 51 |

All the JSON files are stored and served as static files on Asset Packagist side and composer effectively cashes 52 | those files on your side so everything works as quick as possible.

53 | 54 |

Installing to a custom path

55 | 56 |

Asset Packagist is NOT a plugin so it can't affect where the package will be installed.
57 | By default bower-asset/bootstrap package will be installed to 58 | vendor/bower-asset/bootstrap folder.

59 | 60 |

But you can achieve installing to custom path with oomphinc/composer-installers-extender 62 | plugin like this:

63 |

 64 |     "require": {
 65 |         "oomphinc/composer-installers-extender": "^1.1",
 66 |         "bower-asset/bootstrap": "^3.3",
 67 |         "npm-asset/jquery": "^2.2"
 68 |     },
 69 |     "extra": {
 70 |         "installer-types": ["bower-asset", "npm-asset"],
 71 |         "installer-paths": {
 72 |             "public/assets/{$vendor}/{$name}/": ["type:bower-asset", "type:npm-asset"]
 73 |         }
 74 |     },
 75 |     "repositories": [
 76 |         {
 77 |             "type": "composer",
 78 |             "url": "https://asset-packagist.org"
 79 |         }
 80 |     ]
 81 |     
82 | 83 |

Yii2

84 | 85 |

Yii2 expects Bower and NPM packages to be installed to vendor/bower and vendor/npm 86 | folders respectively.

87 | 88 |

So, to use asset-packagist for Yii2 projects it's necessary to reassign Bower and NPM aliases in your application 89 | config like this:

90 | 91 |

 92 |     $config = [
 93 |         ...
 94 |         'aliases' => [
 95 |             '@bower' => '@vendor/bower-asset',
 96 |             '@npm'   => '@vendor/npm-asset',
 97 |         ],
 98 |         ...
 99 |     ];
100 |     
101 | 102 |

Migrating from composer-asset-plugin

103 | 104 |

Moving from composer-asset-plugin is not 105 | straightforward when you host several applications on single server. It's known that asset packagist 106 | and asset plugin don't work well together when plugin is installed in global scope. So, to not affect 107 | other applications by deleting the plugin, you may disable the plugin locally via composer.json 108 | config option (you need plugin version ≥ 1.3.0 for this):

109 | 110 |

111 |     "config": {
112 |         "fxp-asset": {
113 |             "enabled": false
114 |         }
115 |     }
116 |     
117 | 118 |

Acknowledgements

119 | 120 |

This project uses Francois Pluchino's composer-asset-plugin 121 | to convert Bower and NPM packages to Composer format.

122 |

The search is powered by https://libraries.io/.

123 |
124 | -------------------------------------------------------------------------------- /src/librariesio/ProjectDataProvider.php: -------------------------------------------------------------------------------- 1 | cache) { 53 | $this->cache = Instance::ensure($this->cache, Cache::className()); 54 | } 55 | $this->repository = Instance::ensure($this->repository, LibrariesioRepository::className()); 56 | } 57 | 58 | protected function prepareModels() 59 | { 60 | if (!$this->platform) { 61 | $this->platform = 'bower,npm'; 62 | } 63 | if (is_array($this->platform)) { 64 | $this->platform = implode(',', $this->platform); 65 | } 66 | 67 | $query = [ 68 | 'q' => $this->query, 69 | 'platforms' => $this->platform, 70 | ]; 71 | 72 | if (($sort = $this->getSort()) !== false) { 73 | foreach ($sort->getOrders() as $sort => $order) { 74 | $query['sort'] = $sort; 75 | $query['order'] = ($order === SORT_ASC) ? 'asc' : 'desc'; 76 | break; 77 | } 78 | } 79 | 80 | if (($pagination = $this->getPagination()) !== false) { 81 | /** 82 | * Not use '$pagination->getPage()' because need define 'totalCount' first 83 | * totalCount is defined after request. 84 | */ 85 | $page = (int) Yii::$app->getRequest()->getQueryParam($pagination->pageParam, 1); 86 | if ($page > 1) { 87 | $query['page'] = $page; 88 | } 89 | 90 | $query['per_page'] = $pagination->getPageSize(); 91 | } 92 | 93 | $cacheKey = [static::className(), 'query' => $query]; 94 | 95 | $items = []; 96 | $totalCount = 0; 97 | 98 | if ($this->cache && $this->cache->exists($cacheKey)) { 99 | list($totalCount, $items) = $this->cache->get($cacheKey); 100 | } else { 101 | /* @var $response Response */ 102 | $response = $this->repository->search($query); 103 | 104 | if ($response->getStatusCode() !== 200) { 105 | return []; 106 | } 107 | 108 | $totalCount = (int) $response->getHeaderLine('total'); 109 | $items = Json::decode($response->getBody()); 110 | 111 | if ($this->cache) { 112 | $this->cache->set($cacheKey, [$totalCount, $items], $this->cacheDuration); 113 | } 114 | } 115 | 116 | $this->lastTotalCount = $totalCount; 117 | 118 | if (($pagination = $this->getPagination()) !== false) { 119 | $pagination->totalCount = $this->lastTotalCount; 120 | } 121 | 122 | $models = []; 123 | 124 | foreach ($items as $item) { 125 | $models[] = new Project(['attributes' => $item]); 126 | } 127 | 128 | return $models; 129 | } 130 | 131 | /** 132 | * @param Project[] $models 133 | * @return array 134 | */ 135 | protected function prepareKeys($models) 136 | { 137 | $keys = []; 138 | 139 | foreach ($models as $model) { 140 | $keys[] = [ 141 | 'name' => $model->name, 142 | 'platform' => $model->name, 143 | ]; 144 | } 145 | 146 | return $keys; 147 | } 148 | 149 | protected function prepareTotalCount() 150 | { 151 | $this->prepare(); 152 | return $this->lastTotalCount; 153 | } 154 | 155 | public function setSort($value) 156 | { 157 | /** 158 | * Override the default attributes to sort. 159 | */ 160 | if (is_array($value)) { 161 | $value = array_merge([ 162 | 'attributes' => [ 163 | 'Rank' => 'rank', 164 | 'Stars' => 'stars', 165 | 'Dependents Count' => 'dependents_count', 166 | 'Dependent Repos Count' => 'dependent_repos_count', 167 | 'Latest Release Published At' => 'latest_release_published_at', 168 | 'Created At' => 'created_at', 169 | 'Contributions Count' => 'contributions_count', 170 | ], ], $value); 171 | } 172 | 173 | parent::setSort($value); 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /src/models/AssetPackage.php: -------------------------------------------------------------------------------- 1 | checkType($type)) { 59 | throw new Exception('wrong type'); 60 | } 61 | if (!$this->checkName($name)) { 62 | throw new Exception('wrong name'); 63 | } 64 | $this->_type = $type; 65 | $this->_name = $name; 66 | } 67 | 68 | /** 69 | * @return RegistryFactory 70 | */ 71 | public function getRegistry() 72 | { 73 | return Yii::$app->get('registryFactory'); 74 | } 75 | 76 | public function checkType($type) 77 | { 78 | return $type === 'bower' || $type === 'npm'; 79 | } 80 | 81 | public function checkName($name) 82 | { 83 | return strlen($name) > 0; 84 | } 85 | 86 | public function getFullName() 87 | { 88 | return static::buildFullName($this->_type, $this->_name); 89 | } 90 | 91 | public static function buildNormalName($type, $name) 92 | { 93 | return static::buildFullName($type, static::normalizeName($name)); 94 | } 95 | 96 | public static function buildFullName($type, $name) 97 | { 98 | return $type . '-asset/' . $name; 99 | } 100 | 101 | public static function splitFullName($full) 102 | { 103 | list($temp, $name) = explode('/', $full); 104 | list($type) = explode('-', $temp); 105 | 106 | return [$type, $name]; 107 | } 108 | 109 | /** 110 | * @param string $full package name 111 | * @return static 112 | */ 113 | public static function fromFullName($full) 114 | { 115 | list($type, $name) = static::splitFullName($full); 116 | return new static($type, $name); 117 | } 118 | 119 | public function getType() 120 | { 121 | return $this->_type; 122 | } 123 | 124 | public function getNormalName() 125 | { 126 | return static::buildNormalName($this->_type, $this->_name); 127 | } 128 | 129 | public function getName() 130 | { 131 | return $this->_name; 132 | } 133 | 134 | public function getHash() 135 | { 136 | return $this->_hash; 137 | } 138 | 139 | /** 140 | * findOne. 141 | * 142 | * @param string $type 143 | * @param string $name 144 | * @return static|null 145 | */ 146 | public static function findOne($type, $name) 147 | { 148 | $package = new static($type, $name); 149 | $package->load(); 150 | 151 | return $package; 152 | } 153 | 154 | public function load() 155 | { 156 | $data = $this->getStorage()->readPackage($this); 157 | if ($data !== null) { 158 | $this->_hash = $data['hash']; 159 | $this->_releases = $data['releases']; 160 | $this->_updateTime = $data['updateTime']; 161 | } 162 | } 163 | 164 | public function update() 165 | { 166 | $pool = $this->getRegistry()->getPool(); 167 | $this->_releases = $this->prepareReleases($pool); 168 | $this->getStorage()->writePackage($this); 169 | $this->load(); 170 | } 171 | 172 | /** 173 | * @param \Composer\DependencyResolver\Pool $pool 174 | * @return array 175 | */ 176 | public function prepareReleases($pool) 177 | { 178 | $releases = []; 179 | 180 | foreach ($pool->whatProvides($this->getFullName()) as $package) { 181 | if ($package instanceof \Composer\Package\AliasPackage) { 182 | continue; 183 | } 184 | 185 | $version = $this->prepareVersion($package->getPrettyVersion()); 186 | $require = $this->prepareRequire($package->getRequires()); 187 | $release = [ 188 | 'uid' => $this->prepareUid($version), 189 | 'name' => $this->getNormalName(), 190 | 'version' => $version, 191 | 'version_normalized' => $this->prepareVersion($package->getVersion()), 192 | 'type' => $this->getType() . '-asset', 193 | ]; 194 | if ($require) { 195 | $release['require'] = $require; 196 | } 197 | if ($package->getDistUrl()) { 198 | $release['dist'] = [ 199 | 'type' => $package->getDistType(), 200 | 'url' => $package->getDistUrl(), 201 | 'reference' => $package->getDistReference(), 202 | ]; 203 | } 204 | if ($package->getLicense()) { 205 | $release['license'] = $package->getLicense(); 206 | } 207 | if ($package->getSourceUrl()) { 208 | $release['source'] = [ 209 | 'type' => $package->getSourceType(), 210 | 'url' => $package->getSourceUrl(), 211 | 'reference' => $package->getSourceReference(), 212 | ]; 213 | } 214 | if ((isset($release['dist']) && $release['dist']) || (isset($release['source']) && $release['source'])) { 215 | $releases[$version] = $release; 216 | } 217 | } 218 | 219 | //Sort before save 220 | \hiqdev\assetpackagist\components\PackageUtil::sort($releases); 221 | 222 | return $releases; 223 | } 224 | 225 | protected function prepareVersion($version) 226 | { 227 | if ($this->getNormalName() === 'bower-asset/angular') { 228 | return $this->convertPatchToRC($version); 229 | } 230 | 231 | return $version; 232 | } 233 | 234 | protected function convertPatchToRC($version) 235 | { 236 | return preg_replace('/-patch(.+)/', '-RC${1}', $version); 237 | } 238 | 239 | /** 240 | * Prepares array of requires: name => constraint. 241 | * @param Link[] array of package requires 242 | * @return array 243 | */ 244 | public function prepareRequire(array $links) 245 | { 246 | $requires = []; 247 | foreach ($links as $name => $link) { 248 | /** @var Link $link */ 249 | $requires[$name] = $link->getPrettyConstraint(); 250 | } 251 | 252 | return $requires; 253 | } 254 | 255 | public function prepareUid($version) 256 | { 257 | $known = $this->getSaved()->getRelease($version); 258 | 259 | return isset($known['uid']) ? $known['uid'] : $this->getStorage()->getNextId(); 260 | } 261 | 262 | /** 263 | * @return array 264 | */ 265 | public function getReleases() 266 | { 267 | return $this->_releases; 268 | } 269 | 270 | /** 271 | * @param $version 272 | * @return array 273 | */ 274 | public function getRelease($version) 275 | { 276 | return isset($this->_releases[$version]) ? $this->_releases[$version] : []; 277 | } 278 | 279 | public function getSaved() 280 | { 281 | if ($this->_saved === null) { 282 | $this->_saved = static::findOne($this->getType(), $this->getName()); 283 | } 284 | 285 | return $this->_saved; 286 | } 287 | 288 | /** 289 | * @return Storage 290 | */ 291 | public function getStorage() 292 | { 293 | return Yii::$app->get('packageStorage'); 294 | } 295 | 296 | /** 297 | * Returns the latest update time (UNIX Epoch). 298 | * @return int|null 299 | */ 300 | public function getUpdateTime() 301 | { 302 | return $this->_updateTime; 303 | } 304 | 305 | /** 306 | * Package can be updated not more often than once in 10 min. 307 | * @return bool 308 | */ 309 | public function canBeUpdated() 310 | { 311 | return time() - $this->getUpdateTime() > 60 * 10; // 10 min 312 | } 313 | 314 | /** 315 | * Whether tha package should be auth-updated (if it is older than 1 day). 316 | * @return bool 317 | */ 318 | public function canAutoUpdate() 319 | { 320 | return time() - $this->getUpdateTime() > 60 * 60 * 24; // 1 day 321 | } 322 | 323 | public function isAvailable() 324 | { 325 | $repository = Yii::createObject(PackageRepository::class, []); 326 | 327 | return $repository->exists($this); 328 | } 329 | 330 | /** 331 | * @return array 332 | */ 333 | public function __sleep() 334 | { 335 | return ['_type', '_name', '_hash']; 336 | } 337 | } 338 | -------------------------------------------------------------------------------- /src/components/Storage.php: -------------------------------------------------------------------------------- 1 | _path = Yii::getAlias('@storage', false); 30 | } 31 | 32 | protected function acquireLock() 33 | { 34 | /* @var $mutex \yii\mutex\Mutex */ 35 | $mutex = Yii::$app->mutex; 36 | 37 | if (!$mutex->acquire('lock', 5)) { 38 | throw new \Exception('failed get lock'); 39 | } 40 | } 41 | 42 | protected function releaseLock() 43 | { 44 | /* @var $mutex \yii\mutex\Mutex */ 45 | $mutex = Yii::$app->mutex; 46 | 47 | $mutex->release('lock'); 48 | } 49 | 50 | /** 51 | * {@inheritdoc} 52 | */ 53 | public function getNextId() 54 | { 55 | $this->acquireLock(); 56 | { 57 | $nextID = $this->readLastId() + 1; 58 | $this->writeLastId($nextID); 59 | } 60 | $this->releaseLock(); 61 | 62 | return $nextID; 63 | } 64 | 65 | protected function readLastId() 66 | { 67 | $path = $this->getLastIdPath(); 68 | 69 | return (file_exists($path) ? (int) file_get_contents($path) : 0) ?: 1000000; 70 | } 71 | 72 | protected function writeLastId($value) 73 | { 74 | if (file_put_contents($this->getLastIdPath(), $value) === false) { 75 | throw new AssetFileStorageException('Filed to write lastId to the storage'); 76 | } 77 | } 78 | 79 | protected function getLastIdPath() 80 | { 81 | return $this->buildPath('lastid'); 82 | } 83 | 84 | /** 85 | * {@inheritdoc} 86 | */ 87 | public function writePackage(AssetPackage $package) 88 | { 89 | $name = $package->getNormalName(); 90 | $data = [ 91 | 'packages' => [ 92 | $name => $package->getReleases(), 93 | ], 94 | ]; 95 | $json = Json::encode($data); 96 | $hash = hash('sha256', $json); 97 | $path = $this->buildHashedPath($name, $hash); 98 | $latestPath = $this->buildHashedPath($name); 99 | if (!file_exists($path)) { 100 | $this->acquireLock(); 101 | try { 102 | if ($this->mkdir(dirname($path)) === false) { 103 | throw new AssetFileStorageException('Failed to create a directory for asset-package', $package); 104 | } 105 | if (file_put_contents($path, $json) === false) { 106 | throw new AssetFileStorageException('Failed to write package', $package); 107 | } 108 | if (file_put_contents($latestPath, $json) === false) { 109 | throw new AssetFileStorageException('Failed to write file "latest.json" for asset-packge', $package); 110 | } 111 | $this->writeProviderLatest($name, $hash); 112 | } finally { 113 | $this->releaseLock(); 114 | } 115 | } else { 116 | touch($latestPath); 117 | } 118 | 119 | return $hash; 120 | } 121 | 122 | /** 123 | * {@inheritdoc} 124 | */ 125 | public function readPackage(AssetPackage $package) 126 | { 127 | $name = $package->getNormalName(); 128 | $path = $this->buildHashedPath($name); 129 | clearstatcache(false, $path); 130 | if (!file_exists($path)) { 131 | return null; 132 | } 133 | $json = file_get_contents($path); 134 | $updateTime = filemtime($path); 135 | $hash = hash('sha256', $json); 136 | try { 137 | $data = Json::decode($json); 138 | } catch (\Exception $e) { 139 | return null; 140 | } 141 | $releases = isset($data['packages'][$name]) ? $data['packages'][$name] : []; 142 | 143 | return compact('hash', 'releases', 'updateTime'); 144 | } 145 | 146 | protected function buildPath() 147 | { 148 | $args = func_get_args(); 149 | array_unshift($args, $this->_path); 150 | 151 | return implode(DIRECTORY_SEPARATOR, $args); 152 | } 153 | 154 | protected function buildHashedPath($name, $hash = 'latest') 155 | { 156 | return $this->buildPath('p', $name, $hash . '.json'); 157 | } 158 | 159 | protected function writeProviderLatest($name, $hash) 160 | { 161 | $latestPath = $this->buildHashedPath('provider-latest'); 162 | if (file_exists($latestPath)) { 163 | $data = Json::decode(file_get_contents($latestPath) ?: '[]'); 164 | } 165 | if (!isset($data) || !is_array($data)) { 166 | $data = []; 167 | } 168 | if (!isset($data['providers'])) { 169 | $data['providers'] = []; 170 | } 171 | $data['providers'][$name] = ['sha256' => $hash]; 172 | $json = Json::encode($data); 173 | $hash = hash('sha256', $json); 174 | $path = $this->buildHashedPath('provider-latest', $hash); 175 | 176 | if (!file_exists($path)) { 177 | $this->acquireLock(); 178 | 179 | try { 180 | if ($this->mkdir(dirname($path)) === false) { 181 | throw new AssetFileStorageException('Failed to create a directory for provider-latest storage'); 182 | } 183 | if (file_put_contents($path, $json) === false) { 184 | throw new AssetFileStorageException('Failed to write package to provider-latest storage for package "' . $name . '"'); 185 | } 186 | if (file_put_contents($latestPath, $json) === false) { 187 | throw new AssetFileStorageException('Failed to write file "latest.json" to provider-latest storage for package "' . $name . '"'); 188 | } 189 | $this->writePackagesJson($hash); 190 | } finally { 191 | $this->releaseLock(); 192 | } 193 | } else { 194 | touch($latestPath); 195 | } 196 | 197 | return $hash; 198 | } 199 | 200 | protected function writePackagesJson($hash) 201 | { 202 | $data = [ 203 | 'providers-url' => '/p/%package%/%hash%.json', 204 | 'provider-includes' => [ 205 | 'p/provider-latest/%hash%.json' => [ 206 | 'sha256' => $hash, 207 | ], 208 | ], 209 | 'available-package-patterns' => ['bower-asset/*', 'npm-asset/*'], 210 | ]; 211 | $this->acquireLock(); 212 | $filename = $this->buildPath('packages.json'); 213 | try { 214 | if (file_put_contents($filename, Json::encode($data)) === false) { 215 | throw new AssetFileStorageException('Failed to write main packages.json'); 216 | } 217 | touch($filename); 218 | } finally { 219 | $this->releaseLock(); 220 | } 221 | } 222 | 223 | /** 224 | * Creates directory $dir and sets chmod 777. 225 | * @param string $dir 226 | * @return bool whether the directory was created successfully 227 | */ 228 | protected function mkdir($dir) 229 | { 230 | if (!file_exists($dir)) { 231 | return @mkdir($dir, 0777, true); 232 | } 233 | 234 | return true; 235 | } 236 | 237 | public function readJson($path) 238 | { 239 | return Json::decode(file_get_contents($this->buildPath($path))); 240 | } 241 | 242 | protected function readPackagesJson() 243 | { 244 | $data = $this->readJson('packages.json'); 245 | 246 | return $data['provider-includes']; 247 | } 248 | 249 | protected function readProvider($path) 250 | { 251 | $data = $this->readJson($path); 252 | 253 | return $data['providers']; 254 | } 255 | 256 | /** 257 | * {@inheritdoc} 258 | */ 259 | public function listPackages() 260 | { 261 | $packages = []; 262 | $providers = $this->readPackagesJson(); 263 | foreach ($providers as $path => $data) { 264 | $path = strtr($path, ['%hash%' => $data['sha256']]); 265 | $packages = array_merge($packages, $this->readProvider($path)); 266 | } 267 | 268 | return $packages; 269 | } 270 | 271 | public function checkIsSane(AssetPackage $package) 272 | { 273 | $isOk = true; 274 | $name = $package->getNormalName(); 275 | try { 276 | $directoryIterator = new \DirectoryIterator($this->buildPath('p', $name)); 277 | $iterator = new \RegexIterator($directoryIterator, '/^.+\.json$/i', \RecursiveRegexIterator::GET_MATCH); 278 | } catch (\UnexpectedValueException $e) { 279 | return false; 280 | } 281 | 282 | foreach ($iterator as $match) { 283 | $filename = $match[0]; 284 | $sha = basename($filename, '.json'); 285 | if ($sha === 'latest') { 286 | continue; 287 | } 288 | 289 | $path = $this->buildPath('p', $name, $filename); 290 | $fileHash = hash_file('sha256', $path); 291 | if ($sha !== $fileHash) { 292 | unlink($path); 293 | $isOk = false; 294 | } 295 | } 296 | 297 | return $isOk; 298 | } 299 | } 300 | -------------------------------------------------------------------------------- /src/config/bower.list: -------------------------------------------------------------------------------- 1 | bower-asset/boot 2 | bower-asset/bootstrap 3 | bower-asset/angular-latest 4 | bower-asset/angulerjs 5 | bower-asset/aa 6 | bower-asset/angular-1.1.6 7 | bower-asset/animate-css 8 | bower-asset/animate.css 9 | bower-asset/animation.css 10 | bower-asset/backbone 11 | bower-asset/blueimp-file-upload 12 | bower-asset/blueimp-file-upload-node 13 | bower-asset/angular-material-design-light 14 | bower-asset/async 15 | bower-asset/bootstrap-material-design 16 | bower-asset/angular-es6 17 | bower-asset/angular-seed 18 | bower-asset/bluebird 19 | bower-asset/boostrap-sass 20 | bower-asset/bootstrap-sass 21 | bower-asset/bootstrap-sass-official 22 | bower-asset/bootstrap-sass-twbs 23 | bower-asset/adminlte 24 | bower-asset/admin-lte 25 | bower-asset/bootstrap-3-datepicker 26 | bower-asset/bootstrap-datepicker 27 | bower-asset/bootstrap-datepicker-eternicode 28 | bower-asset/bootswatch 29 | bower-asset/bourbon 30 | bower-asset/amazeui 31 | bower-asset/brain 32 | bower-asset/backbone.marionette 33 | bower-asset/angular-ng-sortablejs 34 | bower-asset/card 35 | bower-asset/bulma 36 | bower-asset/aurelia-framework 37 | bower-asset/bam-aurelia-framework 38 | bower-asset/angular-strap 39 | bower-asset/adaptive.background 40 | bower-asset/adaptive-backgrounds 41 | bower-asset/c3 42 | bower-asset/c3js-chart 43 | bower-asset/bootstrap-daterangepicker 44 | bower-asset/bacon 45 | bower-asset/Buttons 46 | bower-asset/bootstrap-modal 47 | bower-asset/awesomplete 48 | bower-asset/bootstrap-select 49 | bower-asset/angular-loading-bar 50 | bower-asset/bounce-js 51 | bower-asset/bounce.js 52 | bower-asset/bootstrap3-datetimepicker 53 | bower-asset/bs-datetimepicker 54 | bower-asset/bootstrap-switch 55 | bower-asset/angular-grid 56 | bower-asset/At.js 57 | bower-asset/Bootflat 58 | bower-asset/bootflatv2 59 | bower-asset/bespoke.js 60 | bower-asset/browser-logos 61 | bower-asset/campoaia 62 | bower-asset/bootstrap-table 63 | bower-asset/bootstra.386 64 | bower-asset/axios 65 | bower-asset/backstretch 66 | bower-asset/bootbox 67 | bower-asset/bootbox.js 68 | bower-asset/bs-bootbox 69 | bower-asset/bootstrap-tour 70 | bower-asset/analytics 71 | bower-asset/bxSlider 72 | bower-asset/bxslider-4 73 | bower-asset/bx-slider.js 74 | bower-asset/babylonjs 75 | bower-asset/annyang 76 | bower-asset/brick 77 | bower-asset/aura 78 | bower-asset/assemble 79 | bower-asset/alt 80 | bower-asset/accountingjs 81 | bower-asset/accounting.js 82 | bower-asset/anijs 83 | bower-asset/blocks 84 | bower-asset/angular-bindonce 85 | bower-asset/basket.js 86 | bower-asset/appjs 87 | bower-asset/app.js 88 | bower-asset/animsition 89 | bower-asset/background-check 90 | bower-asset/backgroundCheck 91 | bower-asset/angular-file-upload 92 | bower-asset/autosize 93 | bower-asset/angular-ui-select 94 | bower-asset/backbone-relational 95 | bower-asset/backbone.relational 96 | bower-asset/angular-filter 97 | bower-asset/angular-local-storage 98 | bower-asset/caman 99 | bower-asset/angular-http-auth 100 | bower-asset/almond 101 | bower-asset/bootstrap-jasny 102 | bower-asset/angular-google-maps 103 | bower-asset/aws-sdk 104 | bower-asset/aws-sdk-js 105 | bower-asset/animo 106 | bower-asset/animo.js 107 | bower-asset/bigvideo.js 108 | bower-asset/BigVideo.js 109 | bower-asset/backbone-forms 110 | bower-asset/cash 111 | bower-asset/angular-moment 112 | bower-asset/bootstrap-datetimepicker-master 113 | bower-asset/bootstrap-multiselect 114 | bower-asset/baobab 115 | bower-asset/bootstrap-calendar 116 | bower-asset/bootstrap-full-view-calendar 117 | bower-asset/angular-formly 118 | bower-asset/backgrid 119 | bower-asset/backbone.localstorage 120 | bower-asset/backbone.localStorage 121 | bower-asset/Backbone.localStorage 122 | bower-asset/bootstrap-admin-template 123 | bower-asset/art-dialog 124 | bower-asset/artDialog 125 | bower-asset/angular-nestedsortable 126 | bower-asset/Angular-NestedSortable 127 | bower-asset/angular-ui-tree 128 | bower-asset/basil.js 129 | bower-asset/bootstrap-social 130 | bower-asset/bricklayer 131 | bower-asset/bitcore 132 | bower-asset/angular-meteor 133 | bower-asset/angularfire 134 | bower-asset/bootstraptagsinput 135 | bower-asset/bootstrap-tagsinput 136 | bower-asset/breakpoint-sass 137 | bower-asset/brototype 138 | bower-asset/angular-chartjs 139 | bower-asset/angular-chart.js 140 | bower-asset/angular-charts-js 141 | bower-asset/backbone.stickit 142 | bower-asset/ag-grid 143 | bower-asset/agGrid 144 | bower-asset/ag-grid-angular1-test 145 | bower-asset/agGrid_kiwik 146 | bower-asset/angularitics 147 | bower-asset/angulartics 148 | bower-asset/angular-xeditable 149 | bower-asset/bucky 150 | bower-asset/bootstrap-fileinput 151 | bower-asset/angular-ui-utils 152 | bower-asset/angular-cfp-hotkeys 153 | bower-asset/angular-dragdrop 154 | bower-asset/angular-placeholder-polyfill-chieffancypants 155 | bower-asset/add-to-homescreen 156 | bower-asset/bootstrap-sweetalert 157 | bower-asset/bootstrap-markdown 158 | bower-asset/angular-smart-table 159 | bower-asset/backbone.paginator 160 | bower-asset/bootstrap-timepicker 161 | bower-asset/blast-text 162 | bower-asset/apache-server-configs 163 | bower-asset/bowser 164 | bower-asset/Bowser 165 | bower-asset/browser 166 | bower-asset/angular-schema-form 167 | bower-asset/amplify 168 | bower-asset/calendar-heatmap 169 | bower-asset/angular-carousel 170 | bower-asset/angular-rn-carousel 171 | bower-asset/cal-heatmap 172 | bower-asset/backstopjs 173 | bower-asset/anima 174 | bower-asset/animatic 175 | bower-asset/blockui 176 | bower-asset/backbone-validation 177 | bower-asset/angular-leaflet 178 | bower-asset/angular-leaflet-directive 179 | bower-asset/angular-socket-io 180 | bower-asset/antimoderate 181 | bower-asset/bootstro 182 | bower-asset/blanket 183 | bower-asset/absurd 184 | bower-asset/aekaplan-grid 185 | bower-asset/bootstrap3-dialog 186 | bower-asset/bootstrap-dialog 187 | bower-asset/BootstrapDialog 188 | bower-asset/alloyui 189 | bower-asset/alloy-ui 190 | bower-asset/blazy 191 | bower-asset/angular-restmod 192 | bower-asset/candy 193 | bower-asset/angular-busy 194 | bower-asset/angularjs-nvd3-directives 195 | bower-asset/angular-scroll 196 | bower-asset/angular-ui-calendar 197 | bower-asset/bootstrap-treeview 198 | bower-asset/angular-cache 199 | bower-asset/awesome-bootstrap-checkbox 200 | bower-asset/bootstrap-validator 201 | bower-asset/angular-deckgrid 202 | bower-asset/bootstrap-hover-dropdown 203 | bower-asset/buzz 204 | bower-asset/alasql 205 | bower-asset/assemble-handlebars-helpers 206 | bower-asset/bootstrap-formhelpers 207 | bower-asset/bootstrap-form-helpers 208 | bower-asset/angular-drag-and-drop-lists 209 | bower-asset/angular-masonry 210 | bower-asset/angular-charts 211 | bower-asset/angular-gantt 212 | bower-asset/angular-data 213 | bower-asset/argjs 214 | bower-asset/arg.js 215 | bower-asset/angularjs-toaster 216 | bower-asset/AngularJS-Toaster 217 | bower-asset/angular-notify-toaster 218 | bower-asset/angular-seo 219 | bower-asset/bower-cortex 220 | bower-asset/ace-build 221 | bower-asset/ace-builds 222 | bower-asset/bootstrap-wizard 223 | bower-asset/angular-material-data-table 224 | bower-asset/angular-ui-sortable 225 | bower-asset/bootcards 226 | bower-asset/band.js 227 | bower-asset/appear 228 | bower-asset/amazeui-react 229 | bower-asset/augment 230 | bower-asset/angular-classy 231 | bower-asset/angular-nvd3 232 | bower-asset/bootstrap.growl 233 | bower-asset/brython 234 | bower-asset/anystretch 235 | bower-asset/beeplay 236 | bower-asset/angular-bluebird 237 | bower-asset/angular-promise 238 | bower-asset/angular-websocket 239 | bower-asset/angular-wizard 240 | bower-asset/benl-angular-wizard 241 | bower-asset/angular-toastr 242 | bower-asset/bootstrap3-typeahead 243 | bower-asset/angular-mobile-nav 244 | bower-asset/angular-checklist-model 245 | bower-asset/backbone.dualstorage 246 | bower-asset/Backbone.dualStorage 247 | bower-asset/beebole-pure 248 | bower-asset/angularjs-multiselect 249 | bower-asset/angular-multi-select 250 | bower-asset/angular-multi-select-master 251 | bower-asset/burger 252 | bower-asset/backbone-react-component 253 | bower-asset/base 254 | bower-asset/bigfoot 255 | bower-asset/angular-jwt 256 | bower-asset/bignumber.js 257 | bower-asset/bigtext 258 | bower-asset/angular-google-chart 259 | bower-asset/balance-text 260 | bower-asset/backbone-offline 261 | bower-asset/backbone.offline 262 | bower-asset/bootstrap-ajax 263 | bower-asset/BookBlock 264 | bower-asset/canvg-gabelerner 265 | bower-asset/amgular-gridster 266 | bower-asset/angular-gridster 267 | bower-asset/angular-permission 268 | bower-asset/angular-snapjs 269 | bower-asset/bootstrapcolorpicker 270 | bower-asset/bootstrap-colorpicker 271 | bower-asset/angular-dashboard-framework 272 | bower-asset/cardkit 273 | bower-asset/background-blur 274 | bower-asset/aight 275 | bower-asset/angular-datatables 276 | bower-asset/bb-angular-datatables 277 | bower-asset/angles 278 | bower-asset/anglesJs 279 | bower-asset/angular-filemanager 280 | bower-asset/bootstrapaccessibilityplugin 281 | bower-asset/angular-timer 282 | bower-asset/bigscreen 283 | bower-asset/angular-breadcrumb 284 | bower-asset/bootstrap-combobox 285 | bower-asset/a 286 | bower-asset/angular-morph 287 | bower-asset/accessibility-developer-tools 288 | bower-asset/big.js 289 | bower-asset/bootstrap-tokenfield 290 | bower-asset/caret.js 291 | bower-asset/Caret.js 292 | bower-asset/alpaca 293 | bower-asset/angucomplete-alt 294 | bower-asset/backbone.epoxy 295 | bower-asset/baguettebox.js 296 | bower-asset/angularytics 297 | bower-asset/backbone.iobind 298 | bower-asset/cardinal 299 | bower-asset/angular-rx 300 | bower-asset/a0-angular-storage 301 | bower-asset/angular-chosen-localytics 302 | bower-asset/bootstrap-contexmenu 303 | bower-asset/bootstrap-contextmenu 304 | bower-asset/angular-bootstrap-nav-tree 305 | bower-asset/angular-bootstrap-nav-tree-nif 306 | bower-asset/bootstrap-chosen 307 | bower-asset/bucketsjs 308 | bower-asset/auth0-angular 309 | bower-asset/bootstrap-maxlength 310 | bower-asset/angular-gettext 311 | bower-asset/angular-dialog-service 312 | bower-asset/Autolinker.js 313 | bower-asset/angular-promise-tracker 314 | bower-asset/angular-spinner 315 | bower-asset/angular-validation 316 | bower-asset/angular-localforage 317 | bower-asset/angular-localForage 318 | bower-asset/acvpp 319 | bower-asset/ang-ro 320 | bower-asset/angular-datepicker 321 | bower-asset/angular-vs-repeat 322 | bower-asset/angular-autosize 323 | bower-asset/angular-elastic 324 | bower-asset/angularjs-slider 325 | bower-asset/bootstrap-ie7 326 | bower-asset/bootstrap-tags 327 | bower-asset/app-router 328 | bower-asset/bootstrap-filestyle 329 | bower-asset/bootstrap-stylus 330 | bower-asset/bootstrap-toggle 331 | bower-asset/bootstrap-rtl 332 | bower-asset/angular-ui-dashboard 333 | bower-asset/angular-ui-select2 334 | bower-asset/better-dom 335 | bower-asset/angular-tour 336 | bower-asset/bootstrap-star-rating 337 | bower-asset/bootstrap-progressbar 338 | bower-asset/backbone-associations 339 | bower-asset/bootstrap3-wysiwyg 340 | bower-asset/angular-markdown-directive 341 | bower-asset/baron 342 | bower-asset/api-designer 343 | bower-asset/angular-facebook 344 | bower-asset/anything.js 345 | bower-asset/backbone-tastypie 346 | bower-asset/animate.less 347 | bower-asset/backbone.syphon 348 | bower-asset/brand-colors 349 | bower-asset/blockrain 350 | bower-asset/angular-payments 351 | bower-asset/angular-kendo 352 | bower-asset/angular-kendo-directives 353 | bower-asset/angular-kendo-ui 354 | bower-asset/angular-paginate-anything 355 | bower-asset/andy 356 | bower-asset/angular-growl 357 | bower-asset/BaremetricsCalendar 358 | bower-asset/catiline 359 | bower-asset/angular-route-segment 360 | bower-asset/angular-sweetalert 361 | bower-asset/angular-sweetalert-promised 362 | bower-asset/autoNumeric 363 | bower-asset/angular-material-icons 364 | bower-asset/angular-google-analytics 365 | bower-asset/backbone-nested-afeld 366 | bower-asset/backbone-nested-model 367 | bower-asset/bearcat 368 | bower-asset/angular-form-builder 369 | bower-asset/angular-tree-control 370 | bower-asset/adazzle-react-data-grid 371 | bower-asset/angular-ui-ace 372 | bower-asset/angular-form-for 373 | bower-asset/bcryptjs 374 | bower-asset/backbone.radio 375 | bower-asset/avalanche-css 376 | bower-asset/angular-motion 377 | bower-asset/bottlejs 378 | bower-asset/backbone-fetch-cache 379 | bower-asset/blockies 380 | bower-asset/alloyeditor 381 | bower-asset/bootpag 382 | bower-asset/angular-bootstrap-calendar 383 | bower-asset/augment.js 384 | bower-asset/backbone-query-parameters 385 | bower-asset/autolayout 386 | bower-asset/angular-material 387 | bower-asset/angular-oauth2 388 | bower-asset/adapter.js 389 | bower-asset/angucomplete 390 | bower-asset/bower-mergely 391 | bower-asset/BttrLazyLoading 392 | bower-asset/angular-slick 393 | bower-asset/ajv 394 | bower-asset/args-js 395 | bower-asset/angular-modal-service 396 | bower-asset/angular-easyfb 397 | bower-asset/bootstrap-sortable 398 | bower-asset/angular-intro.js 399 | bower-asset/bpopup 400 | bower-asset/angular-ui-tinymce 401 | bower-asset/angular-zenpen 402 | bower-asset/backbone.babysitter 403 | bower-asset/angular-devise 404 | bower-asset/ascensor.js 405 | bower-asset/angular-ngautocomplete 406 | bower-asset/angular-youtube-mb 407 | bower-asset/amygdala 408 | bower-asset/animate-transition 409 | bower-asset/ajaxchimp 410 | bower-asset/anchor-js 411 | bower-asset/angular-semantic-ui 412 | bower-asset/backbone-modal 413 | bower-asset/barn 414 | bower-asset/angular-data-table 415 | bower-asset/angularLocalStorage 416 | bower-asset/Angular-localStorage 417 | bower-asset/bootstrap-vertical-tabs 418 | bower-asset/airpub 419 | bower-asset/angular-dragula 420 | bower-asset/angular-dragula.js 421 | bower-asset/animatedheader 422 | bower-asset/AnimatedHeader 423 | bower-asset/angular-ui-layout 424 | bower-asset/angular-css 425 | bower-asset/angular-notify 426 | bower-asset/animatewithsass 427 | bower-asset/angular-scroll-glue 428 | bower-asset/backbone.routeFilter 429 | bower-asset/backbone.wreqr 430 | bower-asset/bigslide 431 | bower-asset/bigSlide 432 | bower-asset/apitizer 433 | bower-asset/api-console 434 | bower-asset/animation-frame 435 | bower-asset/animationFrame 436 | bower-asset/amazeui-touch 437 | bower-asset/allmighty 438 | bower-asset/allmighty-autocomplete 439 | bower-asset/angular-ui-handsontable 440 | bower-asset/angular-inview 441 | bower-asset/air-datepicker 442 | bower-asset/angular-bootstrap-show-errors 443 | bower-asset/angular-underscore 444 | bower-asset/bind.js 445 | bower-asset/angular-ui-notification 446 | bower-asset/bootsketch 447 | bower-asset/bootstrap-duallistbox 448 | bower-asset/bitauth 449 | bower-asset/bson 450 | bower-asset/animate-sass 451 | bower-asset/angular-bootstrap-colorpicker 452 | bower-asset/angular-image-crop 453 | bower-asset/bem-constructor 454 | bower-asset/angular-sails 455 | bower-asset/angular-w5c-validator 456 | bower-asset/angular-native-dragdrop 457 | bower-asset/Blueprint-SlidePushMenus 458 | bower-asset/bootstrap-material-datetimepicker 459 | bower-asset/angular-ui-codemirror 460 | bower-asset/bootstrap-touchspin 461 | bower-asset/all-animation 462 | bower-asset/autofill-event 463 | bower-asset/angularjs-socialshare 464 | bower-asset/axe-core 465 | bower-asset/breakpoint 466 | bower-asset/angularjs-truncate 467 | bower-asset/angular-truncate 468 | bower-asset/angular-truncate-original 469 | bower-asset/angular-ui-map 470 | bower-asset/bootstrap-wysiwyg-steveathon 471 | bower-asset/angular-pageslide-directive 472 | bower-asset/at-table 473 | bower-asset/angular-dynforms 474 | bower-asset/angular-svg-round-progressbar 475 | bower-asset/angular-auto-validate 476 | bower-asset/angular-sortable-view 477 | bower-asset/aload 478 | bower-asset/angular-agility 479 | bower-asset/AngularAgility 480 | bower-asset/angular-materialize 481 | bower-asset/axisj 482 | bower-asset/bootstrap-rating-input 483 | bower-asset/angular-pull-to-refresh 484 | bower-asset/angular-native-picker 485 | bower-asset/angular-pdf 486 | bower-asset/animated-responsive-image-grid 487 | bower-asset/AnimatedResponsiveImageGrid 488 | bower-asset/canvasloader 489 | bower-asset/CanvasLoader 490 | bower-asset/angular-audio 491 | bower-asset/angularjs-datepicker 492 | bower-asset/autocompeter 493 | bower-asset/afkl-lazy-image 494 | bower-asset/angular-block-ui 495 | bower-asset/applepie 496 | bower-asset/angularjs-boilerplate 497 | bower-asset/angular-locker 498 | bower-asset/backbonefire 499 | bower-asset/backfire 500 | bower-asset/caroufredsel 501 | bower-asset/carouFredSel 502 | bower-asset/angular-recaptcha 503 | bower-asset/angular-cookie 504 | bower-asset/brim 505 | bower-asset/angular-once 506 | bower-asset/animated-scrollto 507 | bower-asset/bytebuffer 508 | bower-asset/angular-pickadate 509 | bower-asset/angular-growl-2 510 | bower-asset/angular-growl-3 511 | bower-asset/angular-growl-v2 512 | bower-asset/aja 513 | bower-asset/backbone.subroute 514 | bower-asset/blip 515 | bower-asset/aliyun-sdk 516 | bower-asset/angular-qrcode 517 | bower-asset/angular-ui-date 518 | bower-asset/breakpoint-slicer 519 | bower-asset/angular-slider-venturocket 520 | bower-asset/angular-django-rest-resource 521 | bower-asset/angular-medium-editor 522 | bower-asset/badges 523 | bower-asset/angular-daterangepicker 524 | bower-asset/angular-mask 525 | bower-asset/angular-ng-mask 526 | bower-asset/angular-ngMask 527 | bower-asset/basicModal 528 | bower-asset/angular-highlightjs 529 | bower-asset/angular-dragon-drop 530 | bower-asset/app-layout-templates 531 | bower-asset/basis 532 | bower-asset/basisjs 533 | bower-asset/angular-toasty 534 | bower-asset/backbone-orm 535 | bower-asset/angularjs-imageupload-directive 536 | bower-asset/angular-timeline 537 | bower-asset/backbone.mutators 538 | bower-asset/angular-bootstrap-lightbox 539 | bower-asset/angular-ui-slider 540 | bower-asset/backbone.support 541 | bower-asset/ADE 542 | bower-asset/apollo.js 543 | bower-asset/bootstrap-map-js 544 | bower-asset/alertifyjs 545 | bower-asset/angular-dynamic-locale 546 | bower-asset/angular-smarty 547 | bower-asset/angular-bootstrap-switch 548 | bower-asset/bootstrap3-wysihtml5-bower 549 | bower-asset/angularjs-dropdown-multiselect 550 | bower-asset/angularjs-dropdown-multiselect-sgarcesg1 551 | bower-asset/angular-marked 552 | bower-asset/bootstrap-tabcollapse 553 | bower-asset/background-video 554 | bower-asset/angular-audio-playlist 555 | bower-asset/angular-media-player 556 | bower-asset/ancient-oak 557 | bower-asset/angular-model-factory 558 | bower-asset/adapt-strap 559 | bower-asset/angular-tooltips 560 | bower-asset/algoliasearch 561 | bower-asset/alogs 562 | bower-asset/airbrake-js 563 | bower-asset/airbrake-js-client 564 | bower-asset/angular-pdf-viewer 565 | bower-asset/boombox.js 566 | bower-asset/ajax 567 | bower-asset/alchemyjs 568 | bower-asset/backbone-super 569 | bower-asset/backbone.super 570 | bower-asset/angular-summernote 571 | bower-asset/a11y-toggle 572 | bower-asset/angular-cached-resource 573 | bower-asset/auth0-lock 574 | bower-asset/angular-modal 575 | bower-asset/angular-blocks 576 | bower-asset/asmcrypto 577 | bower-asset/backbone-geppetto 578 | bower-asset/backbone.geppetto 579 | bower-asset/bootstrap-sidebar 580 | bower-asset/barekit 581 | bower-asset/bare-ninja 582 | bower-asset/bootstrap-winjs 583 | bower-asset/angular-autolayout 584 | bower-asset/60fps-scroll 585 | bower-asset/bootstrap-iconpicker 586 | bower-asset/angular-rangeslider 587 | bower-asset/angular-signalr-hub 588 | bower-asset/angular-mass-autocomplete 589 | bower-asset/arc.js 590 | bower-asset/angular-common 591 | bower-asset/blockadblock 592 | bower-asset/bootstrap-autohidingnavbar 593 | bower-asset/bs-autohide-navbar 594 | bower-asset/angular-redactor 595 | bower-asset/bootstrapvalidator 596 | bower-asset/bootstrapValidator 597 | bower-asset/angular-dropdowns 598 | bower-asset/angular-validation-match 599 | bower-asset/adapterjs 600 | bower-asset/angular-perfect-scrollbar 601 | bower-asset/angular-autoFields-bootstrap 602 | bower-asset/angular-ui-router.statehelper 603 | bower-asset/angular-ui-router.stateHelper 604 | bower-asset/bootstrap-datepaginator 605 | bower-asset/angularjs-geolocation 606 | bower-asset/angular-openlayers-directive 607 | bower-asset/angular-adaptive-speech 608 | bower-asset/angular-paging 609 | bower-asset/angular-scroller 610 | bower-asset/angularjs-utilities 611 | bower-asset/angular-virtual-dom 612 | bower-asset/apollo 613 | bower-asset/bootstrap-offcanvas 614 | bower-asset/angular-ladda 615 | bower-asset/angular-parse 616 | bower-asset/angularSails 617 | bower-asset/bootstrap-submenu 618 | bower-asset/angular-credit-cards 619 | bower-asset/angular-isotope 620 | bower-asset/angular-ui-router-anim-in-out 621 | bower-asset/bg-splitter 622 | bower-asset/angular-hateoas 623 | bower-asset/angular-socialshare 624 | bower-asset/angular-flash-alert 625 | bower-asset/autolink 626 | bower-asset/angular-table 627 | bower-asset/angularTable 628 | bower-asset/angular-typeahead 629 | bower-asset/arrive 630 | bower-asset/canv-gauge 631 | bower-asset/a11y.css 632 | bower-asset/angular-flexslider 633 | bower-asset/angular-base64-upload 634 | bower-asset/angular-collection 635 | bower-asset/angular-upload 636 | bower-asset/anuglar-collection 637 | bower-asset/AnythingZoomer 638 | bower-asset/angular 639 | bower-asset/angular2 640 | bower-asset/angularjs 641 | bower-asset/angular-material-datetime 642 | bower-asset/base64 643 | bower-asset/boostrapfile 644 | bower-asset/bootstrap-file-input 645 | bower-asset/bower-angular 646 | bower-asset/angular-load 647 | bower-asset/angular-stripe 648 | bower-asset/angular-google-places-autocomplete 649 | bower-asset/angular-froala 650 | bower-asset/backbone.collectionView 651 | bower-asset/angular-fx 652 | bower-asset/angular-hammer 653 | bower-asset/angular-pouchdb-wspringer 654 | bower-asset/angular-fullscreen 655 | bower-asset/angular-ui-switch 656 | bower-asset/bem-core 657 | bower-asset/angular-slugify 658 | bower-asset/appcache-autoupdate 659 | bower-asset/appcache-nanny 660 | bower-asset/angular-debug-bar 661 | bower-asset/angular-ui-mask 662 | bower-asset/ansi_up 663 | bower-asset/angular-selection-model 664 | bower-asset/async-task 665 | bower-asset/angular-spinkit 666 | bower-asset/angular-material-design-lite 667 | bower-asset/angular-ui-router-tabs 668 | bower-asset/bows 669 | bower-asset/bugsnag 670 | bower-asset/amd-feature 671 | bower-asset/angular-custom-form-validation 672 | bower-asset/angular-ui-form-validation 673 | bower-asset/angular-validator 674 | bower-asset/angular-yandex-map 675 | bower-asset/age 676 | bower-asset/angular-flash 677 | bower-asset/better.js 678 | bower-asset/bonegular 679 | bower-asset/bem-components 680 | bower-asset/bootstrap-ui-datetime-picker 681 | bower-asset/bootsy 682 | bower-asset/adal-angular 683 | bower-asset/angular-chartist.js 684 | bower-asset/angularjs-mongolab 685 | bower-asset/angularjs-mongolab-promise 686 | bower-asset/angular-progress-button-styles 687 | bower-asset/angular-social 688 | bower-asset/angular-bootstrap-slider 689 | bower-asset/angular-bootstrap-slider-f 690 | bower-asset/angular-xml 691 | bower-asset/c3-angular 692 | bower-asset/backbone.touch 693 | bower-asset/bottleneck 694 | bower-asset/angular-highcharts-directive 695 | bower-asset/angular-contenteditable 696 | bower-asset/amplitude 697 | bower-asset/angular-notifications 698 | bower-asset/angular-resizable 699 | bower-asset/angular-selectize2 700 | bower-asset/angular-simple-validation 701 | bower-asset/angular-trix 702 | bower-asset/angular-validation-ghiscoding 703 | bower-asset/bgiframe 704 | bower-asset/angular-poller 705 | bower-asset/angular-video-bg 706 | bower-asset/angularjs-ie8-build 707 | bower-asset/angular-qr 708 | bower-asset/angular-recursion 709 | bower-asset/anno.js 710 | bower-asset/angular-aside 711 | bower-asset/angular-unsavedChanges 712 | bower-asset/ArkUI 713 | bower-asset/boomerang 714 | bower-asset/bootstrap-touch-carousel 715 | bower-asset/angularjs-modal-service 716 | bower-asset/3l 717 | bower-asset/angular-history 718 | bower-asset/amaranjs 719 | bower-asset/backbone.controller 720 | bower-asset/bootstrap-without-jquery 721 | bower-asset/babelfish 722 | bower-asset/angular2-now 723 | bower-asset/angular-aop 724 | bower-asset/bootstrap-ios7 725 | bower-asset/ajaxq 726 | bower-asset/angular-bacon 727 | bower-asset/angular-hammerjs 728 | bower-asset/angular-progress-arc 729 | bower-asset/angular-echarts 730 | bower-asset/angular-route-styles 731 | bower-asset/angular-responsive 732 | bower-asset/angular-spotify 733 | bower-asset/angular-sails-bind 734 | bower-asset/angular-toggle-switch 735 | bower-asset/bardjs 736 | bower-asset/bootcamp 737 | bower-asset/bootstrap.native 738 | bower-asset/angular-atomic-notify 739 | bower-asset/angular-object-table 740 | bower-asset/angular-advanced-searchbox 741 | bower-asset/angular-css-injector 742 | bower-asset/angular-immutable 743 | bower-asset/angularjs-indexedDB 744 | bower-asset/angular-tablesort 745 | bower-asset/backbone.cachingSync 746 | bower-asset/Backbone.cachingSync 747 | bower-asset/angular-base64 748 | bower-asset/angular-morris-chart 749 | bower-asset/amitava82-angular-multiselect 750 | bower-asset/angular-activerecord 751 | bower-asset/angular-swing 752 | bower-asset/angular-pusher 753 | bower-asset/backbone-poller 754 | bower-asset/angular-growl-notifications 755 | bower-asset/avatar 756 | bower-asset/angular-gravatar 757 | bower-asset/backbone-computedfields 758 | bower-asset/backbone.computedfields 759 | bower-asset/better-dateinput-polyfill 760 | bower-asset/bootstrap-flat 761 | bower-asset/angular-awesome-slider 762 | bower-asset/angular-directive.g-signin 763 | bower-asset/angular-bootstrap 764 | bower-asset/angular-ui-bootstrap-bower 765 | bower-asset/asciidoctor.js 766 | bower-asset/backbone.subviews 767 | bower-asset/angularD3 768 | bower-asset/angular-tags 769 | bower-asset/angular-tags-meanstack 770 | bower-asset/backbone.statemanager 771 | bower-asset/angular-typer 772 | bower-asset/bimap 773 | bower-asset/bootstrap-gtreetable 774 | bower-asset/angular-winjs 775 | bower-asset/bem-cn 776 | bower-asset/bem-react 777 | bower-asset/bootstrap-rating 778 | bower-asset/angulargrid 779 | bower-asset/angular-indexed-db 780 | bower-asset/api-check 781 | bower-asset/bio-pv 782 | bower-asset/angular-component.js 783 | bower-asset/angular-feature-flags 784 | bower-asset/angular-ui-scroll 785 | bower-asset/angular-velocity 786 | bower-asset/anchorify 787 | bower-asset/bubbletree 788 | bower-asset/angular-slick-carousel 789 | bower-asset/brandbuttons 790 | bower-asset/BrandButtons 791 | bower-asset/aether 792 | bower-asset/angular-ui-bootstrap-datetimepicker 793 | bower-asset/angular-webstorage 794 | bower-asset/angular-lodash 795 | bower-asset/angular-scroll-watch 796 | bower-asset/angular-retina 797 | bower-asset/angular-esri-map 798 | bower-asset/angular-img-fallback 799 | bower-asset/angular-viewport-watch 800 | bower-asset/animateCSS 801 | bower-asset/backbone_mediator 802 | bower-asset/backbone-paginator 803 | bower-asset/bellows 804 | bower-asset/autocompletelikegoogle 805 | bower-asset/barista 806 | bower-asset/blob-util 807 | bower-asset/angular-google-gapi 808 | bower-asset/angular-wamp 809 | bower-asset/backbone.advice 810 | bower-asset/angular-ueditor 811 | bower-asset/alameda 812 | bower-asset/backbone.courier 813 | bower-asset/bselect 814 | bower-asset/avoscloud-sdk 815 | bower-asset/cajon 816 | bower-asset/Case 817 | bower-asset/angular-debaser 818 | bower-asset/angular-react 819 | bower-asset/backbone.obscura 820 | bower-asset/bootstrap-show-password 821 | bower-asset/angular-confirm-modal 822 | bower-asset/angular-flash-messages 823 | bower-asset/angular-soundmanager2 824 | bower-asset/autogrow 825 | bower-asset/angular-click-outside 826 | bower-asset/angular-chart 827 | bower-asset/artyom.js 828 | bower-asset/bluebutton.js 829 | bower-asset/angular-bootstrap-checkbox 830 | bower-asset/angular-ivh-treeview 831 | bower-asset/bootstrap-confirmation2 832 | bower-asset/bootswatch-scss 833 | bower-asset/braintree-web 834 | bower-asset/bs-confirmation 835 | bower-asset/bs-typeahead 836 | bower-asset/angular-lazyload 837 | bower-asset/angular-parallax 838 | bower-asset/bin-packing-grid 839 | bower-asset/angular-custom-element 840 | bower-asset/angular-route 841 | bower-asset/angular-spring-data-rest 842 | bower-asset/backbone.basicauth 843 | bower-asset/Backbone.xmpp 844 | bower-asset/bemify 845 | bower-asset/bootstrap-modal-carousel 846 | bower-asset/bower-angular-route 847 | bower-asset/a1atscript 848 | bower-asset/amalia.js 849 | bower-asset/arctext-js 850 | bower-asset/bootstrap-checkbox 851 | bower-asset/astorage 852 | bower-asset/backbone.giraffe 853 | bower-asset/angular-app-container 854 | bower-asset/angular-fontawesome 855 | bower-asset/angular-hal 856 | bower-asset/angular-media-queries 857 | bower-asset/angular-relative 858 | bower-asset/angular-widget 859 | bower-asset/angular-animate 860 | bower-asset/angular-disqus 861 | bower-asset/angular-keepr 862 | bower-asset/angular-img-cropper 863 | bower-asset/angular-wysiwyg 864 | bower-asset/backbone.uniquemodel 865 | bower-asset/beez 866 | bower-asset/bootstrap-sf1 867 | bower-asset/angular-couch-potato 868 | bower-asset/angular-logX 869 | bower-asset/angular-md5 870 | bower-asset/angular-swiper 871 | bower-asset/backbone.nativeview 872 | bower-asset/backbone.supermodel 873 | bower-asset/angular-bootstrap-contextmenu 874 | bower-asset/angular-timeago 875 | bower-asset/bootstrap-markdown-editor 876 | bower-asset/angular-form-gen 877 | bower-asset/bootstrap-arabic 878 | bower-asset/calc-polyfill 879 | bower-asset/ahoy 880 | bower-asset/angular-dc 881 | bower-asset/angular-ui-chart 882 | bower-asset/angular-cropme 883 | bower-asset/angular-filters 884 | bower-asset/Backbone.Schema 885 | bower-asset/angular-bootstrap-select 886 | bower-asset/angular-csv-import 887 | bower-asset/angular-emoji-filter 888 | bower-asset/angular-emoji-popup 889 | bower-asset/angular-formly-templates-bootstrap 890 | bower-asset/angular-masonry-directive 891 | bower-asset/angular-slider 892 | bower-asset/autogrow-textarea 893 | bower-asset/angular-odata-resources 894 | bower-asset/bootstrap-magnify 895 | bower-asset/app-loading 896 | bower-asset/basicContext 897 | bower-asset/angular-acl 898 | bower-asset/angular-google-maps-native 899 | bower-asset/apiNG 900 | bower-asset/api-spec-converter 901 | bower-asset/arcgis-cedar 902 | bower-asset/ash-js 903 | bower-asset/behavior3js 904 | bower-asset/bower-ionic 905 | bower-asset/algolia-autocomplete.js 906 | bower-asset/angular-videosharing-embed 907 | bower-asset/backbone-websql 908 | bower-asset/bitset.js 909 | bower-asset/amcharts3 910 | bower-asset/angular-decorators 911 | bower-asset/angular-toArrayFilter 912 | bower-asset/academicons 913 | bower-asset/angular-drupal 914 | bower-asset/angularjs-gravatar 915 | bower-asset/angularjs-gravatardirective 916 | bower-asset/angular-lazy-img 917 | bower-asset/angular-ui-router-title 918 | bower-asset/arangojs 919 | bower-asset/aviator 920 | bower-asset/angular2-moment 921 | bower-asset/angular-ellipsis 922 | bower-asset/angular-i18n 923 | bower-asset/angularplasmid 924 | bower-asset/angular-spectrum-colorpicker 925 | bower-asset/backbone-autocomplete 926 | bower-asset/bem-grid 927 | bower-asset/angular-bootstrap-simple-chat 928 | bower-asset/Backbone.BindTo 929 | bower-asset/angular-hovercard 930 | bower-asset/angularjs-viewhead 931 | bower-asset/angular-multi-step-form 932 | bower-asset/Backbone.Handlebars 933 | bower-asset/base-64 934 | bower-asset/acho 935 | bower-asset/angular2-grid 936 | bower-asset/angular-masonry-fly 937 | bower-asset/angular-ui-router-styles 938 | bower-asset/aurelia-dependency-injection 939 | bower-asset/ayre 940 | bower-asset/blazecss 941 | bower-asset/add-clear 942 | bower-asset/angular-clipboard 943 | bower-asset/backbone.unclassified 944 | bower-asset/am-grid 945 | bower-asset/angular-http-batcher 946 | bower-asset/angular-mocks 947 | bower-asset/angular-print 948 | bower-asset/angularPrint 949 | bower-asset/angular-raven 950 | bower-asset/app.json 951 | bower-asset/array-future 952 | bower-asset/backbone-nested 953 | bower-asset/bibi 954 | bower-asset/blittle_backbone-nested-models 955 | bower-asset/bower-angular-mocks 956 | bower-asset/angular-intercom 957 | bower-asset/angular-intercom.io 958 | bower-asset/angular-palette2 959 | bower-asset/bacon.jquery 960 | bower-asset/bacon-jquery-bindings 961 | bower-asset/aha-table 962 | bower-asset/angular-formly-templates-ionic 963 | bower-asset/angular-knob 964 | bower-asset/angular-order-object-by 965 | bower-asset/angular-promise-buttons 966 | bower-asset/animatesprite 967 | bower-asset/assemble-bootstrap 968 | bower-asset/astarisx 969 | bower-asset/backbone.hammer 970 | bower-asset/backbone.hammer.js 971 | bower-asset/boilerplate-bootstrap 972 | bower-asset/bootstrap-additions 973 | bower-asset/angular-azure-mobile-service 974 | bower-asset/angular-mapbox 975 | bower-asset/angular.panels 976 | bower-asset/angular-phonegap-push-notification 977 | bower-asset/angular-spinners 978 | bower-asset/bootstrap-easy-sidebar 979 | bower-asset/action 980 | bower-asset/angular-notification 981 | bower-asset/angular-resource 982 | bower-asset/angular-ripple 983 | bower-asset/angular-smoothscroll 984 | bower-asset/angular-touch 985 | bower-asset/angular-ui-table-view 986 | bower-asset/ariatemplates 987 | bower-asset/aurelia-validation 988 | bower-asset/bem-classnames 989 | bower-asset/bootstrap-css-only 990 | bower-asset/bootswatch-dist 991 | bower-asset/accounts-phone 992 | bower-asset/angular-animate-css 993 | bower-asset/angular-ckeditor 994 | bower-asset/angular-meditor 995 | bower-asset/angular-swipe 996 | bower-asset/angular-bind-html-compile 997 | bower-asset/angular-date-range-picker 998 | bower-asset/angular-diff-match-patch 999 | bower-asset/angular-facebook-utils 1000 | bower-asset/angular-fcsa-number -------------------------------------------------------------------------------- /history.md: -------------------------------------------------------------------------------- 1 | # hiqdev/asset-packagist 2 | 3 | ## [1.0.1] - 2018-05-29 4 | 5 | - Fixed executed jobs limit to follow `yiisoft/yii2-queue` API changes [@SilverFire] 6 | - [c98c9fa] 2018-05-29 Fixed executed jobs limit to follow yiisoft/yii2-queue API changes [@SilverFire] 7 | 8 | ## [1.0.0] - 2018-05-25 9 | 10 | - Fixed XSS vulnerabilities 11 | - [92c0fd7] 2017-12-11 Fixed XSS vulnerabilities [@SilverFire] 12 | - Added patch version support for `bower-asset/angular` 13 | - [be126d4] 2017-10-01 added converting patch version to RC for bower-asset/angular [@hiqsol] 14 | - Added redirect to package page when its full name given 15 | - [eb93960] 2017-07-04 improved search: added redirect to package page when full name given [@hiqsol] 16 | - Refactored internals: RegistryFactory, Mutex <- Locker, logging 17 | - [cd0f3cc] 2017-05-18 csfixed [@hiqsol] 18 | - [b76fbcd] 2017-05-18 Merge pull request #50 from edgardmessias/refactored [@hiqsol] 19 | - [dc47aff] 2017-05-16 Added comments [@edgardmessias] 20 | - [863dea3] 2017-05-16 Refactored RegistryFactory [@edgardmessias] 21 | - [1f0abde] 2017-05-12 Merge pull request #48 from `edgardmessias/locker_to_mutex` [@hiqsol] 22 | - [035f1ea] 2017-05-12 Merge pull request #49 from `edgardmessias/queue_jobs` [@hiqsol] 23 | - [6f7aaae] 2017-05-11 Serialize only the name of package for more performance in queue jobs [@edgardmessias] 24 | - [ab5e2bd] 2017-05-11 Switch Locker to Mutex (Close #47) [@edgardmessias] 25 | - [257b2f5] 2017-05-10 csfixed [@hiqsol] 26 | - [b1a7d9c] 2017-05-10 Merge pull request #44 from `edgardmessias/composer_log` [@hiqsol] 27 | - [0aa27f6] 2017-05-08 Added composer log into Yii [@edgardmessias] 28 | - Updated documentation 29 | - [5b5f435] 2017-05-10 docs [@hiqsol] 30 | - [2dd8b25] 2016-06-16 added Yii2 section to about page [@hiqsol] 31 | - [a607125] 2016-06-09 added Installing to a custom path manual [@hiqsol] 32 | - [e3cb136] 2016-06-03 added how it works on about page [@hiqsol] 33 | - [ec7bbcd] 2017-04-27 Enhanced wording [@SilverFire] 34 | - [d4fee59] 2017-04-25 Update documentation to use oomphinc/composer-installers-extender [@SilverFire] 35 | - [87e2662] 2017-04-25 Fixed syntax error in AssetPackage [@SilverFire] 36 | - [5a70619] 2017-04-24 Merge pull request #30 from edgardmessias/patch-1 [@SilverFire] 37 | - [de93971] 2017-04-20 Updated example in about page [@edgardmessias] 38 | - Fixed use of `hidev` 39 | - [eabafbb] 2017-05-10 fixed storage actions in goals [@hiqsol] 40 | - [d8b5b87] 2017-05-10 added require hidev (to substitute yii) [@hiqsol] 41 | - [4c94e8f] 2017-05-08 fixed tests [@hiqsol] 42 | - [122874e] 2017-05-08 csfixed [@hiqsol] 43 | - [5390524] 2017-05-05 fixed config for controllers [@hiqsol] 44 | - [d89b68c] 2017-05-04 fixed hidev config for hidev 0.6 [@hiqsol] 45 | - [b850cba] 2017-05-05 renamed configs `web`, `console` <- hisite, hidev [@hiqsol] 46 | - Implemented package management using queues with [zhuravljov/yii2-queue] 47 | - [9f54f52] 2017-09-29 Updated to use `yiisoft/yii2-queue`, implemented sequention jobs execution limit [@SilverFire] 48 | - [2ba21ee] 2017-09-29 Switched to yiisoft/yii2-queue [@SilverFire] 49 | - [9b7d7ff] 2017-09-21 Added migration to follow yii2-queue API changes [@SilverFire] 50 | - [88b96a6] 2018-05-23 Updated `QueueController` to follow yii2-queue API changes [@SilverFire] 51 | - [ace352d] 2017-05-05 Merge pull request #42 from edgardmessias/fix-queue [@SilverFire] 52 | - [7c5d01d] 2017-05-05 Fixed [zhuravljov/yii2-queue] API changes [@edgardmessias] 53 | - [b07d11b] 2017-05-04 Updated to follow [zhuravljov/yii2-queue] API changes [@SilverFire] 54 | - [a72bade] 2017-05-05 csfixed [@hiqsol] 55 | - [7a3380c] 2017-05-05 Merge pull request #41 from edgardmessias/patch-6 [@hiqsol] 56 | - [b781661] 2017-05-04 Ignored AliasPackage (Close #40) [@edgardmessias] 57 | - [7fb4ac1] 2017-03-30 Merge pull request #29 from zhuravljov/master [@SilverFire] 58 | - [9e4c259] 2017-03-30 Last changes for [zhuravljov/yii2-queue] [@zhuravljov] 59 | - [c0bfeb1] 2016-12-19 Do not save succesfully finished jobs in Queue [@SilverFire] 60 | - [9eb09aa] 2016-12-07 Updated to follow changes [zhuravljov/yii2-queue] [@zhuravljov] 61 | - [cb803cb] 2016-12-06 Updated QueueController to follow changes in [zhuravljov/yii2-queue] [@SilverFire] 62 | - [5ff526c] 2016-12-01 Added maintenance/update-expired action [@SilverFire] 63 | - [9515fd0] 2016-12-01 Refactored Storage - added StorageInterface, changes visibiliy of some method [@SilverFire] 64 | - [bc20b98] 2016-11-30 Fixed typo [@SilverFire] 65 | - Improved look, moved search form to NavBar, added color by stability in package details page 66 | - [d428eef] 2017-05-27 added require yii2-hiart-librariesio and yii2-hiart-guzzle [@hiqsol] 67 | - [2ec9f08] 2017-05-27 Merge pull request #52 from `edgardmessias/improved_search` [@hiqsol] 68 | - [b9972eb] 2017-05-24 Added image by platform in result search [@edgardmessias] 69 | - [9f04bf5] 2017-05-24 Added "Powered by libraries.io" [@edgardmessias] 70 | - [3511c98] 2017-05-23 Improved Search using libraries.io (Close #36) [@edgardmessias] 71 | - [33befd4] 2017-05-11 added container class in outer div [@hiqsol] 72 | - [856c104] 2017-05-10 added breadcrumbs and subtitle for pages [@hiqsol] 73 | - [6aa8285] 2017-05-10 fixed navbar menu [@hiqsol] 74 | - [7f3a5b4] 2017-05-10 removed flat theme tuning views [@hiqsol] 75 | - [bbbb7b5] 2017-05-10 added NavbarMenu with search form [@hiqsol] 76 | - [ca928cf] 2017-05-10 moved theme tuning to views/themes [@hiqsol] 77 | - [cd5c912] 2017-05-10 added search form into main menu [@hiqsol] 78 | - [300594c] 2017-05-10 removed original theme tuning [@hiqsol] 79 | - [6438a47] 2017-05-04 Revert "Fixed styles" [@SilverFire] 80 | - [b599663] 2017-05-04 Fixed styles [@SilverFire] 81 | - [404f689] 2017-04-28 Code style adjustment [@SilverFire] 82 | - [c226cff] 2017-04-28 Moved `_after_header` to Flat theme layout [@tafid] 83 | - [7f43b83] 2017-04-28 Changed css styles [@tafid] 84 | - [1ed2835] 2017-04-28 Added AppAsset bundle to config [@tafid] 85 | - [5b0a29f] 2017-04-28 Added FontAwesome like defer [@tafid] 86 | - [f5f7713] 2017-04-28 Added layouts for Original theme [@tafid] 87 | - [9a8db4a] 2017-04-28 Added layouts for Flat theme [@tafid] 88 | - [1aa2d23] 2017-04-28 Merge pull request #35 from edgardmessias/patch-5 [@SilverFire] 89 | - [edcc58c] 2017-04-28 Added color by stability [@edgardmessias] 90 | - Added order for packages releases 91 | - [8542c16] 2017-05-16 Refactored package sort [@edgardmessias] 92 | - [f87848c] 2017-04-27 Merge pull request #32 from edgardmessias/patch-3 [@SilverFire] 93 | - [0ea6a4a] 2017-04-27 Code style fixed [@SilverFire] 94 | - [1ae0b89] 2017-04-27 Added order for packages releases [@edgardmessias] 95 | - Added `version_normalized` 96 | - [76f75df] 2017-04-27 Merge pull request #31 from edgardmessias/patch-2 [@SilverFire] 97 | - [383e494] 2017-04-27 Updated changelog [@SilverFire] 98 | - [85a5314] 2017-04-26 Added `version_normalized` [@edgardmessias] 99 | - Added providing `require` to support dependencies of bower/npm packages 100 | - [03c8992] 2016-08-13 added providing `require` to AssetPackage #14 [@hiqsol] 101 | - Added DB layer to store packages and their properties 102 | - [d1130a1] 2016-11-30 Added packages table. Added duplication prevention. [@SilverFire] 103 | - Added dependencies auto resolving for new packages 104 | - [22ab667] 2016-11-30 Added Package dependencies resolving [@SilverFire] 105 | - [5a29a01] 2016-11-29 Added common config [@SilverFire] 106 | - Added automatic package avoiding for corrupted packages, enhanced error handling 107 | - [257eb43] 2017-04-27 csfixed [@SilverFire] 108 | - [6330bce] 2016-12-19 Enhanced Storage to report file system errors [@SilverFire] 109 | - [e482226] 2016-11-30 Enhanced error handling in PackageUpdateCommand [@SilverFire] 110 | - [0437aee] 2017-04-26 Refactored UpdateController, enhanced error handling [@SilverFire] 111 | - [a0562a3] 2017-04-24 Added package avoiding [@SilverFire] 112 | - [bb771de] 2017-04-24 Added migration for package avoiding [@SilverFire] 113 | - [a96ef4b] 2017-04-27 Added AssetPackageController::actionAvoid [@SilverFire] 114 | - [bd5dca3] 2017-04-27 Enhanced error handling, implemented auto-ignoring [@SilverFire] 115 | - [cfd2352] 2017-04-27 Added AssetPackageController::actionAddUpdateCommand() [@SilverFire] 116 | - [e22d364] 2017-04-27 Fixed PackageRepository::getExpiredForUpdate() [@SilverFire] 117 | - [7d20e30] 2017-04-26 Enhanced error handling [@SilverFire] 118 | - [bdc0fb1] 2017-04-26 Enhanced package info displaying [@SilverFire] 119 | - [1c947e1] 2017-04-26 Bootstarap log module [@SilverFire] 120 | - Fixed minor issues 121 | - [18bfb40] 2018-05-23 Updated changelogs [@SilverFire] 122 | - [ea55b5c] 2017-06-30 switched icons to fixed weight fontawesome [@hiqsol] 123 | - [8a5882e] 2017-06-30 csfixed [@hiqsol] 124 | - [a5f52c5] 2017-06-30 added AppAsset to be registered by themeManager at startup [@hiqsol] 125 | - [f4dc2fc] 2017-06-16 Merge pull request #56 from `anyt/add_license_information_to_package_info` [@hiqsol] 126 | - [b2c50d1] 2017-06-15 Added license information to package info. [yatsenco@gmail.com] 127 | - [38e5b4b] 2017-05-27 added icon for License at _search_item [@hiqsol] 128 | - [8ea9f6b] 2017-05-27 redone to use `yii2-hiart-librariesio` [@hiqsol] 129 | - [68e6592] 2017-05-27 added AssetPackage::isAvailable and buildNormalName [@hiqsol] 130 | - [eb5f5d9] 2017-10-01 added `normalizeScopedName` [@hiqsol] 131 | - [052b795] 2017-07-17 moved `yiisoft/yii2-debug` to require-dev closes #46 [@hiqsol] 132 | - [e1f21c7] 2017-12-16 Merge pull request #75 from and800/master [@hiqsol] 133 | - [0365f77] 2017-10-20 Merge pull request #73 from SilverFire/master [@hiqsol] 134 | - [27ad14d] 2017-10-20 Updated fxp/composer-asset-plugin constraint to ^1.4.2 [@SilverFire] 135 | - [843800f] 2018-02-17 typo [@hiqsol] 136 | - [59e4260] 2017-04-24 Fixed to follow FXP/composer-asset-plugin API changes [@SilverFire] 137 | - [c95600b] 2017-05-08 Merge pull request #43 from `edgardmessias/fix_urls` [@SilverFire] 138 | - [2c47200] 2017-05-08 Fixed urls for use in urlManager [@edgardmessias] 139 | - [399d379] 2017-03-02 Merge pull request #27 from githubjeka/patch-1 [@hiqsol] 140 | - [0afdfd2] 2017-03-02 improved query param [et.coder@gmail.com] 141 | - [1a3454c] 2017-01-12 add github issue template [@hiqsol] 142 | - [dc4ccd1] 2016-12-08 Merge pull request #22 from zhuravljov/master [@SilverFire] 143 | - [e14172c] 2017-04-27 Added STAT cache cleaning in Storage [@SilverFire] 144 | - [a5fb28b] 2017-04-27 Enhanced Storage::writePackagesJson() to touch file after update [@SilverFire] 145 | - [d34e57b] 2017-04-23 csfixed [@hiqsol] 146 | - [e547396] 2017-04-21 removed require theme, moved to root package [@hiqsol] 147 | - [5de31be] 2017-04-21 Fixed DIC configuration [@SilverFire] 148 | - [bb6c7ad] 2017-04-21 removed outdated config/web [@hiqsol] 149 | - [90d9aee] 2017-04-21 added default `favicon.ico` (empty for the moment) [@hiqsol] 150 | - [5918e90] 2017-04-21 fixed namespace [@hiqsol] 151 | - [73f4c57] 2017-04-21 updated config, removed Bootstrap [@hiqsol] 152 | - [d212aec] 2017-04-20 Added package type [@edgardmessias] 153 | - [c8357d5] 2016-07-06 fixed `AssetPackage::checkName()` [@hiqsol] 154 | - [25011fc] 2016-07-06 added `@composer` alias [@hiqsol] 155 | - [8ee6ad3] 2016-06-23 merged [@hiqsol] 156 | - [5935538] 2016-06-24 Merge pull request #9 from redcatphp/master [@hiqsol] 157 | - [4b7abfa] 2016-06-23 minor issues fixes from Jo Surikat [@hiqsol] 158 | - [75f260a] 2016-06-23 fixed getting Storage object [@hiqsol] 159 | - [b13b523] 2016-06-23 add missing getInstance, return excpected type when empty, check isset [jo@surikat.pro] 160 | - [2ea4464] 2016-06-23 csfixed [@hiqsol] 161 | - [38dba2f] 2016-06-23 Merge pull request #8 from redcatphp/master [@hiqsol] 162 | - [344c0d7] 2016-06-23 avoid undefined index "dist" or "source" error [jo@surikat.pro] 163 | - [e23568a] 2016-06-23 avoid undefined index "searchQuery" error [jo@surikat.pro] 164 | - [ec4c66d] 2016-06-23 improved storage create and chmod [@hiqsol] 165 | - [5939201] 2016-06-23 + packageStorage component to hidev config [@hiqsol] 166 | - [f105752] 2016-06-23 Merge pull request #6 from redcatphp/master [@hiqsol] 167 | - [78ca261] 2016-06-23 typo fix class hiqdev\assetpackagist\components\AssetPackage not found [jo@surikat.pro] 168 | - [4986993] 2016-06-16 fixed #3 removed search option from packages.json [@hiqsol] 169 | - [5138f54] 2016-06-16 added displaying last updated at package details [@hiqsol] 170 | - [d35611e] 2016-06-16 fixed problems with character case [@hiqsol] 171 | - [ecf5aef] 2016-06-16 removed breadcrumbs [@hiqsol] 172 | - [5be5f6b] 2016-09-29 moved and moved menus to own folder [@hiqsol] 173 | - [ddfa3ac] 2016-09-29 + more ignores [@hiqsol] 174 | - [224f496] 2016-09-29 csfixed [@hiqsol] 175 | - [db4966b] 2016-09-01 used PoweredBy widget [@hiqsol] 176 | - [e69ed1c] 2016-08-31 redoing to hisite [@hiqsol] 177 | - [b5b2fa7] 2016-08-22 + footer menu [@hiqsol] 178 | - [41033a6] 2016-08-22 + standart actions: error and captcha [@hiqsol] 179 | - [e72a72a] 2016-08-22 + require `yii2-pnotify` [@hiqsol] 180 | - [6452275] 2016-08-22 added noTitle param for flat theme [@hiqsol] 181 | - [cf3855f] 2016-08-22 added menu, simplified config [@hiqsol] 182 | - [62c099e] 2016-08-21 + require hisite-core and themes [@hiqsol] 183 | - [442259c] 2016-08-20 + `session_write_close` in site/update [@hiqsol] 184 | - [55e1777] 2016-08-13 redone bumping to use `chkipper` [@hiqsol] 185 | 186 | ## [0.1.0] - 2016-05-31 187 | 188 | - Fixed minor issues for first release 189 | - [4471376] 2016-05-30 + notFound page [@hiqsol] 190 | - [1f862c1] 2016-05-30 + buildPackageUrl() [@hiqsol] 191 | - [80fb19c] 2016-05-26 fixing chmod-storage goal [@hiqsol] 192 | - [6f6392a] 2016-05-26 added aliases to composer-config-plugin [@hiqsol] 193 | - [ffd2ad5] 2016-05-26 redoing to composer-config-plugin [@hiqsol] 194 | - [a1478ad] 2016-05-26 redoing to `composer-config-plugin` [@hiqsol] 195 | - [133a210] 2016-05-05 fixed dependencies constraints [@hiqsol] 196 | - [e0c6316] 2016-05-04 added `params-local.php` [@hiqsol] 197 | - [305b331] 2016-05-04 fixed version constraints [@hiqsol] 198 | - [fcfa683] 2016-05-04 Merge pull request #1 from samdark/patch-1 [@hiqsol] 199 | - [fa7bcae] 2016-05-04 Better front page wording [sam@rmcreative.ru] 200 | - [a90a482] 2016-05-04 fixed version constraints [@hiqsol] 201 | - Implemented package details page 202 | - [5fad211] 2016-05-19 Implemented package details page [@SilverFire] 203 | - [2195919] 2016-05-19 Update styles [@SilverFire] 204 | - [00e23b9] 2016-05-18 Fixed search form submit url [@SilverFire] 205 | - [f3f873f] 2016-05-18 Implemented package update from the we application [@SilverFire] 206 | - [7183235] 2016-05-17 Added passing of searchQuery to view params [@SilverFire] 207 | - Added and improved texts and package description 208 | - [97e289c] 2016-05-14 added empty counters template to be themed in real site [@hiqsol] 209 | - [9b6ed61] 2016-05-14 added Usage description [@hiqsol] 210 | - [00ff6f1] 2016-05-14 improved description: added logo [@hiqsol] 211 | - [7baf614] 2016-05-14 added package description [@hiqsol] 212 | - [cfb3ae4] 2016-05-14 fixed dependencies [@hiqsol] 213 | - [dd4f37d] 2016-05-14 removed web dir [@hiqsol] 214 | - [71631fe] 2016-05-14 added/improved texts [@hiqsol] 215 | - [63c7c89] 2016-05-12 Added error handling for asset-package/update and update-list [@SilverFire] 216 | - [c9bd8a4] 2016-05-12 Updated PHPDocs, minor [@SilverFire] 217 | - Added Top-1000 Bower packages 218 | - [591f219] 2016-05-12 Added try/catch to AssetPackageController::actionUpdate [@SilverFire] 219 | - [e01d992] 2016-05-11 Added creating of runtime directory in BowerPackageController [@SilverFire] 220 | - [f66e733] 2016-05-11 Added BowerPackageController and actionFetchTop [@SilverFire] 221 | - [082935a] 2016-05-11 Added TOP-100 Bower components to bower.list [@SilverFire] 222 | - [2728344] 2016-05-11 Updated composer.json - added guzzle dependency [@SilverFire] 223 | - [26c30b0] 2016-05-11 Fixed wrong namespaces in Locker; [@SilverFire] 224 | - [4e28d86] 2016-05-11 Updated Usage block on index.php [@SilverFire] 225 | - [9499664] 2016-05-10 + `asset-package/update-all` action [@hiqsol] 226 | - [b4d5c47] 2016-05-10 fixed default lastId [@hiqsol] 227 | - [4678f67] 2016-05-10 removed obsolete PackagesController [@hiqsol] 228 | - [54a8f54] 2016-05-10 added check exitcode when running hidev update package [@hiqsol] 229 | - Changed: rearranged config files to new scheme 230 | - [c77aa60] 2016-05-10 fixed typo [@hiqsol] 231 | - [569947f] 2016-05-10 + `chmod-storage` goal [@hiqsol] 232 | - [b4cf57b] 2016-05-10 still rearranging configs [@hiqsol] 233 | - [c9665bb] 2016-05-10 csfixed [@hiqsol] 234 | - [6a38eb9] 2016-05-10 still rearranging configs [@hiqsol] 235 | - [54ede7d] 2016-05-09 added `config/common.php` [@hiqsol] 236 | - [46631a7] 2016-05-09 redone configs to hidev and hisite [@hiqsol] 237 | - [d2e0f0f] 2016-05-09 moved logos to AppAsset [@hiqsol] 238 | - Changed: redone to `hiqdev/asset-packagist` 239 | - [a85830f] 2016-05-08 changed to hisite-config [@hiqsol] 240 | - [f6aa46d] 2016-05-08 csfixed [@hiqsol] 241 | - [9f7d0b6] 2016-05-08 + hisite-web extension config [@hiqsol] 242 | - [cf2d54d] 2016-05-07 fixed asset-packagist/test action to check storage dir existance [@hiqsol] 243 | - [e7be6b1] 2016-05-05 redone to `hiqdev/asset-packagist` [@hiqsol] 244 | - [08aeb23] 2016-05-05 splitted out `.hidev/goals.yml` [@hiqsol] 245 | - Added list operations 246 | - [1af8dc9] 2016-05-05 + `packages.list` instead of `min_packages.sh` [@hiqsol] 247 | - [37d40a7] 2016-05-05 + list and update-list actions [@hiqsol] 248 | - [a6214a3] 2016-05-05 + read and list functions [@hiqsol] 249 | - [2460d3e] 2016-05-05 + AssetPackage::splitFullName [@hiqsol] 250 | - Added search 251 | - [8afec1f] 2016-04-25 fixed tests [@hiqsol] 252 | - [01d5501] 2016-04-25 + search. it all works now [@hiqsol] 253 | - [f9c3cb1] 2016-04-25 + storage and clean-storage goals [@hiqsol] 254 | - [411bbea] 2016-04-25 + ignore storage files [@hiqsol] 255 | - [d84636c] 2016-04-25 used local hidev [@hiqsol] 256 | - [868e934] 2016-04-24 added `buildHashedPath` [@hiqsol] 257 | - Chandged: redone with `Storage` and `Locker` 258 | - [a48dfb0] 2016-04-24 renamed `do` goal -> `asset-packagist` in `min_packages.sh` [@hiqsol] 259 | - [9a1769d] 2016-04-24 redone buildPath and used Locker [@hiqsol] 260 | - [9f38225] 2016-04-24 added locking [@hiqsol] 261 | - [12b17af] 2016-04-23 renamed `do` goal -> `asset-packagist` [@hiqsol] 262 | - [f9dfeee] 2016-04-23 still redoing with `Storage` NOT FINISHED [@hiqsol] 263 | - [0deab6f] 2016-04-23 inited tests [@hiqsol] 264 | - [48f69b5] 2016-04-23 redoing storage BROKEN [@hiqsol] 265 | - [3134a13] 2016-04-17 + search form [@hiqsol] 266 | - [2a6f9ff] 2016-04-16 + downloaded logos [@hiqsol] 267 | - [afcfcce] 2016-04-16 + bower matchheight to `min_packages` [@hiqsol] 268 | - Added basics 269 | - [ac04710] 2016-04-15 redone to local hidev installation [@hiqsol] 270 | - [9b89c15] 2016-04-15 moved DoController to console dir [@hiqsol] 271 | - [d75181d] 2016-04-15 + set main package alias to bootstrap [@hiqsol] 272 | - [54434bf] 2016-04-10 phpcsfixed [@hiqsol] 273 | - [065c211] 2016-04-10 added basic site pages [@hiqsol] 274 | - [52d05bd] 2016-04-10 used asset-packagist [@hiqsol] 275 | - [519b20d] 2016-04-06 phpcsfixed [@hiqsol] 276 | - [a292a67] 2016-04-06 refactored with fxp registries [@hiqsol] 277 | - [4dfea1c] 2016-04-04 phpcsfixed [@hiqsol] 278 | - [5b163f7] 2016-04-04 inited tests [@hiqsol] 279 | - [8960530] 2016-04-04 + ssl [@hiqsol] 280 | - [b0747e6] 2016-04-04 + `min_packages.sh` [@hiqsol] 281 | - [6e6e8dc] 2016-04-04 small fix [@hiqsol] 282 | - [f0f0054] 2016-04-04 something working [@hiqsol] 283 | - [2d9e89f] 2016-04-02 inited [@hiqsol] 284 | 285 | ## [Development started] - 2016-04-02 286 | 287 | [zhuravljov/yii2-queue]: https://github.com/zhuravljov/yii2-queue 288 | [fxpio/composer-asset-plugin]: https://github.com/fxpio/composer-asset-plugin 289 | [@hiqsol]: https://github.com/hiqsol 290 | [sol@hiqdev.com]: https://github.com/hiqsol 291 | [@SilverFire]: https://github.com/SilverFire 292 | [d.naumenko.a@gmail.com]: https://github.com/SilverFire 293 | [@tafid]: https://github.com/tafid 294 | [andreyklochok@gmail.com]: https://github.com/tafid 295 | [@BladeRoot]: https://github.com/BladeRoot 296 | [bladeroot@gmail.com]: https://github.com/BladeRoot 297 | [@edgardmessias]: https://github.com/edgardmessias 298 | [edgardmessias@gmail.com]: https://github.com/edgardmessias 299 | [@zhuravljov]: https://github.com/zhuravljov 300 | [zhuravljov@gmail.com]: https://github.com/zhuravljov 301 | [4471376]: https://github.com/hiqdev/asset-packagist/commit/4471376 302 | [1f862c1]: https://github.com/hiqdev/asset-packagist/commit/1f862c1 303 | [80fb19c]: https://github.com/hiqdev/asset-packagist/commit/80fb19c 304 | [6f6392a]: https://github.com/hiqdev/asset-packagist/commit/6f6392a 305 | [ffd2ad5]: https://github.com/hiqdev/asset-packagist/commit/ffd2ad5 306 | [a1478ad]: https://github.com/hiqdev/asset-packagist/commit/a1478ad 307 | [133a210]: https://github.com/hiqdev/asset-packagist/commit/133a210 308 | [e0c6316]: https://github.com/hiqdev/asset-packagist/commit/e0c6316 309 | [305b331]: https://github.com/hiqdev/asset-packagist/commit/305b331 310 | [fcfa683]: https://github.com/hiqdev/asset-packagist/commit/fcfa683 311 | [fa7bcae]: https://github.com/hiqdev/asset-packagist/commit/fa7bcae 312 | [a90a482]: https://github.com/hiqdev/asset-packagist/commit/a90a482 313 | [5fad211]: https://github.com/hiqdev/asset-packagist/commit/5fad211 314 | [2195919]: https://github.com/hiqdev/asset-packagist/commit/2195919 315 | [00e23b9]: https://github.com/hiqdev/asset-packagist/commit/00e23b9 316 | [f3f873f]: https://github.com/hiqdev/asset-packagist/commit/f3f873f 317 | [7183235]: https://github.com/hiqdev/asset-packagist/commit/7183235 318 | [97e289c]: https://github.com/hiqdev/asset-packagist/commit/97e289c 319 | [9b6ed61]: https://github.com/hiqdev/asset-packagist/commit/9b6ed61 320 | [00ff6f1]: https://github.com/hiqdev/asset-packagist/commit/00ff6f1 321 | [7baf614]: https://github.com/hiqdev/asset-packagist/commit/7baf614 322 | [cfb3ae4]: https://github.com/hiqdev/asset-packagist/commit/cfb3ae4 323 | [dd4f37d]: https://github.com/hiqdev/asset-packagist/commit/dd4f37d 324 | [71631fe]: https://github.com/hiqdev/asset-packagist/commit/71631fe 325 | [63c7c89]: https://github.com/hiqdev/asset-packagist/commit/63c7c89 326 | [c9bd8a4]: https://github.com/hiqdev/asset-packagist/commit/c9bd8a4 327 | [591f219]: https://github.com/hiqdev/asset-packagist/commit/591f219 328 | [e01d992]: https://github.com/hiqdev/asset-packagist/commit/e01d992 329 | [f66e733]: https://github.com/hiqdev/asset-packagist/commit/f66e733 330 | [082935a]: https://github.com/hiqdev/asset-packagist/commit/082935a 331 | [2728344]: https://github.com/hiqdev/asset-packagist/commit/2728344 332 | [26c30b0]: https://github.com/hiqdev/asset-packagist/commit/26c30b0 333 | [4e28d86]: https://github.com/hiqdev/asset-packagist/commit/4e28d86 334 | [9499664]: https://github.com/hiqdev/asset-packagist/commit/9499664 335 | [b4d5c47]: https://github.com/hiqdev/asset-packagist/commit/b4d5c47 336 | [4678f67]: https://github.com/hiqdev/asset-packagist/commit/4678f67 337 | [54a8f54]: https://github.com/hiqdev/asset-packagist/commit/54a8f54 338 | [c77aa60]: https://github.com/hiqdev/asset-packagist/commit/c77aa60 339 | [569947f]: https://github.com/hiqdev/asset-packagist/commit/569947f 340 | [b4cf57b]: https://github.com/hiqdev/asset-packagist/commit/b4cf57b 341 | [c9665bb]: https://github.com/hiqdev/asset-packagist/commit/c9665bb 342 | [6a38eb9]: https://github.com/hiqdev/asset-packagist/commit/6a38eb9 343 | [54ede7d]: https://github.com/hiqdev/asset-packagist/commit/54ede7d 344 | [46631a7]: https://github.com/hiqdev/asset-packagist/commit/46631a7 345 | [d2e0f0f]: https://github.com/hiqdev/asset-packagist/commit/d2e0f0f 346 | [a85830f]: https://github.com/hiqdev/asset-packagist/commit/a85830f 347 | [f6aa46d]: https://github.com/hiqdev/asset-packagist/commit/f6aa46d 348 | [9f7d0b6]: https://github.com/hiqdev/asset-packagist/commit/9f7d0b6 349 | [cf2d54d]: https://github.com/hiqdev/asset-packagist/commit/cf2d54d 350 | [e7be6b1]: https://github.com/hiqdev/asset-packagist/commit/e7be6b1 351 | [08aeb23]: https://github.com/hiqdev/asset-packagist/commit/08aeb23 352 | [1af8dc9]: https://github.com/hiqdev/asset-packagist/commit/1af8dc9 353 | [37d40a7]: https://github.com/hiqdev/asset-packagist/commit/37d40a7 354 | [a6214a3]: https://github.com/hiqdev/asset-packagist/commit/a6214a3 355 | [2460d3e]: https://github.com/hiqdev/asset-packagist/commit/2460d3e 356 | [8afec1f]: https://github.com/hiqdev/asset-packagist/commit/8afec1f 357 | [01d5501]: https://github.com/hiqdev/asset-packagist/commit/01d5501 358 | [f9c3cb1]: https://github.com/hiqdev/asset-packagist/commit/f9c3cb1 359 | [411bbea]: https://github.com/hiqdev/asset-packagist/commit/411bbea 360 | [d84636c]: https://github.com/hiqdev/asset-packagist/commit/d84636c 361 | [868e934]: https://github.com/hiqdev/asset-packagist/commit/868e934 362 | [a48dfb0]: https://github.com/hiqdev/asset-packagist/commit/a48dfb0 363 | [9a1769d]: https://github.com/hiqdev/asset-packagist/commit/9a1769d 364 | [9f38225]: https://github.com/hiqdev/asset-packagist/commit/9f38225 365 | [12b17af]: https://github.com/hiqdev/asset-packagist/commit/12b17af 366 | [f9dfeee]: https://github.com/hiqdev/asset-packagist/commit/f9dfeee 367 | [0deab6f]: https://github.com/hiqdev/asset-packagist/commit/0deab6f 368 | [48f69b5]: https://github.com/hiqdev/asset-packagist/commit/48f69b5 369 | [3134a13]: https://github.com/hiqdev/asset-packagist/commit/3134a13 370 | [2a6f9ff]: https://github.com/hiqdev/asset-packagist/commit/2a6f9ff 371 | [afcfcce]: https://github.com/hiqdev/asset-packagist/commit/afcfcce 372 | [ac04710]: https://github.com/hiqdev/asset-packagist/commit/ac04710 373 | [9b89c15]: https://github.com/hiqdev/asset-packagist/commit/9b89c15 374 | [d75181d]: https://github.com/hiqdev/asset-packagist/commit/d75181d 375 | [54434bf]: https://github.com/hiqdev/asset-packagist/commit/54434bf 376 | [065c211]: https://github.com/hiqdev/asset-packagist/commit/065c211 377 | [52d05bd]: https://github.com/hiqdev/asset-packagist/commit/52d05bd 378 | [519b20d]: https://github.com/hiqdev/asset-packagist/commit/519b20d 379 | [a292a67]: https://github.com/hiqdev/asset-packagist/commit/a292a67 380 | [4dfea1c]: https://github.com/hiqdev/asset-packagist/commit/4dfea1c 381 | [5b163f7]: https://github.com/hiqdev/asset-packagist/commit/5b163f7 382 | [8960530]: https://github.com/hiqdev/asset-packagist/commit/8960530 383 | [b0747e6]: https://github.com/hiqdev/asset-packagist/commit/b0747e6 384 | [6e6e8dc]: https://github.com/hiqdev/asset-packagist/commit/6e6e8dc 385 | [f0f0054]: https://github.com/hiqdev/asset-packagist/commit/f0f0054 386 | [2d9e89f]: https://github.com/hiqdev/asset-packagist/commit/2d9e89f 387 | [03c8992]: https://github.com/hiqdev/asset-packagist/commit/03c8992 388 | [c8357d5]: https://github.com/hiqdev/asset-packagist/commit/c8357d5 389 | [25011fc]: https://github.com/hiqdev/asset-packagist/commit/25011fc 390 | [8ee6ad3]: https://github.com/hiqdev/asset-packagist/commit/8ee6ad3 391 | [5935538]: https://github.com/hiqdev/asset-packagist/commit/5935538 392 | [4b7abfa]: https://github.com/hiqdev/asset-packagist/commit/4b7abfa 393 | [75f260a]: https://github.com/hiqdev/asset-packagist/commit/75f260a 394 | [b13b523]: https://github.com/hiqdev/asset-packagist/commit/b13b523 395 | [2ea4464]: https://github.com/hiqdev/asset-packagist/commit/2ea4464 396 | [38dba2f]: https://github.com/hiqdev/asset-packagist/commit/38dba2f 397 | [344c0d7]: https://github.com/hiqdev/asset-packagist/commit/344c0d7 398 | [e23568a]: https://github.com/hiqdev/asset-packagist/commit/e23568a 399 | [ec4c66d]: https://github.com/hiqdev/asset-packagist/commit/ec4c66d 400 | [5939201]: https://github.com/hiqdev/asset-packagist/commit/5939201 401 | [f105752]: https://github.com/hiqdev/asset-packagist/commit/f105752 402 | [78ca261]: https://github.com/hiqdev/asset-packagist/commit/78ca261 403 | [4986993]: https://github.com/hiqdev/asset-packagist/commit/4986993 404 | [5138f54]: https://github.com/hiqdev/asset-packagist/commit/5138f54 405 | [2dd8b25]: https://github.com/hiqdev/asset-packagist/commit/2dd8b25 406 | [d35611e]: https://github.com/hiqdev/asset-packagist/commit/d35611e 407 | [ecf5aef]: https://github.com/hiqdev/asset-packagist/commit/ecf5aef 408 | [a607125]: https://github.com/hiqdev/asset-packagist/commit/a607125 409 | [e3cb136]: https://github.com/hiqdev/asset-packagist/commit/e3cb136 410 | [257eb43]: https://github.com/hiqdev/asset-packagist/commit/257eb43 411 | [a96ef4b]: https://github.com/hiqdev/asset-packagist/commit/a96ef4b 412 | [ec7bbcd]: https://github.com/hiqdev/asset-packagist/commit/ec7bbcd 413 | [bd5dca3]: https://github.com/hiqdev/asset-packagist/commit/bd5dca3 414 | [cfd2352]: https://github.com/hiqdev/asset-packagist/commit/cfd2352 415 | [e14172c]: https://github.com/hiqdev/asset-packagist/commit/e14172c 416 | [a5fb28b]: https://github.com/hiqdev/asset-packagist/commit/a5fb28b 417 | [e22d364]: https://github.com/hiqdev/asset-packagist/commit/e22d364 418 | [7d20e30]: https://github.com/hiqdev/asset-packagist/commit/7d20e30 419 | [bdc0fb1]: https://github.com/hiqdev/asset-packagist/commit/bdc0fb1 420 | [0437aee]: https://github.com/hiqdev/asset-packagist/commit/0437aee 421 | [1c947e1]: https://github.com/hiqdev/asset-packagist/commit/1c947e1 422 | [d4fee59]: https://github.com/hiqdev/asset-packagist/commit/d4fee59 423 | [87e2662]: https://github.com/hiqdev/asset-packagist/commit/87e2662 424 | [5a70619]: https://github.com/hiqdev/asset-packagist/commit/5a70619 425 | [bb771de]: https://github.com/hiqdev/asset-packagist/commit/bb771de 426 | [a0562a3]: https://github.com/hiqdev/asset-packagist/commit/a0562a3 427 | [59e4260]: https://github.com/hiqdev/asset-packagist/commit/59e4260 428 | [d34e57b]: https://github.com/hiqdev/asset-packagist/commit/d34e57b 429 | [e547396]: https://github.com/hiqdev/asset-packagist/commit/e547396 430 | [5de31be]: https://github.com/hiqdev/asset-packagist/commit/5de31be 431 | [bb6c7ad]: https://github.com/hiqdev/asset-packagist/commit/bb6c7ad 432 | [90d9aee]: https://github.com/hiqdev/asset-packagist/commit/90d9aee 433 | [5918e90]: https://github.com/hiqdev/asset-packagist/commit/5918e90 434 | [73f4c57]: https://github.com/hiqdev/asset-packagist/commit/73f4c57 435 | [de93971]: https://github.com/hiqdev/asset-packagist/commit/de93971 436 | [d212aec]: https://github.com/hiqdev/asset-packagist/commit/d212aec 437 | [7fb4ac1]: https://github.com/hiqdev/asset-packagist/commit/7fb4ac1 438 | [9e4c259]: https://github.com/hiqdev/asset-packagist/commit/9e4c259 439 | [399d379]: https://github.com/hiqdev/asset-packagist/commit/399d379 440 | [0afdfd2]: https://github.com/hiqdev/asset-packagist/commit/0afdfd2 441 | [1a3454c]: https://github.com/hiqdev/asset-packagist/commit/1a3454c 442 | [c0bfeb1]: https://github.com/hiqdev/asset-packagist/commit/c0bfeb1 443 | [6330bce]: https://github.com/hiqdev/asset-packagist/commit/6330bce 444 | [dc4ccd1]: https://github.com/hiqdev/asset-packagist/commit/dc4ccd1 445 | [9eb09aa]: https://github.com/hiqdev/asset-packagist/commit/9eb09aa 446 | [cb803cb]: https://github.com/hiqdev/asset-packagist/commit/cb803cb 447 | [5ff526c]: https://github.com/hiqdev/asset-packagist/commit/5ff526c 448 | [9515fd0]: https://github.com/hiqdev/asset-packagist/commit/9515fd0 449 | [bc20b98]: https://github.com/hiqdev/asset-packagist/commit/bc20b98 450 | [e482226]: https://github.com/hiqdev/asset-packagist/commit/e482226 451 | [d1130a1]: https://github.com/hiqdev/asset-packagist/commit/d1130a1 452 | [22ab667]: https://github.com/hiqdev/asset-packagist/commit/22ab667 453 | [5a29a01]: https://github.com/hiqdev/asset-packagist/commit/5a29a01 454 | [5be5f6b]: https://github.com/hiqdev/asset-packagist/commit/5be5f6b 455 | [ddfa3ac]: https://github.com/hiqdev/asset-packagist/commit/ddfa3ac 456 | [224f496]: https://github.com/hiqdev/asset-packagist/commit/224f496 457 | [db4966b]: https://github.com/hiqdev/asset-packagist/commit/db4966b 458 | [e69ed1c]: https://github.com/hiqdev/asset-packagist/commit/e69ed1c 459 | [b5b2fa7]: https://github.com/hiqdev/asset-packagist/commit/b5b2fa7 460 | [41033a6]: https://github.com/hiqdev/asset-packagist/commit/41033a6 461 | [e72a72a]: https://github.com/hiqdev/asset-packagist/commit/e72a72a 462 | [6452275]: https://github.com/hiqdev/asset-packagist/commit/6452275 463 | [cf3855f]: https://github.com/hiqdev/asset-packagist/commit/cf3855f 464 | [62c099e]: https://github.com/hiqdev/asset-packagist/commit/62c099e 465 | [442259c]: https://github.com/hiqdev/asset-packagist/commit/442259c 466 | [55e1777]: https://github.com/hiqdev/asset-packagist/commit/55e1777 467 | [Under development]: https://github.com/hiqdev/asset-packagist/compare/1.0.0...HEAD 468 | [0.1.0]: https://github.com/hiqdev/asset-packagist/releases/tag/0.1.0 469 | [257b2f5]: https://github.com/hiqdev/asset-packagist/commit/257b2f5 470 | [5b5f435]: https://github.com/hiqdev/asset-packagist/commit/5b5f435 471 | [b1a7d9c]: https://github.com/hiqdev/asset-packagist/commit/b1a7d9c 472 | [d8b5b87]: https://github.com/hiqdev/asset-packagist/commit/d8b5b87 473 | [eabafbb]: https://github.com/hiqdev/asset-packagist/commit/eabafbb 474 | [c95600b]: https://github.com/hiqdev/asset-packagist/commit/c95600b 475 | [0aa27f6]: https://github.com/hiqdev/asset-packagist/commit/0aa27f6 476 | [2c47200]: https://github.com/hiqdev/asset-packagist/commit/2c47200 477 | [4c94e8f]: https://github.com/hiqdev/asset-packagist/commit/4c94e8f 478 | [122874e]: https://github.com/hiqdev/asset-packagist/commit/122874e 479 | [b850cba]: https://github.com/hiqdev/asset-packagist/commit/b850cba 480 | [ace352d]: https://github.com/hiqdev/asset-packagist/commit/ace352d 481 | [7c5d01d]: https://github.com/hiqdev/asset-packagist/commit/7c5d01d 482 | [5390524]: https://github.com/hiqdev/asset-packagist/commit/5390524 483 | [a72bade]: https://github.com/hiqdev/asset-packagist/commit/a72bade 484 | [7a3380c]: https://github.com/hiqdev/asset-packagist/commit/7a3380c 485 | [d89b68c]: https://github.com/hiqdev/asset-packagist/commit/d89b68c 486 | [b781661]: https://github.com/hiqdev/asset-packagist/commit/b781661 487 | [6438a47]: https://github.com/hiqdev/asset-packagist/commit/6438a47 488 | [b599663]: https://github.com/hiqdev/asset-packagist/commit/b599663 489 | [b07d11b]: https://github.com/hiqdev/asset-packagist/commit/b07d11b 490 | [1aa2d23]: https://github.com/hiqdev/asset-packagist/commit/1aa2d23 491 | [404f689]: https://github.com/hiqdev/asset-packagist/commit/404f689 492 | [c226cff]: https://github.com/hiqdev/asset-packagist/commit/c226cff 493 | [7f43b83]: https://github.com/hiqdev/asset-packagist/commit/7f43b83 494 | [1ed2835]: https://github.com/hiqdev/asset-packagist/commit/1ed2835 495 | [5b0a29f]: https://github.com/hiqdev/asset-packagist/commit/5b0a29f 496 | [f5f7713]: https://github.com/hiqdev/asset-packagist/commit/f5f7713 497 | [9a8db4a]: https://github.com/hiqdev/asset-packagist/commit/9a8db4a 498 | [edcc58c]: https://github.com/hiqdev/asset-packagist/commit/edcc58c 499 | [f87848c]: https://github.com/hiqdev/asset-packagist/commit/f87848c 500 | [0ea6a4a]: https://github.com/hiqdev/asset-packagist/commit/0ea6a4a 501 | [1ae0b89]: https://github.com/hiqdev/asset-packagist/commit/1ae0b89 502 | [76f75df]: https://github.com/hiqdev/asset-packagist/commit/76f75df 503 | [383e494]: https://github.com/hiqdev/asset-packagist/commit/383e494 504 | [85a5314]: https://github.com/hiqdev/asset-packagist/commit/85a5314 505 | [cd0f3cc]: https://github.com/hiqdev/asset-packagist/commit/cd0f3cc 506 | [b76fbcd]: https://github.com/hiqdev/asset-packagist/commit/b76fbcd 507 | [dc47aff]: https://github.com/hiqdev/asset-packagist/commit/dc47aff 508 | [8542c16]: https://github.com/hiqdev/asset-packagist/commit/8542c16 509 | [863dea3]: https://github.com/hiqdev/asset-packagist/commit/863dea3 510 | [1f0abde]: https://github.com/hiqdev/asset-packagist/commit/1f0abde 511 | [035f1ea]: https://github.com/hiqdev/asset-packagist/commit/035f1ea 512 | [6f7aaae]: https://github.com/hiqdev/asset-packagist/commit/6f7aaae 513 | [ab5e2bd]: https://github.com/hiqdev/asset-packagist/commit/ab5e2bd 514 | [33befd4]: https://github.com/hiqdev/asset-packagist/commit/33befd4 515 | [856c104]: https://github.com/hiqdev/asset-packagist/commit/856c104 516 | [6aa8285]: https://github.com/hiqdev/asset-packagist/commit/6aa8285 517 | [7f3a5b4]: https://github.com/hiqdev/asset-packagist/commit/7f3a5b4 518 | [bbbb7b5]: https://github.com/hiqdev/asset-packagist/commit/bbbb7b5 519 | [ca928cf]: https://github.com/hiqdev/asset-packagist/commit/ca928cf 520 | [cd5c912]: https://github.com/hiqdev/asset-packagist/commit/cd5c912 521 | [300594c]: https://github.com/hiqdev/asset-packagist/commit/300594c 522 | [88b96a6]: https://github.com/hiqdev/asset-packagist/commit/88b96a6 523 | [843800f]: https://github.com/hiqdev/asset-packagist/commit/843800f 524 | [e1f21c7]: https://github.com/hiqdev/asset-packagist/commit/e1f21c7 525 | [92c0fd7]: https://github.com/hiqdev/asset-packagist/commit/92c0fd7 526 | [0365f77]: https://github.com/hiqdev/asset-packagist/commit/0365f77 527 | [27ad14d]: https://github.com/hiqdev/asset-packagist/commit/27ad14d 528 | [be126d4]: https://github.com/hiqdev/asset-packagist/commit/be126d4 529 | [eb5f5d9]: https://github.com/hiqdev/asset-packagist/commit/eb5f5d9 530 | [9f54f52]: https://github.com/hiqdev/asset-packagist/commit/9f54f52 531 | [2ba21ee]: https://github.com/hiqdev/asset-packagist/commit/2ba21ee 532 | [9b7d7ff]: https://github.com/hiqdev/asset-packagist/commit/9b7d7ff 533 | [052b795]: https://github.com/hiqdev/asset-packagist/commit/052b795 534 | [eb93960]: https://github.com/hiqdev/asset-packagist/commit/eb93960 535 | [ea55b5c]: https://github.com/hiqdev/asset-packagist/commit/ea55b5c 536 | [8a5882e]: https://github.com/hiqdev/asset-packagist/commit/8a5882e 537 | [a5f52c5]: https://github.com/hiqdev/asset-packagist/commit/a5f52c5 538 | [f4dc2fc]: https://github.com/hiqdev/asset-packagist/commit/f4dc2fc 539 | [b2c50d1]: https://github.com/hiqdev/asset-packagist/commit/b2c50d1 540 | [38e5b4b]: https://github.com/hiqdev/asset-packagist/commit/38e5b4b 541 | [8ea9f6b]: https://github.com/hiqdev/asset-packagist/commit/8ea9f6b 542 | [68e6592]: https://github.com/hiqdev/asset-packagist/commit/68e6592 543 | [d428eef]: https://github.com/hiqdev/asset-packagist/commit/d428eef 544 | [2ec9f08]: https://github.com/hiqdev/asset-packagist/commit/2ec9f08 545 | [b9972eb]: https://github.com/hiqdev/asset-packagist/commit/b9972eb 546 | [9f04bf5]: https://github.com/hiqdev/asset-packagist/commit/9f04bf5 547 | [3511c98]: https://github.com/hiqdev/asset-packagist/commit/3511c98 548 | [18bfb40]: https://github.com/hiqdev/asset-packagist/commit/18bfb40 549 | [1.0.0]: https://github.com/hiqdev/asset-packagist/compare/0.1.0...1.0.0 550 | [c98c9fa]: https://github.com/hiqdev/asset-packagist/commit/c98c9fa 551 | [1.0.1]: https://github.com/hiqdev/asset-packagist/compare/1.0.0...1.0.1 552 | --------------------------------------------------------------------------------