chigix/chiji
Chiji is a PHP 5.4+ base package for organizing and releasing front-end assets in web projects. It models resources and dependencies via Project, SourceRoad, and annotations, supporting pre-building and distribution, with optional bridge packages (e.g., Symfony).
Installation:
composer require chigix/chiji:~1.0.0
Requires PHP 5.4+.
Create a config file (/path/to/conf-file.php):
<?php
class ConfigFile extends \Chigi\Chiji\Project\ProjectConfig {
public function getProjectName() { return "MyApp"; }
public function getSourceDirs() { return ['app/scripts', 'app/styles']; }
public function getReleaseDirs() { return ['public/assets']; }
}
return new ConfigFile();
Register the project in your Laravel service provider (e.g., AppServiceProvider):
use Chigi\Chiji\Project\Project;
use Chigi\Chiji\Util\ProjectUtil;
public function boot() {
$project = new Project(__DIR__.'/conf-file.php');
ProjectUtil::registerProject($project);
}
Run asset processing via Artisan (create a custom command or use Robo):
php artisan chiji:build
(Note: Requires a custom Artisan command or Robo integration—see Implementation Patterns.)
app/styles/main.less) with @require annotations:
@require('bower_components/bootstrap/less/bootstrap.less');
@release('dist', 'main.css');
php artisan chiji:release
public/assets/dist/main.css.Extend Laravel’s Artisan to trigger Chiji tasks:
// app/Console/Commands/ChijiBuildCommand.php
namespace App\Console\Commands;
use Chigi\Chiji\Project\Project;
use Chigi\Chiji\Util\ProjectUtil;
use Illuminate\Console\Command;
class ChijiBuildCommand extends Command {
protected $signature = 'chiji:build';
protected $description = 'Build front-end assets with Chiji';
public function handle() {
$project = ProjectUtil::getRegisteredProject('MyApp');
foreach ($project->getSourceDirs() as $dir) {
$project->scanAndRegisterResources($dir);
}
$project->buildAndRelease();
$this->info('Chiji build completed!');
}
}
Register in app/Console/Kernel.php:
protected $commands = [
\App\Console\Commands\ChijiBuildCommand::class,
];
// app/Providers/AppServiceProvider.php
public function boot() {
$this->app->booting(function () {
$project = new Project(__DIR__.'/../conf-file.php');
ProjectUtil::registerProject($project);
});
}
Watch Mode (via Robo or custom script):
// RoboFile.php
use Chigi\Chiji\Project\Project;
use Chigi\Chiji\Util\ProjectUtil;
$this->taskExec('chiji:build')->run();
$this->taskWatch('app/styles/**/*.less')->exec('chiji:build');
Annotation-Driven Processing:
@require in LESS/JS to auto-load dependencies:
@require('vendor/jquery/dist/jquery.js');
@release to define output paths:
@release('dist', 'app.css');
Minification & Concatenation:
Configure ProjectConfig to enable optimizations:
public function getReleaseDirs() {
return [
'public/assets' => [
'dist' => [
'concat' => true,
'minify' => true,
],
],
];
}
Cache Busting:
Append hashes to filenames in ProjectConfig:
public function getReleaseOptions() {
return ['hash' => true];
}
Render Chiji-processed assets in Blade:
// resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{{ chiji_release('dist/main.css') }}">
<script src="{{ chiji_release('dist/app.js') }}"></script>
</head>
</html>
(Requires a Blade directive or helper—see Gotchas.)
Annotation Parsing Issues:
@require or @release annotations in CSS/LESS may not parse due to regex limitations./* @require */ syntax:
/* @require('vendor/package.css') */
Robo Task Conflicts:
composer.json:
"extra": {
"robo": {
"disable": true
}
}
Case-Sensitive Paths:
ProjectConfig:
public function getSourceDirs() {
return array_map('str_replace', ['\\', '/'], ['app/scripts', 'app/styles']);
}
Enable Verbose Logging:
\Chigi\Chiji\Util\Logger::setLevel(\Monolog\Logger::DEBUG);
Check Registered Resources:
$project = ProjectUtil::getRegisteredProject('MyApp');
foreach ($project->getRegisteredResources() as $resource) {
dump($resource->getFile(), $resource->getAnnotations());
}
Validate Annotations:
Use the analyzeAnnotations() method to debug:
$resource = $project->getResourceByFile('app/styles/main.less');
$resource->analyzeAnnotations(); // Throws exceptions on errors
Custom Annotations:
Extend \Chigi\Chiji\File\Annotation to add new directives:
class CustomAnnotation extends \Chigi\Chiji\File\Annotation {
public function analyze() {
// Custom logic for @myannotation
}
}
Release Plugins:
Implement \Chigi\Chiji\Release\PluginInterface for custom release logic (e.g., CDN uploads):
class CDNPlugin implements PluginInterface {
public function release($resource, $road) {
// Upload to CDN
}
}
Blade Directives:
Register a helper for chiji_release():
// app/Providers/AppServiceProvider.php
Blade::directive('chiji_release', function ($expr) {
return "<?php echo Chigi\Chiji\Util\ReleaseUtil::dist(".$expr."); ?>";
});
Avoid Over-Scanning:
Exclude non-asset directories in getSourceDirs() to speed up registration:
public function getSourceDirs() {
return [
'app/scripts',
'app/styles',
// Exclude: 'app/views', 'app/config'
];
}
Cache Building: Disable cache for development:
public function getBuildOptions() {
return ['cache' => false]; // Forces rebuild on every run
}
Publish Config:
Add a publishable config file for ProjectConfig:
// app/Providers/AppServiceProvider.php
if ($this->app->environment('local')) {
$this->publishes([
__DIR__.'/../../conf-file.php' => config_path('chiji.php'),
], 'chiji');
}
Queue Asset Processing: Use Laravel Queues to defer heavy builds:
// app/Console/Commands/ChijiBuildCommand.php
public function handle() {
dispatch(new ChijiBuildJob($project));
}
Vite/Laravel Mix Compatibility: Disable Chiji for Mix-managed assets by excluding directories:
public function getSourceDirs() {
return ['app/scripts', 'app/styles']; // Exclude 'resources/js'
}
How can I help you explore Laravel packages today?