@@ -95,7 +110,11 @@ const sortedEntries = computed(() => {
v-for="p in periods"
:key="p.value"
class="top-relative__period-btn"
- :class="currentPeriod === p.value ? 'top-relative__period-btn--active' : 'top-relative__period-btn--inactive'"
+ :class="
+ currentPeriod === p.value
+ ? 'top-relative__period-btn--active'
+ : 'top-relative__period-btn--inactive'
+ "
@click="setPeriod(p.value)"
>
{{ p.label }}
@@ -104,7 +123,10 @@ const sortedEntries = computed(() => {
@@ -117,7 +139,14 @@ const sortedEntries = computed(() => {
@click="handleSort('rank')"
>
#
-
{{ sortIndicator('rank') }}
+
{{ sortIndicator('rank') }}
{
@click="handleSort('name')"
>
Plugin
- {{ sortIndicator('name') }}
+ {{ sortIndicator('name') }}
|
{
@click="handleSort('pct_growth')"
>
% Change
- {{ sortIndicator('pct_growth') }}
+ {{ sortIndicator('pct_growth') }}
|
{
@click="handleSort('absolute_growth')"
>
Installs
- {{ sortIndicator('absolute_growth') }}
+ {{ sortIndicator('absolute_growth') }}
|
|
@@ -151,9 +201,15 @@ const sortedEntries = computed(() => {
v-for="(entry, index) in sortedEntries"
:key="entry.plugin.id"
class="top-relative__row"
- :class="index % 2 === 0 ? 'top-relative__row--even' : 'top-relative__row--odd'"
+ :class="
+ index % 2 === 0
+ ? 'top-relative__row--even'
+ : 'top-relative__row--odd'
+ "
>
-
{{ entry.rank }} |
+
+ {{ entry.rank }}
+ |
|
- {{ hasWindowBaseline(entry) ? (entry.pct_growth >= 0 ? '+' : '') + entry.pct_growth.toFixed(1) + '%' : '—' }}
+ {{
+ hasWindowBaseline(entry)
+ ? (entry.pct_growth >= 0 ? '+' : '') +
+ entry.pct_growth.toFixed(1) +
+ '%'
+ : '—'
+ }}
|
-
+ |
- {{ formatNumber(entry.plugin.current_installs) }}
- +{{ formatNumber(entry.absolute_growth) }}
+ {{
+ formatNumber(entry.plugin.current_installs)
+ }}
+ +{{
+ formatNumber(entry.absolute_growth)
+ }}
|
-
- Stats
+ |
+ Stats
|
@@ -212,7 +296,7 @@ const sortedEntries = computed(() => {
/* ── Period selector ── */
.top-relative__periods {
- @apply flex flex-shrink-0 flex-wrap gap-1.5 sm:gap-2 sm:justify-end;
+ @apply flex shrink-0 flex-wrap gap-1.5 sm:justify-end sm:gap-2;
}
.top-relative__period-btn {
@@ -276,7 +360,7 @@ const sortedEntries = computed(() => {
}
.top-relative__head-cell {
- @apply px-2 py-2 text-xs font-medium uppercase tracking-wider text-gray-500 sm:px-4 sm:py-3;
+ @apply px-2 py-2 text-xs font-medium tracking-wider text-gray-500 uppercase sm:px-4 sm:py-3;
}
.top-relative__head-cell--rank {
@@ -332,7 +416,7 @@ const sortedEntries = computed(() => {
}
.top-relative__cell--rank {
- @apply w-8 text-right text-sm font-medium tabular-nums text-gray-400 sm:w-12;
+ @apply w-8 text-right text-sm font-medium text-gray-400 tabular-nums sm:w-12;
padding-right: 0;
}
@@ -346,7 +430,7 @@ const sortedEntries = computed(() => {
}
.top-relative__installs-total {
- @apply text-sm font-bold tabular-nums text-gray-200;
+ @apply text-sm font-bold text-gray-200 tabular-nums;
}
.top-relative__installs-gain {
@@ -355,7 +439,7 @@ const sortedEntries = computed(() => {
}
.top-relative__cell--pct {
- @apply text-right tabular-nums font-semibold;
+ @apply text-right font-semibold tabular-nums;
color: #86efac;
width: 1%;
white-space: nowrap;
@@ -370,7 +454,7 @@ const sortedEntries = computed(() => {
/* ── Plugin name + author ── */
.top-relative__plugin {
- @apply flex flex-col gap-0 min-w-0;
+ @apply flex min-w-0 flex-col gap-0;
}
.top-relative__plugin-name {
@@ -378,7 +462,7 @@ const sortedEntries = computed(() => {
}
.top-relative__plugin-author {
- @apply truncate text-xs text-gray-400;
+ @apply truncate text-xs text-gray-300;
}
/* ── Stats link ── */
diff --git a/resources/js/types/index.ts b/resources/js/types/index.ts
index 79ece52..9db3a03 100644
--- a/resources/js/types/index.ts
+++ b/resources/js/types/index.ts
@@ -45,3 +45,11 @@ export interface Top100Metrics {
computed_at: string;
rankings: RankedPlugin[];
}
+
+export interface SharedInertiaProps {
+ errors: Record
;
+ name: string;
+ apiUrl: string;
+ appUrl: string;
+ plugins: Plugin[];
+}
diff --git a/resources/js/utils/formatting.ts b/resources/js/utils/formatting.ts
index 7b68bb1..72d9388 100644
--- a/resources/js/utils/formatting.ts
+++ b/resources/js/utils/formatting.ts
@@ -6,15 +6,28 @@ export function formatDate(dateString: string): string {
month: 'long',
day: 'numeric',
};
- return new Intl.DateTimeFormat('en-US', options).format(new Date(dateString));
+ return new Intl.DateTimeFormat('en-US', options).format(
+ new Date(dateString),
+ );
}
-export function formatChartDate(dateString: string, includeTime: boolean): string {
+export function formatChartDate(
+ dateString: string,
+ includeTime: boolean,
+): string {
const date = new Date(dateString);
if (includeTime) {
- return new Intl.DateTimeFormat('en-US', { hour: 'numeric', minute: '2-digit', hour12: true }).format(date);
+ return new Intl.DateTimeFormat('en-US', {
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: true,
+ }).format(date);
}
- return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(date);
+ return new Intl.DateTimeFormat('en-US', {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ }).format(date);
}
export function formatNumber(num: number): string {
@@ -37,7 +50,13 @@ export function scoreSearchResult(plugin: Plugin, query: string): number {
let score = 0;
const wordsInFields = new Set();
- const fieldsToSearch = [plugin.name, plugin.display, plugin.author, plugin.description, plugin.tags];
+ const fieldsToSearch = [
+ plugin.name,
+ plugin.display,
+ plugin.author,
+ plugin.description,
+ plugin.tags,
+ ];
fieldsToSearch.forEach((field) => {
if (field) {
diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php
index 77932df..693f8ad 100644
--- a/tests/Feature/ExampleTest.php
+++ b/tests/Feature/ExampleTest.php
@@ -2,7 +2,9 @@
namespace Tests\Feature;
+use App\Services\RuneliteApiService;
use Illuminate\Foundation\Testing\RefreshDatabase;
+use Mockery;
use Tests\TestCase;
class ExampleTest extends TestCase
@@ -11,7 +13,14 @@ class ExampleTest extends TestCase
public function test_returns_a_successful_response()
{
- $response = $this->get(route('home'));
+ $mock = Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $response = $this->get(route('home'), [
+ 'X-Inertia' => 'true',
+ 'X-Requested-With' => 'XMLHttpRequest',
+ ]);
$response->assertOk();
}
diff --git a/tests/Feature/PublicPagesTest.php b/tests/Feature/PublicPagesTest.php
new file mode 100644
index 0000000..1a793cb
--- /dev/null
+++ b/tests/Feature/PublicPagesTest.php
@@ -0,0 +1,263 @@
+ 'true',
+ 'X-Requested-With' => 'XMLHttpRequest',
+ ];
+}
+
+it('renders the home page with plugin data', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([
+ [
+ 'id' => 1,
+ 'name' => 'gpu',
+ 'display' => 'GPU',
+ 'author' => 'RuneLite',
+ 'description' => 'GPU plugin',
+ 'tags' => 'graphics',
+ 'current_installs' => 100,
+ 'all_time_high' => 120,
+ 'updated_on' => '2026-04-19 00:00:00',
+ 'created_on' => '2025-01-01 00:00:00',
+ ],
+ ]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $response = $this->get(route('home'), inertiaHeaders());
+
+ $response->assertSuccessful();
+ $response->assertJsonPath('component', 'Index');
+ $response->assertJsonPath('props.plugins.0.name', 'gpu');
+});
+
+it('exposes shared inertia props needed by the app shell', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $response = $this->get(route('home'), inertiaHeaders());
+
+ $response->assertSuccessful()->assertJsonPath('component', 'Index');
+
+ $payload = $response->json();
+
+ expect(data_get($payload, 'props.name'))->toBeString()->not->toBeEmpty()
+ ->and(data_get($payload, 'props.apiUrl'))->toBeString()->toContain('http')
+ ->and(data_get($payload, 'props.appUrl'))->toBeString()->toContain('http');
+});
+
+it('renders plugin detail page and returns 404 for unknown plugin', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugin')->with('gpu', \Mockery::type('array'))->once()->andReturn([
+ 'id' => 1,
+ 'name' => 'gpu',
+ 'display' => 'GPU',
+ 'author' => 'RuneLite',
+ 'description' => 'GPU plugin',
+ 'tags' => 'graphics',
+ 'current_installs' => 100,
+ 'all_time_high' => 120,
+ 'updated_on' => '2026-04-19 00:00:00',
+ 'created_on' => '2025-01-01 00:00:00',
+ ]);
+ $mock->shouldReceive('getPlugin')->with('missing', \Mockery::type('array'))->once()->andReturn(null);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('plugin.show', ['name' => 'gpu']), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'PluginDetail')
+ ->assertJsonPath('props.plugin.name', 'gpu');
+
+ $this->get(route('plugin.show', ['name' => 'missing']))
+ ->assertNotFound();
+});
+
+it('renders top metrics pages', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getTopHundred')->once()->andReturn([
+ 'rankings' => [
+ [
+ 'rank' => 1,
+ 'plugin' => [
+ 'id' => 1,
+ 'name' => 'gpu',
+ 'display' => 'GPU',
+ 'author' => 'RuneLite',
+ 'current_installs' => 100,
+ ],
+ ],
+ ],
+ ]);
+ $mock->shouldReceive('getTopAbsolute')->with('30d')->once()->andReturn([]);
+ $mock->shouldReceive('getTopRelative')->with('30d')->once()->andReturn([]);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('top'), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'Top100')
+ ->assertJsonPath('props.metrics.rankings.0.rank', 1)
+ ->assertJsonPath('props.metrics.rankings.0.plugin.name', 'gpu');
+
+ $this->get(route('top.absolute'), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'TopAbsolute');
+
+ $this->get(route('top.relative'), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'TopRelative');
+});
+
+it('renders absolute and relative pages with entry rows for ui tables', function () {
+ $entries = [
+ [
+ 'plugin' => [
+ 'name' => 'gpu',
+ 'display' => 'GPU',
+ ],
+ 'delta' => 123,
+ 'current_installs' => 1000,
+ ],
+ ];
+
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getTopAbsolute')->with('30d')->once()->andReturn($entries);
+ $mock->shouldReceive('getTopRelative')->with('30d')->once()->andReturn($entries);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('top.absolute'), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'TopAbsolute')
+ ->assertJsonPath('props.entries.0.plugin.name', 'gpu')
+ ->assertJsonPath('props.entries.0.delta', 123);
+
+ $this->get(route('top.relative'), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'TopRelative')
+ ->assertJsonPath('props.entries.0.plugin.name', 'gpu')
+ ->assertJsonPath('props.entries.0.delta', 123);
+});
+
+it('redirects random route to plugin detail', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getRandomPlugin')->once()->andReturn([
+ 'name' => 'gpu',
+ ]);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('plugin.random'))
+ ->assertRedirect(route('plugin.show', ['name' => 'gpu']));
+});
+
+it('renders sitemap xml and uses cached value when present', function () {
+ Cache::put('sitemap.xml', 'https://example.test/gpu', now()->addMinute());
+
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('sitemap'))
+ ->assertSuccessful()
+ ->assertHeader('Content-Type', 'application/xml')
+ ->assertSee('https://example.test/gpu', false);
+});
+
+it('generates sitemap xml when cache is missing', function () {
+ Cache::forget('sitemap.xml');
+
+ $plugins = [
+ [
+ 'name' => 'gpu',
+ 'updated_on' => '2026-04-19 00:00:00',
+ ],
+ ];
+
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn($plugins);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $response = $this->get(route('sitemap'));
+
+ $response->assertSuccessful()
+ ->assertHeader('Content-Type', 'application/xml')
+ ->assertSee(route('plugin.show', ['name' => 'gpu']), false);
+
+ expect(Cache::get('sitemap.xml'))->toBeString();
+});
+
+it('returns 404 for missing og image plugin', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugin')->with('missing-plugin', \Mockery::type('array'))->once()->andReturn(null);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('og.image', ['name' => 'missing-plugin']))
+ ->assertNotFound();
+});
+
+it('passes range query to plugin detail endpoint', function () {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getPlugin')->with('gpu', ['range' => '7d'])->once()->andReturn([
+ 'id' => 1,
+ 'name' => 'gpu',
+ 'display' => 'GPU',
+ 'author' => 'RuneLite',
+ 'description' => 'GPU plugin',
+ 'tags' => 'graphics',
+ 'current_installs' => 100,
+ 'all_time_high' => 120,
+ 'updated_on' => '2026-04-19 00:00:00',
+ 'created_on' => '2025-01-01 00:00:00',
+ ]);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('plugin.show', ['name' => 'gpu', 'range' => '7d']), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'PluginDetail')
+ ->assertJsonPath('props.plugin.name', 'gpu');
+});
+
+it('passes selected period to absolute and relative metrics pages', function (string $period) {
+ $mock = \Mockery::mock(RuneliteApiService::class);
+ $mock->shouldReceive('getTopAbsolute')->with($period)->once()->andReturn([]);
+ $mock->shouldReceive('getTopRelative')->with($period)->once()->andReturn([]);
+ $mock->shouldReceive('getPlugins')->atLeast()->once()->andReturn([]);
+
+ app()->instance(RuneliteApiService::class, $mock);
+
+ $this->get(route('top.absolute', ['period' => $period]), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'TopAbsolute')
+ ->assertJsonPath('props.period', $period);
+
+ $this->get(route('top.relative', ['period' => $period]), inertiaHeaders())
+ ->assertSuccessful()
+ ->assertJsonPath('component', 'TopRelative')
+ ->assertJsonPath('props.period', $period);
+})->with([
+ '1 day' => '24h',
+ '7 days' => '7d',
+ '30 days' => '30d',
+ '6 months' => '6m',
+ '1 year' => '1y',
+]);
diff --git a/tests/Pest.php b/tests/Pest.php
index e69de29..4809776 100644
--- a/tests/Pest.php
+++ b/tests/Pest.php
@@ -0,0 +1,5 @@
+extend(TestCase::class)->in('Feature', 'Unit');
From 5a0a3d58bac08fb1feba347999a6890f455a6f54 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 20 Apr 2026 04:45:16 +0000
Subject: [PATCH 2/4] Bump picomatch in the npm_and_yarn group across 1
directory
Bumps the npm_and_yarn group with 1 update in the / directory: [picomatch](https://github.com/micromatch/picomatch).
Updates `picomatch` from 2.3.1 to 2.3.2
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)
---
updated-dependencies:
- dependency-name: picomatch
dependency-version: 2.3.2
dependency-type: indirect
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot]
---
package-lock.json | 110 ++++++++++++++++++++++++++--------------------
1 file changed, 62 insertions(+), 48 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d8f0e80..08d99b2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -395,6 +395,7 @@
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
"integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -544,9 +545,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -563,9 +561,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -582,9 +577,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -601,9 +593,6 @@
"cpu": [
"s390x"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -620,9 +609,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -639,9 +625,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -748,9 +731,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -882,9 +862,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -901,9 +878,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -920,9 +894,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -939,9 +910,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -980,6 +948,64 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1",
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
+ "version": "2.8.1",
+ "inBundle": true,
+ "license": "0BSD",
+ "optional": true
+ },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz",
@@ -3020,9 +3046,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -3043,9 +3066,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -3066,9 +3086,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -3089,9 +3106,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -3362,9 +3376,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
From 106a712d267012ee8f44cb24b86b59bb2e9577d2 Mon Sep 17 00:00:00 2001
From: Nick2bad4u <20943337+Nick2bad4u@users.noreply.github.com>
Date: Mon, 20 Apr 2026 00:52:09 -0400
Subject: [PATCH 3/4] Remove unused overrides for eslint-plugin-import in
package.json
Signed-off-by: Nick2bad4u <20943337+Nick2bad4u@users.noreply.github.com>
---
package.json | 5 -----
1 file changed, 5 deletions(-)
diff --git a/package.json b/package.json
index ca000f1..2e25ab4 100644
--- a/package.json
+++ b/package.json
@@ -54,10 +54,5 @@
"@rollup/rollup-linux-x64-gnu": "4.60.2",
"@tailwindcss/oxide-linux-x64-gnu": "^4.2.2",
"lightningcss-linux-x64-gnu": "^1.32.0"
- },
- "overrides": {
- "eslint-plugin-import": {
- "eslint": "^10.2.1"
- }
}
}
From 799ad51c47c806fb9ef2c8641fab94c87d773cb1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 27 May 2026 19:07:01 +0000
Subject: [PATCH 4/4] Bump symfony/routing in the composer group across 1
directory
Bumps the composer group with 1 update in the / directory: [symfony/routing](https://github.com/symfony/routing).
Updates `symfony/routing` from 7.4.8 to 7.4.13
- [Release notes](https://github.com/symfony/routing/releases)
- [Changelog](https://github.com/symfony/routing/blob/8.1/CHANGELOG.md)
- [Commits](https://github.com/symfony/routing/compare/v7.4.8...v7.4.13)
---
updated-dependencies:
- dependency-name: symfony/routing
dependency-version: 7.4.13
dependency-type: indirect
dependency-group: composer
...
Signed-off-by: dependabot[bot]
---
composer.lock | 34 +++++++++++++++++++---------------
1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/composer.lock b/composer.lock
index 2fa3bc3..4e41c0e 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "fdc249c007c9cc071e37c2cf693e8e16",
+ "content-hash": "2d184d8bf8954aded76d39de060ea212",
"packages": [
{
"name": "artesaos/seotools",
@@ -4307,16 +4307,16 @@
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.6.0",
+ "version": "v3.7.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
- "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b",
+ "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b",
"shasum": ""
},
"require": {
@@ -4329,7 +4329,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
- "dev-main": "3.6-dev"
+ "dev-main": "3.7-dev"
}
},
"autoload": {
@@ -4354,7 +4354,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0"
},
"funding": [
{
@@ -4365,12 +4365,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-09-25T14:21:43+00:00"
+ "time": "2026-04-13T15:52:40+00:00"
},
{
"name": "symfony/dom-crawler",
@@ -6025,16 +6029,16 @@
},
{
"name": "symfony/routing",
- "version": "v7.4.8",
+ "version": "v7.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b"
+ "reference": "3a162171bb008e5e0f15dce6581373a4c0e8390d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b",
- "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/3a162171bb008e5e0f15dce6581373a4c0e8390d",
+ "reference": "3a162171bb008e5e0f15dce6581373a4c0e8390d",
"shasum": ""
},
"require": {
@@ -6086,7 +6090,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v7.4.8"
+ "source": "https://github.com/symfony/routing/tree/v7.4.13"
},
"funding": [
{
@@ -6106,7 +6110,7 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-05-24T11:20:33+00:00"
},
{
"name": "symfony/service-contracts",
@@ -10347,7 +10351,7 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^8.2"
+ "php": "^8.5"
},
"platform-dev": {},
"plugin-api-version": "2.9.0"