Compare commits
4 Commits
jobs/hellc
...
jobs/epic-
Author | SHA1 | Date | |
---|---|---|---|
d33d0ba6a1 | |||
fcb3f8d7d8 | |||
1bebf03a70 | |||
7079206658 |
@ -5,8 +5,6 @@ namespace App\Browser;
|
|||||||
use App\Models\Job;
|
use App\Models\Job;
|
||||||
use App\Models\JobArtifact;
|
use App\Models\JobArtifact;
|
||||||
use App\Models\JobRun;
|
use App\Models\JobRun;
|
||||||
use App\Notification\Notifications\JobErrorNotification;
|
|
||||||
use App\Notification\Providers\AllNotification;
|
|
||||||
use Closure;
|
use Closure;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Facebook\WebDriver\Chrome\ChromeOptions;
|
use Facebook\WebDriver\Chrome\ChromeOptions;
|
||||||
@ -58,8 +56,7 @@ abstract class BrowserJob implements ShouldQueue
|
|||||||
// throw $e;
|
// throw $e;
|
||||||
}
|
}
|
||||||
catch (Throwable $e) {
|
catch (Throwable $e) {
|
||||||
$browser->screenshot(JobErrorScreenshot::getFileName($this->jobId));
|
$browser->screenshot("failure-{$this->jobId}");
|
||||||
AllNotification::send(new JobErrorNotification($this->jobId, $e->getMessage()));
|
|
||||||
dump($e);
|
dump($e);
|
||||||
throw $e;
|
throw $e;
|
||||||
} finally {
|
} finally {
|
||||||
@ -159,6 +156,7 @@ abstract class BrowserJob implements ShouldQueue
|
|||||||
'--whitelisted-ips=""',
|
'--whitelisted-ips=""',
|
||||||
'--disable-dev-shm-usage',
|
'--disable-dev-shm-usage',
|
||||||
'--user-data-dir=/home/seluser/profile/',
|
'--user-data-dir=/home/seluser/profile/',
|
||||||
|
'--auto-open-devtools-for-tabs',
|
||||||
])->all());
|
])->all());
|
||||||
|
|
||||||
return RemoteWebDriver::create(
|
return RemoteWebDriver::create(
|
||||||
@ -181,7 +179,8 @@ abstract class BrowserJob implements ShouldQueue
|
|||||||
*/
|
*/
|
||||||
protected function hasHeadlessDisabled(): bool
|
protected function hasHeadlessDisabled(): bool
|
||||||
{
|
{
|
||||||
return config('dusk.headlessDisabled', false);
|
return isset($_SERVER['DUSK_HEADLESS_DISABLED']) ||
|
||||||
|
isset($_ENV['DUSK_HEADLESS_DISABLED']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -189,7 +188,8 @@ abstract class BrowserJob implements ShouldQueue
|
|||||||
*/
|
*/
|
||||||
protected function shouldStartMaximized(): bool
|
protected function shouldStartMaximized(): bool
|
||||||
{
|
{
|
||||||
return config('dusk.shouldStartMaximized', false);
|
return isset($_SERVER['DUSK_START_MAXIMIZED']) ||
|
||||||
|
isset($_ENV['DUSK_START_MAXIMIZED']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
47
app/Browser/Components/Hellcase/EpicGamesLogin.php
Normal file
47
app/Browser/Components/Hellcase/EpicGamesLogin.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Browser\Components\Hellcase;
|
||||||
|
|
||||||
|
use Laravel\Dusk\Browser;
|
||||||
|
use Laravel\Dusk\Component as BaseComponent;
|
||||||
|
|
||||||
|
class EpicGamesLogin extends BaseComponent
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Get the root selector for the component.
|
||||||
|
*/
|
||||||
|
public function selector(): string
|
||||||
|
{
|
||||||
|
return 'form';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the browser page contains the component.
|
||||||
|
*/
|
||||||
|
public function assert(Browser $browser): void
|
||||||
|
{
|
||||||
|
$browser->assertVisible($this->selector());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the element shortcuts for the component.
|
||||||
|
*
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
|
public function elements(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'@email' => 'input#email',
|
||||||
|
'@password' => 'input#password',
|
||||||
|
'@signin-button' => 'button[type="submit"]',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function fillForm(Browser $browser, $email, $password) {
|
||||||
|
$browser->type('@email', $email);
|
||||||
|
sleep(1);
|
||||||
|
$browser->type('@password', $password);
|
||||||
|
sleep(1);
|
||||||
|
$browser->click('@signin-button');
|
||||||
|
}
|
||||||
|
}
|
@ -1,27 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Browser;
|
|
||||||
|
|
||||||
use Laravel\Dusk\Browser;
|
|
||||||
use function rtrim;
|
|
||||||
|
|
||||||
|
|
||||||
class JobDebugScreenshot {
|
|
||||||
public const IMG_FILE_NAME = "debug-";
|
|
||||||
|
|
||||||
public static function getFileName(int $jobId): string {
|
|
||||||
return static::IMG_FILE_NAME . $jobId . ".png";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getImgFileAbsolutePath(int $jobId): string {
|
|
||||||
return rtrim(Browser::$storeScreenshotsAt, '/') . "/" . static::getFileName($jobId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getImgFileProjectPath(int $jobId): string {
|
|
||||||
return app_path("Browser/screenshots/" . static::getFileName($jobId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getImgFileExternalPath(int $jobId): string {
|
|
||||||
return "screenshots/" . static::getFileName($jobId);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Browser;
|
|
||||||
|
|
||||||
use Laravel\Dusk\Browser;
|
|
||||||
use function rtrim;
|
|
||||||
|
|
||||||
|
|
||||||
class JobErrorScreenshot {
|
|
||||||
public const IMG_FILE_NAME = "failure-";
|
|
||||||
|
|
||||||
public static function getFileName(int $jobId): string {
|
|
||||||
return static::IMG_FILE_NAME . $jobId . ".png";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getImgFileAbsolutePath(int $jobId): string {
|
|
||||||
return rtrim(Browser::$storeScreenshotsAt, '/') . "/" . static::getFileName($jobId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getImgFileProjectPath(int $jobId): string {
|
|
||||||
return app_path("Browser/screenshots/" . static::getFileName($jobId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getImgFileExternalPath(int $jobId): string {
|
|
||||||
return "screenshots/" . static::getFileName($jobId);
|
|
||||||
}
|
|
||||||
}
|
|
174
app/Browser/Jobs/EpicGames/EpicGamesJob.php
Normal file
174
app/Browser/Jobs/EpicGames/EpicGamesJob.php
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Browser\Jobs\EpicGames;
|
||||||
|
|
||||||
|
use App\Browser\BrowserJob;
|
||||||
|
use App\Browser\Components\Hellcase\EpicGamesLogin;
|
||||||
|
use App\Models\JobInfo;
|
||||||
|
use App\Models\JobRun;
|
||||||
|
use App\Notification\Notifications\SimpleNotification;
|
||||||
|
use App\Notification\Providers\AllNotification;
|
||||||
|
use Exception;
|
||||||
|
use Facebook\WebDriver\WebDriverBy;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Laravel\Dusk\Browser;
|
||||||
|
|
||||||
|
class EpicGamesJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
||||||
|
{
|
||||||
|
private const APPROXIMATIVE_RUNNING_MINUTES = 2;
|
||||||
|
|
||||||
|
private const WEBSITE_URL = "https://www.epicgames.com/store/en-US/";
|
||||||
|
|
||||||
|
private JobRun $jobRun;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
Log::info("Constructing " . self::class);
|
||||||
|
parent::__construct(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run(Browser $browser): ?JobRun
|
||||||
|
{
|
||||||
|
// $browser->visit("https://bscscan.com/contractsVerified");
|
||||||
|
// sleep(3);
|
||||||
|
Log::info("Running " . self::class);
|
||||||
|
$this->jobRun = new JobRun([
|
||||||
|
"job_id" => $this->jobId,
|
||||||
|
"success" => false,
|
||||||
|
]);
|
||||||
|
$this->jobRun->save();
|
||||||
|
|
||||||
|
// $this->goToEpicGamesWebsite($browser);
|
||||||
|
// $this->removePopups($browser);
|
||||||
|
sleep(5);
|
||||||
|
$this->signin($browser);
|
||||||
|
$this->getFreeGames($browser);
|
||||||
|
|
||||||
|
$this->jobRun->success = true;
|
||||||
|
$this->jobRun->save();
|
||||||
|
|
||||||
|
Log::info(self::class . " run ended");
|
||||||
|
|
||||||
|
return $this->jobRun;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function runTest(Browser $browser): ?JobRun
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->goToEpicGamesWebsite($browser);
|
||||||
|
sleep(2);
|
||||||
|
$this->removePopups($browser);
|
||||||
|
sleep(2);
|
||||||
|
$this->signin($browser);
|
||||||
|
return $this->makeSimpleJobRun(
|
||||||
|
true,
|
||||||
|
"Connexion réussie",
|
||||||
|
"Datboi a réussi à se connecter sur EpicGames"
|
||||||
|
);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return $this->makeSimpleJobRun(
|
||||||
|
true,
|
||||||
|
"Connexion échouée",
|
||||||
|
"Datboi n'a pas réussi à se connecter sur EpicGames :\n" . $e->getMessage()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function goToEpicGamesWebsite(Browser $browser)
|
||||||
|
{
|
||||||
|
sleep(3);
|
||||||
|
$browser->visit(self::WEBSITE_URL);
|
||||||
|
sleep(3);
|
||||||
|
$this->assertNotDetected($browser);
|
||||||
|
$browser->waitForText("Store", 30, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function signin(Browser $browser)
|
||||||
|
{
|
||||||
|
// $browser->visit("https://store.epicgames.com/login?state=%2Fen-US%2F");
|
||||||
|
$browser->driver->executeScript('window.open("https://store.epicgames.com/login?state=%2Fen-US%2F")');
|
||||||
|
sleep(5);
|
||||||
|
$this->assertNotDetected($browser);
|
||||||
|
$browser->waitForText("Sign In", 30, true);
|
||||||
|
sleep(3);
|
||||||
|
|
||||||
|
$jobInfos = JobInfo::where("job_id", $this->jobId)->get();
|
||||||
|
$email = $jobInfos->where("key", "epicgames_account_email")->first()->value;
|
||||||
|
$password = $jobInfos->where("key", "epicgames_account_password")->first()->value;
|
||||||
|
$browser->within(new EpicGamesLogin, function (Browser $browser) use ($email, $password) {
|
||||||
|
$browser->fillForm($email, $password);
|
||||||
|
});
|
||||||
|
|
||||||
|
sleep(40);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFreeGames(Browser $browser)
|
||||||
|
{
|
||||||
|
$browser->driver->executeScript('window.open("https://www.epicgames.com/store/en-US/free-games")');
|
||||||
|
// $browser->visit('https://www.epicgames.com/store/en-US/free-games');
|
||||||
|
$browser->waitForText("Free Games", 30, true);
|
||||||
|
$freeGamesLinkElements = $browser->driver->findElements(WebDriverBy::xpath('//a[contains(@aria-label, "Free Now")]'));
|
||||||
|
$freeGamesLinks = [];
|
||||||
|
foreach ($freeGamesLinkElements as $element) {
|
||||||
|
$freeGamesLinks[] = $element->getAttribute("href");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($freeGamesLinks as $link) {
|
||||||
|
$browser->visit($link);
|
||||||
|
$this->claimCurrentGame($browser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function claimCurrentGame(Browser $browser)
|
||||||
|
{
|
||||||
|
sleep(5);
|
||||||
|
$this->assertNotDetected($browser);
|
||||||
|
if ($this->unratedContent($browser)) {
|
||||||
|
throw new Exception("Le jeu demande un âge et datboi a la flemme de le mettre");
|
||||||
|
}
|
||||||
|
$this->waitForAndClickElementContainingText($browser, '//button', "Get", 30, true);
|
||||||
|
sleep(5);
|
||||||
|
$this->assertNotDetected($browser);
|
||||||
|
$browser->waitForText("Place Order", 30, true);
|
||||||
|
$browser->click("Place Order");
|
||||||
|
sleep(5);
|
||||||
|
$this->assertNotDetected($browser);
|
||||||
|
$browser->waitForText("Order Confirmation", 30, true);
|
||||||
|
$browser->click("Close");
|
||||||
|
sleep(5);
|
||||||
|
|
||||||
|
AllNotification::send(
|
||||||
|
new SimpleNotification($this->jobId, "Un jeu a été ajouté à votre bibliothèque", "Un jeu a été ajouté à votre bibliothèque EpicGames")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function unratedContent(Browser $browser)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$browser->waitForText("please provide your date of birth", 5, true);
|
||||||
|
return true;
|
||||||
|
} catch (Exception $_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function removePopups(Browser $browser)
|
||||||
|
{
|
||||||
|
// $browser->script('document.querySelector("div.app-modal")[0].remove();');
|
||||||
|
// $browser->driver->executeScript('document.querySelector("div.app-modal")[0].remove();');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function assertNotDetected(Browser $browser)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$browser->waitForText("One more step", 10, true);
|
||||||
|
} catch (Exception $_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new Exception("Détecté par cloudflare");
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,6 @@ namespace App\Browser\Jobs\Hellcase;
|
|||||||
|
|
||||||
use App\Browser\BrowserJob;
|
use App\Browser\BrowserJob;
|
||||||
use App\Browser\Components\Hellcase\MainNav;
|
use App\Browser\Components\Hellcase\MainNav;
|
||||||
use App\Browser\JobDebugScreenshot;
|
|
||||||
use App\Browser\Jobs\Hellcase\HellcaseLoginQrCode;
|
use App\Browser\Jobs\Hellcase\HellcaseLoginQrCode;
|
||||||
use App\Models\JobArtifact;
|
use App\Models\JobArtifact;
|
||||||
use App\Models\JobRun;
|
use App\Models\JobRun;
|
||||||
@ -12,8 +11,6 @@ use App\Notification\NotificationBody\Hellcase\HellcaseNotificationDailyFreeBody
|
|||||||
use App\Notification\NotificationBody\Hellcase\HellcaseNotificationLoginBody;
|
use App\Notification\NotificationBody\Hellcase\HellcaseNotificationLoginBody;
|
||||||
use App\Notification\Notifications\Hellcase\HellcaseNotificationDailyFree;
|
use App\Notification\Notifications\Hellcase\HellcaseNotificationDailyFree;
|
||||||
use App\Notification\Notifications\Hellcase\HellcaseNotificationLogin;
|
use App\Notification\Notifications\Hellcase\HellcaseNotificationLogin;
|
||||||
use App\Notification\Notifications\JobDebugNotification;
|
|
||||||
use App\Notification\Notifications\JobErrorNotification;
|
|
||||||
use App\Notification\Providers\AllNotification;
|
use App\Notification\Providers\AllNotification;
|
||||||
use Facebook\WebDriver\WebDriverBy;
|
use Facebook\WebDriver\WebDriverBy;
|
||||||
use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
|
use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
|
||||||
@ -24,42 +21,37 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
{
|
{
|
||||||
private const STEAM_LOGIN_THRESHOLD = 5 * 60; // 5 minutes
|
private const STEAM_LOGIN_THRESHOLD = 5 * 60; // 5 minutes
|
||||||
private const APPROXIMATIVE_RUNNING_MINUTES = 2;
|
private const APPROXIMATIVE_RUNNING_MINUTES = 2;
|
||||||
|
private const WEBSITE_URL = "https://hellcase.com";
|
||||||
|
|
||||||
protected JobRun $jobRun;
|
private JobRun $jobRun;
|
||||||
|
|
||||||
public function __construct($jobId = 2)
|
public function __construct()
|
||||||
{
|
{
|
||||||
Log::info("Constructing HellcaseJob");
|
Log::info("Constructing " . self::class);
|
||||||
parent::__construct($jobId);
|
parent::__construct(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function run(Browser $browser): ?JobRun
|
public function run(Browser $browser): ?JobRun
|
||||||
{
|
{
|
||||||
Log::info("Running HellcaseJob");
|
Log::info("Running " . self::class);
|
||||||
$this->jobRun = new JobRun([
|
$this->jobRun = new JobRun([
|
||||||
"job_id" => $this->jobId,
|
"job_id" => $this->jobId,
|
||||||
"success" => false,
|
"success" => false,
|
||||||
]);
|
]);
|
||||||
$this->jobRun->save();
|
$this->jobRun->save();
|
||||||
|
|
||||||
$browser->visit('https://hellcase.com');
|
$browser->visit(self::WEBSITE_URL);
|
||||||
$browser->waitForText("CASES", 30, true);
|
$browser->waitForText("CASES", 30, true);
|
||||||
$this->removePopups($browser);
|
$this->removePopups($browser);
|
||||||
sleep(5);
|
sleep(5);
|
||||||
$this->signin($browser);
|
$this->signin($browser);
|
||||||
try {
|
$this->joinFreeGiveaways($browser);
|
||||||
$this->joinFreeGiveaways($browser);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$this->jobRun->success = false;
|
|
||||||
$this->jobRun->save();
|
|
||||||
AllNotification::send(new JobErrorNotification($this->jobId, "Erreur lors de la participation aux concours gratuits : " . $e->getMessage()));
|
|
||||||
}
|
|
||||||
$this->getDailyFree($browser);
|
$this->getDailyFree($browser);
|
||||||
|
|
||||||
$this->jobRun->success = true;
|
$this->jobRun->success = true;
|
||||||
$this->jobRun->save();
|
$this->jobRun->save();
|
||||||
|
|
||||||
Log::info("HellcaseJob run ended");
|
Log::info(self::class . " run ended");
|
||||||
|
|
||||||
return $this->jobRun;
|
return $this->jobRun;
|
||||||
}
|
}
|
||||||
@ -70,7 +62,7 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
public function runTest(Browser $browser): ?JobRun
|
public function runTest(Browser $browser): ?JobRun
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$browser->visit('https://hellcase.com');
|
$browser->visit(self::WEBSITE_URL);
|
||||||
$browser->waitForText("CASES", 30, true);
|
$browser->waitForText("CASES", 30, true);
|
||||||
$this->removePopups($browser);
|
$this->removePopups($browser);
|
||||||
sleep(2);
|
sleep(2);
|
||||||
@ -89,7 +81,7 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function signin(Browser $browser)
|
private function signin(Browser $browser)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$browser->clickAtXPath('//button[.//span[text() = "Sign in"]]');
|
$browser->clickAtXPath('//button[.//span[text() = "Sign in"]]');
|
||||||
@ -100,20 +92,13 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
sleep(5);
|
sleep(5);
|
||||||
$browser->waitForText("Sign in with Steam", 30, true);
|
$browser->waitForText("Sign in with Steam", 30, true);
|
||||||
sleep(3);
|
sleep(3);
|
||||||
$browser->driver->findElement(WebDriverBy::xpath('//button[contains(@class,"_base_zvftr_1 _accent-1_zvftr_105 _m_zvftr_52 _full_zvftr_94 _primary_zvftr_100")]'))->click();
|
$browser->driver->findElement(WebDriverBy::xpath('//button[@class = "_base_1uydq_1 _accent-1_1uydq_105 _m_1uydq_52 _full_1uydq_94 _primary_1uydq_100"]'))->click();
|
||||||
sleep(5);
|
sleep(5);
|
||||||
|
|
||||||
// QR CODE SCANNING
|
// QR CODE SCANNING
|
||||||
try {
|
try {
|
||||||
$browser->waitForTextIn("div", "Or sign in with QR", 30, true);
|
$browser->waitForTextIn("div", "Or sign in with QR", 30, true);
|
||||||
sleep(10);
|
$qrCode = $browser->driver->findElement(WebDriverBy::xpath('//div[./*[contains(text(), "Or sign in with QR")]]'));
|
||||||
try {
|
|
||||||
$qrCode = $browser->driver->findElement(WebDriverBy::xpath('//div[./*[contains(text(), "Or sign in with QR")]]'));
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$browser->screenshot(JobDebugScreenshot::getFileName($this->jobId));
|
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "Le QR code de la page de connexion de Steam n'a pas été trouvé"));
|
|
||||||
throw $e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait to be redirected to the Steam login page, while waiting take a new screenshot every 30 seconds
|
// Wait to be redirected to the Steam login page, while waiting take a new screenshot every 30 seconds
|
||||||
$isBackOnHellcase = false;
|
$isBackOnHellcase = false;
|
||||||
@ -138,11 +123,9 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
// If the QR code is not found, we are not on the QR code page
|
// If the QR code is not found, we are not on the QR code page
|
||||||
Log::debug("Exception because qrcode not found : " . $e);
|
|
||||||
$isBackOnHellcase = true;
|
$isBackOnHellcase = true;
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
// If the QR code is not found, we are not on the QR code page
|
// If the QR code is not found, we are not on the QR code page
|
||||||
Log::debug("Exception because qrcode not found : " . $e);
|
|
||||||
$isBackOnHellcase = true;
|
$isBackOnHellcase = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,8 +142,6 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
try {
|
try {
|
||||||
$buttons = $browser->driver->findElements(WebDriverBy::xpath('//a[text() = "Join for free"]'));
|
$buttons = $browser->driver->findElements(WebDriverBy::xpath('//a[text() = "Join for free"]'));
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$browser->screenshot(JobDebugScreenshot::getFileName($this->jobId));
|
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "No join for free buttons found"));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,31 +151,9 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
"content" => ""
|
"content" => ""
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$nextSlideButton = $browser->driver->findElement(WebDriverBy::xpath('//button[@class="_button_1ygbm_7 _next_1ygbm_24"]'));
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$browser->screenshot(JobDebugScreenshot::getFileName($this->jobId));
|
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "No next slide button found"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach ($buttons as $button) {
|
foreach ($buttons as $button) {
|
||||||
// Click the next slide button if the button is not clickable
|
$button->click();
|
||||||
$clickedFailsCounter = 0;
|
sleep(5);
|
||||||
while ($clickedFailsCounter < 7 && $clickedFailsCounter >= 0) {
|
|
||||||
try {
|
|
||||||
$button->click();
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$clickedFailsCounter++;
|
|
||||||
try {
|
|
||||||
$nextSlideButton->click();
|
|
||||||
} catch (\Exception $_) {}
|
|
||||||
sleep(3);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$clickedFailsCounter = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sleep(5); // Wait a bit for loading
|
|
||||||
$this->joinGiveaway($browser);
|
$this->joinGiveaway($browser);
|
||||||
$browser->within(new MainNav, function (Browser $browser) {
|
$browser->within(new MainNav, function (Browser $browser) {
|
||||||
$browser->goToHome();
|
$browser->goToHome();
|
||||||
@ -238,12 +197,9 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
if ($availibleInButton->getAttribute("disabled") == "true") {
|
if ($availibleInButton->getAttribute("disabled") == "true") {
|
||||||
$hours = $availibleInButton->getText();
|
$hours = $availibleInButton->getText();
|
||||||
// If the text is like "in 26 sec." we need to put one minute
|
// If the text is like "in 26 sec." we need to put one minute
|
||||||
if (str_contains(strtolower($hours), "seconds")) {
|
if (str_contains($hours, "sec")) {
|
||||||
$browser->screenshot(JobDebugScreenshot::getFileName($this->jobId));
|
$this->reschedule(1);
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "I hate niggers"));
|
return;
|
||||||
// $this->reschedule(1);
|
|
||||||
sleep(60);
|
|
||||||
return $this->getDailyFree($browser);
|
|
||||||
}
|
}
|
||||||
$hours = explode(" ", $hours);
|
$hours = explode(" ", $hours);
|
||||||
$minutes = $hours[4];
|
$minutes = $hours[4];
|
||||||
@ -390,7 +346,7 @@ class HellcaseJob extends BrowserJob implements ShouldBeUniqueUntilProcessing
|
|||||||
$browser->clickAtXPath('//*[contains(text(), "Edit Profile")]');
|
$browser->clickAtXPath('//*[contains(text(), "Edit Profile")]');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function removePopups(Browser $browser)
|
private function removePopups(Browser $browser)
|
||||||
{
|
{
|
||||||
// $browser->script('document.querySelector("div.app-modal")[0].remove();');
|
// $browser->script('document.querySelector("div.app-modal")[0].remove();');
|
||||||
// $browser->driver->executeScript('document.querySelector("div.app-modal")[0].remove();');
|
// $browser->driver->executeScript('document.querySelector("div.app-modal")[0].remove();');
|
||||||
|
@ -1,145 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Browser\Jobs\HellcaseBattles;
|
|
||||||
|
|
||||||
use App\Browser\Jobs\Hellcase\HellcaseJob;
|
|
||||||
use App\Models\HellcaseBattle;
|
|
||||||
use App\Models\Job;
|
|
||||||
use App\Models\JobRun;
|
|
||||||
use App\Notification\Notifications\JobDebugNotification;
|
|
||||||
use App\Notification\Providers\AllNotification;
|
|
||||||
use Exception;
|
|
||||||
use Facebook\WebDriver\WebDriver;
|
|
||||||
use Facebook\WebDriver\WebDriverBy;
|
|
||||||
use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
|
|
||||||
use Illuminate\Support\Collection;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
|
||||||
use Laravel\Dusk\Browser;
|
|
||||||
|
|
||||||
class HellcaseBattlesJob extends HellcaseJob implements ShouldBeUniqueUntilProcessing
|
|
||||||
{
|
|
||||||
private Collection $jobInfos;
|
|
||||||
private array $battlesToAdd = [];
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
Log::info("Constructing HellcaseBattlesJob");
|
|
||||||
parent::__construct(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function run(Browser $browser): ?JobRun
|
|
||||||
{
|
|
||||||
$this->jobInfos = Job::find($this->jobId)->jobInfosTable();
|
|
||||||
Log::info("Running HellcaseBattlesJob");
|
|
||||||
$this->jobRun = new JobRun([
|
|
||||||
"job_id" => $this->jobId,
|
|
||||||
"success" => false,
|
|
||||||
]);
|
|
||||||
$this->jobRun->save();
|
|
||||||
|
|
||||||
$browser->visit('https://hellcase.com');
|
|
||||||
$browser->waitForText("CASES", 30, true);
|
|
||||||
$this->removePopups($browser);
|
|
||||||
sleep(5);
|
|
||||||
$this->signin($browser);
|
|
||||||
|
|
||||||
$this->saveInterestingBattles($browser);
|
|
||||||
|
|
||||||
$this->sendFinishedBattles($browser);
|
|
||||||
|
|
||||||
$this->createNewBattles();
|
|
||||||
|
|
||||||
$this->jobRun->success = true;
|
|
||||||
$this->jobRun->save();
|
|
||||||
|
|
||||||
Log::info("HellcaseBattlesJob run ended");
|
|
||||||
|
|
||||||
return $this->jobRun;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save current cases battles to database for later processing
|
|
||||||
* @param \Laravel\Dusk\Browser $browser
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function saveInterestingBattles(Browser $browser)
|
|
||||||
{
|
|
||||||
$battleIndex = 0; // Index of the battle to get info from
|
|
||||||
$running = true;
|
|
||||||
while ($running) {
|
|
||||||
$browser->visit('https://hellcase.com/casebattle');
|
|
||||||
$browser->waitForText("CASES", 30, true);
|
|
||||||
|
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "I hate niggers"));
|
|
||||||
|
|
||||||
// Sort by price
|
|
||||||
try {
|
|
||||||
$sortByPriceDiv = $browser->driver->findElement(WebDriverBy::xpath("//*[span[contains(text(), 'Value')]]"));
|
|
||||||
$sortByPriceDiv->click();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "Failed to sort by price"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sleep(5);
|
|
||||||
|
|
||||||
$battles = $browser->driver->findElements(WebDriverBy::xpath("//*[contains(@class, 'casebattle-table__item')]"));
|
|
||||||
$battle = $battles[$battleIndex];
|
|
||||||
$battleIndex++;
|
|
||||||
$browser->scrollIntoView(".casebattle-table__item:nth-child(" . max($battleIndex -1, 1) . ")");
|
|
||||||
sleep(2);
|
|
||||||
$battleValue = floatval(
|
|
||||||
explode(
|
|
||||||
"\n",
|
|
||||||
$battle->findElement(WebDriverBy::xpath("./div/div[contains(@class, 'core-price')]"))->getDomProperty("innerText")
|
|
||||||
)[1]
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($battleValue < floatval($this->jobInfos->get("hellcase_battles_minimum_value"))) {
|
|
||||||
$running = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$battleLinkButton = $battle->findElement(WebDriverBy::xpath('./div//button[text() = "watch"]'));
|
|
||||||
$battleLinkButton->sendKeys("\n");
|
|
||||||
sleep(3);
|
|
||||||
$battleLink = $browser->driver->getCurrentURL();
|
|
||||||
|
|
||||||
$this->battlesToAdd[$battleLink] = $battleValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function sendFinishedBattles(Browser $browser) {
|
|
||||||
// foreach battle that we didn"t already planned to add with $this->battlesToAdd
|
|
||||||
foreach (HellcaseBattle::all() as $battle) {
|
|
||||||
dump($battle);
|
|
||||||
if (!array_key_exists($battle->getUrl(), $this->battlesToAdd)) {
|
|
||||||
dump("finished");
|
|
||||||
$browser->visit($battle->getUrl());
|
|
||||||
|
|
||||||
try {
|
|
||||||
$browser->waitForText("Started at");
|
|
||||||
// Send the battle
|
|
||||||
$this->sendBattle($browser, $battle);
|
|
||||||
} catch (Exception $e) { // Battle is not finished or error (like battle cancelled)
|
|
||||||
}
|
|
||||||
|
|
||||||
$battle->delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function sendBattle(Browser $browser, HellcaseBattle $battle) {
|
|
||||||
AllNotification::send(new JobDebugNotification($this->jobId, "Battle sent" . $battle->getUrl()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function createNewBattles() {
|
|
||||||
foreach ($this->battlesToAdd as $battleLink => $battleValue) {
|
|
||||||
$battleLink = explode("/", $battleLink);
|
|
||||||
HellcaseBattle::firstOrCreate([
|
|
||||||
"battle_id" => $battleLink[count($battleLink) - 1],
|
|
||||||
"value" => $battleValue,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -21,7 +21,7 @@ class JobController extends Controller
|
|||||||
public function show($jobId, Request $request)
|
public function show($jobId, Request $request)
|
||||||
{
|
{
|
||||||
return Inertia::render('Job', [
|
return Inertia::render('Job', [
|
||||||
'job' => Job::where('id', $jobId)->with('jobInfos', 'jobRuns')->first(),
|
'job' => Job::where('id', $jobId)->with('jobInfos')->first(),
|
||||||
'error' => $request->input('error'),
|
'error' => $request->input('error'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Models;
|
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
|
||||||
|
|
||||||
class HellcaseBattle extends Model
|
|
||||||
{
|
|
||||||
protected $fillable = [
|
|
||||||
"battle_id",
|
|
||||||
"value",
|
|
||||||
];
|
|
||||||
|
|
||||||
public function getUrl() {
|
|
||||||
return "https://hellcase.com/casebattle/{$this->battle_id}";
|
|
||||||
}
|
|
||||||
}
|
|
@ -21,16 +21,6 @@ class Job extends Model
|
|||||||
return $this->hasMany(JobInfo::class)->with("jobInfoType")->orderBy("created_at");
|
return $this->hasMany(JobInfo::class)->with("jobInfoType")->orderBy("created_at");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an associative collection of the job infos with their values
|
|
||||||
* @return \Illuminate\Database\Eloquent\Collection<string, string>>
|
|
||||||
*/
|
|
||||||
public function jobInfosTable() {
|
|
||||||
return $this->jobInfos->mapWithKeys(function ($jobInfo) {
|
|
||||||
return [$jobInfo->key => $jobInfo->value];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public function jobRuns()
|
public function jobRuns()
|
||||||
{
|
{
|
||||||
return $this->hasMany(JobRun::class)->orderBy("created_at");
|
return $this->hasMany(JobRun::class)->orderBy("created_at");
|
||||||
|
@ -4,7 +4,6 @@ namespace App\Notification;
|
|||||||
|
|
||||||
use App\Models\Job;
|
use App\Models\Job;
|
||||||
use App\Notification\Stringifiable\StringifiableSimpleText;
|
use App\Notification\Stringifiable\StringifiableSimpleText;
|
||||||
use function PHPUnit\Framework\isNull;
|
|
||||||
|
|
||||||
abstract class Notification {
|
abstract class Notification {
|
||||||
|
|
||||||
@ -13,16 +12,10 @@ abstract class Notification {
|
|||||||
|
|
||||||
public bool $isError;
|
public bool $isError;
|
||||||
|
|
||||||
public function __construct(int $jobId, NotificationBody $body = null, bool $isError = false) {
|
public function __construct(int $jobId, NotificationBody $body, bool $isError = false) {
|
||||||
$this->job = Job::find($jobId);
|
$this->job = Job::find($jobId);
|
||||||
if ($body !== null) {
|
|
||||||
$this->body = $body;
|
|
||||||
}
|
|
||||||
$this->isError = $isError;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setBody(NotificationBody $body) {
|
|
||||||
$this->body = $body;
|
$this->body = $body;
|
||||||
|
$this->isError = $isError;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTitle(): Stringifiable {
|
public function getTitle(): Stringifiable {
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Notification\NotificationBody;
|
|
||||||
|
|
||||||
use App\Models\Job;
|
|
||||||
use App\Notification\NotificationBody;
|
|
||||||
use App\Notification\Stringifiable;
|
|
||||||
|
|
||||||
class JobDebugNotificationBody extends NotificationBody {
|
|
||||||
|
|
||||||
private Job $job;
|
|
||||||
private string $body;
|
|
||||||
private ?string $error;
|
|
||||||
private bool $hasScreenshot;
|
|
||||||
|
|
||||||
public function __construct(Job $job, string $body, string $error = null, bool $hasScreenshot = false) {
|
|
||||||
$this->job = $job;
|
|
||||||
$this->body = $body;
|
|
||||||
$this->error = $error;
|
|
||||||
$this->hasScreenshot = $hasScreenshot;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function constructString(bool $inMarkdown = false) {
|
|
||||||
$mdBody = "";
|
|
||||||
if ($this->body !== null) {
|
|
||||||
$mdBody .= $this->body;
|
|
||||||
}
|
|
||||||
if ($this->error !== null) {
|
|
||||||
$errorWrapper = $inMarkdown ? "```" : "";
|
|
||||||
$mdBody .= " :\n" . $errorWrapper . $this->error . $errorWrapper;
|
|
||||||
}
|
|
||||||
if ($inMarkdown && $this->hasScreenshot) {
|
|
||||||
$mdBody .= "\nScreenshot : ";
|
|
||||||
}
|
|
||||||
return $mdBody;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function toMarkdownString(): string {
|
|
||||||
return $this->constructString(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function toString(): string {
|
|
||||||
return $this->constructString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Notification\NotificationBody;
|
|
||||||
|
|
||||||
use App\Models\Job;
|
|
||||||
use App\Notification\NotificationBody;
|
|
||||||
use App\Notification\Stringifiable;
|
|
||||||
|
|
||||||
class JobErrorNotificationBody extends NotificationBody {
|
|
||||||
|
|
||||||
private Job $job;
|
|
||||||
private string $error;
|
|
||||||
|
|
||||||
public function __construct(Job $job, $error) {
|
|
||||||
$this->job = $job;
|
|
||||||
$this->error = $error;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function toMarkdownString(): string {
|
|
||||||
return "Le job \"{$this->job->name}\" a échoué avec l'erreur :\n ```" . $this->error . "``` \nScreenshot : ";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function toString(): string {
|
|
||||||
return "Le job \"{$this->job->name}\" a échoué avec l'erreur :\n " . $this->error;
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,9 +3,12 @@
|
|||||||
namespace App\Notification\Notifications\Hellcase;
|
namespace App\Notification\Notifications\Hellcase;
|
||||||
|
|
||||||
use App\Browser\Jobs\Hellcase\HellcaseDailyFreeScreenshot;
|
use App\Browser\Jobs\Hellcase\HellcaseDailyFreeScreenshot;
|
||||||
|
use App\Browser\Jobs\Hellcase\HellcaseLoginQrCode;
|
||||||
use App\Notification\Notification;
|
use App\Notification\Notification;
|
||||||
|
use App\Notification\Notifications\NotificationLogin;
|
||||||
|
use Laravel\Dusk\Browser;
|
||||||
|
|
||||||
class HellcaseNotificationDailyFree extends Notification {
|
class HellcaseNotificationDailyFree extends NotificationLogin {
|
||||||
|
|
||||||
public function __construct(int $jobId, \App\Notification\NotificationBody $body) {
|
public function __construct(int $jobId, \App\Notification\NotificationBody $body) {
|
||||||
parent::__construct($jobId, $body);
|
parent::__construct($jobId, $body);
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Notification\Notifications;
|
|
||||||
|
|
||||||
use App\Browser\JobDebugScreenshot;
|
|
||||||
use App\Notification\Notification;
|
|
||||||
use App\Notification\NotificationBody\JobDebugNotificationBody;
|
|
||||||
use App\Notification\Stringifiable;
|
|
||||||
use App\Notification\Stringifiable\StringifiableSimpleText;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
|
||||||
|
|
||||||
class JobDebugNotification extends Notification {
|
|
||||||
|
|
||||||
private string|null $title;
|
|
||||||
private string|null $screenShotProjectPath;
|
|
||||||
|
|
||||||
public function __construct(int $jobId, string $body, string $title = null, string $error = null, ?string $screenshotProjectPath = "", bool $isError = false) {
|
|
||||||
parent::__construct($jobId, isError:$isError);
|
|
||||||
$this->title = $title;
|
|
||||||
if ($screenshotProjectPath === "") {
|
|
||||||
$screenshotProjectPath = JobDebugScreenshot::getImgFileProjectPath($jobId);
|
|
||||||
}
|
|
||||||
$this->screenShotProjectPath = $screenshotProjectPath;
|
|
||||||
$this->setBody(new JobDebugNotificationBody($this->job, $body, $error, $this->screenShotProjectPath != null));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle(): Stringifiable {
|
|
||||||
return new StringifiableSimpleText($this->title ?? "DEBUG Job {$this->job->name}");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function getImageProjectPath(): string|null {
|
|
||||||
return $this->screenShotProjectPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function getLinkURL(): string|null {
|
|
||||||
return route('jobs.show', ['job' => $this->job->id]);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Notification\Notifications;
|
|
||||||
|
|
||||||
use App\Browser\JobErrorScreenshot;
|
|
||||||
use App\Models\Job;
|
|
||||||
use App\Notification\Notification;
|
|
||||||
use App\Notification\NotificationBody\JobErrorNotificationBody;
|
|
||||||
use App\Notification\Stringifiable;
|
|
||||||
use App\Notification\Stringifiable\StringifiableSimpleText;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
|
||||||
|
|
||||||
class JobErrorNotification extends Notification {
|
|
||||||
|
|
||||||
public function __construct(int $jobId, string $error) {
|
|
||||||
parent::__construct($jobId, isError:true);
|
|
||||||
$this->setBody(new JobErrorNotificationBody($this->job, $error));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle(): Stringifiable {
|
|
||||||
return new StringifiableSimpleText("Le job {$this->job->name} a échoué");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function getImageProjectPath(): string|null {
|
|
||||||
return JobErrorScreenshot::getImgFileProjectPath($this->job->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function getLinkURL(): string|null {
|
|
||||||
return route('jobs.show', ['job' => $this->job->id]);
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,6 +3,9 @@
|
|||||||
namespace App\Notification\Providers;
|
namespace App\Notification\Providers;
|
||||||
|
|
||||||
use App\Notification\NotificationProvider;
|
use App\Notification\NotificationProvider;
|
||||||
|
use App\Notification\INotificationProvider;
|
||||||
|
use App\Models\JobInfo;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
class AllNotification extends NotificationProvider {
|
class AllNotification extends NotificationProvider {
|
||||||
private const NOTIFICATIONS_PROVIDERS = [
|
private const NOTIFICATIONS_PROVIDERS = [
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Notification\Providers;
|
namespace App\Notification\Providers;
|
||||||
|
|
||||||
use App\Notification\NotificationProvider;
|
use App\Notification\NotificationProvider;
|
||||||
|
use App\Notification\INotificationProvider;
|
||||||
use App\Models\JobInfo;
|
use App\Models\JobInfo;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
"$schema": "https://shadcn-vue.com/schema.json",
|
"$schema": "https://shadcn-vue.com/schema.json",
|
||||||
"style": "default",
|
"style": "default",
|
||||||
"typescript": true,
|
"typescript": true,
|
||||||
|
"tsConfigPath": "./tsconfig.json",
|
||||||
"tailwind": {
|
"tailwind": {
|
||||||
"config": "tailwind.config.js",
|
"config": "tailwind.config.js",
|
||||||
"css": "resources/css/app.css",
|
"css": "resources/css/app.css",
|
||||||
@ -9,12 +10,9 @@
|
|||||||
"cssVariables": true,
|
"cssVariables": true,
|
||||||
"prefix": ""
|
"prefix": ""
|
||||||
},
|
},
|
||||||
|
"framework": "laravel",
|
||||||
"aliases": {
|
"aliases": {
|
||||||
"components": "@/Components",
|
"components": "@/Components",
|
||||||
"composables": "@/composables",
|
"utils": "@/lib/utils"
|
||||||
"utils": "@/lib/utils",
|
}
|
||||||
"ui": "@/Components/ui",
|
|
||||||
"lib": "@/lib"
|
|
||||||
},
|
|
||||||
"iconLibrary": "lucide"
|
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
"erusev/parsedown": "^1.7",
|
"erusev/parsedown": "^1.7",
|
||||||
"inertiajs/inertia-laravel": "^2.0",
|
"inertiajs/inertia-laravel": "^2.0",
|
||||||
"laravel/dusk": "^8.2",
|
"laravel/dusk": "^8.2",
|
||||||
"laravel/framework": "^12.0",
|
"laravel/framework": "^11.31",
|
||||||
"laravel/reverb": "^1.0",
|
"laravel/reverb": "^1.0",
|
||||||
"laravel/sanctum": "^4.0",
|
"laravel/sanctum": "^4.0",
|
||||||
"laravel/telescope": "^5.5",
|
"laravel/telescope": "^5.5",
|
||||||
|
369
composer.lock
generated
369
composer.lock
generated
@ -4,20 +4,20 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "6008577001548e6e63c074be98000d97",
|
"content-hash": "8aafa9016bed300d87195bccee6bfe4b",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "brick/math",
|
"name": "brick/math",
|
||||||
"version": "0.12.3",
|
"version": "0.12.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/brick/math.git",
|
"url": "https://github.com/brick/math.git",
|
||||||
"reference": "866551da34e9a618e64a819ee1e01c20d8a588ba"
|
"reference": "f510c0a40911935b77b86859eb5223d58d660df1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba",
|
"url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1",
|
||||||
"reference": "866551da34e9a618e64a819ee1e01c20d8a588ba",
|
"reference": "f510c0a40911935b77b86859eb5223d58d660df1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -26,7 +26,7 @@
|
|||||||
"require-dev": {
|
"require-dev": {
|
||||||
"php-coveralls/php-coveralls": "^2.2",
|
"php-coveralls/php-coveralls": "^2.2",
|
||||||
"phpunit/phpunit": "^10.1",
|
"phpunit/phpunit": "^10.1",
|
||||||
"vimeo/psalm": "6.8.8"
|
"vimeo/psalm": "5.16.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -56,7 +56,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/brick/math/issues",
|
"issues": "https://github.com/brick/math/issues",
|
||||||
"source": "https://github.com/brick/math/tree/0.12.3"
|
"source": "https://github.com/brick/math/tree/0.12.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -64,7 +64,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-28T13:11:00+00:00"
|
"time": "2023-11-29T23:19:16+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "carbonphp/carbon-doctrine-types",
|
"name": "carbonphp/carbon-doctrine-types",
|
||||||
@ -1283,21 +1283,21 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "inertiajs/inertia-laravel",
|
"name": "inertiajs/inertia-laravel",
|
||||||
"version": "v2.0.1",
|
"version": "v2.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/inertiajs/inertia-laravel.git",
|
"url": "https://github.com/inertiajs/inertia-laravel.git",
|
||||||
"reference": "d855ad18bcaae883e307619370d8c3dcfb5adbaa"
|
"reference": "0259e37f802bc39c814c42ba92c04ada17921f70"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/d855ad18bcaae883e307619370d8c3dcfb5adbaa",
|
"url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/0259e37f802bc39c814c42ba92c04ada17921f70",
|
||||||
"reference": "d855ad18bcaae883e307619370d8c3dcfb5adbaa",
|
"reference": "0259e37f802bc39c814c42ba92c04ada17921f70",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"laravel/framework": "^10.0|^11.0|^12.0",
|
"laravel/framework": "^10.0|^11.0",
|
||||||
"php": "^8.1.0",
|
"php": "^8.1.0",
|
||||||
"symfony/console": "^6.2|^7.0"
|
"symfony/console": "^6.2|^7.0"
|
||||||
},
|
},
|
||||||
@ -1345,7 +1345,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/inertiajs/inertia-laravel/issues",
|
"issues": "https://github.com/inertiajs/inertia-laravel/issues",
|
||||||
"source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.1"
|
"source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -1353,20 +1353,20 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-18T19:00:36+00:00"
|
"time": "2024-12-13T02:48:29+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/dusk",
|
"name": "laravel/dusk",
|
||||||
"version": "v8.3.1",
|
"version": "v8.2.14",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/dusk.git",
|
"url": "https://github.com/laravel/dusk.git",
|
||||||
"reference": "541ca2d2004ae4ed04446b9e712b68180fca158c"
|
"reference": "28c9fce3900625522afc2468a9117cdf44f919c1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/dusk/zipball/541ca2d2004ae4ed04446b9e712b68180fca158c",
|
"url": "https://api.github.com/repos/laravel/dusk/zipball/28c9fce3900625522afc2468a9117cdf44f919c1",
|
||||||
"reference": "541ca2d2004ae4ed04446b9e712b68180fca158c",
|
"reference": "28c9fce3900625522afc2468a9117cdf44f919c1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1383,13 +1383,11 @@
|
|||||||
"vlucas/phpdotenv": "^5.2"
|
"vlucas/phpdotenv": "^5.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"laravel/framework": "^10.0|^11.0|^12.0",
|
|
||||||
"mockery/mockery": "^1.6",
|
"mockery/mockery": "^1.6",
|
||||||
"orchestra/testbench-core": "^8.19|^9.0|^10.0",
|
"orchestra/testbench": "^8.19|^9.0|^10.0",
|
||||||
"phpstan/phpstan": "^1.10",
|
"phpstan/phpstan": "^1.10",
|
||||||
"phpunit/phpunit": "^10.1|^11.0|^12.0.1",
|
"phpunit/phpunit": "^10.1|^11.0",
|
||||||
"psy/psysh": "^0.11.12|^0.12",
|
"psy/psysh": "^0.11.12|^0.12"
|
||||||
"symfony/yaml": "^6.2|^7.0"
|
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-pcntl": "Used to gracefully terminate Dusk when tests are running."
|
"ext-pcntl": "Used to gracefully terminate Dusk when tests are running."
|
||||||
@ -1425,26 +1423,26 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/laravel/dusk/issues",
|
"issues": "https://github.com/laravel/dusk/issues",
|
||||||
"source": "https://github.com/laravel/dusk/tree/v8.3.1"
|
"source": "https://github.com/laravel/dusk/tree/v8.2.14"
|
||||||
},
|
},
|
||||||
"time": "2025-02-12T16:14:51+00:00"
|
"time": "2025-01-26T19:36:00+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/framework",
|
"name": "laravel/framework",
|
||||||
"version": "v12.0.1",
|
"version": "v11.41.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/framework.git",
|
"url": "https://github.com/laravel/framework.git",
|
||||||
"reference": "d99e2385a6d4324782d52f4423891966425641be"
|
"reference": "3ef433d5865f30a19b6b1be247586068399b59cc"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/framework/zipball/d99e2385a6d4324782d52f4423891966425641be",
|
"url": "https://api.github.com/repos/laravel/framework/zipball/3ef433d5865f30a19b6b1be247586068399b59cc",
|
||||||
"reference": "d99e2385a6d4324782d52f4423891966425641be",
|
"reference": "3ef433d5865f30a19b6b1be247586068399b59cc",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"brick/math": "^0.11|^0.12",
|
"brick/math": "^0.9.3|^0.10.2|^0.11|^0.12",
|
||||||
"composer-runtime-api": "^2.2",
|
"composer-runtime-api": "^2.2",
|
||||||
"doctrine/inflector": "^2.0.5",
|
"doctrine/inflector": "^2.0.5",
|
||||||
"dragonmantank/cron-expression": "^3.4",
|
"dragonmantank/cron-expression": "^3.4",
|
||||||
@ -1459,32 +1457,32 @@
|
|||||||
"fruitcake/php-cors": "^1.3",
|
"fruitcake/php-cors": "^1.3",
|
||||||
"guzzlehttp/guzzle": "^7.8.2",
|
"guzzlehttp/guzzle": "^7.8.2",
|
||||||
"guzzlehttp/uri-template": "^1.0",
|
"guzzlehttp/uri-template": "^1.0",
|
||||||
"laravel/prompts": "^0.3.0",
|
"laravel/prompts": "^0.1.18|^0.2.0|^0.3.0",
|
||||||
"laravel/serializable-closure": "^1.3|^2.0",
|
"laravel/serializable-closure": "^1.3|^2.0",
|
||||||
"league/commonmark": "^2.6",
|
"league/commonmark": "^2.6",
|
||||||
"league/flysystem": "^3.25.1",
|
"league/flysystem": "^3.25.1",
|
||||||
"league/flysystem-local": "^3.25.1",
|
"league/flysystem-local": "^3.25.1",
|
||||||
"league/uri": "^7.5.1",
|
"league/uri": "^7.5.1",
|
||||||
"monolog/monolog": "^3.0",
|
"monolog/monolog": "^3.0",
|
||||||
"nesbot/carbon": "^3.8.4",
|
"nesbot/carbon": "^2.72.6|^3.8.4",
|
||||||
"nunomaduro/termwind": "^2.0",
|
"nunomaduro/termwind": "^2.0",
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
"psr/container": "^1.1.1|^2.0.1",
|
"psr/container": "^1.1.1|^2.0.1",
|
||||||
"psr/log": "^1.0|^2.0|^3.0",
|
"psr/log": "^1.0|^2.0|^3.0",
|
||||||
"psr/simple-cache": "^1.0|^2.0|^3.0",
|
"psr/simple-cache": "^1.0|^2.0|^3.0",
|
||||||
"ramsey/uuid": "^4.7",
|
"ramsey/uuid": "^4.7",
|
||||||
"symfony/console": "^7.2.0",
|
"symfony/console": "^7.0.3",
|
||||||
"symfony/error-handler": "^7.2.0",
|
"symfony/error-handler": "^7.0.3",
|
||||||
"symfony/finder": "^7.2.0",
|
"symfony/finder": "^7.0.3",
|
||||||
"symfony/http-foundation": "^7.2.0",
|
"symfony/http-foundation": "^7.2.0",
|
||||||
"symfony/http-kernel": "^7.2.0",
|
"symfony/http-kernel": "^7.0.3",
|
||||||
"symfony/mailer": "^7.2.0",
|
"symfony/mailer": "^7.0.3",
|
||||||
"symfony/mime": "^7.2.0",
|
"symfony/mime": "^7.0.3",
|
||||||
"symfony/polyfill-php83": "^1.31",
|
"symfony/polyfill-php83": "^1.31",
|
||||||
"symfony/process": "^7.2.0",
|
"symfony/process": "^7.0.3",
|
||||||
"symfony/routing": "^7.2.0",
|
"symfony/routing": "^7.0.3",
|
||||||
"symfony/uid": "^7.2.0",
|
"symfony/uid": "^7.0.3",
|
||||||
"symfony/var-dumper": "^7.2.0",
|
"symfony/var-dumper": "^7.0.3",
|
||||||
"tijsverkoyen/css-to-inline-styles": "^2.2.5",
|
"tijsverkoyen/css-to-inline-styles": "^2.2.5",
|
||||||
"vlucas/phpdotenv": "^5.6.1",
|
"vlucas/phpdotenv": "^5.6.1",
|
||||||
"voku/portable-ascii": "^2.0.2"
|
"voku/portable-ascii": "^2.0.2"
|
||||||
@ -1548,17 +1546,17 @@
|
|||||||
"league/flysystem-read-only": "^3.25.1",
|
"league/flysystem-read-only": "^3.25.1",
|
||||||
"league/flysystem-sftp-v3": "^3.25.1",
|
"league/flysystem-sftp-v3": "^3.25.1",
|
||||||
"mockery/mockery": "^1.6.10",
|
"mockery/mockery": "^1.6.10",
|
||||||
"orchestra/testbench-core": "^10.0",
|
"orchestra/testbench-core": "^9.6",
|
||||||
"pda/pheanstalk": "^5.0.6",
|
"pda/pheanstalk": "^5.0.6",
|
||||||
"php-http/discovery": "^1.15",
|
"php-http/discovery": "^1.15",
|
||||||
"phpstan/phpstan": "^2.0",
|
"phpstan/phpstan": "^1.11.5",
|
||||||
"phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1",
|
"phpunit/phpunit": "^10.5.35|^11.3.6",
|
||||||
"predis/predis": "^2.3",
|
"predis/predis": "^2.3",
|
||||||
"resend/resend-php": "^0.10.0",
|
"resend/resend-php": "^0.10.0",
|
||||||
"symfony/cache": "^7.2.0",
|
"symfony/cache": "^7.0.3",
|
||||||
"symfony/http-client": "^7.2.0",
|
"symfony/http-client": "^7.0.3",
|
||||||
"symfony/psr-http-message-bridge": "^7.2.0",
|
"symfony/psr-http-message-bridge": "^7.0.3",
|
||||||
"symfony/translation": "^7.2.0"
|
"symfony/translation": "^7.0.3"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
|
"ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
|
||||||
@ -1584,22 +1582,22 @@
|
|||||||
"mockery/mockery": "Required to use mocking (^1.6).",
|
"mockery/mockery": "Required to use mocking (^1.6).",
|
||||||
"pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
|
"pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
|
||||||
"php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
|
"php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
|
||||||
"phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).",
|
"phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).",
|
||||||
"predis/predis": "Required to use the predis connector (^2.3).",
|
"predis/predis": "Required to use the predis connector (^2.3).",
|
||||||
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
|
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
|
||||||
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
|
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
|
||||||
"resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).",
|
"resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).",
|
||||||
"symfony/cache": "Required to PSR-6 cache bridge (^7.2).",
|
"symfony/cache": "Required to PSR-6 cache bridge (^7.0).",
|
||||||
"symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).",
|
"symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).",
|
||||||
"symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).",
|
"symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).",
|
||||||
"symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).",
|
"symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).",
|
||||||
"symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).",
|
"symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).",
|
||||||
"symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)."
|
"symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)."
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "12.x-dev"
|
"dev-master": "11.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -1642,20 +1640,20 @@
|
|||||||
"issues": "https://github.com/laravel/framework/issues",
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
"source": "https://github.com/laravel/framework"
|
"source": "https://github.com/laravel/framework"
|
||||||
},
|
},
|
||||||
"time": "2025-02-24T13:31:23+00:00"
|
"time": "2025-01-30T13:25:22+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/prompts",
|
"name": "laravel/prompts",
|
||||||
"version": "v0.3.5",
|
"version": "v0.3.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/prompts.git",
|
"url": "https://github.com/laravel/prompts.git",
|
||||||
"reference": "57b8f7efe40333cdb925700891c7d7465325d3b1"
|
"reference": "abeaa2ba4294247d5409490d1ca1bc6248087011"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/prompts/zipball/57b8f7efe40333cdb925700891c7d7465325d3b1",
|
"url": "https://api.github.com/repos/laravel/prompts/zipball/abeaa2ba4294247d5409490d1ca1bc6248087011",
|
||||||
"reference": "57b8f7efe40333cdb925700891c7d7465325d3b1",
|
"reference": "abeaa2ba4294247d5409490d1ca1bc6248087011",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1699,9 +1697,9 @@
|
|||||||
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/laravel/prompts/issues",
|
"issues": "https://github.com/laravel/prompts/issues",
|
||||||
"source": "https://github.com/laravel/prompts/tree/v0.3.5"
|
"source": "https://github.com/laravel/prompts/tree/v0.3.4"
|
||||||
},
|
},
|
||||||
"time": "2025-02-11T13:34:40+00:00"
|
"time": "2025-01-24T15:41:01+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/reverb",
|
"name": "laravel/reverb",
|
||||||
@ -1851,16 +1849,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/serializable-closure",
|
"name": "laravel/serializable-closure",
|
||||||
"version": "v2.0.3",
|
"version": "v2.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/serializable-closure.git",
|
"url": "https://github.com/laravel/serializable-closure.git",
|
||||||
"reference": "f379c13663245f7aa4512a7869f62eb14095f23f"
|
"reference": "2e1a362527783bcab6c316aad51bf36c5513ae44"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f379c13663245f7aa4512a7869f62eb14095f23f",
|
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2e1a362527783bcab6c316aad51bf36c5513ae44",
|
||||||
"reference": "f379c13663245f7aa4512a7869f62eb14095f23f",
|
"reference": "2e1a362527783bcab6c316aad51bf36c5513ae44",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1908,7 +1906,7 @@
|
|||||||
"issues": "https://github.com/laravel/serializable-closure/issues",
|
"issues": "https://github.com/laravel/serializable-closure/issues",
|
||||||
"source": "https://github.com/laravel/serializable-closure"
|
"source": "https://github.com/laravel/serializable-closure"
|
||||||
},
|
},
|
||||||
"time": "2025-02-11T15:03:05+00:00"
|
"time": "2025-01-24T15:42:37+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/telescope",
|
"name": "laravel/telescope",
|
||||||
@ -2701,16 +2699,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nesbot/carbon",
|
"name": "nesbot/carbon",
|
||||||
"version": "3.8.6",
|
"version": "3.8.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/CarbonPHP/carbon.git",
|
"url": "https://github.com/CarbonPHP/carbon.git",
|
||||||
"reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd"
|
"reference": "129700ed449b1f02d70272d2ac802357c8c30c58"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd",
|
"url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/129700ed449b1f02d70272d2ac802357c8c30c58",
|
||||||
"reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd",
|
"reference": "129700ed449b1f02d70272d2ac802357c8c30c58",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -2786,8 +2784,8 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"docs": "https://carbon.nesbot.com/docs",
|
"docs": "https://carbon.nesbot.com/docs",
|
||||||
"issues": "https://github.com/CarbonPHP/carbon/issues",
|
"issues": "https://github.com/briannesbitt/Carbon/issues",
|
||||||
"source": "https://github.com/CarbonPHP/carbon"
|
"source": "https://github.com/briannesbitt/Carbon"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -2803,7 +2801,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-20T17:33:38+00:00"
|
"time": "2024-12-27T09:25:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nette/schema",
|
"name": "nette/schema",
|
||||||
@ -3928,16 +3926,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ramsey/collection",
|
"name": "ramsey/collection",
|
||||||
"version": "2.1.0",
|
"version": "2.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/ramsey/collection.git",
|
"url": "https://github.com/ramsey/collection.git",
|
||||||
"reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109"
|
"reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109",
|
"url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
|
||||||
"reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109",
|
"reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -3945,22 +3943,25 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"captainhook/plugin-composer": "^5.3",
|
"captainhook/plugin-composer": "^5.3",
|
||||||
"ergebnis/composer-normalize": "^2.45",
|
"ergebnis/composer-normalize": "^2.28.3",
|
||||||
"fakerphp/faker": "^1.24",
|
"fakerphp/faker": "^1.21",
|
||||||
"hamcrest/hamcrest-php": "^2.0",
|
"hamcrest/hamcrest-php": "^2.0",
|
||||||
"jangregor/phpstan-prophecy": "^2.1",
|
"jangregor/phpstan-prophecy": "^1.0",
|
||||||
"mockery/mockery": "^1.6",
|
"mockery/mockery": "^1.5",
|
||||||
"php-parallel-lint/php-console-highlighter": "^1.0",
|
"php-parallel-lint/php-console-highlighter": "^1.0",
|
||||||
"php-parallel-lint/php-parallel-lint": "^1.4",
|
"php-parallel-lint/php-parallel-lint": "^1.3",
|
||||||
"phpspec/prophecy-phpunit": "^2.3",
|
"phpcsstandards/phpcsutils": "^1.0.0-rc1",
|
||||||
"phpstan/extension-installer": "^1.4",
|
"phpspec/prophecy-phpunit": "^2.0",
|
||||||
"phpstan/phpstan": "^2.1",
|
"phpstan/extension-installer": "^1.2",
|
||||||
"phpstan/phpstan-mockery": "^2.0",
|
"phpstan/phpstan": "^1.9",
|
||||||
"phpstan/phpstan-phpunit": "^2.0",
|
"phpstan/phpstan-mockery": "^1.1",
|
||||||
"phpunit/phpunit": "^10.5",
|
"phpstan/phpstan-phpunit": "^1.3",
|
||||||
"ramsey/coding-standard": "^2.3",
|
"phpunit/phpunit": "^9.5",
|
||||||
"ramsey/conventional-commits": "^1.6",
|
"psalm/plugin-mockery": "^1.1",
|
||||||
"roave/security-advisories": "dev-latest"
|
"psalm/plugin-phpunit": "^0.18.4",
|
||||||
|
"ramsey/coding-standard": "^2.0.3",
|
||||||
|
"ramsey/conventional-commits": "^1.3",
|
||||||
|
"vimeo/psalm": "^5.4"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@ -3998,9 +3999,19 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/ramsey/collection/issues",
|
"issues": "https://github.com/ramsey/collection/issues",
|
||||||
"source": "https://github.com/ramsey/collection/tree/2.1.0"
|
"source": "https://github.com/ramsey/collection/tree/2.0.0"
|
||||||
},
|
},
|
||||||
"time": "2025-03-02T04:48:29+00:00"
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/ramsey",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2022-12-31T21:50:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ramsey/uuid",
|
"name": "ramsey/uuid",
|
||||||
@ -4982,16 +4993,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/error-handler",
|
"name": "symfony/error-handler",
|
||||||
"version": "v7.2.4",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/error-handler.git",
|
"url": "https://github.com/symfony/error-handler.git",
|
||||||
"reference": "aabf79938aa795350c07ce6464dd1985607d95d5"
|
"reference": "959a74d044a6db21f4caa6d695648dcb5584cb49"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/error-handler/zipball/aabf79938aa795350c07ce6464dd1985607d95d5",
|
"url": "https://api.github.com/repos/symfony/error-handler/zipball/959a74d044a6db21f4caa6d695648dcb5584cb49",
|
||||||
"reference": "aabf79938aa795350c07ce6464dd1985607d95d5",
|
"reference": "959a74d044a6db21f4caa6d695648dcb5584cb49",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -5037,7 +5048,7 @@
|
|||||||
"description": "Provides tools to manage errors and ease debugging PHP code",
|
"description": "Provides tools to manage errors and ease debugging PHP code",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/error-handler/tree/v7.2.4"
|
"source": "https://github.com/symfony/error-handler/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -5053,7 +5064,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-02T20:27:07+00:00"
|
"time": "2025-01-07T09:39:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher",
|
"name": "symfony/event-dispatcher",
|
||||||
@ -5355,16 +5366,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-kernel",
|
"name": "symfony/http-kernel",
|
||||||
"version": "v7.2.4",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-kernel.git",
|
"url": "https://github.com/symfony/http-kernel.git",
|
||||||
"reference": "9f1103734c5789798fefb90e91de4586039003ed"
|
"reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f1103734c5789798fefb90e91de4586039003ed",
|
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b",
|
||||||
"reference": "9f1103734c5789798fefb90e91de4586039003ed",
|
"reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -5449,7 +5460,7 @@
|
|||||||
"description": "Provides a structured process for converting a Request into a Response",
|
"description": "Provides a structured process for converting a Request into a Response",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-kernel/tree/v7.2.4"
|
"source": "https://github.com/symfony/http-kernel/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -5465,7 +5476,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-26T11:01:22+00:00"
|
"time": "2025-01-29T07:40:13+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mailer",
|
"name": "symfony/mailer",
|
||||||
@ -5549,16 +5560,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mime",
|
"name": "symfony/mime",
|
||||||
"version": "v7.2.4",
|
"version": "v7.2.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mime.git",
|
"url": "https://github.com/symfony/mime.git",
|
||||||
"reference": "87ca22046b78c3feaff04b337f33b38510fd686b"
|
"reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b",
|
"url": "https://api.github.com/repos/symfony/mime/zipball/2fc3b4bd67e4747e45195bc4c98bea4628476204",
|
||||||
"reference": "87ca22046b78c3feaff04b337f33b38510fd686b",
|
"reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -5613,7 +5624,7 @@
|
|||||||
"mime-type"
|
"mime-type"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mime/tree/v7.2.4"
|
"source": "https://github.com/symfony/mime/tree/v7.2.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -5629,7 +5640,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-19T08:51:20+00:00"
|
"time": "2025-01-27T11:08:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-ctype",
|
"name": "symfony/polyfill-ctype",
|
||||||
@ -6269,16 +6280,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/process",
|
"name": "symfony/process",
|
||||||
"version": "v7.2.4",
|
"version": "v7.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/process.git",
|
"url": "https://github.com/symfony/process.git",
|
||||||
"reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf"
|
"reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/process/zipball/d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf",
|
"url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
|
||||||
"reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf",
|
"reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6310,7 +6321,7 @@
|
|||||||
"description": "Executes commands in sub-processes",
|
"description": "Executes commands in sub-processes",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/process/tree/v7.2.4"
|
"source": "https://github.com/symfony/process/tree/v7.2.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -6326,7 +6337,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-05T08:33:46+00:00"
|
"time": "2024-11-06T14:24:19+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/routing",
|
"name": "symfony/routing",
|
||||||
@ -6581,16 +6592,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation",
|
"name": "symfony/translation",
|
||||||
"version": "v7.2.4",
|
"version": "v7.2.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/translation.git",
|
"url": "https://github.com/symfony/translation.git",
|
||||||
"reference": "283856e6981286cc0d800b53bd5703e8e363f05a"
|
"reference": "e2674a30132b7cc4d74540d6c2573aa363f05923"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a",
|
"url": "https://api.github.com/repos/symfony/translation/zipball/e2674a30132b7cc4d74540d6c2573aa363f05923",
|
||||||
"reference": "283856e6981286cc0d800b53bd5703e8e363f05a",
|
"reference": "e2674a30132b7cc4d74540d6c2573aa363f05923",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6656,7 +6667,7 @@
|
|||||||
"description": "Provides tools to internationalize your application",
|
"description": "Provides tools to internationalize your application",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/translation/tree/v7.2.4"
|
"source": "https://github.com/symfony/translation/tree/v7.2.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -6672,7 +6683,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-13T10:27:23+00:00"
|
"time": "2024-12-07T08:18:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation-contracts",
|
"name": "symfony/translation-contracts",
|
||||||
@ -6911,16 +6922,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tightenco/ziggy",
|
"name": "tightenco/ziggy",
|
||||||
"version": "v2.5.2",
|
"version": "v2.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/tighten/ziggy.git",
|
"url": "https://github.com/tighten/ziggy.git",
|
||||||
"reference": "d59dbb61dc0a1d9abb2130451b9e5e0f264bfe1c"
|
"reference": "2b574ba281546884b7bdde6eefa451ba7e0b52f7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/tighten/ziggy/zipball/d59dbb61dc0a1d9abb2130451b9e5e0f264bfe1c",
|
"url": "https://api.github.com/repos/tighten/ziggy/zipball/2b574ba281546884b7bdde6eefa451ba7e0b52f7",
|
||||||
"reference": "d59dbb61dc0a1d9abb2130451b9e5e0f264bfe1c",
|
"reference": "2b574ba281546884b7bdde6eefa451ba7e0b52f7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -6930,9 +6941,9 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"laravel/folio": "^1.1",
|
"laravel/folio": "^1.1",
|
||||||
"orchestra/testbench": "^7.0 || ^8.0 || ^9.0 || ^10.0",
|
"orchestra/testbench": "^7.0 || ^8.0 || ^9.0",
|
||||||
"pestphp/pest": "^2.26|^3.0",
|
"pestphp/pest": "^2.26",
|
||||||
"pestphp/pest-plugin-laravel": "^2.4|^3.0"
|
"pestphp/pest-plugin-laravel": "^2.4"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@ -6975,9 +6986,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/tighten/ziggy/issues",
|
"issues": "https://github.com/tighten/ziggy/issues",
|
||||||
"source": "https://github.com/tighten/ziggy/tree/v2.5.2"
|
"source": "https://github.com/tighten/ziggy/tree/v2.5.0"
|
||||||
},
|
},
|
||||||
"time": "2025-02-27T15:43:52+00:00"
|
"time": "2025-01-23T00:32:18+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "tijsverkoyen/css-to-inline-styles",
|
"name": "tijsverkoyen/css-to-inline-styles",
|
||||||
@ -7439,29 +7450,29 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/breeze",
|
"name": "laravel/breeze",
|
||||||
"version": "v2.3.5",
|
"version": "v2.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/breeze.git",
|
"url": "https://github.com/laravel/breeze.git",
|
||||||
"reference": "1d85805c4aecc425a0ce157147384d4becea3fa2"
|
"reference": "c40f7fce4fd80e39c7f4317697eeba21d2344003"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/breeze/zipball/1d85805c4aecc425a0ce157147384d4becea3fa2",
|
"url": "https://api.github.com/repos/laravel/breeze/zipball/c40f7fce4fd80e39c7f4317697eeba21d2344003",
|
||||||
"reference": "1d85805c4aecc425a0ce157147384d4becea3fa2",
|
"reference": "c40f7fce4fd80e39c7f4317697eeba21d2344003",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"illuminate/console": "^11.0|^12.0",
|
"illuminate/console": "^11.0",
|
||||||
"illuminate/filesystem": "^11.0|^12.0",
|
"illuminate/filesystem": "^11.0",
|
||||||
"illuminate/support": "^11.0|^12.0",
|
"illuminate/support": "^11.0",
|
||||||
"illuminate/validation": "^11.0|^12.0",
|
"illuminate/validation": "^11.0",
|
||||||
"php": "^8.2.0",
|
"php": "^8.2.0",
|
||||||
"symfony/console": "^7.0"
|
"symfony/console": "^7.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"laravel/framework": "^11.0|^12.0",
|
"laravel/framework": "^11.0",
|
||||||
"orchestra/testbench-core": "^9.0|^10.0",
|
"orchestra/testbench-core": "^9.0",
|
||||||
"phpstan/phpstan": "^2.0"
|
"phpstan/phpstan": "^2.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@ -7496,7 +7507,7 @@
|
|||||||
"issues": "https://github.com/laravel/breeze/issues",
|
"issues": "https://github.com/laravel/breeze/issues",
|
||||||
"source": "https://github.com/laravel/breeze"
|
"source": "https://github.com/laravel/breeze"
|
||||||
},
|
},
|
||||||
"time": "2025-02-19T23:49:42+00:00"
|
"time": "2025-01-26T19:08:50+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/pail",
|
"name": "laravel/pail",
|
||||||
@ -7578,16 +7589,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/pint",
|
"name": "laravel/pint",
|
||||||
"version": "v1.21.0",
|
"version": "v1.20.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/pint.git",
|
"url": "https://github.com/laravel/pint.git",
|
||||||
"reference": "531fa0871fbde719c51b12afa3a443b8f4e4b425"
|
"reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/pint/zipball/531fa0871fbde719c51b12afa3a443b8f4e4b425",
|
"url": "https://api.github.com/repos/laravel/pint/zipball/53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
|
||||||
"reference": "531fa0871fbde719c51b12afa3a443b8f4e4b425",
|
"reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -7595,15 +7606,15 @@
|
|||||||
"ext-mbstring": "*",
|
"ext-mbstring": "*",
|
||||||
"ext-tokenizer": "*",
|
"ext-tokenizer": "*",
|
||||||
"ext-xml": "*",
|
"ext-xml": "*",
|
||||||
"php": "^8.2.0"
|
"php": "^8.1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"friendsofphp/php-cs-fixer": "^3.68.5",
|
"friendsofphp/php-cs-fixer": "^3.66.0",
|
||||||
"illuminate/view": "^11.42.0",
|
"illuminate/view": "^10.48.25",
|
||||||
"larastan/larastan": "^3.0.4",
|
"larastan/larastan": "^2.9.12",
|
||||||
"laravel-zero/framework": "^11.36.1",
|
"laravel-zero/framework": "^10.48.25",
|
||||||
"mockery/mockery": "^1.6.12",
|
"mockery/mockery": "^1.6.12",
|
||||||
"nunomaduro/termwind": "^2.3",
|
"nunomaduro/termwind": "^1.17.0",
|
||||||
"pestphp/pest": "^2.36.0"
|
"pestphp/pest": "^2.36.0"
|
||||||
},
|
},
|
||||||
"bin": [
|
"bin": [
|
||||||
@ -7640,7 +7651,7 @@
|
|||||||
"issues": "https://github.com/laravel/pint/issues",
|
"issues": "https://github.com/laravel/pint/issues",
|
||||||
"source": "https://github.com/laravel/pint"
|
"source": "https://github.com/laravel/pint"
|
||||||
},
|
},
|
||||||
"time": "2025-02-18T03:18:57+00:00"
|
"time": "2025-01-14T16:20:53+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/sail",
|
"name": "laravel/sail",
|
||||||
@ -7790,16 +7801,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "myclabs/deep-copy",
|
"name": "myclabs/deep-copy",
|
||||||
"version": "1.13.0",
|
"version": "1.12.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/myclabs/DeepCopy.git",
|
"url": "https://github.com/myclabs/DeepCopy.git",
|
||||||
"reference": "024473a478be9df5fdaca2c793f2232fe788e414"
|
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414",
|
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
|
||||||
"reference": "024473a478be9df5fdaca2c793f2232fe788e414",
|
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -7838,7 +7849,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/myclabs/DeepCopy/issues",
|
"issues": "https://github.com/myclabs/DeepCopy/issues",
|
||||||
"source": "https://github.com/myclabs/DeepCopy/tree/1.13.0"
|
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -7846,7 +7857,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-12T12:17:51+00:00"
|
"time": "2024-11-08T17:47:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nunomaduro/collision",
|
"name": "nunomaduro/collision",
|
||||||
@ -8066,23 +8077,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
"version": "11.0.9",
|
"version": "11.0.8",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||||
"reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7"
|
"reference": "418c59fd080954f8c4aa5631d9502ecda2387118"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7",
|
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118",
|
||||||
"reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7",
|
"reference": "418c59fd080954f8c4aa5631d9502ecda2387118",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-libxml": "*",
|
"ext-libxml": "*",
|
||||||
"ext-xmlwriter": "*",
|
"ext-xmlwriter": "*",
|
||||||
"nikic/php-parser": "^5.4.0",
|
"nikic/php-parser": "^5.3.1",
|
||||||
"php": ">=8.2",
|
"php": ">=8.2",
|
||||||
"phpunit/php-file-iterator": "^5.1.0",
|
"phpunit/php-file-iterator": "^5.1.0",
|
||||||
"phpunit/php-text-template": "^4.0.1",
|
"phpunit/php-text-template": "^4.0.1",
|
||||||
@ -8094,7 +8105,7 @@
|
|||||||
"theseer/tokenizer": "^1.2.3"
|
"theseer/tokenizer": "^1.2.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^11.5.2"
|
"phpunit/phpunit": "^11.5.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-pcov": "PHP extension that provides line coverage",
|
"ext-pcov": "PHP extension that provides line coverage",
|
||||||
@ -8132,7 +8143,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
|
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9"
|
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -8140,7 +8151,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-25T13:26:39+00:00"
|
"time": "2024-12-11T12:34:27+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-file-iterator",
|
"name": "phpunit/php-file-iterator",
|
||||||
@ -8389,16 +8400,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "11.5.10",
|
"version": "11.5.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "d5df2b32d729562ff8db634678d71085ee579006"
|
"reference": "e0da3559ec50a91f6a6a201473b607b5ccfd9a1b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d5df2b32d729562ff8db634678d71085ee579006",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e0da3559ec50a91f6a6a201473b607b5ccfd9a1b",
|
||||||
"reference": "d5df2b32d729562ff8db634678d71085ee579006",
|
"reference": "e0da3559ec50a91f6a6a201473b607b5ccfd9a1b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -8408,7 +8419,7 @@
|
|||||||
"ext-mbstring": "*",
|
"ext-mbstring": "*",
|
||||||
"ext-xml": "*",
|
"ext-xml": "*",
|
||||||
"ext-xmlwriter": "*",
|
"ext-xmlwriter": "*",
|
||||||
"myclabs/deep-copy": "^1.13.0",
|
"myclabs/deep-copy": "^1.12.1",
|
||||||
"phar-io/manifest": "^2.0.4",
|
"phar-io/manifest": "^2.0.4",
|
||||||
"phar-io/version": "^3.2.1",
|
"phar-io/version": "^3.2.1",
|
||||||
"php": ">=8.2",
|
"php": ">=8.2",
|
||||||
@ -8470,7 +8481,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.10"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.4"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -8486,7 +8497,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-02-25T06:11:48+00:00"
|
"time": "2025-01-28T15:03:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
|
@ -4,7 +4,5 @@ return [
|
|||||||
|
|
||||||
"driver" => [
|
"driver" => [
|
||||||
"url" => $_ENV['DUSK_DRIVER_URL'] ?? env('DUSK_DRIVER_URL') ?? null
|
"url" => $_ENV['DUSK_DRIVER_URL'] ?? env('DUSK_DRIVER_URL') ?? null
|
||||||
],
|
]
|
||||||
"shouldStartMaximized" => $_ENV['DUSK_START_MAXIMIZED'] ?? env('DUSK_START_MAXIMIZED') ?? false,
|
|
||||||
"headlessDisabled" => $_ENV['DUSK_HEADLESS_DISABLED'] ?? env('DUSK_HEADLESS_DISABLED') ?? false
|
|
||||||
];
|
];
|
||||||
|
44
database/migrations/2025_02_27_180246_add_epic_games_job.php
Normal file
44
database/migrations/2025_02_27_180246_add_epic_games_job.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration {
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
$jobId = 3;
|
||||||
|
\App\Models\Job::forcecreate([
|
||||||
|
'id' => $jobId,
|
||||||
|
'name' => 'Jeu gratuit Epic Games',
|
||||||
|
'description' => 'Prends le jeu gratuit Epic games. Tourne tous les jours.',
|
||||||
|
]);
|
||||||
|
\App\Models\JobInfo::forceCreate([
|
||||||
|
"key" => "epicgames_account_email",
|
||||||
|
"name" => "E-mail",
|
||||||
|
"description" => "L'adresse e-mail utilisée pour votre compte Epic Games.",
|
||||||
|
"job_info_type_id" => 2,
|
||||||
|
"job_id" => $jobId,
|
||||||
|
], );
|
||||||
|
\App\Models\JobInfo::forceCreate([
|
||||||
|
"key" => "epicgames_account_password",
|
||||||
|
"name" => "Mot de passe",
|
||||||
|
"description" => "Le mot de passe utilisé pour votre compte Epic Games.",
|
||||||
|
"job_info_type_id" => 3,
|
||||||
|
"job_id" => $jobId,
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
\App\Models\Job::find(3)->delete();
|
||||||
|
\App\Models\JobInfo::where('job_id', 3)->delete();
|
||||||
|
}
|
||||||
|
};
|
@ -1,82 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use App\Models\Job;
|
|
||||||
use App\Models\JobInfo;
|
|
||||||
use App\Models\JobInfoType;
|
|
||||||
use Illuminate\Database\Migrations\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
|
||||||
use Illuminate\Support\Facades\Schema;
|
|
||||||
|
|
||||||
return new class extends Migration
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Run the migrations.
|
|
||||||
*/
|
|
||||||
public function up(): void
|
|
||||||
{
|
|
||||||
$newJobId = 3;
|
|
||||||
Job::forceCreate([
|
|
||||||
"id" => $newJobId,
|
|
||||||
"name" => "Hellcase Battles",
|
|
||||||
"description" => "Envoie les meilleures battles d'Hellcase",
|
|
||||||
]);
|
|
||||||
|
|
||||||
JobInfo::forceCreate([
|
|
||||||
"key" => "hellcase_battles_discord_webhook_url",
|
|
||||||
"name" => "Webhook Discord",
|
|
||||||
"description" => "Le lien discord webhook utilisé pour envoyer les meilleures battles d'Hellcase.\nSi aucun n'est spécifié, le webhook Discord des paramètres généraux sera utilisé.",
|
|
||||||
"placeholder" => "https://discord.com/api/webhooks/...",
|
|
||||||
"is_required" => false,
|
|
||||||
"job_info_type_id" => 4,
|
|
||||||
"job_id" => $newJobId,
|
|
||||||
]);
|
|
||||||
|
|
||||||
JobInfoType::forceCreate([
|
|
||||||
"id" => 5,
|
|
||||||
"name" => "number",
|
|
||||||
]);
|
|
||||||
JobInfoType::forceCreate([
|
|
||||||
"id" => 6,
|
|
||||||
"name" => "boolean",
|
|
||||||
]);
|
|
||||||
|
|
||||||
JobInfo::forceCreate([
|
|
||||||
"key" => "hellcase_battles_minimum_value",
|
|
||||||
"name" => "Valeur minimum des battles",
|
|
||||||
"description" => "La valeur minimale qu'une battle doit avoir pour être envoyée, en euros.",
|
|
||||||
"placeholder" => "1000",
|
|
||||||
"job_info_type_id" => 5,
|
|
||||||
"job_id" => $newJobId,
|
|
||||||
]);
|
|
||||||
|
|
||||||
JobInfo::forceCreate([
|
|
||||||
"key" => "hellcase_battles_allow_bots",
|
|
||||||
"name" => "Autoriser les battles avec bots",
|
|
||||||
"description" => "Envoyer les battles avec un seul joueur et des bots.",
|
|
||||||
"is_required" => false,
|
|
||||||
"job_info_type_id" => 6,
|
|
||||||
"job_id" => $newJobId,
|
|
||||||
]);
|
|
||||||
|
|
||||||
Schema::create('hellcase_battles', function (Blueprint $table) {
|
|
||||||
$table->id();
|
|
||||||
|
|
||||||
$table->string("battle_id")->unique();
|
|
||||||
$table->float("value");
|
|
||||||
|
|
||||||
$table->timestamps();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reverse the migrations.
|
|
||||||
*/
|
|
||||||
public function down(): void
|
|
||||||
{
|
|
||||||
Job::where("id", 3)->delete();
|
|
||||||
JobInfo::where("job_id", 3)->delete();
|
|
||||||
JobInfoType::whereIn("id", [5, 6])->delete();
|
|
||||||
|
|
||||||
Schema::dropIfExists('hellcase_battles');
|
|
||||||
}
|
|
||||||
};
|
|
77
package-lock.json
generated
77
package-lock.json
generated
@ -11,7 +11,6 @@
|
|||||||
"lucide-react": "^0.474.0",
|
"lucide-react": "^0.474.0",
|
||||||
"lucide-vue-next": "^0.474.0",
|
"lucide-vue-next": "^0.474.0",
|
||||||
"radix-vue": "^1.9.13",
|
"radix-vue": "^1.9.13",
|
||||||
"reka-ui": "^2.1.0",
|
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "^2.6.0",
|
||||||
"tailwindcss-animate": "^1.0.7"
|
"tailwindcss-animate": "^1.0.7"
|
||||||
},
|
},
|
||||||
@ -22,10 +21,8 @@
|
|||||||
"autoprefixer": "^10.4.12",
|
"autoprefixer": "^10.4.12",
|
||||||
"axios": "^1.7.4",
|
"axios": "^1.7.4",
|
||||||
"concurrently": "^9.0.1",
|
"concurrently": "^9.0.1",
|
||||||
"laravel-echo": "^2.0.2",
|
|
||||||
"laravel-vite-plugin": "^1.2.0",
|
"laravel-vite-plugin": "^1.2.0",
|
||||||
"postcss": "^8.4.31",
|
"postcss": "^8.4.31",
|
||||||
"pusher-js": "^8.4.0",
|
|
||||||
"sass-embedded": "^1.83.4",
|
"sass-embedded": "^1.83.4",
|
||||||
"tailwindcss": "^3.2.1",
|
"tailwindcss": "^3.2.1",
|
||||||
"typescript": "^5.6.3",
|
"typescript": "^5.6.3",
|
||||||
@ -959,20 +956,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tanstack/virtual-core": {
|
"node_modules/@tanstack/virtual-core": {
|
||||||
"version": "3.13.4",
|
"version": "3.11.3",
|
||||||
"resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.4.tgz",
|
"resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.3.tgz",
|
||||||
"integrity": "sha512-fNGO9fjjSLns87tlcto106enQQLycCKR4DPNpgq3djP5IdcPFdPAmaKjsgzIeRhH7hWrELgW12hYnRthS5kLUw==",
|
"integrity": "sha512-v2mrNSnMwnPJtcVqNvV0c5roGCBqeogN8jDtgtuHCphdwBasOZ17x8UV8qpHUh+u0MLfX43c0uUHKje0s+Zb0w==",
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "github",
|
"type": "github",
|
||||||
"url": "https://github.com/sponsors/tannerlinsley"
|
"url": "https://github.com/sponsors/tannerlinsley"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tanstack/vue-virtual": {
|
"node_modules/@tanstack/vue-virtual": {
|
||||||
"version": "3.13.4",
|
"version": "3.11.3",
|
||||||
"resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.4.tgz",
|
"resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.11.3.tgz",
|
||||||
"integrity": "sha512-1fPrd3hE1SS4R/9JbX1AlzueY4duCK7ixuLcMW5GMnk9N6WbLo9MioNKiv22V+UaXKOLNy8tLdzT8NYerOFTOQ==",
|
"integrity": "sha512-BVZ00i5XBucetRj2doVd32jOPtJthvZSVJvx9GL4gSQsyngliSCtzlP1Op7TFrEtmebRKT8QUQE1tRhOQzWecQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/virtual-core": "3.13.4"
|
"@tanstack/virtual-core": "3.11.3"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "github",
|
"type": "github",
|
||||||
@ -2242,15 +2239,6 @@
|
|||||||
"jiti": "bin/jiti.js"
|
"jiti": "bin/jiti.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/laravel-echo": {
|
|
||||||
"version": "2.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-2.0.2.tgz",
|
|
||||||
"integrity": "sha512-Ciai6hA7r35MFqNRb8G034cvm9WiveSTFQQKRGJhWtZGbng7C8BBa5QvqDxk/Mw5GeJ+q19jrEwQhf7r1b1lcg==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/laravel-vite-plugin": {
|
"node_modules/laravel-vite-plugin": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz",
|
||||||
@ -2499,11 +2487,6 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ohash": {
|
|
||||||
"version": "1.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.6.tgz",
|
|
||||||
"integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="
|
|
||||||
},
|
|
||||||
"node_modules/package-json-from-dist": {
|
"node_modules/package-json-from-dist": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
||||||
@ -2717,15 +2700,6 @@
|
|||||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/pusher-js": {
|
|
||||||
"version": "8.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0.tgz",
|
|
||||||
"integrity": "sha512-wp3HqIIUc1GRyu1XrP6m2dgyE9MoCsXVsWNlohj0rjSkLf+a0jLvEyVubdg58oMk7bhjBWnFClgp8jfAa6Ak4Q==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"tweetnacl": "^1.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/qs": {
|
"node_modules/qs": {
|
||||||
"version": "6.14.0",
|
"version": "6.14.0",
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
|
||||||
@ -2873,37 +2847,6 @@
|
|||||||
"node": ">=8.10.0"
|
"node": ">=8.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/reka-ui": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-w4kEDEyXhIqv4QeFJeiuBc4mQP37hH/UTRpEb9dMbPdR49JG5TcV/s0+ntNRONUUW4LDLX7E1ZPcwBw5hnu0yw==",
|
|
||||||
"dependencies": {
|
|
||||||
"@floating-ui/dom": "^1.6.13",
|
|
||||||
"@floating-ui/vue": "^1.1.6",
|
|
||||||
"@internationalized/date": "^3.5.0",
|
|
||||||
"@internationalized/number": "^3.5.0",
|
|
||||||
"@tanstack/vue-virtual": "^3.12.0",
|
|
||||||
"@vueuse/core": "^12.5.0",
|
|
||||||
"@vueuse/shared": "^12.5.0",
|
|
||||||
"aria-hidden": "^1.2.4",
|
|
||||||
"defu": "^6.1.4",
|
|
||||||
"ohash": "^1.1.4"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"vue": ">= 3.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/reka-ui/node_modules/@vueuse/shared": {
|
|
||||||
"version": "12.8.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz",
|
|
||||||
"integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==",
|
|
||||||
"dependencies": {
|
|
||||||
"vue": "^3.5.13"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/antfu"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/require-directory": {
|
"node_modules/require-directory": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||||
@ -3754,12 +3697,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
|
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
|
||||||
},
|
},
|
||||||
"node_modules/tweetnacl": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/typescript": {
|
"node_modules/typescript": {
|
||||||
"version": "5.7.3",
|
"version": "5.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
|
||||||
|
@ -24,14 +24,12 @@
|
|||||||
"vue-tsc": "^2.0.24"
|
"vue-tsc": "^2.0.24"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/vue-table": "^8.21.2",
|
|
||||||
"@vueuse/core": "^12.5.0",
|
"@vueuse/core": "^12.5.0",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.474.0",
|
"lucide-react": "^0.474.0",
|
||||||
"lucide-vue-next": "^0.474.0",
|
"lucide-vue-next": "^0.474.0",
|
||||||
"radix-vue": "^1.9.13",
|
"radix-vue": "^1.9.13",
|
||||||
"reka-ui": "^2.1.0",
|
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "^2.6.0",
|
||||||
"tailwindcss-animate": "^1.0.7"
|
"tailwindcss-animate": "^1.0.7"
|
||||||
}
|
}
|
||||||
|
50
pnpm-lock.yaml
generated
50
pnpm-lock.yaml
generated
@ -8,9 +8,6 @@ importers:
|
|||||||
|
|
||||||
.:
|
.:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tanstack/vue-table':
|
|
||||||
specifier: ^8.21.2
|
|
||||||
version: 8.21.2(vue@3.5.13(typescript@5.7.3))
|
|
||||||
'@vueuse/core':
|
'@vueuse/core':
|
||||||
specifier: ^12.5.0
|
specifier: ^12.5.0
|
||||||
version: 12.7.0(typescript@5.7.3)
|
version: 12.7.0(typescript@5.7.3)
|
||||||
@ -29,9 +26,6 @@ importers:
|
|||||||
radix-vue:
|
radix-vue:
|
||||||
specifier: ^1.9.13
|
specifier: ^1.9.13
|
||||||
version: 1.9.16(vue@3.5.13(typescript@5.7.3))
|
version: 1.9.16(vue@3.5.13(typescript@5.7.3))
|
||||||
reka-ui:
|
|
||||||
specifier: ^2.1.0
|
|
||||||
version: 2.1.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
|
|
||||||
tailwind-merge:
|
tailwind-merge:
|
||||||
specifier: ^2.6.0
|
specifier: ^2.6.0
|
||||||
version: 2.6.0
|
version: 2.6.0
|
||||||
@ -431,19 +425,9 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1'
|
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1'
|
||||||
|
|
||||||
'@tanstack/table-core@8.21.2':
|
|
||||||
resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==}
|
|
||||||
engines: {node: '>=12'}
|
|
||||||
|
|
||||||
'@tanstack/virtual-core@3.13.2':
|
'@tanstack/virtual-core@3.13.2':
|
||||||
resolution: {integrity: sha512-Qzz4EgzMbO5gKrmqUondCjiHcuu4B1ftHb0pjCut661lXZdGoHeze9f/M8iwsK1t5LGR6aNuNGU7mxkowaW6RQ==}
|
resolution: {integrity: sha512-Qzz4EgzMbO5gKrmqUondCjiHcuu4B1ftHb0pjCut661lXZdGoHeze9f/M8iwsK1t5LGR6aNuNGU7mxkowaW6RQ==}
|
||||||
|
|
||||||
'@tanstack/vue-table@8.21.2':
|
|
||||||
resolution: {integrity: sha512-KBgOWxha/x4m1EdhVWxOpqHb661UjqAxzPcmXR3QiA7aShZ547x19Gw0UJX9we+m+tVcPuLRZ61JsYW47QZFfQ==}
|
|
||||||
engines: {node: '>=12'}
|
|
||||||
peerDependencies:
|
|
||||||
vue: '>=3.2'
|
|
||||||
|
|
||||||
'@tanstack/vue-virtual@3.13.2':
|
'@tanstack/vue-virtual@3.13.2':
|
||||||
resolution: {integrity: sha512-z4swzjdhzCh95n9dw9lTvw+t3iwSkYRlVkYkra3C9mul/m5fTzHR7KmtkwH4qXMTXGJUbngtC/bz2cHQIHkO8g==}
|
resolution: {integrity: sha512-z4swzjdhzCh95n9dw9lTvw+t3iwSkYRlVkYkra3C9mul/m5fTzHR7KmtkwH4qXMTXGJUbngtC/bz2cHQIHkO8g==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -968,9 +952,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
|
resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
ohash@1.1.6:
|
|
||||||
resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==}
|
|
||||||
|
|
||||||
package-json-from-dist@1.0.1:
|
package-json-from-dist@1.0.1:
|
||||||
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
||||||
|
|
||||||
@ -1073,11 +1054,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
||||||
engines: {node: '>=8.10.0'}
|
engines: {node: '>=8.10.0'}
|
||||||
|
|
||||||
reka-ui@2.1.0:
|
|
||||||
resolution: {integrity: sha512-w4kEDEyXhIqv4QeFJeiuBc4mQP37hH/UTRpEb9dMbPdR49JG5TcV/s0+ntNRONUUW4LDLX7E1ZPcwBw5hnu0yw==}
|
|
||||||
peerDependencies:
|
|
||||||
vue: '>= 3.2.0'
|
|
||||||
|
|
||||||
require-directory@2.1.1:
|
require-directory@2.1.1:
|
||||||
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
|
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
@ -1705,15 +1681,8 @@ snapshots:
|
|||||||
mini-svg-data-uri: 1.4.4
|
mini-svg-data-uri: 1.4.4
|
||||||
tailwindcss: 3.4.17
|
tailwindcss: 3.4.17
|
||||||
|
|
||||||
'@tanstack/table-core@8.21.2': {}
|
|
||||||
|
|
||||||
'@tanstack/virtual-core@3.13.2': {}
|
'@tanstack/virtual-core@3.13.2': {}
|
||||||
|
|
||||||
'@tanstack/vue-table@8.21.2(vue@3.5.13(typescript@5.7.3))':
|
|
||||||
dependencies:
|
|
||||||
'@tanstack/table-core': 8.21.2
|
|
||||||
vue: 3.5.13(typescript@5.7.3)
|
|
||||||
|
|
||||||
'@tanstack/vue-virtual@3.13.2(vue@3.5.13(typescript@5.7.3))':
|
'@tanstack/vue-virtual@3.13.2(vue@3.5.13(typescript@5.7.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tanstack/virtual-core': 3.13.2
|
'@tanstack/virtual-core': 3.13.2
|
||||||
@ -2255,8 +2224,6 @@ snapshots:
|
|||||||
|
|
||||||
object-inspect@1.13.3: {}
|
object-inspect@1.13.3: {}
|
||||||
|
|
||||||
ohash@1.1.6: {}
|
|
||||||
|
|
||||||
package-json-from-dist@1.0.1: {}
|
package-json-from-dist@1.0.1: {}
|
||||||
|
|
||||||
path-browserify@1.0.1: {}
|
path-browserify@1.0.1: {}
|
||||||
@ -2354,23 +2321,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
|
|
||||||
reka-ui@2.1.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)):
|
|
||||||
dependencies:
|
|
||||||
'@floating-ui/dom': 1.6.13
|
|
||||||
'@floating-ui/vue': 1.1.6(vue@3.5.13(typescript@5.7.3))
|
|
||||||
'@internationalized/date': 3.7.0
|
|
||||||
'@internationalized/number': 3.6.0
|
|
||||||
'@tanstack/vue-virtual': 3.13.2(vue@3.5.13(typescript@5.7.3))
|
|
||||||
'@vueuse/core': 12.7.0(typescript@5.7.3)
|
|
||||||
'@vueuse/shared': 12.7.0(typescript@5.7.3)
|
|
||||||
aria-hidden: 1.2.4
|
|
||||||
defu: 6.1.4
|
|
||||||
ohash: 1.1.6
|
|
||||||
vue: 3.5.13(typescript@5.7.3)
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- '@vue/composition-api'
|
|
||||||
- typescript
|
|
||||||
|
|
||||||
require-directory@2.1.1: {}
|
require-directory@2.1.1: {}
|
||||||
|
|
||||||
resolve@1.22.10:
|
resolve@1.22.10:
|
||||||
|
@ -18,7 +18,7 @@ const jobInfoType = props.jobInfo.job_info_type.name;
|
|||||||
<div>
|
<div>
|
||||||
<Label :for="'' + jobInfo.id" class="text">{{ jobInfo.name }}<span v-if="jobInfo.is_required" class="cursor-help" title="Requis" aria-label="Requis">*</span></Label>
|
<Label :for="'' + jobInfo.id" class="text">{{ jobInfo.name }}<span v-if="jobInfo.is_required" class="cursor-help" title="Requis" aria-label="Requis">*</span></Label>
|
||||||
<Description>{{ jobInfo.description }}</Description>
|
<Description>{{ jobInfo.description }}</Description>
|
||||||
<Input v-if="['text', 'email', 'password', 'url', 'number'].includes(jobInfoType)" :type="jobInfoType" :id="'' + jobInfo.id" :name="'' + jobInfo.id" :placeholder="jobInfo.placeholder" v-model="jobInfo.value as string" :required="jobInfo.is_required" />
|
<Input v-if="jobInfoType != 'checkbox'" :type="jobInfoType" :id="'' + jobInfo.id" :name="'' + jobInfo.id" :placeholder="jobInfo.placeholder" v-model="jobInfo.value as string" :required="jobInfo.is_required" />
|
||||||
<VModelCheckbox v-else :id="'' + jobInfo.id" :class="''" v-model="jobInfo.value as boolean" />
|
<VModelCheckbox v-else :id="'' + jobInfo.id" :class="''" v-model="jobInfo.value as boolean" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import Separator from "@/Components/ui/separator/Separator.vue";
|
|
||||||
import { JobRunArtifact } from "@/types/Jobs/job";
|
|
||||||
|
|
||||||
defineProps<{
|
|
||||||
jobRun: JobRunArtifact;
|
|
||||||
}>();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<ul>
|
|
||||||
<li v-for="artifact in jobRun.artifacts" :key="artifact.id">
|
|
||||||
<p>{{ artifact.name }}</p>
|
|
||||||
<p class="italic">{{ artifact.content }}</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
ul {
|
|
||||||
list-style-type: circle;
|
|
||||||
padding-left: 1rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,28 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import AccordionContent from "@/Components/ui/accordion/AccordionContent.vue";
|
|
||||||
import AccordionItem from "@/Components/ui/accordion/AccordionItem.vue";
|
|
||||||
import AccordionTrigger from "@/Components/ui/accordion/AccordionTrigger.vue";
|
|
||||||
import { JobRunArtifact } from "@/types/Jobs/job";
|
|
||||||
import JobRunArtifacts from "./JobRunArtifacts.vue";
|
|
||||||
|
|
||||||
defineProps<{
|
|
||||||
jobRun: JobRunArtifact;
|
|
||||||
}>();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<AccordionItem :value="''+jobRun.id" :class="[jobRun.success ? 'bg-green-100' : 'bg-red-200', 'first:rounded-t last:rounded-b', 'px-3']">
|
|
||||||
<AccordionTrigger>
|
|
||||||
{{ new Date(Date.parse(jobRun.created_at)).toLocaleTimeString(undefined, {
|
|
||||||
weekday: "long",
|
|
||||||
year: "numeric",
|
|
||||||
month: "long",
|
|
||||||
day: "numeric",
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
<JobRunArtifacts :jobRun="jobRun" />
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
</template>
|
|
@ -1,30 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { Job, JobRunArtifact } from "@/types/Jobs/job";
|
|
||||||
import JobRunItem from "./JobRunItem.vue";
|
|
||||||
import Accordion from "@/Components/ui/accordion/Accordion.vue";
|
|
||||||
import ScrollArea from "@/Components/ui/scroll-area/ScrollArea.vue";
|
|
||||||
|
|
||||||
defineProps<{
|
|
||||||
job: Job;
|
|
||||||
}>();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div v-if="job.job_runs.length > 0">
|
|
||||||
<h2>Ancien jobs</h2>
|
|
||||||
<ScrollArea class="min-h-[300px] max-h-[20vh] overflow-auto pr-2">
|
|
||||||
<Accordion type="multiple" collapsible>
|
|
||||||
<JobRunItem
|
|
||||||
:jobRun="jobRun"
|
|
||||||
v-for="jobRun in job.job_runs.sort((a, b) => {
|
|
||||||
return (
|
|
||||||
new Date(b.created_at).getTime() -
|
|
||||||
new Date(a.created_at).getTime()
|
|
||||||
);
|
|
||||||
})"
|
|
||||||
:key="jobRun.id"
|
|
||||||
/>
|
|
||||||
</Accordion>
|
|
||||||
</ScrollArea>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
@ -1,19 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import {
|
|
||||||
AccordionRoot,
|
|
||||||
type AccordionRootEmits,
|
|
||||||
type AccordionRootProps,
|
|
||||||
useForwardPropsEmits,
|
|
||||||
} from 'reka-ui'
|
|
||||||
|
|
||||||
const props = defineProps<AccordionRootProps>()
|
|
||||||
const emits = defineEmits<AccordionRootEmits>()
|
|
||||||
|
|
||||||
const forwarded = useForwardPropsEmits(props, emits)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<AccordionRoot v-bind="forwarded">
|
|
||||||
<slot />
|
|
||||||
</AccordionRoot>
|
|
||||||
</template>
|
|
@ -1,24 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { cn } from '@/lib/utils'
|
|
||||||
import { AccordionContent, type AccordionContentProps } from 'reka-ui'
|
|
||||||
import { computed, type HTMLAttributes } from 'vue'
|
|
||||||
|
|
||||||
const props = defineProps<AccordionContentProps & { class?: HTMLAttributes['class'] }>()
|
|
||||||
|
|
||||||
const delegatedProps = computed(() => {
|
|
||||||
const { class: _, ...delegated } = props
|
|
||||||
|
|
||||||
return delegated
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<AccordionContent
|
|
||||||
v-bind="delegatedProps"
|
|
||||||
class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
|
|
||||||
>
|
|
||||||
<div :class="cn('pb-4 pt-0', props.class)">
|
|
||||||
<slot />
|
|
||||||
</div>
|
|
||||||
</AccordionContent>
|
|
||||||
</template>
|
|
@ -1,24 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { cn } from '@/lib/utils'
|
|
||||||
import { AccordionItem, type AccordionItemProps, useForwardProps } from 'reka-ui'
|
|
||||||
import { computed, type HTMLAttributes } from 'vue'
|
|
||||||
|
|
||||||
const props = defineProps<AccordionItemProps & { class?: HTMLAttributes['class'] }>()
|
|
||||||
|
|
||||||
const delegatedProps = computed(() => {
|
|
||||||
const { class: _, ...delegated } = props
|
|
||||||
|
|
||||||
return delegated
|
|
||||||
})
|
|
||||||
|
|
||||||
const forwardedProps = useForwardProps(delegatedProps)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<AccordionItem
|
|
||||||
v-bind="forwardedProps"
|
|
||||||
:class="cn('border-b', props.class)"
|
|
||||||
>
|
|
||||||
<slot />
|
|
||||||
</AccordionItem>
|
|
||||||
</template>
|
|
@ -1,39 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { cn } from '@/lib/utils'
|
|
||||||
import { ChevronDown } from 'lucide-vue-next'
|
|
||||||
import {
|
|
||||||
AccordionHeader,
|
|
||||||
AccordionTrigger,
|
|
||||||
type AccordionTriggerProps,
|
|
||||||
} from 'reka-ui'
|
|
||||||
import { computed, type HTMLAttributes } from 'vue'
|
|
||||||
|
|
||||||
const props = defineProps<AccordionTriggerProps & { class?: HTMLAttributes['class'] }>()
|
|
||||||
|
|
||||||
const delegatedProps = computed(() => {
|
|
||||||
const { class: _, ...delegated } = props
|
|
||||||
|
|
||||||
return delegated
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<AccordionHeader class="flex">
|
|
||||||
<AccordionTrigger
|
|
||||||
v-bind="delegatedProps"
|
|
||||||
:class="
|
|
||||||
cn(
|
|
||||||
'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',
|
|
||||||
props.class,
|
|
||||||
)
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<slot />
|
|
||||||
<slot name="icon">
|
|
||||||
<ChevronDown
|
|
||||||
class="h-4 w-4 shrink-0 transition-transform duration-200"
|
|
||||||
/>
|
|
||||||
</slot>
|
|
||||||
</AccordionTrigger>
|
|
||||||
</AccordionHeader>
|
|
||||||
</template>
|
|
@ -1,4 +0,0 @@
|
|||||||
export { default as Accordion } from './Accordion.vue'
|
|
||||||
export { default as AccordionContent } from './AccordionContent.vue'
|
|
||||||
export { default as AccordionItem } from './AccordionItem.vue'
|
|
||||||
export { default as AccordionTrigger } from './AccordionTrigger.vue'
|
|
@ -1,35 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { cn } from '@/lib/utils'
|
|
||||||
import { Separator, type SeparatorProps } from 'reka-ui'
|
|
||||||
import { computed, type HTMLAttributes } from 'vue'
|
|
||||||
|
|
||||||
const props = defineProps<
|
|
||||||
SeparatorProps & { class?: HTMLAttributes['class'], label?: string }
|
|
||||||
>()
|
|
||||||
|
|
||||||
const delegatedProps = computed(() => {
|
|
||||||
const { class: _, ...delegated } = props
|
|
||||||
|
|
||||||
return delegated
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<Separator
|
|
||||||
v-bind="delegatedProps"
|
|
||||||
:class="
|
|
||||||
cn(
|
|
||||||
'shrink-0 bg-border relative',
|
|
||||||
props.orientation === 'vertical' ? 'w-px h-full' : 'h-px w-full',
|
|
||||||
props.class,
|
|
||||||
)
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
v-if="props.label"
|
|
||||||
:class="cn('text-xs text-muted-foreground bg-background absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex justify-center items-center',
|
|
||||||
props.orientation === 'vertical' ? 'w-[1px] px-1 py-2' : 'h-[1px] py-1 px-2',
|
|
||||||
)"
|
|
||||||
>{{ props.label }}</span>
|
|
||||||
</Separator>
|
|
||||||
</template>
|
|
@ -1 +0,0 @@
|
|||||||
export { default as Separator } from './Separator.vue'
|
|
@ -1,7 +1,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import JobForm from '../Components/Layout/Job/JobForm.vue'
|
import JobForm from '../Components/Layout/Job/JobForm.vue'
|
||||||
import JobCard from '../Components/Layout/Job/JobCard.vue'
|
import JobCard from '../Components/Layout/Job/JobCard.vue'
|
||||||
import JobRuns from '../Components/Layout/Job/JobRuns/JobRuns.vue';
|
|
||||||
import { Job } from "@/types/Jobs/job";
|
import { Job } from "@/types/Jobs/job";
|
||||||
import { Head } from "@inertiajs/vue3";
|
import { Head } from "@inertiajs/vue3";
|
||||||
|
|
||||||
@ -17,6 +16,4 @@ defineProps<{
|
|||||||
<JobCard :job="job" />
|
<JobCard :job="job" />
|
||||||
|
|
||||||
<JobForm :job="job" :error="error" />
|
<JobForm :job="job" :error="error" />
|
||||||
|
|
||||||
<JobRuns :job="job" />
|
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,17 +1,8 @@
|
|||||||
import type { Updater } from '@tanstack/vue-table'
|
import { clsx, type ClassValue } from "clsx";
|
||||||
import type { Ref } from 'vue'
|
import { twMerge } from "tailwind-merge";
|
||||||
import { type ClassValue, clsx } from 'clsx'
|
|
||||||
import { twMerge } from 'tailwind-merge'
|
|
||||||
|
|
||||||
export function cn(...inputs: ClassValue[]) {
|
export function cn(...inputs: ClassValue[]) {
|
||||||
return twMerge(clsx(inputs))
|
return twMerge(clsx(inputs));
|
||||||
}
|
|
||||||
|
|
||||||
export function valueUpdater<T extends Updater<any>>(updaterOrValue: T, ref: Ref) {
|
|
||||||
ref.value
|
|
||||||
= typeof updaterOrValue === 'function'
|
|
||||||
? updaterOrValue(ref.value)
|
|
||||||
: updaterOrValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function httpApi<T>(route: string): Promise<T> {
|
export async function httpApi<T>(route: string): Promise<T> {
|
||||||
|
14
resources/js/types/Jobs/job.d.ts
vendored
14
resources/js/types/Jobs/job.d.ts
vendored
@ -5,9 +5,8 @@ export type Job = {
|
|||||||
is_active: boolean;
|
is_active: boolean;
|
||||||
|
|
||||||
job_infos: JobInfo[];
|
job_infos: JobInfo[];
|
||||||
job_runs: JobRunArtifact[];
|
|
||||||
|
|
||||||
created_at: string;
|
created_at: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type JobInfo = {
|
export type JobInfo = {
|
||||||
@ -27,23 +26,16 @@ export type JobInfo = {
|
|||||||
export type JobInfoType = {
|
export type JobInfoType = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
name: string;
|
||||||
|
created_at: Date;
|
||||||
created_at: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type JobRunArtifact = {
|
export type JobRunArtifact = {
|
||||||
id: number;
|
jobId: number;
|
||||||
job_id: number;
|
|
||||||
artifacts: JobArtifact[];
|
artifacts: JobArtifact[];
|
||||||
success: boolean;
|
success: boolean;
|
||||||
|
|
||||||
created_at: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type JobArtifact = {
|
export type JobArtifact = {
|
||||||
id: number;
|
|
||||||
name: string;
|
name: string;
|
||||||
content: string;
|
content: string;
|
||||||
|
|
||||||
created_at: string;
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@ Route::get('/jobs', function (Request $request) {
|
|||||||
|
|
||||||
Route::get('/test/{id}', function (Request $request, $id, BrowserJobsInstances $BrowserJobsInstances) {
|
Route::get('/test/{id}', function (Request $request, $id, BrowserJobsInstances $BrowserJobsInstances) {
|
||||||
$log = $BrowserJobsInstances->getJobInstance($id)->execute();
|
$log = $BrowserJobsInstances->getJobInstance($id)->execute();
|
||||||
dump($log);
|
|
||||||
return response()->json(['message' => 'Job ' . $id . ' ran', 'jobRun' => $log->load('artifacts')]);
|
return response()->json(['message' => 'Job ' . $id . ' ran', 'jobRun' => $log->load('artifacts')]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Browser\Jobs\EpicGames\EpicGamesJob;
|
||||||
use App\Browser\Jobs\Hellcase\HellcaseJob;
|
use App\Browser\Jobs\Hellcase\HellcaseJob;
|
||||||
use App\Browser\Jobs\HellcaseBattles\HellcaseBattlesJob;
|
|
||||||
use App\Jobs\PruneOldJobRuns;
|
use App\Jobs\PruneOldJobRuns;
|
||||||
use App\Services\BrowserJobsInstances;
|
use App\Services\BrowserJobsInstances;
|
||||||
use Illuminate\Foundation\Inspiring;
|
use Illuminate\Foundation\Inspiring;
|
||||||
@ -22,4 +22,6 @@ Schedule::job(new PruneOldJobRuns)->monthly()->onOneServer()->withoutOverlapping
|
|||||||
// Jobs
|
// Jobs
|
||||||
Schedule::job(new HellcaseJob)->daily()->onOneServer()->withoutOverlapping()->name('hellcase')->description('Hellcase job');
|
Schedule::job(new HellcaseJob)->daily()->onOneServer()->withoutOverlapping()->name('hellcase')->description('Hellcase job');
|
||||||
// Schedule::job(new HellcaseJob)->everyMinute()->onOneServer()->withoutOverlapping()->name('hellcase')->description('Hellcase job');
|
// Schedule::job(new HellcaseJob)->everyMinute()->onOneServer()->withoutOverlapping()->name('hellcase')->description('Hellcase job');
|
||||||
Schedule::job(new HellcaseBattlesJob)->hourly()->onOneServer()->withoutOverlapping()->name('hellcase_battles')->description('Hellcase battles job');
|
|
||||||
|
Schedule::job(new EpicGamesJob())->daily()->onOneServer()->withoutOverlapping()->name('epic-games')->description('Epic Games job');
|
||||||
|
|
||||||
|
3
todo.md
3
todo.md
@ -13,9 +13,6 @@
|
|||||||
- Websocket installé
|
- Websocket installé
|
||||||
- Serveur php plus propre (nginx, apache, n'importe)
|
- Serveur php plus propre (nginx, apache, n'importe)
|
||||||
- Epic games
|
- Epic games
|
||||||
Pas l'air possible avec cloudflare
|
|
||||||
- Petit bug, quand l'on enregistre un formulaire avec une erreur, l'url a un argument GET ?error=mon%24erreur
|
|
||||||
Du coup dans la nav le job actuel n'est plus reconnu
|
|
||||||
|
|
||||||
## Pour deploy Lama
|
## Pour deploy Lama
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user