diff options
author | Sam Light <sam@lightscale.co.uk> | 2025-03-31 23:28:21 +0100 |
---|---|---|
committer | Sam Light <samlight1994@gmail.com> | 2025-03-31 23:28:21 +0100 |
commit | 138ff4bea020350f6b067624dea328d88ceb74b0 (patch) | |
tree | 73b550350f0aaaf2470ddc6d80c9bba9a0f60cb0 | |
parent | 292c0eb477a8ffb7d3389a44ff1d41ccdc2ee790 (diff) |
Queuing files
-rw-r--r-- | src/Assets.php | 19 | ||||
-rw-r--r-- | tests/Feature/AssetsTest.php | 19 |
2 files changed, 38 insertions, 0 deletions
diff --git a/src/Assets.php b/src/Assets.php index 981ac76..962041f 100644 --- a/src/Assets.php +++ b/src/Assets.php @@ -12,6 +12,7 @@ class Assets private array $files = []; private array $queuedHeadFiles = []; private array $queuedFooterFiles = []; + private array $queuedFileHashs = []; public function addManifest( string $name, @@ -81,10 +82,28 @@ class Assets } } + private function pushFile(File $file, bool $footer): void + { + $hash = $file->hash(); + + if ($this->queuedFileHashes[$hash] ?? false) { + throw new Exception("File {$file} is already queued"); + } + else { + $this->queuedFileHashes[$hash] = true; + $queue = $footer ? 'queuedFooterFiles' : 'queuedHeadFiles'; + $this->{$queue}[] = $file; + } + } + public function queueFile(string $file, string $fileClass, bool $footer): void { $file = new FileString($file); $manifest = $this->getFileManifest($file); + $url = $manifest->getUrl($file->fileUri) ?? $file->fileUri; + + $file = new $fileClass($url); + $this->pushFile($file, $footer); } public function queueScript(string $file, bool $footer = true): void diff --git a/tests/Feature/AssetsTest.php b/tests/Feature/AssetsTest.php index f618d46..9614eee 100644 --- a/tests/Feature/AssetsTest.php +++ b/tests/Feature/AssetsTest.php @@ -94,5 +94,24 @@ describe('manages manifests', function() use ($newManifest) { $result = $assets->getFileManifest($file); expect($result)->toBe($manifest); }); +}); + +describe('queuing files', function() use ($newManifest) { + test('queue script', function() use ($newManifest) { + $assets = app(Assets::class); + $manifest = $newManifest(); + $assets->addManifest('main', $manifest, true); + $assets->queueScript('main::main.js'); + + expect($assets->getQueuedFooterFiles())->toBeArray()->toHaveLength(1); + }); + + test('queue style', function() use ($newManifest) { + $assets = app(Assets::class); + $manifest = $newManifest(); + $assets->addManifest('main', $manifest, true); + $assets->queueStyle('main::main.css'); + expect($assets->getQueuedHeadFiles())->toBeArray()->toHaveLength(1); + }); }); |