diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 00000000..cdbef5b7 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(graphify query *)", + "Bash(php artisan *)", + "Bash(node driver.mjs)", + "Bash(nohup php artisan serve --host=0.0.0.0 --port=8000)", + "Bash(timeout 20 bash -c 'until curl -sf http://127.0.0.1:8000/ >/dev/null; do sleep 1; done')", + "Bash(curl -s http://127.0.0.1:8000/)", + "Bash(npm run *)", + "Bash(php artisan tinker '--execute= *)" + ] + } +} diff --git a/.claude/skills/laravel-13/SKILL.md b/.claude/skills/laravel-13/SKILL.md new file mode 100644 index 00000000..ad6d75d4 --- /dev/null +++ b/.claude/skills/laravel-13/SKILL.md @@ -0,0 +1,177 @@ +--- +name: laravel-13 +description: This skill should be used when writing, reviewing, or upgrading PHP/Laravel backend code in a Laravel 13.x application. It should be used for Eloquent models, migrations, query builder code, routing/controllers, and when upgrading a Laravel 12 app to Laravel 13. Laravel 13 released March 17, 2026, after this model's training cutoff, so this skill's references/ files and live web-fetches to laravel.com/docs/13.x/* should be treated as ground truth over training-data memory of Laravel 12 or earlier. +--- + +# Laravel 13 + +Laravel 13 (released March 17, 2026) is an intentionally low-breakage major +release — most Laravel 12 apps upgrade with minimal code changes. It requires +**PHP 8.3+** and continues Laravel's shift toward first-party PHP attributes +for declarative configuration, alongside a new AI SDK, JSON:API resources, +and native vector search. + +**Do not default to Laravel 12 patterns.** Where this skill's `references/` +files don't cover something, `web_fetch` the live docs at +`https://laravel.com/docs/13.x/` (e.g. `/docs/13.x/eloquent`, +`/docs/13.x/validation`, `/docs/13.x/sanctum`) rather than guessing from +training data. The 13.x docs are the only ground truth for anything +attribute-related, AI SDK–related, or vector-search–related — these are new +enough that pre-2026 training data will be wrong or silently absent. + +## Stack context + +This is a PHP/Laravel-primary stack: Laravel handles routing, Eloquent +models, controllers, and Blade where server-rendered views are still used. +**React** is used for interactive frontend pieces (mounted into Blade via +Vite), and **SCSS** for styling. When editing frontend code inside a Laravel +app, keep API boundaries clean — Eloquent API resources (including the new +JSON:API resources, see below) are the contract React components consume. +Practically, that means: put data-shaping logic in a Resource class rather +than serializing models ad hoc in a controller, and treat a controller +method's return type as the actual frontend contract, not an implementation +detail — a React component and a Laravel resource should be able to change +independently as long as that contract holds. SCSS changes are orthogonal to +anything in this skill — Vite's asset pipeline doesn't change with the +framework's major version. + +## What changed from Laravel 12 to 13 + +Full detail lives in `references/upgrade-12-to-13.md`. Highlights: + +- **PHP 8.3 minimum** (was 8.2 in Laravel 12). Supported range is PHP 8.3–8.5. +- **CSRF middleware renamed**: `VerifyCsrfToken` → `PreventRequestForgery`, + now with origin-aware verification via the `Sec-Fetch-Site` header. Old + class names remain as deprecated aliases — update direct references + (`->withoutMiddleware([...])`, tests) to the new name. +- **`serializable_classes` cache hardening** (medium impact): `config/cache.php` + now defaults to blocking arbitrary PHP object unserialization from cache + unless explicitly allow-listed. If you cache PHP objects (not just arrays), + you must list those classes explicitly or you'll get silent deserialization + failures. +- **MySQL/MariaDB `upsert` validation**: an empty `uniqueBy` now throws + `InvalidArgumentException` instead of generating broken SQL. +- Several **low-impact renames**: `JobAttempted::$exceptionOccurred` → + `$exception` (now the actual exception object or `null`); + `QueueBusy::$connection` → `$connectionName`; pagination Bootstrap-3 view + names became explicit (`pagination::bootstrap-3`). +- Laravel Boost (`^2.0`) can drive the upgrade itself — the + `/upgrade-laravel-v13` slash command automates most of the mechanical work + if Boost is installed in the app. + +For a real upgrade, don't stop at this summary — read +`references/upgrade-12-to-13.md` in full before touching `composer.json`. +It also lists a dozen low/very-low-impact contract additions and renames +(queue events, HTTP client method signatures, pagination view names, a +`symfony/polyfill-php85` global-function collision) that rarely bite but +are cheap to check for in a large codebase. + +### New capabilities worth knowing about + +- **Expanded PHP attributes across the framework.** Models can now be + configured with `#[Table]`, `#[Fillable]`, `#[Guarded]`, `#[Unguarded]`, + `#[Connection]`, `#[DateFormat]`, `#[WithoutTimestamps]`, + `#[WithoutIncrementing]`, `#[ScopedBy]` instead of (or alongside) the + traditional `protected $table`, `protected $fillable`, etc. properties. + Local query scopes now use `#[Scope]` on a `protected` method instead of a + `scopeXxx()`-prefixed public method. Controllers gained `#[Middleware(...)]` + and `#[Authorize(...)]` attributes as declarative alternatives to + route-file `->middleware()` calls and `can` middleware strings. See + `references/eloquent.md` and `references/routing.md` — **both the + attribute style and the older property/method style still work**, and + existing Laravel 12 code using the old style needs no changes. +- **`Queue::route(JobClass::class, connection: ..., queue: ...)`** — central, + class-based queue/connection routing instead of setting `$queue`/ + `$connection` on every job or calling `->onQueue()` at every dispatch site. +- **`Cache::touch($key, $seconds)`** — extend a cache entry's TTL without + re-fetching and re-storing its value. Custom cache store implementations + must add a `touch` method to satisfy the `Store` contract. +- **`PreventRequestForgery`** (see upgrade notes above) — also exposes a + `preventRequestForgery(...)` method in the middleware configuration API. +- **JSON:API resources** — first-party support for the JSON:API spec + (resource objects, relationship inclusion, sparse fieldsets, links, + compliant headers) alongside existing Eloquent API resources. Fetch + `/docs/13.x/eloquent-resources#jsonapi-resources` for the exact class/method + names when building one — not covered in `references/` here since usage is + narrow and spec-driven. +- **Vector search** — `DB::table(...)->whereVectorSimilarTo('embedding', $vector, minSimilarity: 0.4)` + and related methods (`selectVectorDistance`, `whereVectorDistanceLessThan`, + `orderByVectorDistance`) for cosine-similarity search, PostgreSQL + + `pgvector` only. The vector argument can be a raw embedding array *or* a + plain string — Laravel will generate the embedding via the AI SDK + automatically. See `references/database.md`. +- **Laravel AI SDK** (`laravel/ai`, stable in 13) — provider-agnostic text + generation, tool-calling agents, image/audio generation, and embeddings + (`Str::of($text)->toEmbeddings()`). Fetch `/docs/13.x/ai-sdk` for anything + beyond the one-liner examples in the release notes — this is an entirely + new package, not an incremental change, so there's no prior-version + knowledge to fall back on. + +### A quick taste of the attribute style + +Since this is the single biggest day-to-day change, here's the shape before +diving into `references/eloquent.md` for the full attribute list. Both of +these are equivalent and both are valid Laravel 13 code — attributes don't +replace the property style, they're an alternative for models where +declaring config at the top of the class reads better than scattering it +across several `protected` properties: + +```php +// Attribute style (new option in 13) +#[Table('flights', key: 'flight_id')] +#[Fillable(['name', 'destination'])] +class Flight extends Model {} + +// Property style (still fully supported, what most 12.x code already has) +class Flight extends Model +{ + protected $table = 'flights'; + protected $primaryKey = 'flight_id'; + protected $fillable = ['name', 'destination']; +} +``` + +Don't churn through an existing codebase converting property style to +attribute style — that's a cosmetic diff with no behavioral upside. Use +attributes for *new* models where they read more cleanly, and leave +existing 12.x-style models alone unless the user asks for a conversion. + +## Where to look + +| Need | File | +|---|---| +| Concrete upgrade diffs (12→13), what breaks / what's deprecated | `references/upgrade-12-to-13.md` | +| Model definitions (attribute vs. property style), relationships, scopes, casts, factories | `references/eloquent.md` | +| Query builder basics, migrations, transactions, vector search | `references/database.md` | +| Route definitions, controller attributes, route model binding, resources | `references/routing.md` | +| `Str`, `Arr`, `collect()`, `Http`, `Validator` quick reference | `references/common-helpers.md` | + +If a task touches something not in this table (JSON:API resources, the AI +SDK, Sanctum, broadcasting, queues in depth, testing, etc.), `web_fetch` the +matching `https://laravel.com/docs/13.x/` page directly rather than +improvising from memory of Laravel 10/11/12 docs — the URL slugs are usually +the same as prior versions (`/docs/13.x/queues`, `/docs/13.x/validation`, +`/docs/13.x/sanctum`, `/docs/13.x/eloquent-relationships`, etc.). + +## A note on confidence + +Everything in the five `references/` files was pulled directly from the live +`laravel.com/docs/13.x/*` pages (plus the release notes and upgrade guide) +during this skill's creation, not reconstructed from training data. Code +examples in those files are the framework's own examples, not invented ones +— if a snippet looks slightly unusual (e.g. `now()->minus(months: 1)` instead +of the more familiar `now()->subMonth()`), that's very likely a genuine 13.x +API detail worth double-checking rather than a transcription slip, since +Laravel has been known to introduce named-argument-friendly method variants +across major versions. + +That said, these five files are a curated subset — Eloquent relationships, +factories, custom cast classes, migrations column types, validation rules, +queues, broadcasting, testing, and the AI SDK/JSON:API resources were +deliberately **not** fully inlined here to keep `SKILL.md` and its +references lean and because their APIs are either unchanged from Laravel 12 +(safe to reason about from memory, but verify anything unusual) or entirely +new (no safe memory to fall back on at all — must fetch). When a task needs +one of those, prefer a fresh `web_fetch` over confidence born from general +Laravel familiarity. It costs one tool call and eliminates an entire class +of "this was true in Laravel 11" mistakes. diff --git a/.claude/skills/laravel-13/references/common-helpers.md b/.claude/skills/laravel-13/references/common-helpers.md new file mode 100644 index 00000000..677037c6 --- /dev/null +++ b/.claude/skills/laravel-13/references/common-helpers.md @@ -0,0 +1,143 @@ +# Common Helpers & Facades Quick Reference (Laravel 13.x) + +These APIs are stable across recent Laravel major versions — nothing here +is 13.x-specific except where noted (`Str::uuid7()`, `Str::of()->toEmbeddings()`). +Fetch `/docs/13.x/strings`, `/docs/13.x/helpers`, `/docs/13.x/collections`, +`/docs/13.x/http-client`, or `/docs/13.x/validation` directly for anything +not listed. + +## `Str` (`Illuminate\Support\Str`) + +| Method | Purpose | +|---|---| +| `Str::slug($title)` | URL-friendly slug | +| `Str::limit($str, 20)` | Truncate to length | +| `Str::random(32)` | Random string | +| `Str::uuid()` | UUIDv4 | +| `Str::uuid7()` | UUIDv7 (time-ordered, sortable — used by `HasUuids` by default) | +| `Str::ulid()` | ULID (compact, time-ordered) | +| `Str::plural($word)` / `Str::singular($word)` | Pluralize / singularize | +| `Str::camel($str)` / `Str::snake($str)` / `Str::kebab($str)` / `Str::studly($str)` | Case conversion | +| `Str::headline($str)` / `Str::title($str)` / `Str::apa($str)` | Title-casing variants | +| `Str::contains($haystack, $needle)` / `startsWith()` / `endsWith()` | Substring checks | +| `Str::replace($search, $replace, $subject)` | Replace | +| `Str::upper()` / `Str::lower()` | Case | +| `Str::password(32)` | Secure random password | +| `Str::isJson()` / `isUrl()` / `isUuid()` / `isUlid()` | Validity checks | +| `Str::after($subject, $search)` / `before()` / `between()` | Substring extraction | +| `Str::of($string)` | Fluent `Stringable` instance — chain `->trim()->slug()->limit(20)` etc. | + +**New in 13 — AI SDK integration:** +`Str::of($text)->toEmbeddings()` generates vector embeddings directly from +a string via the Laravel AI SDK — pairs with `whereVectorSimilarTo` in +`references/database.md`. Fetch `/docs/13.x/ai-sdk#embeddings` for +provider/config details before using this in application code. + +## `Arr` (`Illuminate\Support\Arr`) + +Prefer `Arr::` methods over legacy global `array_*()` helpers, especially +`Arr::first()`/`Arr::last()` — Laravel 13 ships a PHP 8.5 polyfill +(`symfony/polyfill-php85`) that can define global `array_first()`/ +`array_last()` with different (callback-less) semantics than +`laravel/helpers`' historical versions. See +`references/upgrade-12-to-13.md`. + +```php +use Illuminate\Support\Arr; + +Arr::get($array, 'products.desk.price', 0); // dot-notation get w/ default +Arr::set($array, 'products.desk.price', 200); // dot-notation set +Arr::has($array, 'products.desk'); +Arr::only($array, ['name', 'email']); +Arr::except($array, ['password']); +Arr::first($array, fn ($value) => $value > 100); // callback supported +Arr::last($array); +Arr::flatten($array); +Arr::collapse($arrayOfArrays); +Arr::pluck($array, 'name'); +``` + +## `collect()` / `Illuminate\Support\Collection` + +```php +$collection = collect([1, 2, 3, 4]); + +$collection->map(fn ($n) => $n * 2); +$collection->filter(fn ($n) => $n > 2); +$collection->reject(fn ($n) => $n > 2); // inverse of filter +$collection->reduce(fn ($carry, $n) => $carry + $n, 0); +$collection->groupBy('type'); +$collection->pluck('name'); +$collection->sortBy('name'); +$collection->chunk(200); +$collection->each(fn ($item) => /* ... */ null); +``` + +Eloquent's `Collection` (returned by `->get()`, `::all()`) extends this +base class and adds model-specific helpers (`modelKeys()`, `load()`, etc.) +— see `references/eloquent.md`. + +## `Http` (`Illuminate\Support\Facades\Http`) + +```php +use Illuminate\Support\Facades\Http; + +$response = Http::get('https://api.example.com/users'); +$response = Http::post('https://api.example.com/users', ['name' => 'Steve']); + +$response = Http::withToken($token) + ->withHeaders(['X-Custom' => 'value']) + ->timeout(10) + ->retry(3, 100) + ->post(/* ... */); + +$response->json(); +$response->status(); +$response->successful(); +$response->throw(); // throws on 4xx/5xx — signature is explicit in 13.x +``` + +## `Validator` / form validation + +```php +use Illuminate\Support\Facades\Validator; + +$validator = Validator::make($request->all(), [ + 'title' => 'required|max:255', + 'body' => 'required', + 'email' => 'required|email|unique:users,email', +]); + +if ($validator->fails()) { + return redirect('/create') + ->withErrors($validator) + ->withInput(); +} +``` + +Controller-level convenience (throws `ValidationException` automatically, +302-redirects with errors on failure in a web context): + +```php +$validated = $request->validate([ + 'title' => 'required|max:255', + 'body' => 'required', +]); +``` + +For Form Request classes (`php artisan make:request StoreFlightRequest`) +and custom validation rule objects, fetch `/docs/13.x/validation` directly +— the class shape (`authorize()`, `rules()`) is unchanged from Laravel 12. + +## React + SCSS stack notes + +- Laravel API resources (`php artisan make:resource`) are the typical + contract between Eloquent models and React components — return + `SomeResource::collection($models)` or `new SomeResource($model)` from + controllers consumed by the frontend. New JSON:API resources (see + `SKILL.md`) are an alternative when the frontend needs JSON:API-shaped + responses specifically (sparse fieldsets, `included`, etc.) — not needed + for a plain internal API. +- SCSS compiles through Vite (`resources/sass` → `laravel-vite-plugin`), + unrelated to any Laravel 13 change — Vite/asset-pipeline config is + independent of the framework major version. diff --git a/.claude/skills/laravel-13/references/database.md b/.claude/skills/laravel-13/references/database.md new file mode 100644 index 00000000..df94e23b --- /dev/null +++ b/.claude/skills/laravel-13/references/database.md @@ -0,0 +1,208 @@ +# Database: Query Builder (Laravel 13.x) + +Source: https://laravel.com/docs/13.x/queries. Fetch that URL directly for +anything beyond what's below (joins beyond inner/left/right, unions, +full-text search, reusable query components, debugging helpers). Migration +and transaction syntax below is standard and effectively unchanged from +Laravel 12 — fetch `/docs/13.x/migrations` for column-type specifics +(`vector`, spatial types) if working with newer column types. + +## Basic queries + +```php +use Illuminate\Support\Facades\DB; + +$users = DB::table('users')->get(); + +$users = DB::table('users') + ->select('name', 'email as user_email') + ->where('votes', '>', 100) + ->orderBy('name') + ->limit(10) + ->get(); + +// value shorthand — assumes `=` +$users = DB::table('users')->where('votes', 100)->get(); + +// array of conditions +$users = DB::table('users')->where([ + ['status', '=', '1'], + ['subscribed', '<>', '1'], +])->get(); +``` + +PDO parameter binding protects query *values* automatically — never +interpolate user input into column/order-by names, since PDO can't bind +those. + +## Where variants worth knowing + +```php +// OR, grouped to avoid clobbering global scopes +$users = DB::table('users') + ->where('votes', '>', 100) + ->orWhere(function ($query) { + $query->where('name', 'Abigail')->where('votes', '>', 50); + }) + ->get(); + +// negation +$products = DB::table('products')->whereNot(function ($query) { + $query->where('clearance', true)->orWhere('price', '<', 10); +})->get(); + +// same condition across multiple columns +$users = DB::table('users') + ->whereAny(['name', 'email', 'phone'], 'like', 'Example%') + ->get(); +``` + +## Joins + +```php +$users = DB::table('users') + ->join('contacts', 'users.id', '=', 'contacts.user_id') + ->join('orders', 'users.id', '=', 'orders.user_id') + ->select('users.*', 'contacts.phone', 'orders.price') + ->get(); + +DB::table('users')->leftJoin('posts', 'users.id', '=', 'posts.user_id')->get(); +DB::table('users')->rightJoin('posts', 'users.id', '=', 'posts.user_id')->get(); +``` + +## Insert / update / delete + +```php +DB::table('users')->insert(['email' => 'kayla@example.com', 'votes' => 0]); + +DB::table('users')->insert([ + ['email' => 'picard@example.com', 'votes' => 0], + ['email' => 'janeway@example.com', 'votes' => 0], +]); + +$id = DB::table('users')->insertGetId(['email' => 'john@example.com', 'votes' => 0]); + +DB::table('flights')->upsert( + [ + ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99], + ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150], + ], + ['departure', 'destination'], // uniqueBy — must be non-empty (13.x validates this) + ['price'], // columns to update on conflict +); + +$affected = DB::table('users')->where('id', 1)->update(['votes' => 1]); + +// JSON column update +DB::table('users')->where('id', 1)->update(['options->enabled' => true]); + +DB::table('users')->updateOrInsert( + ['email' => 'john@example.com', 'name' => 'John'], + ['votes' => '2'], +); + +DB::table('users')->increment('votes', 5); +DB::table('users')->incrementEach(['votes' => 5, 'balance' => 100]); + +$deleted = DB::table('users')->where('votes', '>', 100)->delete(); +``` + +## Vector similarity clauses (new in 13, PostgreSQL + pgvector only) + +Requires the `pgvector` PostgreSQL extension. Ensure it before creating +`vector` columns: + +```php +use Illuminate\Support\Facades\Schema; + +Schema::ensureVectorExtensionExists(); +``` + +`whereVectorSimilarTo` filters by cosine similarity and orders by relevance +automatically. `minSimilarity` ranges `0.0`–`1.0` (`1.0` = identical): + +```php +$documents = DB::table('documents') + ->whereVectorSimilarTo('embedding', $queryEmbedding, minSimilarity: 0.4) + ->limit(10) + ->get(); +``` + +The vector argument accepts a **plain string** too — Laravel generates the +embedding automatically via the Laravel AI SDK: + +```php +$documents = DB::table('documents') + ->whereVectorSimilarTo('embedding', 'Best wineries in Napa Valley') + ->limit(10) + ->get(); +``` + +Disable the automatic relevance ordering with `order: false` to sort by +something else instead: + +```php +$documents = DB::table('documents') + ->whereVectorSimilarTo('embedding', $queryEmbedding, minSimilarity: 0.4, order: false) + ->orderBy('created_at', 'desc') + ->limit(10) + ->get(); +``` + +For finer control, compose the primitives directly: + +```php +$documents = DB::table('documents') + ->select('*') + ->selectVectorDistance('embedding', $queryEmbedding, as: 'distance') + ->whereVectorDistanceLessThan('embedding', $queryEmbedding, maxDistance: 0.3) + ->orderByVectorDistance('embedding', $queryEmbedding) + ->limit(10) + ->get(); +``` + +## Transactions + +```php +use Illuminate\Support\Facades\DB; + +DB::transaction(function () { + DB::table('users')->update(['votes' => 1]); + DB::table('posts')->delete(); +}); + +// manual control +DB::beginTransaction(); +try { + // ... + DB::commit(); +} catch (\Throwable $e) { + DB::rollBack(); + throw $e; +} +``` + +## Pessimistic locking + +```php +DB::table('users')->where('votes', '>', 100)->sharedLock()->get(); +DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get(); +``` + +## Migrations — quick reminders + +Standard `Schema::create`/`Schema::table` + `Blueprint` API is unchanged. +For soft deletes: + +```php +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +Schema::table('flights', function (Blueprint $table) { + $table->softDeletes(); +}); +``` + +Fetch `/docs/13.x/migrations` directly for column-type specifics (`vector`, +spatial/geo types, UUID/ULID columns) — these vary by database driver and +are easy to get subtly wrong from memory. diff --git a/.claude/skills/laravel-13/references/eloquent.md b/.claude/skills/laravel-13/references/eloquent.md new file mode 100644 index 00000000..165d487c --- /dev/null +++ b/.claude/skills/laravel-13/references/eloquent.md @@ -0,0 +1,308 @@ +# Eloquent (Laravel 13.x) + +Source: https://laravel.com/docs/13.x/eloquent (model config, scopes) and +https://laravel.com/docs/13.x/eloquent-mutators (casts). Fetch +`/docs/13.x/eloquent-relationships` and `/docs/13.x/eloquent-factories` +directly for relationship/factory syntax beyond the basics below — they +were not pulled into this reference and their APIs are effectively +unchanged from Laravel 12, but confirm before relying on memory for +anything non-trivial (polymorphic relations, custom pivot models, etc.). + +## Model definition: attribute style vs. property style + +Laravel 13 lets you configure a model either the traditional way +(protected properties) or via first-party PHP attributes on the class. +**Both work; neither is deprecated.** Attributes read better when a model +has several non-default settings; properties are fine for one-offs and are +what most existing Laravel 12 code already uses — don't rewrite working +models just to switch style. + +```php +enabled'])]`. + +UUID/ULID primary keys still use traits, not attributes: + +```php +use Illuminate\Database\Eloquent\Concerns\HasUuids; // or HasUlids +use Illuminate\Database\Eloquent\Model; + +class Article extends Model +{ + use HasUuids; +} + +$article = Article::create(['title' => 'Traveling to Europe']); +$article->id; // "018f2b5c-6a7f-7b12-9d6f-2f8a4e0c9c11" — UUIDv7 by default +``` + +## Query scopes + +### Local scopes: `#[Scope]` attribute (new style) replaces `scopeXxx()` + +Laravel 13's preferred style: a `protected` method with `#[Scope]`, named +after the scope itself (no `scope` prefix): + +```php +where('votes', '>', 100); + } + + #[Scope] + protected function ofType(Builder $query, string $type): void + { + $query->where('type', $type); + } +} +``` + +```php +$users = User::popular()->ofType('admin')->orderBy('created_at')->get(); +``` + +Scope methods must return `void` or the same builder — don't `return $query;` +explicitly when using `void`. When calling an attributed scope *from inside +the model class itself*, go through `static::query()->popular()`, not a bare +`static::popular()`, so the call is routed through Eloquent's scope handling. + +Chaining scopes with `or` needs a closure (or the higher-order `orWhere`): + +```php +$users = User::popular()->orWhere(function (Builder $query) { + $query->active(); +})->get(); + +// equivalent, no closure: +$users = User::popular()->orWhere->active()->get(); +``` + +### Global scopes + +```php +where('created_at', '<', now()->minus(years: 2000)); + } +} +``` + +Attach via attribute (preferred) or `booted()`: + +```php +#[ScopedBy([AncientScope::class])] +class User extends Model {} +``` + +Remove per-query with `withoutGlobalScope(AncientScope::class)`, +`withoutGlobalScopes([...])`, or `withoutGlobalScopesExcept([...])`. + +### Pending attributes on scopes + +`withAttributes()` inside a scope both constrains the query *and* seeds +attributes on models created via that scope: + +```php +#[Scope] +protected function draft(Builder $query): void +{ + $query->withAttributes(['hidden' => true]); +} + +$draft = Post::draft()->create(['title' => 'In Progress']); +$draft->hidden; // true +``` + +Pass `asConditions: false` to seed attributes without adding `where` clauses. + +## Casts + +Casts are defined via a `casts()` method (not an attribute), returning an +array of `attribute => type`: + +```php + 'boolean', + 'options' => 'array', + 'joined_at' => 'datetime', + 'balance' => 'decimal:2', + 'settings' => 'encrypted:array', + ]; + } +} +``` + +Supported built-in cast types: `array`, `AsFluent::class`, +`AsStringable::class`, `AsUri::class`, `boolean`, `collection`, `date`, +`datetime`, `immutable_date`, `immutable_datetime`, `decimal:`, +`double`, `encrypted`, `encrypted:array`, `encrypted:collection`, +`encrypted:object`, `float`, `hashed`, `integer`, `object`, `real`, +`string`, `timestamp`. + +For custom cast classes (value objects, inbound-only casts, cast +parameters, `Castable`), fetch +`https://laravel.com/docs/13.x/eloquent-mutators#custom-casts` directly — +not duplicated here since it's rarely needed day-to-day and the exact +interface methods matter. + +## Common query/CRUD patterns + +```php +// Retrieve +$flight = Flight::find(1); +$flight = Flight::where('active', 1)->first(); +$flight = Flight::firstWhere('active', 1); +$flight = Flight::findOrFail(1); // 404s if unhandled in a route +$flight = Flight::firstOrCreate(['name' => 'London to Paris']); +$flight = Flight::updateOrCreate( + ['departure' => 'Oakland', 'destination' => 'San Diego'], + ['price' => 99, 'discounted' => 1] +); + +// Insert / update +$flight = Flight::create(['name' => 'London to Paris']); // needs Fillable/Guarded +$flight->update(['name' => 'Paris to London']); +$flight->fill(['name' => 'Amsterdam to Frankfurt'])->save(); + +// Upsert (needs a primary/unique index on the uniqueBy columns) +Flight::upsert( + [ + ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99], + ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150], + ], + uniqueBy: ['departure', 'destination'], + update: ['price'], +); + +// Delete +Flight::destroy(1, 2, 3); +Flight::where('active', 0)->delete(); // no model events fired (mass delete) +``` + +### Soft deletes + +```php +use Illuminate\Database\Eloquent\SoftDeletes; + +class Flight extends Model +{ + use SoftDeletes; // casts deleted_at to Carbon automatically +} + +Flight::withTrashed()->where('account_id', 1)->get(); +Flight::onlyTrashed()->get(); +$flight->restore(); +$flight->forceDelete(); // permanent +``` + +### Pruning (periodic cleanup) + +```php +use Illuminate\Database\Eloquent\Prunable; // or MassPrunable for bulk deletes + +class Flight extends Model +{ + use Prunable; + + public function prunable(): Builder + { + return static::where('created_at', '<=', now()->minus(months: 1)); + } +} +``` + +Schedule with `Schedule::command('model:prune')->daily();` in +`routes/console.php`. + +## Relationships and factories + +Standard relationship methods (`hasOne`, `hasMany`, `belongsTo`, +`belongsToMany`, `hasManyThrough`, `morphTo`, etc.) and factory syntax +(`Model::factory()->count(3)->create()`) are unchanged from Laravel 12. +Fetch `/docs/13.x/eloquent-relationships` or `/docs/13.x/eloquent-factories` +for exact syntax on anything beyond basic `hasMany`/`belongsTo` — especially +polymorphic relations, custom pivot models (table-name pluralization +changed in 13, see `references/upgrade-12-to-13.md`), and factory states. diff --git a/.claude/skills/laravel-13/references/routing.md b/.claude/skills/laravel-13/references/routing.md new file mode 100644 index 00000000..0a8ff4db --- /dev/null +++ b/.claude/skills/laravel-13/references/routing.md @@ -0,0 +1,207 @@ +# Routing & Controllers (Laravel 13.x) + +Sources: https://laravel.com/docs/13.x/routing and +https://laravel.com/docs/13.x/controllers. Fetch those directly for rate +limiting, CORS, and route caching details not covered below. + +## Basic route definitions + +```php +use Illuminate\Support\Facades\Route; +use App\Http\Controllers\UserController; + +Route::get('/greeting', fn () => 'Hello World'); +Route::get('/user', [UserController::class, 'index']); + +Route::get($uri, $callback); +Route::post($uri, $callback); +Route::put($uri, $callback); +Route::patch($uri, $callback); +Route::delete($uri, $callback); +Route::match(['get', 'post'], '/', fn () => /* ... */ null); +Route::any('/', fn () => /* ... */ null); +``` + +`routes/web.php` gets the `web` middleware group (session, CSRF). +`routes/api.php` (created via `php artisan install:api`, which also installs +Sanctum) gets the `api` group and an automatic `/api` prefix. + +## Route parameters + +```php +Route::get('/user/{id}', fn (string $id) => 'User '.$id); +Route::get('/user/{name?}', fn (?string $name = null) => $name); // optional +Route::get('/user/{id}', fn (string $id) => /* ... */ null) + ->where('id', '[0-9]+'); // regex constraint +``` + +## Named routes & groups + +```php +Route::get('/user/profile', fn () => /* ... */ null)->name('profile'); + +Route::middleware(['auth'])->group(function () { + Route::get('/dashboard', fn () => /* ... */ null); +}); + +Route::prefix('admin')->name('admin.')->group(function () { + Route::get('/users', fn () => /* ... */ null)->name('users'); // → admin.users +}); +``` + +## Route model binding + +```php +// Implicit — type-hint the model, Laravel resolves by route-segment key +Route::get('/users/{user}', fn (User $user) => $user); + +// Custom key +Route::get('/posts/{post:slug}', fn (Post $post) => $post); + +// Implicit enum binding +Route::get('/orders/{status}', fn (OrderStatus $status) => $status); +``` + +`findOrFail`-style 404 behavior is automatic for implicit binding; a +missing/soft-deleted model produces a 404 unless customized (see resource +`missing()`/`withTrashed()` below). + +## Controller middleware — three ways (all still valid) + +**Route-file style** (unchanged from 12.x): + +```php +Route::get('/profile', [UserController::class, 'show'])->middleware('auth'); +``` + +**`HasMiddleware` interface** (unchanged from 12.x): + +```php +use Illuminate\Routing\Controllers\HasMiddleware; +use Illuminate\Routing\Controllers\Middleware; + +class UserController implements HasMiddleware +{ + public static function middleware(): array + { + return [ + 'auth', + new Middleware('log', only: ['index']), + new Middleware('subscribed', except: ['store']), + ]; + } +} +``` + +**PHP attributes** (new option in 13.x, class- and method-level, merged +together): + +```php + PhotoController::class, 'posts' => PostController::class]); + +Route::resource('photos', PhotoController::class)->only(['index', 'show']); +Route::resource('photos', PhotoController::class)->except(['destroy']); + +// nested +Route::resource('photos.comments', PhotoCommentController::class); + +// soft-deletable resources in bulk +Route::softDeletableResources(['photos' => PhotoController::class]); +``` + +Standard CRUD verb/URI/action/name table (`index`, `create`, `store`, +`show`, `edit`, `update`, `destroy`) is unchanged from prior versions. + +### Fine-grained resource middleware (`middlewareFor` / `withoutMiddlewareFor`) + +```php +Route::resource('users', UserController::class) + ->middleware(['auth', 'verified']); // all actions + +Route::resource('users', UserController::class) + ->middlewareFor('show', 'auth'); // one action + +Route::apiResource('users', UserController::class) + ->middlewareFor(['show', 'update'], ['auth', 'verified']); // several + +Route::middleware(['auth', 'verified', 'subscribed'])->group(function () { + Route::resource('users', UserController::class) + ->withoutMiddlewareFor('index', ['auth', 'verified']); +}); +``` + +## Dependency injection in controllers + +```php +class UserController extends Controller +{ + public function __construct( + protected UserRepository $users, // constructor injection + ) {} + + public function update(Request $request, string $id): RedirectResponse + { + // method injection: Request auto-resolved, {id} still bound by name + } +} +``` diff --git a/.claude/skills/laravel-13/references/upgrade-12-to-13.md b/.claude/skills/laravel-13/references/upgrade-12-to-13.md new file mode 100644 index 00000000..ca8d421c --- /dev/null +++ b/.claude/skills/laravel-13/references/upgrade-12-to-13.md @@ -0,0 +1,143 @@ +# Upgrading From Laravel 12.x to 13.0 + +Source: https://laravel.com/docs/13.x/upgrade (fetch this URL directly for +anything not summarized below, or if the app being upgraded has dependencies +not mentioned here). + +Estimated upgrade time: ~10 minutes for a typical app. Laravel Boost `^2.0` +can automate most of this via the `/upgrade-laravel-v13` slash command if +installed in the target app. + +## High impact + +### Updating dependencies + +In `composer.json`: + +- `laravel/framework` → `^13.0` +- `laravel/boost` → `^2.0` +- `laravel/tinker` → `^3.0` +- `phpunit/phpunit` → `^12.0` +- `pestphp/pest` → `^4.0` + +If using the global Laravel installer CLI: `composer global update laravel/installer` +(or update Herd if using its bundled installer). + +### CSRF middleware renamed: `PreventRequestForgery` + +`VerifyCsrfToken` is renamed to `Illuminate\Foundation\Http\Middleware\PreventRequestForgery`, +and now performs origin-aware verification using the `Sec-Fetch-Site` header +in addition to token-based CSRF protection. `VerifyCsrfToken` and +`ValidateCsrfToken` remain as deprecated aliases (so old code doesn't break +outright), but update direct references — especially in tests and +`withoutMiddleware` calls: + +```php +use Illuminate\Foundation\Http\Middleware\PreventRequestForgery; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; + +// Laravel <= 12.x +->withoutMiddleware([VerifyCsrfToken::class]); + +// Laravel >= 13.x +->withoutMiddleware([PreventRequestForgery::class]); +``` + +The middleware configuration API also gained `preventRequestForgery(...)` as +a first-class method. + +## Medium impact + +### Cache `serializable_classes` config + +The default `config/cache.php` now includes `serializable_classes` set to +`false`. This hardens cache unserialization to prevent PHP deserialization +gadget-chain attacks if `APP_KEY` leaks. If the app stores PHP objects +(not just arrays/scalars) in cache, list the allowed classes explicitly: + +```php +'serializable_classes' => [ + App\Data\CachedDashboardStats::class, + App\Support\CachedPricingSnapshot::class, +], +``` + +Apps that previously relied on unserializing arbitrary cached objects need +to migrate to an explicit allow-list, or switch those cache payloads to +arrays. + +### MySQL/MariaDB `upsert` requires non-empty `uniqueBy` + +Laravel now validates that `uniqueBy` is non-empty and throws +`InvalidArgumentException` if it isn't, instead of generating invalid SQL. +MySQL/MariaDB drivers still ignore the actual *value* of `uniqueBy` (they +always use the table's primary/unique indexes) — but the argument itself +must not be empty. + +## Low impact (know these exist, fix if they bite) + +- **Cache/session key prefixes** now use hyphens instead of underscores + (`app-name-cache-` vs `app_name_cache_`) *only* when falling back to + framework defaults (no explicit `CACHE_PREFIX`/`REDIS_PREFIX`/ + `SESSION_COOKIE` in `.env`). Set those env vars explicitly to keep old + values. +- **`Container::call` respects nullable class defaults** — a + `function (?Carbon $date = null)` param with no bound `Carbon` instance + now resolves to `null` instead of an auto-resolved `Carbon` instance, + matching Laravel 12's constructor-injection behavior. +- **Eloquent model instantiation during `boot()` now throws.** Calling + `new static()` (or similar) from inside a model's `boot()`/trait `boot*()` + method raises `LogicException`. Move that logic outside the boot cycle. +- **Polymorphic pivot table names now pluralize** when inferred for custom + pivot model classes. If a model relied on the old singular inference, + set the table name explicitly on the pivot model. +- **Eloquent collection (de)serialization restores eager-loaded relations** + (e.g. after a queued job round-trip) — code that assumed relations were + gone after deserialization needs review. +- **MySQL `DELETE ... JOIN ... ORDER BY ... LIMIT`** now compiles the + `ORDER BY`/`LIMIT` into the SQL instead of silently dropping them — this + can turn a previously-succeeding unbounded delete into a `QueryException` + on engines that don't support the syntax. +- **`JobAttempted::$exceptionOccurred` (bool) → `$exception` (exception or `null`)**. + Update any listener referencing the old property. +- **`QueueBusy::$connection` → `$connectionName`.** +- **Domain routes now match before non-domain routes**, regardless of + registration order — review route-matching if the app has both. +- **`Str` factories (UUID/ULID/random) reset between tests** — set them + per-test/per-setup instead of relying on persistence across test methods. +- **Bootstrap-3 pagination view names are explicit**: + `pagination::default` → `pagination::bootstrap-3`, + `pagination::simple-default` → `pagination::simple-bootstrap-3`. +- **`symfony/polyfill-php85` dependency** — on PHP < 8.5 this defines global + `array_first()` / `array_last()` unless already defined. These can + conflict with `laravel/helpers` or custom globals of the same name and + have different signatures (no callback support). Prefer + `Illuminate\Support\Arr::first($array, fn ($value) => ...)` instead of a + bare `array_first()` to sidestep the conflict entirely. + +## Very low impact (contract additions — only matters for custom implementations) + +- `Illuminate\Contracts\Cache\Store` gained `touch($key, $seconds)`. +- `Illuminate\Contracts\Bus\Dispatcher` gained `dispatchAfterResponse($command, $handler = null)`. +- `Illuminate\Contracts\Routing\ResponseFactory` gained an `eventStream` signature. +- `Illuminate\Contracts\Auth\MustVerifyEmail` gained `markEmailAsUnverified()`. +- `Illuminate\Contracts\Queue\Queue` gained `pendingSize`, `delayedSize`, + `reservedSize`, `creationTimeOfOldestPendingJob`. +- HTTP client `Response::throw`/`throwIf` now declare their `$callback` + parameter directly in the signature (matters only if overriding these). +- Default password-reset mail subject changed: "Reset Password Notification" + → "Reset your password". Update tests/translations asserting the old text. +- Queued notifications now respect `#[DeleteWhenMissingModels]` / + `$deleteWhenMissingModels` reliably. +- Manager `extend(...)` closures are now bound to the manager instance as + `$this` — capture any previously-relied-upon object via `use (...)` instead. +- `Illuminate\Support\Js::from` uses `JSON_UNESCAPED_UNICODE` by default now. +- `ApplicationBuilder::withScheduling()` registration is now deferred until + `Schedule` is resolved (matters only if something depended on immediate + registration during bootstrap). + +## Not covered here + +Config file diffs, comments, and other non-functional changes are tracked in +the `laravel/laravel` skeleton repo: +https://github.com/laravel/laravel/compare/12.x...13.x diff --git a/.claude/skills/run-where2fly/.gitignore b/.claude/skills/run-where2fly/.gitignore new file mode 100644 index 00000000..9bff9eb0 --- /dev/null +++ b/.claude/skills/run-where2fly/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +screenshots/ diff --git a/.claude/skills/run-where2fly/SKILL.md b/.claude/skills/run-where2fly/SKILL.md new file mode 100644 index 00000000..c58b5a3d --- /dev/null +++ b/.claude/skills/run-where2fly/SKILL.md @@ -0,0 +1,149 @@ +--- +name: run-where2fly +description: Build, run, and drive Where2Fly (Laravel + React flight-destination finder). Use when asked to start the app, take a screenshot of it, run its PHP test suite, or interact with the running search/map UI. +--- + +Where2Fly is a Laravel app that serves server-rendered Blade pages with +a React-driven Leaflet map. Drive it by starting `php artisan serve` +and scripting a headless Chromium session via +`.claude/skills/run-where2fly/driver.mjs` (a small chromium-cli-alike +built for this skill — `chromium-cli` itself isn't installed in this +container). All paths below are relative to the repo root (`/app`). + +## Prerequisites + +PHP 8.3, MySQL client, Node 20+, and Composer/npm deps are already +installed in this container. The driver needs Playwright + a headless +Chromium, installed once inside the skill directory: + +```bash +cd .claude/skills/run-where2fly +npm install # installs playwright (see package.json) +npx playwright install --with-deps chromium # ~300MB download, one-time +``` + +## Setup + +The repo already has a working `.env` (DB creds, `APP_KEY`, API keys) +and a MySQL server reachable at `host.docker.internal` with the +`where2fly` and `where2fly_test` databases already migrated. If +starting fresh, or if `migrate:status` shows pending migrations: + +```bash +php artisan migrate +``` + +Frontend assets are already built (`public/build/` exists). If you +change anything under `resources/`, rebuild: + +```bash +npm install # repo root, not the skill dir +npm run build +``` + +## Run (agent path) + +Start the Laravel dev server, then drive it with the skill's Playwright +script. + +```bash +cd /app +nohup php artisan serve --host=0.0.0.0 --port=8000 > /tmp/artisan-serve.log 2>&1 & +timeout 20 bash -c 'until curl -sf http://127.0.0.1:8000/ >/dev/null; do sleep 1; done' +``` + +```bash +cd /app/.claude/skills/run-where2fly +node driver.mjs <<'EOF' +nav http://127.0.0.1:8000/ +wait-for text=SEARCH 5000 +screenshot home +click button.submitBtn:visible +sleep 3000 +screenshot search-results +console --errors +EOF +``` + +Screenshots land in `.claude/skills/run-where2fly/screenshots/` (also +copied to `screenshot.png` as a "latest" pointer). Stop the server with +`pkill -f "artisan serve"`. + +Driver commands (`driver.mjs`, read from stdin or a script file): + +| command | what it does | +|---|---| +| `nav ` | navigate | +| `wait-for text=` or `wait-for ` `[timeoutMs]` | wait until visible | +| `click ` | click (selectors support `:visible`, `text=`) | +| `fill ` | fill an input (goes through React's input pipeline) | +| `press ` | keyboard press | +| `screenshot [name]` | full-page screenshot | +| `screenshot-element [name]` | crop to one element | +| `console --errors` | print captured console/page errors | +| `eval ` | `page.evaluate` and print the result | +| `sleep ` | pause | +| `quit` / `exit` | close browser | + +The homepage's search form has **three tabs** (Find Arrival / Find +Departure / Find Flights), each with its own hidden `button.submitBtn` +— plain `click text=SEARCH` matches Playwright's first (possibly +hidden) match and silently does nothing. Use `button.submitBtn:visible` +to hit the active tab's button. + +## Run (human path) + +`php artisan serve` then open `http://localhost:8000` in a browser. +Ctrl-C to stop. (`docker-compose.dev.yml` exists for a containerized +setup, but this container already has PHP/MySQL/Node natively, so +`artisan serve` is simpler and is what was verified.) + +## Test + +```bash +php artisan test +``` + +~120 tests / ~265 assertions, ~10s, all passing against the +`where2fly_test` database defined in `phpunit.xml`. If the suite +suddenly takes ~15 minutes instead, the seeder is broken (every failing +test re-runs `migrate:fresh`) — fix `TestAirportSeeder` first, don't +debug individual tests. + +## Gotchas + +- **`chromium-cli` isn't installed in this container** — this skill + ships its own minimal Playwright REPL (`driver.mjs`) instead. If a + future environment does have `chromium-cli`, prefer that. +- **Hidden duplicate buttons.** See the `button.submitBtn:visible` note + above — the search form renders one submit button per tab, only one + visible at a time. +- **Umami analytics 400s are expected and harmless.** `console + --errors` will show repeated `400` responses from + `https://metrics.blt950.com/api/send` — the dev `.env`'s + `UMAMI_WEBSITE_ID_DEV` is a placeholder, not a real site ID. Ignore + these; a real API/search error would show up as a different error or + a visibly broken results page. +- **`GET /api/user/authenticated` 400 is also expected noise** when + browsing logged-out — every page fires it. Same rule as the umami + errors: ignore it in `console --errors` unless the page itself is + visibly broken. +- **Stopping the server: never `pkill -f "artisan serve"` inside a + compound command.** `pkill -f` matches the *full command line* of + every process — including the `bash -c` running the very command that + contains that string — so it kills your own shell mid-command (exit + code 144, later steps in the same command silently skipped). Use the + bracket trick `pkill -f "[a]rtisan serve"`, or run the pkill as its + own standalone command with nothing after it. +- **Direct results URL beats driving the search form.** The web search + is a plain GET; to screenshot/verify the results page, navigate + straight to + `/search?icao=EGLL&direction=departure&codeletter=JM&airtimeMin=0&airtimeMax=8&metcondition=ANY&destinationWithRoutesOnly=0&destinationRunwayLights=0&destinationAirbases=0&flightDirection=0&temperatureMin=-60&temperatureMax=60&elevationMin=-2000&elevationMax=18000&rwyLengthMin=0&rwyLengthMax=17000` + (all listed params are required by validation) instead of filling the + multi-tab form. On any page with the map, `eval + window.setFocusAirport('KORD')` opens the React airport card directly + without hunting for Leaflet markers. +- **Map tiles need a moment.** Right after `nav`, the Leaflet map pane + renders solid black until tiles load — `sleep 2000-3000` (or + `wait-for` a marker/selector you expect) before screenshotting if you + need the map itself, not just the form. diff --git a/.claude/skills/run-where2fly/driver.mjs b/.claude/skills/run-where2fly/driver.mjs new file mode 100644 index 00000000..9b824012 --- /dev/null +++ b/.claude/skills/run-where2fly/driver.mjs @@ -0,0 +1,143 @@ +#!/usr/bin/env node +// Minimal chromium-cli-like REPL driver, built because chromium-cli isn't +// available in this environment. Reads newline-separated commands from +// stdin (or a script file passed as argv[2]) and drives a headless +// Chromium session against the running app. +// +// Commands: +// nav +// wait-for text= | wait-for [timeoutMs] +// click +// fill +// press +// screenshot [name] +// screenshot-element [name] +// console --errors +// eval +// sleep +// +// Screenshots land in ./screenshots/.png (relative to CWD). + +import { chromium } from 'playwright'; +import readline from 'node:readline'; +import fs from 'node:fs'; +import path from 'node:path'; + +const screenshotDir = path.resolve(process.cwd(), 'screenshots'); +fs.mkdirSync(screenshotDir, { recursive: true }); + +const browser = await chromium.launch({ args: ['--no-sandbox'] }); +const context = await browser.newContext({ viewport: { width: 1400, height: 900 } }); +const page = await context.newPage(); + +const consoleMessages = []; +page.on('console', (msg) => consoleMessages.push({ type: msg.type(), text: msg.text() })); +page.on('pageerror', (err) => consoleMessages.push({ type: 'pageerror', text: String(err) })); + +let shotCounter = 0; + +function parseSelector(arg) { + if (arg.startsWith('text=')) { + return { locator: page.getByText(arg.slice(5), { exact: false }) }; + } + return { locator: page.locator(arg) }; +} + +async function runLine(lineRaw) { + const line = lineRaw.trim(); + if (!line || line.startsWith('#')) return; + const [cmd, ...rest] = line.split(' '); + const argStr = rest.join(' '); + + try { + switch (cmd) { + case 'nav': { + await page.goto(argStr, { waitUntil: 'domcontentloaded' }); + console.log(`[nav] ${argStr} -> ${page.url()}`); + break; + } + case 'wait-for': { + const [selArg, timeoutArg] = argStr.split(' '); + const timeout = timeoutArg ? parseInt(timeoutArg, 10) : 15000; + const { locator } = parseSelector(selArg); + await locator.first().waitFor({ state: 'visible', timeout }); + console.log(`[wait-for] found: ${selArg}`); + break; + } + case 'click': { + const { locator } = parseSelector(argStr); + await locator.first().click(); + console.log(`[click] ${argStr}`); + break; + } + case 'fill': { + const [selArg, ...text] = rest; + const { locator } = parseSelector(selArg); + await locator.first().fill(text.join(' ')); + console.log(`[fill] ${selArg} = ${text.join(' ')}`); + break; + } + case 'press': { + await page.keyboard.press(argStr); + console.log(`[press] ${argStr}`); + break; + } + case 'screenshot': { + const name = argStr || `shot-${++shotCounter}`; + const file = path.join(screenshotDir, `${name}.png`); + await page.screenshot({ path: file, fullPage: true }); + fs.copyFileSync(file, path.join(screenshotDir, 'screenshot.png')); + console.log(`[screenshot] ${file}`); + break; + } + case 'screenshot-element': { + const [selArg, name] = rest; + const { locator } = parseSelector(selArg); + const file = path.join(screenshotDir, `${name || `el-${++shotCounter}`}.png`); + await locator.first().screenshot({ path: file }); + console.log(`[screenshot-element] ${file}`); + break; + } + case 'console': { + if (argStr === '--errors') { + const errs = consoleMessages.filter((m) => m.type === 'error' || m.type === 'pageerror'); + console.log(`[console --errors] ${errs.length} error(s)`); + errs.forEach((e) => console.log(` ${e.type}: ${e.text}`)); + } else { + consoleMessages.forEach((m) => console.log(` ${m.type}: ${m.text}`)); + } + break; + } + case 'eval': { + const result = await page.evaluate(argStr); + console.log(`[eval] ${JSON.stringify(result)}`); + break; + } + case 'sleep': { + await new Promise((r) => setTimeout(r, parseInt(argStr, 10))); + break; + } + case 'quit': + case 'exit': + await browser.close(); + process.exit(0); + break; + default: + console.log(`[?] unknown command: ${cmd}`); + } + } catch (err) { + console.log(`[error] ${cmd}: ${err.message}`); + } +} + +const input = process.argv[2] + ? fs.createReadStream(process.argv[2]) + : process.stdin; + +const rl = readline.createInterface({ input, crlfDelay: Infinity }); + +for await (const line of rl) { + await runLine(line); +} + +await browser.close(); diff --git a/.claude/skills/run-where2fly/package-lock.json b/.claude/skills/run-where2fly/package-lock.json new file mode 100644 index 00000000..1330f468 --- /dev/null +++ b/.claude/skills/run-where2fly/package-lock.json @@ -0,0 +1,60 @@ +{ + "name": "run-where2fly", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "run-where2fly", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "playwright": "^1.61.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/.claude/skills/run-where2fly/package.json b/.claude/skills/run-where2fly/package.json new file mode 100644 index 00000000..9c623006 --- /dev/null +++ b/.claude/skills/run-where2fly/package.json @@ -0,0 +1,10 @@ +{ + "name": "run-where2fly", + "version": "1.0.0", + "description": "Playwright driver for the run-where2fly agent skill", + "private": true, + "type": "module", + "dependencies": { + "playwright": "^1.61.1" + } +} diff --git a/.claude/skills/vatsim-apis/SKILL.md b/.claude/skills/vatsim-apis/SKILL.md new file mode 100644 index 00000000..0d632f5c --- /dev/null +++ b/.claude/skills/vatsim-apis/SKILL.md @@ -0,0 +1,102 @@ +--- +name: vatsim-apis +description: Reference for VATSIM's public and authenticated APIs — the real-time network Data API (online pilots/controllers/ATIS/prefiles), the METAR API, the Events API, the Slurper API, the authenticated Core API (member info, ratings, ATC history, org rosters), and the separate ATC Bookings API. Use this skill whenever the user wants to build, debug, or call anything that talks to vatsim.net/vatsim.dev endpoints, fetch live VATSIM network data, look up METARs from metar.vatsim.net, pull VATSIM events, look up a VATSIM member/CID, or integrate VATSIM ATC booking data — even if they only mention "the VATSIM API" generically or paste one of these URLs without naming the API. +--- + +# VATSIM APIs + +VATSIM (the Virtual Air Traffic Simulation network) exposes several independent +public HTTP APIs, plus one separately-hosted booking API. They are not one +unified service — each has its own base URL, auth model, and update cadence. +Official docs (OpenAPI-rendered, JS-required to see full schemas in a browser): +https://vatsim.dev/services/apis + +## Which API do I need? + +| Need | API | Auth | Base URL | +|---|---|---|---| +| Who's flying/controlling right now, positions, flight plans, ATIS | **Data API** | None | `https://data.vatsim.net/v3/` | +| METAR for one/many/all airports | **METAR API** | None | `https://metar.vatsim.net/` | +| Upcoming/current network events (used a lot — see `references/events-api.md`) | **Events API** | None | `https://my.vatsim.net/api/v2/events/` | +| Live connection status/position for one known CID (used by AFV) | **Slurper API** | None | `https://slurper.vatsim.net/users/info` | +| Member profile, ratings, flight history, org rosters, ATC history | **Core API** | API key (`X-API-Key` header) | `https://api.vatsim.net/api/` | +| Publish/manage ATC position bookings for a division/subdivision | **ATC Bookings API** | None (GET) / Bearer token (write) | `https://atc-bookings.vatsim.net/api/` | +| Discover current base URLs for the above (in case they change) | **Status endpoint** | None | `https://status.vatsim.net/status.json` | + +If unsure which base URL is current, fetch `status.vatsim.net/status.json` first — it's +the canonical service-discovery document VATSIM clients (like vPilot, Euroscope) use. + +Read `references/data-api.md`, `references/events-api.md`, +`references/metar-slurper.md`, `references/core-api.md`, or +`references/atc-bookings.md` for full field-level schemas, parameters, and +example requests before writing integration code — don't guess field names +from memory. + +## Quick recipes + +**Get everyone currently online (pilots, controllers, ATIS, prefiles):** +``` +GET https://data.vatsim.net/v3/vatsim-data.json +``` +No auth, no params. Regenerates every ~15s server-side; poll no more than every +15s. See `references/data-api.md` for the full response schema (pilots, +controllers, atis, prefiles, servers, facilities, ratings arrays). + +**Get a METAR:** +``` +GET https://metar.vatsim.net/EGLL # single airport, plain text +GET https://metar.vatsim.net/EGLL,KJFK,ENGM # comma-separated, multiple +GET https://metar.vatsim.net/ENG # 3-letter-or-fewer prefix = wildcard, all matching airports +GET https://metar.vatsim.net/all # every airport VATSIM has a METAR for +GET https://metar.vatsim.net/EGLL?format=json # add &format=json for structured {id, metar} objects +``` +Default response is `text/plain`, newline-delimited. This is an unauthenticated +convenience endpoint — same underlying data as the documented METAR API's +`GET /:icao`. + +**Get upcoming/current events:** +``` +GET https://my.vatsim.net/api/v2/events/latest # all current + upcoming +GET https://my.vatsim.net/api/v2/events/view/{id} # a single event +GET https://my.vatsim.net/api/v2/events/view/division/{division} # by division, e.g. SEA +``` +Returns `{ "data": [ {...event...} ] }` (single-event variant returns +`{ "data": {...} }`, an object not an array). See `references/events-api.md` +for the full event object schema, the region/subdivision filter variants, and +Laravel-flavored polling recipes — worth reading in full since this is used a lot. + +**Look up a member (needs a Core API key):** +``` +GET https://api.vatsim.net/api/ratings/{cid}/ +Header: X-API-Key: +``` +Core API access for anything beyond public/anonymized data requires a division +or subdivision to request a key from the VATSIM Tech Team. See +`references/core-api.md`. + +**Check/manage ATC bookings for a facility:** +``` +GET https://atc-bookings.vatsim.net/api/booking +``` +Public read, no auth needed for GET. Creating/editing/deleting bookings +(`POST`/`PUT`/`DELETE /booking`) needs a Bearer token issued to divisions/ +subdivisions/ARTCCs/vACCs that run active ATC service — request via +https://support.vatsim.net. See `references/atc-bookings.md`. + +## General notes that apply across all of these + +- **Rate limiting / etiquette**: the Data API regenerates every 15s — polling + faster just returns the same cached file and wastes bandwidth. Cache + aggressively and respect this cadence in any app you build (e.g. a Laravel + scheduled job every 15–60s, not a tight loop). +- **No official client libraries are bundled here** — these are plain REST/JSON + (or CSV for Slurper, plain text for METAR by default) over HTTPS. Any HTTP + client works fine (Laravel's `Http::get()`, `fetch`, `curl`, etc.). +- **Terms of Service**: all VATSIM API use is governed by + https://vatsim.net/docs/policy/user-agreement — don't scrape/store personal + member data (names, emails) beyond what the public Data/Core API already + anonymizes/exposes. +- **CIDs vs callsigns**: `cid` is a VATSIM member's permanent numeric ID; + `callsign` is their current session identifier (aircraft callsign for + pilots, position callsign like `EGLL_TWR` for controllers) and only exists + while connected. diff --git a/.claude/skills/vatsim-apis/references/atc-bookings.md b/.claude/skills/vatsim-apis/references/atc-bookings.md new file mode 100644 index 00000000..dd9fe012 --- /dev/null +++ b/.claude/skills/vatsim-apis/references/atc-bookings.md @@ -0,0 +1,80 @@ +# ATC Bookings API + +Base URL: `https://atc-bookings.vatsim.net/api/` +Docs (interactive): https://atc-bookings.vatsim.net/api-doc +Auth: none for reads; Bearer token for writes + +This is a **separate service** from the vatsim.dev-documented APIs — it backs +https://atc-bookings.vatsim.net, the calendar controllers use to book ATC +positions in advance. It is *advisory only*: a booking is not an ATC-position +reservation guarantee, just a published schedule. + +## Read (public, no auth) + +### `GET /booking` +Returns all current bookings. + +```json +[ + { + "id": 1, + "callsign": "LON_CTR", + "cid": 1240411, + "type": "booking", + "start": "2022-02-12 12:00:00", + "end": "2022-02-12 14:00:00", + "division": "EUD", + "subdivision": "AMS" + } +] +``` + +### `GET /booking/{id}` +Returns a single booking by ID, same object shape as above. + +## Write (requires Bearer token) + +An API key/Bearer token is only issued to divisions, subdivisions, ARTCCs, or +vACCs that provide active ATC service — request one from the VATSIM Tech Team +via https://support.vatsim.net (must be submitted by staff responsible for +that facility's web presence). Send it as a standard `Authorization: Bearer +` header. + +### `POST /booking` +Create a booking. + +**Payload:** +```json +{ + "callsign": "LON_CTR", + "cid": 1240411, + "type": "booking", + "start": "2022-02-12 12:00:00", + "end": "2022-02-12 14:00:00", + "division": "EUD", + "subdivision": "AMS" +} +``` +**Responses:** `201` (created, returns the booking object incl. `id`), +`401` (unauthorized), `422` (validation errors). + +### `PUT /booking/{id}` +Update an existing booking. Same payload shape as `POST`. +**Responses:** `200` (updated, returns booking object), `401`, `404` (not +found), `422` (validation errors). + +### `DELETE /booking/{id}` +Delete a booking. +**Responses:** `200` on success, `401` if unauthorized. + +## Field notes + +- `type` — typically `"booking"`; other values may exist for training/exam + sessions depending on the facility's setup, confirm against a live sample + if building against a specific division's data. +- `division` / `subdivision` — VATSIM division/subdivision short codes (e.g. + `EUD`/`AMS` for VATSIM Europe / Amsterdam FIR). +- Timestamps are plain `YYYY-MM-DD HH:MM:SS` strings (not ISO 8601 with a `Z` + suffix like the other VATSIM APIs) — treat as UTC unless a facility + documents otherwise, and don't assume they'll parse with the same datetime + format string you use for Data/Events/Core API timestamps. diff --git a/.claude/skills/vatsim-apis/references/core-api.md b/.claude/skills/vatsim-apis/references/core-api.md new file mode 100644 index 00000000..fcce6a6e --- /dev/null +++ b/.claude/skills/vatsim-apis/references/core-api.md @@ -0,0 +1,63 @@ +# Core API + +Base URL: `https://api.vatsim.net/api/` +Auth: API key, required for most non-public endpoints +Docs: https://vatsim.dev/api/core-api + +This is the authenticated API for member data, ratings, org rosters, and ATC +history. The public can access anonymized data (no names/emails); divisions +and subdivisions can get a key with elevated access to their own members' +personal info and roster-management endpoints. Request a key via the VATSIM +Tech Team: https://support.vatsim.net/open.php?topicId=16 + +## Authentication + +Send your key in a header: +``` +X-API-Key: +``` +A legacy `LegacyAuth` scheme exists for backwards compatibility with API v1 +integrations — don't use it for new integrations, use `X-API-Key`. + +## Endpoint groups + +### members +- `GET /members/{cid}/flightplans` — a member's filed flight plans +- `GET /members/{cid}/history` (or similar `history_atc`/`history_pilot` + variants) — a member's previous pilot/ATC sessions +- Additional `members` sub-endpoints exist for ratings and profile info — + check https://vatsim.dev/api/core-api/members-api-retrieve-member-flightplans + for the current full list, since this group has grown over time. + +### community +- `GET /v2/members/discord/{discord_user_id}` — resolve a VATSIM CID from a + linked Discord user ID (requires the member to have linked Discord via + https://community.vatsim.net). Returns `{ "id": "", "user_id": "" }`, + or 404 with `{ "detail": "Not Found." }` if unlinked. + +### orgs +- `GET /orgs/{division}/roster` — list a division's members +- `GET /orgs/{division}/{subdivision}/roster` — list a subdivision's members +(Roster endpoints require a key scoped to that division/subdivision.) + +### atc +- `GET /v2/atc/online` — list all currently online controllers (mirrors the + Data API's `controllers[]`, but as an authenticated/versioned Core API + route with a richer per-session shape including the controller's active + flight plan reference structure `fp`). Fields: `id`, `callsign`, `start` + (date-time), `server`, `rating`, plus a nested `fp` object with keys like + `vatsim_id`, `flight_type`, `callsign`, `aircraft`, `dep`, `arr`, `alt`, + `altitude`, `route`, `rmks`, `filed`, etc. +- `GET /v2/atc/history` (or similarly named) — historical ATC sessions + +## Notes + +- The Core API is versioned (`v1` legacy, `v2` current) — prefer `v2` paths + for anything new. +- Public/anonymized reads (e.g. aggregate rating counts, public roster info) + may work without a key; anything returning a member's name, email, or + full session history will require one. +- If you're building a division/vACC website integration (e.g. a roster page, + ATC activity tracker, or training endorsement dashboard), this is the API + to use — don't try to scrape the Data API for that, it only has live + session data, not historical/administrative records. diff --git a/.claude/skills/vatsim-apis/references/data-api.md b/.claude/skills/vatsim-apis/references/data-api.md new file mode 100644 index 00000000..7f62c496 --- /dev/null +++ b/.claude/skills/vatsim-apis/references/data-api.md @@ -0,0 +1,92 @@ +# Data API + +Base URL: `https://data.vatsim.net/v3/` +Auth: none. Public. +Docs: https://vatsim.dev/api/data-api + +This is the real-time snapshot of everyone/everything currently on the network. +It's a static JSON file regenerated server-side roughly every 15 seconds — +treat it as a poll-and-cache target, not a streaming API. + +## Endpoints + +| Method | Path | Description | +|---|---|---| +| GET | `/vatsim-data.json` | Full live network data feed (pilots, controllers, ATIS, prefiles, servers, facilities, ratings) | +| GET | `/vatsim-servers.json` | List of live FSD (Flight Simulation Daemon) servers | +| GET | `/all-servers.json` | List of all FSD servers, including sweatbox/training servers | +| GET | `/sweatbox-servers.json` | List of sweatbox-only (training) servers | +| GET | `/transceivers-data.json` | Live radio transceiver data (used for e.g. VHF range/frequency tooling) | + +Always confirm current file names against `https://status.vatsim.net/status.json` +before hardcoding — VATSIM has changed these paths across major versions +(v2 → v3) before. + +## `GET /vatsim-data.json` — response schema + +Top-level object: + +- `general` — feed metadata + - `version` (int) — major version of the data feed + - `update_timestamp` (date-time) — when this feed was generated + - `connected_clients` (int) — total pilots + controllers + ATIS connected + - `unique_users` (int) — total unique users connected + - `reload`, `update` — deprecated, ignore +- `pilots[]` — connected pilots + - `cid` (int), `name` (string), `callsign` (string), `server` (string) + - `pilot_rating` (int), `military_rating` (int) + - `latitude`, `longitude` (number, deg), `altitude` (int, ft MSL) + - `groundspeed` (int, kts), `heading` (int, deg magnetic) + - `transponder` (string), `qnh_i_hg` (number), `qnh_mb` (int) + - `flight_plan` (object, absent if none filed): + - `flight_rules` (`I` or `V`), `aircraft`, `aircraft_faa`, `aircraft_short` + - `departure`, `arrival`, `alternate` (ICAO strings) + - `deptime`, `enroute_time`, `fuel_time` (strings) + - `remarks`, `route`, `revision_id`, `assigned_transponder` + - `logon_time` (date-time), `last_updated` (date-time) +- `controllers[]` — connected ATC positions + - `cid`, `name`, `callsign`, `frequency` (MHz string), `facility` (int, see `facilities[]`) + - `rating` (int, see `ratings[]`), `server`, `visual_range` (NM, int) + - `text_atis` (string[]) — controller info lines + - `last_updated`, `logon_time` +- `atis[]` — same shape as `controllers[]` plus `atis_code` (current phonetic + letter, e.g. `"I"`) +- `servers[]` — FSD servers + - `ident`, `hostname_or_ip`, `location`, `name` + - `client_connections_allowed` (bool), `is_sweatbox` (bool) +- `prefiles[]` — flight plans filed but not yet connected + - `cid`, `callsign`, `flight_plan` (same shape as pilots'), `last_updated` +- `facilities[]` — lookup table: `id` (int) → `short` (3-letter code, e.g. `TWR`, + `CTR`) → `long_name` +- `ratings[]` — controller rating lookup: `id` → `short_name` (e.g. `S1`, `C3`) → `long_name` +- `pilot_ratings[]` — pilot rating lookup: `id` → `short_name` → `long_name` +- `military_ratings[]` — military rating lookup, same shape + +### Example: filter to pilots inbound to a specific airport (pseudocode) +```php +$data = Http::get('https://data.vatsim.net/v3/vatsim-data.json')->json(); +$inbound = collect($data['pilots']) + ->filter(fn ($p) => data_get($p, 'flight_plan.arrival') === 'ENGM'); +``` + +### Example: find all online controllers at a facility +```php +$controllers = collect($data['controllers']) + ->filter(fn ($c) => str_starts_with($c['callsign'], 'ENGM')); +``` + +## `GET /vatsim-servers.json`, `/all-servers.json`, `/sweatbox-servers.json` + +Each returns an array of server objects shaped like the `servers[]` entries +above (`ident`, `hostname_or_ip`, `location`, `name`, +`client_connections_allowed`, `is_sweatbox`). Useful for building a "choose a +server" UI for a client, or for status dashboards. + +## `GET /transceivers-data.json` + +Live per-client transceiver (radio) data — frequency, position, and +transmit/receive flags for each connected client's radios. Primarily used by +tools that need to reason about VHF range/coverage (e.g. mapping who can +actually hear whom). Field-level shape can drift; fetch a live sample and +inspect it if you need this endpoint, since it's less commonly documented than +the main feed. diff --git a/.claude/skills/vatsim-apis/references/events-api.md b/.claude/skills/vatsim-apis/references/events-api.md new file mode 100644 index 00000000..6b20cd30 --- /dev/null +++ b/.claude/skills/vatsim-apis/references/events-api.md @@ -0,0 +1,115 @@ +# Events API + +Base URL: `https://my.vatsim.net/api/v2/` +Docs: https://vatsim.dev/api/events-api +Auth: none. Public, GET-only. + +Returns info about upcoming/current VATSIM events (group flights, controller +exams, VASOPS events) — who's organizing them, when, which airports/routes +are involved, and description/banner content for display. + +## Endpoints + +| Method | Path | Returns | +|---|---|---| +| GET | `/events/latest` | All current + upcoming events (most common one to poll) | +| GET | `/events/view/{id}` | A single event by its numeric ID | +| GET | `/events/view/division/{division}` | Events organized by a specific division (e.g. `SEA`) | +| GET | `/events/view/region/{region}` | Events organized by a specific region — same `view/` pattern as division, confirm exact param casing against a live call before shipping | +| GET | `/events/view/subdivision/{subdivision}` | Events organized by a specific subdivision — same `view/` pattern, confirm before shipping | + +The `region`/`subdivision` filter routes follow the same `/events/view//` +shape as the confirmed `division` route, but verify with a live request if +you're building against them — VATSIM's events routes have shifted before +(there's a legacy, deprecated `v1` at `my.vatsim.net/api/v1/events/all`; use +`v2` for anything new). + +## Response shape + +**List endpoints** (`/events/latest`, `/events/view/division/{division}`, etc.) +wrap results in a `data` array: +```json +{ + "data": [ + { + "id": 1, + "type": "Event", + "name": "Example Event", + "link": "https://my.vatsim.net/events/example-event", + "organisers": [ + { "region": "AMAS", "division": "USA", "subdivision": null, "organised_by_vatsim": false } + ], + "airports": [ { "icao": "KJFK" } ], + "routes": [ + { "departure": "KJFK", "arrival": "KATL", "route": "RBV Q430 BYRDD J48 MOL FLASK OZZZI1" } + ], + "start_time": "2026-08-01T00:00:00.000000Z", + "end_time": "2026-08-01T06:00:00.000000Z", + "short_description": "Fly with us tonight!", + "description": "Fly with us tonight! (full text, Markdown)", + "banner": "https://vatsim-my.nyc3.digitaloceanspaces.com/events/JpjoYKp6CRcz4V1wvdlMnQHiAtYOmT2p3DevEA7j.png" + } + ] +} +``` + +**Single-event endpoint** (`/events/view/{id}`) wraps the same object shape in +a `data` *object* instead of an array: +```json +{ "data": { "id": 1, "type": "Event", "...": "..." } } +``` +On failure it returns a `success`/`message` error object instead — check for a +`data` key before assuming success. + +### Field notes + +- `id` (int) — stable event ID, usable in `/events/view/{id}`. +- `type` (string) — one of `Event`, `Controller Examination`, `VASOPS Event`. +- `name` (string) — event title. +- `link` (string) — public myVATSIM event page URL. +- `organisers[]` — each entry has `region`, `division`, `subdivision` + (any of which may be `null` depending on scope) and `organised_by_vatsim` + (bool — true for network-wide official events). +- `airports[]` — `{ icao }` objects, one per airport tagged to the event. +- `routes[]` — `{ departure, arrival, route }`, prescribed routing for + group-flight style events; can be an empty array. +- `start_time` / `end_time` — ISO 8601 UTC timestamps with microsecond + precision (`...000000Z`). +- `short_description` / `description` — Markdown strings; `description` is + the full body, `short_description` a teaser — render both as Markdown, not + plain text. +- `banner` — full URL to a hosted banner image (DigitalOcean Spaces), or + absent/empty if the organiser didn't upload one — guard for that in UI code. + +## Practical notes for polling + +- No documented rate limit, but this endpoint isn't a real-time feed like the + Data API — events don't change second-to-second, so polling every few + minutes (or on page load) is more than enough. Don't put this in a tight + loop. +- The dataset can include far-future events; if you only want "what's on + soon", filter client-side on `start_time`/`end_time` after fetching rather + than assuming the API already limits by date range. +- `/events/latest` has had transient outages in the past (VATSIM tech team + fixed within hours) — build in basic retry/backoff and don't treat a + failed fetch as "no events." + +## Recipes + +**Fetch and filter to events at your home airport:** +```php +$events = collect(Http::get('https://my.vatsim.net/api/v2/events/latest')->json('data')); +$engmEvents = $events->filter( + fn ($e) => collect($e['airports'])->pluck('icao')->contains('ENGM') +); +``` + +**Fetch a single event by ID for a detail page:** +```php +$event = Http::get("https://my.vatsim.net/api/v2/events/view/{$id}")->json('data'); +``` + +**Fetch everything organized by your division:** +```php +$events = Http::get('https://my.vatsim.net/api/v2/events/view/division/SEA')->json('data'); +``` diff --git a/.claude/skills/vatsim-apis/references/metar-slurper.md b/.claude/skills/vatsim-apis/references/metar-slurper.md new file mode 100644 index 00000000..2135f2c2 --- /dev/null +++ b/.claude/skills/vatsim-apis/references/metar-slurper.md @@ -0,0 +1,78 @@ +# METAR API, Slurper API + +Both are public, unauthenticated, GET-only. (Looking for the Events API? See +`references/events-api.md` — it has its own file since it's used heavily.) + +--- + +## METAR API + +Base URL: `https://metar.vatsim.net/` +Docs: https://vatsim.dev/api/metar-api + +### `GET /:icao` + +Returns current METAR(s) for the requested airport(s). + +**Path parameter** `icao` (required) — one or more ICAO codes, comma-delimited. +Special cases: +- A single code (e.g. `EGLL`) → that airport's METAR. +- Comma-delimited list (e.g. `EGLL,KJFK,ENGM`) → METARs for each, newline-delimited. +- `all` → METARs for every airport VATSIM currently has data for. +- Any string of **3 characters or fewer** is treated as a prefix wildcard — + e.g. `EN` returns METARs for every airport starting with `EN` (all Norwegian + ICAOs), `K` returns every US airport. + +**Query parameter** `format` (optional) — `text` (default) or `json`. + +**Responses:** +- `format=text` (default): `text/plain`, one raw METAR string per line, e.g. + `EGLL 021450Z 24012KT 9999 FEW035 18/11 Q1015 NOSIG` +- `format=json`: `application/json` array of `{ "id": "", "metar": "" }` + +``` +GET https://metar.vatsim.net/EGLL +GET https://metar.vatsim.net/EGLL,KJFK +GET https://metar.vatsim.net/ENG # wildcard: all ENG* airports +GET https://metar.vatsim.net/all +GET https://metar.vatsim.net/EGLL?format=json +``` + +Note: `metar.vatsim.net/all` and `metar.vatsim.net/` (the URLs the user +already knows) are the same public endpoint described by this documented API — +there's no separate "undocumented" version, it's just not always linked +prominently from the main API index. + +--- + +## Slurper API + +Base URL: `https://slurper.vatsim.net/` +Docs: https://vatsim.dev/api/slurper-api + +Originally built for Audio for VATSIM (AFV) clients to resolve a member's +current connection/position; still useful for anything that needs a quick +"is this CID online, and where" lookup without parsing the full Data API feed. + +### `GET /users/info` + +**Query parameter** `cid` (required, int) — VATSIM ID to look up. + +``` +GET https://slurper.vatsim.net/users/info?cid=1234567 +``` + +**Response**: `text/plain` CSV (not JSON), one line per active connection for +that CID, fields in order: +1. VATSIM ID +2. Callsign +3. Facility type — `pilot` or `atc` +4. Frequency (empty for pilots) +5. Visual range (empty for pilots) +6. Latitude +7. Longitude +8. Secondary positions — four-or-more lat/lon pairs if the controller has set + a multi-point coverage area +9. Trailing comma + +Empty response body means the CID is not currently connected. diff --git a/.dockerignore b/.dockerignore index 05192d6c..320c7730 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,18 @@ node_modules vendor public/build +public/hot storage/logs +storage/*.key +.env +.env.* +!.env.example +auth.json .git +.github +.claude +graphify-out +tests +.phpunit.cache +.phpunit.result.cache +*.md \ No newline at end of file diff --git a/.env.example b/.env.example index 598054a7..3c35e863 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,7 @@ APP_URL=https://where2fly.today APP_ENV=production APP_DEBUG=false +APP_KEY= APP_AIRLABS_KEY= APP_FSADDONCOMPARE_KEY= diff --git a/.github/actions/setup-dependencies/action.yaml b/.github/actions/setup-dependencies/action.yaml index 73ae58ff..557742ec 100644 --- a/.github/actions/setup-dependencies/action.yaml +++ b/.github/actions/setup-dependencies/action.yaml @@ -37,6 +37,7 @@ runs: if: inputs.setup-node == 'true' uses: actions/setup-node@v4 with: + node-version: '22' cache: 'npm' cache-dependency-path: ${{ inputs.path }} diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5ef8969b..237925b8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,14 +5,81 @@ on: push: paths-ignore: - "**.md" + pull_request: + paths-ignore: + - "**.md" env: IMAGE_NAME: blt950/where2fly jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup dependencies + uses: ./.github/actions/setup-dependencies + with: + path: "." + + - name: Check formatting + run: ./vendor/bin/pint --test + + tests: + name: PHPUnit + runs-on: ubuntu-latest + needs: lint + + services: + mysql: + image: mysql:8 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: where2fly_test + ports: + - 3306:3306 + options: >- + --health-cmd="mysqladmin ping --silent" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup dependencies + uses: ./.github/actions/setup-dependencies + with: + path: "." + setup-node: "true" + + - name: Build frontend assets + run: npm run build + + - name: Copy environment file + run: cp .env.example .env + + - name: Generate app key + run: php artisan key:generate + + - name: Run tests + run: php artisan test + env: + DB_HOST: 127.0.0.1 + DB_PORT: 3306 + DB_DATABASE: where2fly_test + DB_USERNAME: root + DB_PASSWORD: root + build-container: name: Build Container runs-on: ubuntu-latest + needs: tests + if: github.event_name == 'push' steps: - name: configure docker buildx uses: docker/setup-buildx-action@v3 diff --git a/.github/workflows/linting.yaml b/.github/workflows/linting.yaml index 917f2779..d3193337 100644 --- a/.github/workflows/linting.yaml +++ b/.github/workflows/linting.yaml @@ -1,8 +1,7 @@ --- name: Linting -on: - push: +on: {} # Superseded by ci.yaml jobs: lint-formatting: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 00000000..c081d3fd --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,51 @@ +--- +name: "Tests" + +on: {} # Superseded by ci.yaml + +jobs: + tests: + name: PHPUnit + runs-on: ubuntu-latest + + services: + mysql: + image: mysql:8 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: where2fly_test + ports: + - 3306:3306 + options: >- + --health-cmd="mysqladmin ping --silent" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup dependencies + uses: ./.github/actions/setup-dependencies + with: + path: "." + setup-node: "true" + + - name: Build frontend assets + run: npm run build + + - name: Copy environment file + run: cp .env.example .env + + - name: Generate app key + run: php artisan key:generate + + - name: Run tests + run: php artisan test + env: + DB_HOST: 127.0.0.1 + DB_PORT: 3306 + DB_DATABASE: where2fly_test + DB_USERNAME: root + DB_PASSWORD: root diff --git a/.gitignore b/.gitignore index 43cbe0e9..d139c46a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,11 @@ yarn-error.log /.vscode apache/* .DS_Store +graphify-out/cache +graphify-out/graph.html +graphify-out/manifest.json +graphify-out/.* +graphify-out/cost.json /resources/fonts/fa-brands-400.ttf /resources/fonts/fa-brands-400.woff2 @@ -52,4 +57,6 @@ apache/* /resources/fonts/fa-sharp-thin-100.ttf /resources/fonts/fa-sharp-thin-100.woff2 /resources/fonts/fa-v4compatibility.ttf -/resources/fonts/fa-v4compatibility.woff2 \ No newline at end of file +/resources/fonts/fa-v4compatibility.woff2 +.phpunit.cache/test-results +.abacusai/config.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..b77f1e3a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,50 @@ +# Where2Fly + +Flight destination finder: given a departure or arrival airport, suggests nearby destinations filtered/scored by weather (METAR) and VATSIM network activity. + +## Tech stack + +- **Backend:** Laravel 13, PHP ^8.2, MySQL 8.4 (Oracle client, see Dockerfile), Sentry, `laravel-eloquent-spatial` for geo queries. +- **Frontend:** Blade + React 19 for the interactive map canvas only (`resources/js/components/map`) — the rest of the UI is server-rendered Blade/JS/SCSS. +- **Frontend layout:** `resources/js/components/{map,context,ui,utils}`, `resources/js/functions`. + +Consult the `laravel-13` skill for Laravel 13-specific API/behavior questions (post-dates training data), and the `run-where2fly` skill to build/run the app, take screenshots, or run the PHP test suite. + +## Codebase navigation + +This repo has a `graphify` knowledge graph checked into `graphify-out/` (`graph.json`, `GRAPH_REPORT.md`, `graph.html`). Before a broad grep/explore sweep to understand architecture or cross-file relationships, check `graphify-out/GRAPH_REPORT.md` (god nodes, communities, surprising connections) or run `graphify query ""` — it's usually cheaper than re-deriving structure from scratch. Requires the `graphifyy` package on `PATH`/`python3` (`pip install graphifyy` or `uv tool install graphifyy`); if it's not installed and can't be, skip straight to normal grep/Explore rather than stalling on setup. The graph can go stale as the repo changes — run `graphify update /app` (the code-only subcommand, no LLM key needed) after a burst of commits if answers look off; the `graphify /app --update` flag form instead triggers full semantic extraction, demands an LLM API key and chokes on the repo's ~1,300 images. Treat the graph as a shortcut, not ground truth over reading the actual files. + +## Architecture: scoring & search + +**Data ingestion** (`update:data` at `:05`/`:35` in `routes/console.php` → `fetch:metars`, `fetch:tafs`, `fetch:vatsim`; `fetch:bookings` separately every 30 min): METARs and TAFs come from the aviationweather.gov bulk cache files (`{metars,tafs}.cache.xml.gz` — download, gunzip, parse, delete; see `AviationWeatherHelper`), never per-airport API calls. Stored METAR text starts at the time group (`040720Z ...`) — the report-type token and station id are stripped on ingest. TAFs are two tables: `tafs` (one row per airport — the document's raw text, `issued_at` for change detection, validity) and `taf_forecasts` (one row per period, structured fields, ceiling pre-computed to a plain `ceiling_ft_agl` int — no JSON; `TafForecast` mirrors `Metar`'s condition-method names). `bookings` stores the next 24h of VATSIM ATC bookings (primary key = the API's own booking id, no local auto-increment) resolved to airports via `AirportCallsignHelper::resolveIcao()` (shared with `fetch:vatsim`; unresolvable/CTR/FSS/ATIS positions are dropped, never stored with a null FK). + +**Scoring**: every `airport_scores` row is a tagged event (`reason`) carrying a confidence weight (`score` decimal: 1.00 for certain signals, less for uncertain TAF periods — `AirportScore::forecastWeight()`: TEMPO 0.7, PROB40 0.5, PROB30 0.3, PROBnn TEMPO slightly below the bare PROB), a validity window (`valid_from`/`valid_to`) and a `source` (`metar`, `taf`, `vatsim`, `event`, `booking`, `logon_estimate`). **Each fetch command owns its sources** and deletes+rebuilds only those on each run: `fetch:metars` → `metar` (incl. runway-dependent `METAR_RVR`/`METAR_CROSSWIND`), `fetch:vatsim` → `vatsim`/`event`/`logon_estimate` (plus `VATSIM_POPULAR` from the pilots section of the same vatsim-data.json download), `fetch:bookings` → `booking`, and `fetch:tafs` maintains `taf` rows incrementally (only when a TAF's `issued_at` advances). There is no separate calc command. Adding a new score signal means picking a `source` tag, a window, and which fetch command owns its rebuild — don't reintroduce a blind full truncate. Bookings and logon-estimates materialize *predicted* `VATSIM_ATC` rows (events only produce `VATSIM_EVENT` — an event alone doesn't assert ATC presence); the shared weather-reason checks live in `WeatherScoreHelper::reasons()` (works on `Metar` or `TafForecast`). **All** TAF periods score, including bare TEMPO — TEMPO/PROB rows carry `probability`/`tempo` in `data` (badge + tooltip line) and a `score` weight below 1, which fades the icon to 50% (`score-uncertain`). + +**ETA matching**: score lookups are time-scoped. `AirportScore::coversEta()` (SQL) is the single definition — exact window containment for `metar`/`taf`/`vatsim`/`logon_estimate`, ±1h overlap (`OVERLAP_MATCH_HOURS`) for the scheduled-presence signals `booking`/`event` (a booking starting shortly after the ETA still shows so the pilot can adjust their flight time), and a METAR-fallback branch (a `metar` row matches regardless of window when no TAF period covers the ETA). Online-controller semantics: the live `vatsim` row covers "now" views for as long as they're online; forecasts predict an unbooked controller present strictly until `logon + 2h` (`logon_estimate` — a session already past 2h yields a never-matching window on purpose). Its `$metarOnlyWeather` mode (departure candidates) ignores TAF rows entirely and always trusts the current METAR. It has a PHP twin, `coversEtaAt()`/`Airport::scoresAtEta()`, used to filter loaded collections per candidate — **keep the two in sync when changing matching rules**. Search binds a per-candidate ETA computed inside SQL (`CalculationHelper::forecastEtaSql()`, distance-derived) — but **only when the candidates are arrivals**; departure suggestions are evaluated at `now()` (the pilot leaves there soon, so the current METAR applies and `forecastSource` is `metar`). "Now" views also pass `now()`. Rankings (`sortByScores`) sum each reason's single best weight (a `MAX(CASE WHEN reason = ? …)` pivot — several sources can assert the same reason, and a certain row beats an uncertain TAF row for the same reason, never adds to it); rendering dedupes via `Airport::displayScores()` (same best-weight-first preference) and each icon (tooltip lines, uncertainty badge, facility dots) renders through the `App\View\Components\ScoreIcon` component — view logic belongs there, not in `@php` blocks. + +**Search** (`app/Http/Controllers/API/SearchController.php`): validates a large filter payload (departure/arrival, destination continents/countries/states, aircraft codeletter, airtime range, score filters, runway/lights/airbase/size filters, temperature/elevation/runway-length ranges, arrival whitelist, limit) → resolves the anchor `Airport` → chains Eloquent query scopes defined directly on `App\Models\Airport` (`airportOpen`, `notIcao`, `isAirportSize`, `inContinent`/`inCountry`/`inState`, `withinDistance`/`withinBearing`, `filterRunwayLengths`, `filterRunwayLights`, `filterAirbases`, `filterByScores`, `filterRoutesAndAirlines`, `returnOnlyWhitelistedIcao`, `sortByScores`) → shuffles within score-count buckets and takes 20 → applies a `filterWithCriteria` collection macro for weather/temp/elevation post-filtering (which also narrows each candidate's loaded scores to its ETA and sets `forecast_source`) → returns `AirportResource`/`SuggestedAirportResource`. + +Most domain logic lives as query scopes on `Airport` (large file) plus `CalculationHelper` (aircraft range/bearing math). When extending search/scoring, prefer adding a new scope on `Airport` (or a new reason in the owning fetch command) over introducing a parallel filtering path. + +## Console commands: hard-won gotchas + +- **Memory**: PHP `memory_limit` is 256MB and `update:data` runs all fetch commands **in one process** (`$this->call()`). `Airport::all()` materializes ~80k full models (~220MB) — for icao→id lookup maps always `Airport::select('id', 'icao', ...)`. A command that passes standalone can still OOM composed; after touching any of these commands, verify with a full `php artisan update:data` run, not just the single command. +- **Bulk writes**: chunk `insert`/`upsert` payloads (`array_chunk(..., 500)`) — MySQL's prepared-statement placeholder limit (~65k) is easy to blow with thousands of rows × several columns. +- **Carbon 3**: singular units take no argument — `addHour(1)` is invalid, use `addHours($n)`. +- **AWC cache quirks** (encoded in `FetchMetars`/`FetchTafs`/`Taf` and their tests — read those before "fixing" parsing): `wind_dir_degrees` can be the literal `VRB`; both `METAR` and `SPECI` rows are valid observations; TAF sky cover uses `OVX` for obscured sky; visibility can be `6+`/`10+` ("at or above"); TAF amendment detection must key off `issue_time`, not `bulletin_time`. + +## Testing + +- PHPUnit only (`phpunit.xml`), suites: `tests/Unit`, `tests/Feature`. +- Tests run against a real MySQL database (`DB_DATABASE=where2fly_test`) — there's no sqlite/in-memory fallback, so a MySQL instance must be available. +- Use the `phpunit` to test the app. Invoke the `run-where2fly` where the unit test doesn't cover the case. +- `TestAirportSeeder` seeds `airport_scores` rows with deliberately wide validity windows (now−1h → now+30h) so filter/sort tests aren't sensitive to ETA windowing; tests that exercise the windowing itself (`ScorePredictionTest`) seed their own rows. New `airport_scores` fixtures must set `source`/`valid_from`/`valid_to` — they're NOT NULL. +- A schema/seeder error makes the suite crawl (~15 min instead of ~10s: every failing test re-runs `migrate:fresh`) — if tests suddenly take forever, suspect the seeder before the tests. + +## Code style + +- Formatter is Laravel Pint (`pint.json`, `laravel` preset + a few custom rules). Run `./vendor/bin/pint` (or via the dev container) before committing PHP changes — don't hand-format to match the preset from memory. + +## Migrations + +- Keep the existing convention: one timestamped file per schema change, descriptive snake_case name (e.g. `add_feedback_votes_table`, `index_runways`), placed in `database/migrations/`. Don't bundle unrelated schema changes into a single migration. diff --git a/Dockerfile b/Dockerfile index b7c4ede6..db4b6f8c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Intermediate build container for front-end resources -FROM docker.io/library/node:25.8-alpine AS frontend +FROM docker.io/library/node:26.5-alpine AS frontend # Easy to prune intermediary containers LABEL stage=build @@ -11,7 +11,7 @@ RUN npm ci --omit dev && \ #################################################################################################### # Primary container -FROM docker.io/library/php:8.3.30-apache-trixie +FROM docker.io/library/php:8.5.8-apache-trixie # Default container port for the apache configuration EXPOSE 80 443 @@ -34,7 +34,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* # Install Oracle MySQL Client -ARG MYSQL_CLIENT_VERSION=8.4.2 +ARG MYSQL_CLIENT_VERSION=8.4.9 RUN set -eux; \ curl -fsSL "https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-${MYSQL_CLIENT_VERSION}-linux-glibc2.28-x86_64.tar.xz" -o /tmp/mysql-client.tar.xz; \ tar -xf /tmp/mysql-client.tar.xz -C /usr/local; \ @@ -54,8 +54,8 @@ COPY ./container/configs/apache.conf /etc/apache2/apache2.conf COPY ./container/configs/php.ini /usr/local/etc/php/php.ini # Install PHP extension(s) -COPY --from=mlocati/php-extension-installer:2.10.6 /usr/bin/install-php-extensions /usr/local/bin/ -RUN install-php-extensions pdo_mysql zip opcache +COPY --from=mlocati/php-extension-installer:2.11.12 /usr/bin/install-php-extensions /usr/local/bin/ +RUN install-php-extensions pdo_mysql zip opcache intl # Install composer COPY --from=docker.io/library/composer:latest /usr/bin/composer /usr/bin/composer @@ -66,9 +66,21 @@ COPY --from=frontend --chown=www-data:www-data /app/public/ /app/public/ WORKDIR /app RUN composer install --no-dev --no-interaction --prefer-dist -RUN mkdir -p /app/storage/logs/ + +# Normalise ownership/permissions of the writable trees before we drop into the service process. +RUN mkdir -p \ + /app/storage/logs \ + /app/storage/app/tmp \ + /app/storage/app/backup-temp \ + /app/storage/framework/cache \ + /app/storage/framework/sessions \ + /app/storage/framework/views \ + /app/bootstrap/cache && \ + chown -R www-data:www-data /app/storage /app/bootstrap/cache && \ + chmod -R g+w /app/storage /app/bootstrap/cache # Wrap around the default PHP entrypoint with a custom entrypoint COPY ./container/entrypoint.sh /usr/local/bin/service-entrypoint +RUN chmod +x /usr/local/bin/service-entrypoint ENTRYPOINT [ "service-entrypoint" ] CMD ["apache2-foreground"] diff --git a/app/Console/Commands/AccountClearUnverified.php b/app/Console/Commands/AccountClearUnverified.php index f7783c11..1db7bf74 100644 --- a/app/Console/Commands/AccountClearUnverified.php +++ b/app/Console/Commands/AccountClearUnverified.php @@ -27,7 +27,7 @@ class AccountClearUnverified extends Command public function handle() { // Delete users who haven't verified their email address for 7 days - $users = User::where('email_verified_at', null) + $users = User::whereNull('email_verified_at') ->where('created_at', '<', now()->subDays(7)) ->get(); diff --git a/app/Console/Commands/CalcScores.php b/app/Console/Commands/CalcScores.php deleted file mode 100644 index 61364cd0..00000000 --- a/app/Console/Commands/CalcScores.php +++ /dev/null @@ -1,189 +0,0 @@ -info('Starting calculations of aerodrome scores'); - - // Fetch VATSIM data - $vatsimRequest = Http::get('https://data.vatsim.net/v3/vatsim-data.json'); - $vatsimPilots = null; - if ($vatsimRequest->successful()) { - $vatsimPilots = json_decode($vatsimRequest->body(), false)->pilots; - } - - // Grab relevant aerodromes for calculations - $airports = Airport::where('type', '!=', 'closed')->has('metar')->with('metar', 'runways', 'controllers', 'events')->get(); - - $airportScoreInsert = []; - foreach ($airports as $airport) { - - // Skip airport with old metars - if (Carbon::now()->gt(Carbon::parse($airport->metar->last_update)->addHour(1))) { - continue; - } - - if ($airport->metar->windAtAbove(15)) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_WINDY', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->windGusts()) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_GUSTS', 'score' => 1, 'data' => null]; - } - - $activeRunwayComponents = ['headwind' => 0, 'crosswind' => 0]; - $airportScoreRVRInserted = false; - foreach ($airport->runways->where('closed', false) as $runway) { - // Check RVR at runways - if ( - $airportScoreRVRInserted == false && - ((! empty($runway->le_ident) && $airport->metar->rvrAtBelow($runway->le_ident, 700)) || - (! empty($runway->he_ident) && $airport->metar->rvrAtBelow($runway->he_ident, 700))) - ) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_RVR', 'score' => 1, 'data' => null]; - $airportScoreRVRInserted = true; - } - - // Calculate headwind component on active runway - if (! empty($airport->metar->wind_direction)) { - - // Fallback to varchar runway identifier if heading is not present in data, which is common. - if (empty($runway->le_heading) && ! empty($runway->le_ident)) { - $runway->le_heading = rwyIdentToHeading($runway->le_ident); - } - - if (empty($runway->he_heading) && ! empty($runway->he_ident)) { - $runway->he_heading = rwyIdentToHeading($runway->he_ident); - } - - // Set the components - $headwindComponentLe = abs($airport->metar->wind_speed * cos(($airport->metar->wind_direction - $runway->le_heading) / 180 * 3.14)); - $crosswindComponentLe = abs($airport->metar->wind_speed * sin(($airport->metar->wind_direction - $runway->le_heading) / 180 * pi())); - - $headwindComponentHe = abs($airport->metar->wind_speed * cos(($airport->metar->wind_direction - $runway->he_heading) / 180 * 3.14)); - $crosswindComponentHe = abs($airport->metar->wind_speed * sin(($airport->metar->wind_direction - $runway->he_heading) / 180 * pi())); - - if ($activeRunwayComponents['headwind'] < $headwindComponentLe) { - $activeRunwayComponents['headwind'] = $headwindComponentLe; - $activeRunwayComponents['crosswind'] = $crosswindComponentLe; - } elseif ($activeRunwayComponents['headwind'] < $headwindComponentHe) { - $activeRunwayComponents['headwind'] = $headwindComponentHe; - $activeRunwayComponents['crosswind'] = $crosswindComponentHe; - } - } - } - - // Check if crosswind component is fun at active runway - if ($airport->metar->wind_speed >= 15 && $activeRunwayComponents['crosswind'] > 12) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_CROSSWIND', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->sightBelow(5000)) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_SIGHT', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->ceilingAtAbove(300)) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_CEILING', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->foggy()) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_FOGGY', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->heavyRain()) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_HEAVY_RAIN', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->heavySnow()) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_HEAVY_SNOW', 'score' => 1, 'data' => null]; - } - - if ($airport->metar->thunderstorm()) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'METAR_THUNDERSTORM', 'score' => 1, 'data' => null]; - } - - // Check VATSIM controllers - if ($airport->controllers->count()) { - - $stations = collect(); - foreach ($airport->controllers->pluck('callsign') as $cs) { - $r = substr($cs, -3); - if ($r != 'OBS') { - $stations[$r] = true; - } - } - - $referenceOrder = ['DEL', 'GND', 'TWR', 'APP', 'CTR']; - $stations = $stations->keys()->sort(function ($a, $b) use ($referenceOrder) { - $aSearch = array_search($a, $referenceOrder); - $bSearch = array_search($b, $referenceOrder); - - return $aSearch - $bSearch; - }); - - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'VATSIM_ATC', 'score' => 1, 'data' => $stations->join(', ')]; - } - - // Check if many pilots are departing this airport - if ($vatsimPilots) { - $movements = 0; - foreach ($vatsimPilots as $vp) { - if (distance($airport->latitude_deg, $airport->longitude_deg, $vp->latitude, $vp->longitude, 'N') <= 5) { - $movements++; - } - } - - if ($movements >= 10) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'VATSIM_POPULAR', 'score' => 1, 'data' => null]; - - } - } - - // Check if ongoing VATSIM event - foreach ($airport->events as $event) { - if (Carbon::now()->gt($event->start_time) && Carbon::now()->lt($event->end_time)) { - $airportScoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'VATSIM_EVENT', 'score' => 1, 'data' => $event->event . ' until ' . Carbon::parse($event->end_time)->format('H:i\z')]; - - } - } - - } - - AirportScore::truncate(); - AirportScore::insert($airportScoreInsert); - - $this->info('Calculations of ' . $airports->count() . ' aerodromes finished in ' . round(microtime(true) - $processTime) . ' seconds'); - - } -} diff --git a/app/Console/Commands/CreateApiKey.php b/app/Console/Commands/CreateApiKey.php index 6bc00266..f117c6f3 100644 --- a/app/Console/Commands/CreateApiKey.php +++ b/app/Console/Commands/CreateApiKey.php @@ -4,7 +4,7 @@ use App\Models\ApiKey; use Illuminate\Console\Command; -use Ramsey\Uuid\Uuid; +use Illuminate\Support\Str; class CreateApiKey extends Command { @@ -33,7 +33,7 @@ public function handle() $ip = $this->ask('Which IP address can use this key?'); // Generate key - $secret = Uuid::uuid4(); + $secret = Str::uuid(); ApiKey::create([ 'key' => $secret, 'name' => $name, diff --git a/app/Console/Commands/EnrichAirports.php b/app/Console/Commands/EnrichAirports.php index e21f03f2..0a236106 100644 --- a/app/Console/Commands/EnrichAirports.php +++ b/app/Console/Commands/EnrichAirports.php @@ -4,6 +4,7 @@ use App\Models\Airport; use Illuminate\Console\Command; +use Illuminate\Support\Facades\DB; class EnrichAirports extends Command { @@ -30,15 +31,13 @@ public function handle() { $processTime = microtime(true); - $count = 0; - $this->info('> Enriching airports with additional data...'); // Create booleans of airports that has airline service - $airlineQuery = Airport::where('scheduled_service', 'yes')->update(['w2f_scheduled_service' => true]); + Airport::where('scheduled_service', 'yes')->update(['w2f_scheduled_service' => true]); // Create booleans of airports that is an airforce base - $airforceAirports = Airport::where('name', 'like', '% RAF %') + Airport::where('name', 'like', '% RAF %') ->orWhere('name', 'like', 'RAF %') ->orWhere('name', 'like', '%Air Base%') ->orWhere('name', 'like', '%airbase%') @@ -54,9 +53,9 @@ public function handle() ->update(['w2f_airforcebase' => true]); // Transfer the gps_code to icao to make sure newest icao codes are used by default - $gpsCodeToIcao = Airport::where('gps_code', '!=', '') + Airport::where('gps_code', '!=', '') ->whereColumn('gps_code', '!=', 'icao') - ->update(['icao' => \DB::raw('gps_code')]); + ->update(['icao' => DB::raw('gps_code')]); // Set the airport as closed if no runways are open Airport::query()->update(['w2f_has_open_runway' => false]); diff --git a/app/Console/Commands/FetchBookings.php b/app/Console/Commands/FetchBookings.php new file mode 100644 index 00000000..8cd3119b --- /dev/null +++ b/app/Console/Commands/FetchBookings.php @@ -0,0 +1,128 @@ +info('Fetching VATSIM ATC bookings'); + + $response = Http::timeout(60)->retry(3, 1000)->get('https://atc-bookings.vatsim.net/api/booking'); + if (! $response->successful()) { + $this->error('Fetching of bookings failed with HTTP ' . $response->status()); + + return Command::FAILURE; + } + + // Only the id is used from these maps — don't load full models for all airports + $airportsByIcao = Airport::select('id', 'icao', 'local_code')->get()->keyBy('icao'); + $airportsByLocalCode = $airportsByIcao->filter(fn ($airport) => ! empty($airport->local_code))->keyBy('local_code'); + + $upsertData = []; + $seenBookingIds = []; + $horizon = now()->addHours(24); + foreach ($response->object() as $booking) { + + // The API returns naive datetimes with no offset — they are UTC + $start = Carbon::parse($booking->start, 'UTC'); + $end = Carbon::parse($booking->end, 'UTC'); + + // Only store the next 24 hours of bookings, matching the practical horizon of a search's ETA + if ($start->gt($horizon) || $end->lte(now())) { + continue; + } + + // A booking that can't be resolved to exactly one airport is dropped + $icao = AirportCallsignHelper::resolveIcao($booking->callsign); + $airport = $icao ? ($airportsByIcao[$icao] ?? $airportsByLocalCode[$icao] ?? null) : null; + if (! $airport) { + continue; + } + + $seenBookingIds[] = $booking->id; + $upsertData[] = [ + 'vatsim_booking_id' => $booking->id, + 'callsign' => $booking->callsign, + 'airport_id' => $airport->id, + 'division' => $booking->division ?? null, + 'subdivision' => $booking->subdivision ?? null, + 'start' => $start, + 'end' => $end, + 'last_synced_at' => now(), + ]; + } + + foreach (array_chunk($upsertData, 500) as $chunk) { + Booking::upsert( + $chunk, + ['vatsim_booking_id'], + ['callsign', 'airport_id', 'division', 'subdivision', 'start', 'end', 'last_synced_at'] + ); + } + + // Remove bookings that were cancelled upstream or have already ended + Booking::whereNotIn('vatsim_booking_id', $seenBookingIds)->orWhere('end', '<', now())->delete(); + + $this->scoreBookings(); + + $this->info('Fetching and scoring of ' . count($upsertData) . ' bookings finished in ' . round(microtime(true) - $processTime) . ' seconds'); + + } + + /** + * Rebuild the booking-sourced predicted VATSIM_ATC scores — this command + * owns the `booking` source. + */ + private function scoreBookings(): void + { + $scoreInsert = []; + $bookings = Booking::whereHas('airport', fn ($query) => $query->where('type', '!=', 'closed')->whereHas('metar'))->get(); + + foreach ($bookings as $booking) { + $scoreInsert[] = [ + 'airport_id' => $booking->airport_id, + 'reason' => 'VATSIM_ATC', + 'score' => 1, + 'data' => json_encode(['callsign' => $booking->callsign, 'facility' => AirportCallsignHelper::facility($booking->callsign)]), + 'source' => AirportScore::SOURCE_BOOKING, + 'valid_from' => $booking->start, + 'valid_to' => $booking->end, + ]; + } + + AirportScore::where('source', AirportScore::SOURCE_BOOKING)->delete(); + foreach (array_chunk($scoreInsert, 500) as $chunk) { + AirportScore::insert($chunk); + } + } +} diff --git a/app/Console/Commands/FetchFlights.php b/app/Console/Commands/FetchFlights.php index d4dee095..95c47406 100644 --- a/app/Console/Commands/FetchFlights.php +++ b/app/Console/Commands/FetchFlights.php @@ -4,7 +4,6 @@ use App\Models\Flight; use Illuminate\Console\Command; -use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Http; class FetchFlights extends Command @@ -39,7 +38,7 @@ public function handle() $response = Http::timeout(60)->retry(3, 1000)->get('https://airlabs.co/api/v9/flights?api_key=' . $apiKey); if ($response->successful()) { - $flights = collect(json_decode($response->body(), false)->response); + $flights = collect($response->object()->response); $upsertData = []; foreach ($flights as $flight) { @@ -60,7 +59,6 @@ public function handle() continue; } - isset($flight->reg_number) ? $regNumber = $flight->reg_number : $regNumber = null; $upsertData[] = [ 'airline_icao' => $flight->airline_icao, 'airline_iata' => $flight->airline_iata, @@ -69,7 +67,7 @@ public function handle() 'dep_icao' => $flight->dep_icao, 'arr_icao' => $flight->arr_icao, 'last_aircraft_icao' => $flight->aircraft_icao, - 'reg_number' => $regNumber, + 'reg_number' => $flight->reg_number, 'last_seen_at' => now(), 'lock_counter' => false, ]; @@ -105,7 +103,7 @@ public function handle() Flight::where('last_seen_at', '<', now()->subHours(6))->where('lock_counter', false)->update(['seen_counter' => \DB::raw('seen_counter + 1'), 'lock_counter' => true]); // Enrich the flights with aircraft types - Artisan::call('enrich:flights'); + $this->call('enrich:flights'); } else { $this->error('Failed to fetch flights. API response not successful.'); diff --git a/app/Console/Commands/FetchGithubIssues.php b/app/Console/Commands/FetchGithubIssues.php index db2e1e4a..a9360b51 100644 --- a/app/Console/Commands/FetchGithubIssues.php +++ b/app/Console/Commands/FetchGithubIssues.php @@ -37,6 +37,6 @@ public function handle() $this->info("No new issues. Highest issue: #{$highestFetched}"); } - $this->info('Fetched ' . count($data) . ' issues.'); + $this->info('Fetched ' . $data->count() . ' issues.'); } } diff --git a/app/Console/Commands/FetchMetars.php b/app/Console/Commands/FetchMetars.php index 486e9564..2085fe0f 100644 --- a/app/Console/Commands/FetchMetars.php +++ b/app/Console/Commands/FetchMetars.php @@ -2,14 +2,23 @@ namespace App\Console\Commands; +use App\Helpers\AviationWeatherHelper; +use App\Helpers\WeatherScoreHelper; use App\Models\Airport; +use App\Models\AirportScore; use App\Models\Metar; use Carbon\Carbon; use Illuminate\Console\Command; -use Illuminate\Support\Facades\Http; +use SimpleXMLElement; +use XMLReader; class FetchMetars extends Command { + /** + * How long an observation stays valid — also the staleness cutoff for scoring. + */ + private const METAR_VALIDITY_HOURS = 1; + /** * The name and signature of the console command. * @@ -22,7 +31,7 @@ class FetchMetars extends Command * * @var string */ - protected $description = 'Fetch all latest METARs from VATSIM'; + protected $description = 'Fetch all latest METARs from the aviationweather.gov bulk cache'; /** * Execute the console command. @@ -35,85 +44,169 @@ public function handle() $processTime = microtime(true); $this->info("Starting fetching of METAR's"); - $response = Http::timeout(60)->retry(3, 1000)->get('https://metar.vatsim.net?id=all'); - if ($response->successful()) { - $data = collect(preg_split("/\r\n|\n|\r/", $response->body())); - - // Fetch all airports - $airportsFilter = []; - $airportsData = []; - foreach ($data as $d) { - $icao = substr($d, 0, 4); - $airportsFilter[] = $icao; - $airportsData[$icao] = $d; + $paths = AviationWeatherHelper::downloadCache('https://aviationweather.gov/data/cache/metars.cache.xml.gz'); + + // Stream-parse the METAR nodes — the file is too large to load as one DOM + $airportsData = []; + $reader = new XMLReader; + $reader->open($paths['xml']); + while ($reader->read()) { + if ($reader->nodeType !== XMLReader::ELEMENT || $reader->name !== 'METAR') { + continue; } - // Get the relevant airports - $upsertData = []; - foreach (Airport::whereIn('icao', $airportsFilter)->get() as $airport) { - $d = $airportsData[strtoupper($airport->icao)]; + $node = new SimpleXMLElement($reader->readOuterXml()); + $icao = strtoupper((string) $node->station_id); + if ($icao === '' || ! isset($node->raw_text, $node->observation_time)) { + continue; + } - // Don't add the METAR if it's not from today - $metarDate = (int) substr($d, 5, 2); - if ($metarDate != date('d')) { - continue; - } + $observationTime = Carbon::parse((string) $node->observation_time); - $time = Carbon::now()->setDay($metarDate)->setHour((int) substr($d, 7, 2))->setMinute((int) substr($d, 9, 2))->setSeconds(0); - $metar = substr($d, 13, null); - - // Fetch the wind direction and speed - $windData = ['direction' => null, 'speed' => null, 'gusting' => null]; - $windResult = []; - if (preg_match('/(\d\d\d)(\d\d)G?(\d\d)?KT/', $metar, $windResult)) { - $windData['direction'] = $windResult[1]; - $windData['speed'] = $windResult[2]; - if (isset($windResult[3])) { - $windData['gusting'] = $windResult[3]; - } - } elseif (preg_match('/(\d\d\d)(\d\d)G?(\d\d)?MPS/', $metar, $windResult)) { - $windData['direction'] = $windResult[1]; - $windData['speed'] = round($windResult[2] * 1.943844); - if (isset($windResult[3])) { - $windData['gusting'] = round($windResult[3] * 1.943844); - } - } + // A station can appear as both a routine METAR and a SPECI — keep the newest + if (isset($airportsData[$icao]) && $airportsData[$icao]['last_update']->gte($observationTime)) { + continue; + } - if (preg_match('/(M?\d\d)\/(M?\d\d)/', $metar, $temperatureResult)) { - if (substr($temperatureResult[1], 0, 1) == 'M') { - $temperature = (int) substr($temperatureResult[1], 1) * -1; - } else { - $temperature = (int) $temperatureResult[1]; - } - } + // Variable wind is reported as the literal string VRB — no usable direction + $windDirection = null; + if (isset($node->wind_dir_degrees) && is_numeric((string) $node->wind_dir_degrees)) { + $windDirection = (int) $node->wind_dir_degrees; + } - // Check for missing data - if (! isset($temperature)) { - continue; - } + $airportsData[$icao] = [ + 'last_update' => $observationTime, + 'metar' => preg_replace('/^(?:METAR |SPECI )?' . preg_quote($icao, '/') . ' /', '', (string) $node->raw_text), + 'wind_direction' => $windDirection, + 'wind_speed' => (int) $node->wind_speed_kt, + 'wind_gusts' => (int) $node->wind_gust_kt, + 'temperature' => isset($node->temp_c) ? (int) round((float) $node->temp_c) : null, + ]; + } + $reader->close(); + + // Get the relevant airports + $upsertData = []; + foreach (Airport::select('id', 'icao')->whereIn('icao', array_keys($airportsData))->get() as $airport) { + $d = $airportsData[strtoupper($airport->icao)]; - // Upsert the data - $upsertData[] = [ - 'airport_id' => (int) $airport->id, - 'last_update' => $time, - 'metar' => $metar, - 'wind_direction' => (int) $windData['direction'], - 'wind_speed' => (int) $windData['speed'], - 'wind_gusts' => (int) $windData['gusting'], - 'temperature' => (int) $temperature, - ]; + // Check for missing data + if ($d['temperature'] === null) { + continue; } - // Update the data + $upsertData[] = array_merge(['airport_id' => (int) $airport->id], $d); + } + + // Update the data in chunks + foreach (array_chunk($upsertData, 1000) as $chunk) { Metar::upsert( - $upsertData, + $chunk, ['airport_id'], ['last_update', 'metar', 'wind_direction', 'wind_speed', 'wind_gusts', 'temperature'] ); + } + + AviationWeatherHelper::cleanup($paths); + + // Free the parsed cache before loading airport models — update:data runs + // every command in one 256MB process + $metarCount = count($airportsData); + $airportsData = $upsertData = []; + + $this->scoreMetars(); + $this->info('Fetching and scoring of ' . $metarCount . " METAR's finished in " . round(microtime(true) - $processTime) . ' seconds'); + + } + + /** + * Rebuild the metar-sourced airport scores from the fresh observations. + * Each fetch command owns its own airport_scores sources — this one owns `metar`. + */ + private function scoreMetars(): void + { + $scoreInsert = []; + foreach (Airport::where('type', '!=', 'closed')->has('metar')->with('metar', 'runways')->get() as $airport) { + // A stale observation scores nothing — its old rows drop out on the rebuild + if (now()->lte($airport->metar->last_update->copy()->addHours(self::METAR_VALIDITY_HOURS))) { + $scoreInsert = array_merge($scoreInsert, $this->metarScores($airport)); + } + } + + AirportScore::where('source', AirportScore::SOURCE_METAR)->delete(); + foreach (array_chunk($scoreInsert, 500) as $chunk) { + AirportScore::insert($chunk); + } + } + + /** + * Weather scores from the airport's current METAR, valid from the observation + * until the next one is expected. + * + * @return array + */ + private function metarScores(Airport $airport): array + { + $scores = []; + $metarArraySuffix = [ + 'source' => AirportScore::SOURCE_METAR, + 'valid_from' => $airport->metar->last_update, + 'valid_to' => $airport->metar->last_update->copy()->addHours(self::METAR_VALIDITY_HOURS), + ]; + + // Fill in scores from current METAR observation + foreach (WeatherScoreHelper::reasons($airport->metar) as $reason) { + $scores[] = ['airport_id' => $airport->id, 'reason' => $reason, 'score' => 1, 'data' => null] + $metarArraySuffix; + } + + $activeRunwayComponents = ['headwind' => 0, 'crosswind' => 0]; + $airportScoreRVRInserted = false; + foreach ($airport->runways->where('closed', false) as $runway) { + // Check RVR at runways + if ( + $airportScoreRVRInserted == false && + ((! empty($runway->le_ident) && $airport->metar->rvrAtBelow($runway->le_ident, 700)) || + (! empty($runway->he_ident) && $airport->metar->rvrAtBelow($runway->he_ident, 700))) + ) { + $scores[] = ['airport_id' => $airport->id, 'reason' => 'METAR_RVR', 'score' => 1, 'data' => null] + $metarArraySuffix; + $airportScoreRVRInserted = true; + } + + // Calculate headwind component on active runway + if (! empty($airport->metar->wind_direction)) { + + // Fallback to varchar runway identifier if heading is not present in data, which is common. + if (empty($runway->le_heading) && ! empty($runway->le_ident)) { + $runway->le_heading = rwyIdentToHeading($runway->le_ident); + } + + if (empty($runway->he_heading) && ! empty($runway->he_ident)) { + $runway->he_heading = rwyIdentToHeading($runway->he_ident); + } + + // Set the components + $headwindComponentLe = abs($airport->metar->wind_speed * cos(deg2rad($airport->metar->wind_direction - $runway->le_heading))); + $crosswindComponentLe = abs($airport->metar->wind_speed * sin(deg2rad($airport->metar->wind_direction - $runway->le_heading))); + + $headwindComponentHe = abs($airport->metar->wind_speed * cos(deg2rad($airport->metar->wind_direction - $runway->he_heading))); + $crosswindComponentHe = abs($airport->metar->wind_speed * sin(deg2rad($airport->metar->wind_direction - $runway->he_heading))); + + if ($activeRunwayComponents['headwind'] < $headwindComponentLe) { + $activeRunwayComponents['headwind'] = $headwindComponentLe; + $activeRunwayComponents['crosswind'] = $crosswindComponentLe; + } elseif ($activeRunwayComponents['headwind'] < $headwindComponentHe) { + $activeRunwayComponents['headwind'] = $headwindComponentHe; + $activeRunwayComponents['crosswind'] = $crosswindComponentHe; + } + } } - $this->info('Fetching of ' . $data->count() . " METAR's finished in " . round(microtime(true) - $processTime) . ' seconds'); + // Check if crosswind component is fun at active runway + if ($airport->metar->wind_speed >= 15 && $activeRunwayComponents['crosswind'] > 12) { + $scores[] = ['airport_id' => $airport->id, 'reason' => 'METAR_CROSSWIND', 'score' => 1, 'data' => null] + $metarArraySuffix; + } + return $scores; } } diff --git a/app/Console/Commands/FetchTafs.php b/app/Console/Commands/FetchTafs.php new file mode 100644 index 00000000..066c85b2 --- /dev/null +++ b/app/Console/Commands/FetchTafs.php @@ -0,0 +1,216 @@ +info("Starting fetching of TAF's"); + + $paths = AviationWeatherHelper::downloadCache('https://aviationweather.gov/data/cache/tafs.cache.xml.gz'); + $tafDocuments = $this->parseTafDocuments($paths['xml']); + + $airports = Airport::select('id', 'icao')->whereIn('icao', array_keys($tafDocuments))->get()->keyBy(fn ($airport) => strtoupper($airport->icao)); + + // Only reprocess airports whose TAF has actually been reissued/amended since the last run. TAFs only change every ~6 hours plus occasional amendments + $storedIssues = Taf::pluck('issued_at', 'airport_id'); + + $changedDocuments = []; + foreach ($tafDocuments as $icao => $document) { + $airport = $airports[$icao] ?? null; + if (! $airport) { + continue; + } + + if (isset($storedIssues[$airport->id]) && Carbon::parse($storedIssues[$airport->id])->gte($document['issued_at'])) { + continue; + } + + $changedDocuments[$airport->id] = $document; + } + + $forecastInsert = []; + $airportScoreInsert = []; + + // Cleanup the old TAFs and their periods + foreach (array_chunk(array_keys($changedDocuments), 500) as $chunk) { + Taf::whereIn('airport_id', $chunk)->delete(); + AirportScore::whereIn('airport_id', $chunk)->where('source', AirportScore::SOURCE_TAF)->delete(); + } + + // Insert fresh TAF documents in bulk — on the ~6h reissue boundary nearly + // every station changes at once, so per-document inserts would be thousands + // of round-trips. The table is one row per airport, so the ids can be read + // back keyed by airport_id to attach the periods. + $documentInsert = []; + foreach ($changedDocuments as $airportId => $document) { + $documentInsert[] = [ + 'airport_id' => $airportId, + 'raw_text' => $document['raw_text'], + 'issued_at' => $document['issued_at'], + 'bulletin_time' => $document['bulletin_time'], + 'valid_from' => $document['valid_from'], + 'valid_to' => $document['valid_to'], + 'last_update' => now(), + ]; + } + + foreach (array_chunk($documentInsert, 500) as $chunk) { + Taf::insert($chunk); + } + + $tafIds = Taf::whereIn('airport_id', array_keys($changedDocuments))->pluck('id', 'airport_id'); + + foreach ($changedDocuments as $airportId => $document) { + foreach ($document['periods'] as $period) { + $forecastInsert[] = array_merge($period, ['taf_id' => $tafIds[$airportId]]); + + // TEMPO/PROB periods score like any other but at reduced + // weight, flagged so the icon carries the uncertainty badge — + // with a percentage when given + $data = []; + if ($period['probability'] !== null) { + $data['probability'] = $period['probability']; + } + if ($period['change_indicator'] === 'TEMPO') { + $data['tempo'] = true; + } + $weight = AirportScore::forecastWeight($period['probability'], $period['change_indicator'] === 'TEMPO'); + $data = $data ? json_encode($data) : null; + + foreach (WeatherScoreHelper::reasons(new TafForecast($period)) as $reason) { + $airportScoreInsert[] = [ + 'airport_id' => $airportId, + 'reason' => $reason, + 'score' => $weight, + 'data' => $data, + 'source' => AirportScore::SOURCE_TAF, + 'valid_from' => $period['valid_from'], + 'valid_to' => $period['valid_to'], + ]; + } + } + } + + foreach (array_chunk($forecastInsert, 500) as $chunk) { + TafForecast::insert($chunk); + } + + foreach (array_chunk($airportScoreInsert, 500) as $chunk) { + AirportScore::insert($chunk); + } + + // Prune what has fully passed, expired forecasts can never cover an ETA + TafForecast::where('valid_to', '<', now())->delete(); + Taf::where('valid_to', '<', now())->delete(); + AirportScore::where('source', AirportScore::SOURCE_TAF)->where('valid_to', '<', now())->delete(); + + AviationWeatherHelper::cleanup($paths); + + $this->info('Fetching of ' . count($tafDocuments) . " TAF's (" . count($changedDocuments) . ' changed) finished in ' . round(microtime(true) - $processTime) . ' seconds'); + + } + + /** + * Parse the cache XML into one document per station, keeping only the newest + * issue per station and each document's forecast periods as column-ready arrays. + */ + private function parseTafDocuments(string $xmlPath): array + { + $tafDocuments = []; + $xml = simplexml_load_file($xmlPath); + + foreach ($xml->data->TAF as $taf) { + $icao = strtoupper((string) $taf->station_id); + if ($icao === '' || ! isset($taf->raw_text, $taf->issue_time)) { + continue; + } + + // issue_time advances on amendments (TAF AMD) while bulletin_time doesn't, + // which is what makes the issued_at change-detection catch amendments + $issuedAt = Carbon::parse((string) $taf->issue_time); + if (isset($tafDocuments[$icao]) && $tafDocuments[$icao]['issued_at']->gte($issuedAt)) { + continue; + } + + $periods = []; + foreach ($taf->forecast as $forecast) { + if (! isset($forecast->fcst_time_from, $forecast->fcst_time_to)) { + continue; + } + + // A period that has fully passed can never cover an ETA. Inserting it would only churn against the expiry pruning + if (Carbon::parse((string) $forecast->fcst_time_to)->isPast()) { + continue; + } + + $skyCondition = []; + foreach ($forecast->sky_condition as $layer) { + $skyCondition[] = [ + 'cover' => (string) $layer['sky_cover'], + 'base_ft_agl' => isset($layer['cloud_base_ft_agl']) ? (int) $layer['cloud_base_ft_agl'] : null, + ]; + } + + $periods[] = [ + 'change_indicator' => isset($forecast->change_indicator) ? (string) $forecast->change_indicator : null, + 'probability' => isset($forecast->probability) ? (int) $forecast->probability : null, + 'wind_dir_degrees' => isset($forecast->wind_dir_degrees) ? (string) $forecast->wind_dir_degrees : null, + 'wind_speed_kt' => isset($forecast->wind_speed_kt) ? (int) $forecast->wind_speed_kt : null, + 'wind_gust_kt' => isset($forecast->wind_gust_kt) ? (int) $forecast->wind_gust_kt : null, + 'visibility_statute_mi' => isset($forecast->visibility_statute_mi) ? (string) $forecast->visibility_statute_mi : null, + 'wx_string' => isset($forecast->wx_string) ? (string) $forecast->wx_string : null, + 'ceiling_ft_agl' => TafForecast::ceilingFromSkyCondition($skyCondition), + 'valid_from' => Carbon::parse((string) $forecast->fcst_time_from), + 'valid_to' => Carbon::parse((string) $forecast->fcst_time_to), + ]; + } + + if (! count($periods)) { + continue; + } + + $tafDocuments[$icao] = [ + 'issued_at' => $issuedAt, + 'bulletin_time' => isset($taf->bulletin_time) ? Carbon::parse((string) $taf->bulletin_time) : null, + 'raw_text' => preg_replace('/^TAF (?:AMD |COR )?' . preg_quote($icao, '/') . ' /', '', (string) $taf->raw_text), + 'valid_from' => isset($taf->valid_time_from) ? Carbon::parse((string) $taf->valid_time_from) : collect($periods)->min('valid_from'), + 'valid_to' => isset($taf->valid_time_to) ? Carbon::parse((string) $taf->valid_time_to) : collect($periods)->max('valid_to'), + 'periods' => $periods, + ]; + } + + return $tafDocuments; + } +} diff --git a/app/Console/Commands/FetchVatsim.php b/app/Console/Commands/FetchVatsim.php index 9275fc9f..d03a3e47 100644 --- a/app/Console/Commands/FetchVatsim.php +++ b/app/Console/Commands/FetchVatsim.php @@ -4,6 +4,7 @@ use App\Helpers\AirportCallsignHelper; use App\Models\Airport; +use App\Models\AirportScore; use App\Models\Controller; use App\Models\Event; use Carbon\Carbon; @@ -12,6 +13,16 @@ class FetchVatsim extends Command { + /** + * How long a live observation stays valid: until the next poll. + */ + private const POLL_INTERVAL_MINUTES = 60; + + /** + * Estimate an online controller without a booking to sit two hours before logging off. + */ + private const LOGON_ESTIMATE_HOURS = 2; + /** * The name and signature of the console command. * @@ -39,12 +50,13 @@ public function handle() $upsertEventsData = []; $upsertControllerData = []; - $airportMap = Airport::all()->keyBy('icao'); + + $airportMap = Airport::select('id', 'icao')->get()->keyBy('icao'); $this->info('Fetching events...'); $response = Http::timeout(60)->retry(3, 1000)->get('https://my.vatsim.net/api/v2/events/latest'); if ($response->successful()) { - $data = json_decode($response->body(), false)->data; + $data = $response->object()->data; foreach ($data as $event) { if (count($event->airports)) { @@ -65,35 +77,25 @@ public function handle() $this->info('Fetching online controllers...'); $response = Http::get('https://data.vatsim.net/v3/vatsim-data.json'); + $vatsimPilots = null; if ($response->successful()) { - $data = json_decode($response->body(), false)->controllers; + $vatsimData = $response->object(); + $vatsimPilots = $vatsimData->pilots; - foreach ($data as $controller) { + foreach ($vatsimData->controllers as $controller) { // Skip observers, FSS and enroute controllers if ($controller->facility <= 1 || $controller->facility >= 6) { continue; } - // Fetch callsign prefix - preg_match('/^([A-Z]*)_/', $controller->callsign, $matches); + // Resolve the position callsign to an airport ICAO + $callsign = AirportCallsignHelper::resolveIcao($controller->callsign); - if (! isset($matches[1])) { + if (! $callsign) { continue; } - // For callsigns with 3 letters or less - if (strlen($matches[1]) <= 3) { - $australianCallsign = AirportCallsignHelper::returnAustralianAirport($matches[1]); - if ($australianCallsign) { - $callsign = $australianCallsign; - } else { - $callsign = AirportCallsignHelper::returnAmericanIcao($matches[1]); - } - } else { - $callsign = $matches[1]; - } - if (isset($airportMap[$callsign])) { $upsertControllerData[] = [ 'airport_id' => $airportMap[$callsign]->id, @@ -120,7 +122,110 @@ public function handle() ['callsign', 'logon_time'] ); - $this->info('Fetching of VATSIM data finished in ' . round(microtime(true) - $processTime) . ' seconds'); + // Free the lookup map before loading full airport models for scoring + $airportMap = $upsertEventsData = $upsertControllerData = null; + + $this->scoreVatsim($vatsimPilots); + $this->info('Fetching and scoring of VATSIM data finished in ' . round(microtime(true) - $processTime) . ' seconds'); + + } + + /** + * Rebuild the airport scores this command owns: the live `vatsim` rows, + * `event` windows and per-controller `logon_estimate` predictions. + * + * @param array|null $vatsimPilots the pilots section of vatsim-data.json + */ + private function scoreVatsim($vatsimPilots): void + { + $scoreInsert = []; + $airports = Airport::where('type', '!=', 'closed')->has('metar')->with('controllers', 'events')->get(); + + foreach ($airports as $airport) { + + // Array suffix template for live VATSIM_* scores + $vatsimArraySuffix = [ + 'source' => AirportScore::SOURCE_VATSIM, + 'valid_from' => now(), + 'valid_to' => now()->copy()->addMinutes(self::POLL_INTERVAL_MINUTES), + ]; + + // VATSIM_ATC: Check VATSIM controllers, keeping the earliest logon so the tooltip reflects how long it has been staffed + if ($airport->controllers->count()) { + + $stations = collect(); + foreach ($airport->controllers as $controller) { + $facility = AirportCallsignHelper::facility($controller->callsign); + if ($facility === null || $facility == 'OBS') { + continue; + } + + if (! isset($stations[$facility]) || $controller->logon_time->lt($stations[$facility])) { + $stations[$facility] = $controller->logon_time; + } + } + + $stations = $stations + ->map(fn ($logonTime, $facility) => ['facility' => $facility, 'logon_time' => $logonTime]) + ->sortBy(fn ($station) => ($order = array_search($station['facility'], Airport::ATC_FACILITY_ORDER)) === false ? 99 : $order) + ->values(); + + $scoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'VATSIM_ATC', 'score' => 1, 'data' => json_encode(['stations' => $stations])] + $vatsimArraySuffix; + } + + // VATSIM_ATC: Live logins with estimated logoff time (LOGON_ESTIMATE_HOURS) + foreach ($airport->controllers as $controller) { + $scoreInsert[] = [ + 'airport_id' => $airport->id, + 'reason' => 'VATSIM_ATC', + 'score' => 1, + 'data' => json_encode([ + 'position' => $controller->callsign, + 'facility' => AirportCallsignHelper::facility($controller->callsign), + 'logon_time' => $controller->logon_time, + ]), + 'source' => AirportScore::SOURCE_LOGON_ESTIMATE, + 'valid_from' => now(), + 'valid_to' => $controller->logon_time->copy()->addHours(self::LOGON_ESTIMATE_HOURS), + ]; + } + + // VATSIM_EVENT: Fetch non finished events + foreach ($airport->events as $event) { + if (now()->gt($event->end_time)) { + continue; + } + + $scoreInsert[] = [ + 'airport_id' => $airport->id, + 'reason' => 'VATSIM_EVENT', + 'score' => 1, + 'data' => json_encode(['event' => $event->event]), + 'source' => AirportScore::SOURCE_EVENT, + 'valid_from' => $event->start_time, + 'valid_to' => $event->end_time, + ]; + } + + // VATSIM_POPULAR: Check if many pilots are moving around the airport + if ($vatsimPilots) { + $movements = 0; + foreach ($vatsimPilots as $vp) { + if (distance($airport->latitude_deg, $airport->longitude_deg, $vp->latitude, $vp->longitude) <= 5) { + $movements++; + } + } + + if ($movements >= 10) { + $scoreInsert[] = ['airport_id' => $airport->id, 'reason' => 'VATSIM_POPULAR', 'score' => 1, 'data' => json_encode(['movements' => $movements])] + $vatsimArraySuffix; + } + } + } + + AirportScore::whereIn('source', [AirportScore::SOURCE_VATSIM, AirportScore::SOURCE_EVENT, AirportScore::SOURCE_LOGON_ESTIMATE])->delete(); + foreach (array_chunk($scoreInsert, 500) as $chunk) { + AirportScore::insert($chunk); + } } } diff --git a/app/Console/Commands/UpdateData.php b/app/Console/Commands/UpdateData.php index 08ae968f..2ada2987 100644 --- a/app/Console/Commands/UpdateData.php +++ b/app/Console/Commands/UpdateData.php @@ -3,7 +3,6 @@ namespace App\Console\Commands; use Illuminate\Console\Command; -use Illuminate\Support\Facades\Artisan; class UpdateData extends Command { @@ -33,13 +32,13 @@ public function handle() $this->info('> Calling all relevant data update commands...'); $this->info('>> fetch:metars running'); - Artisan::call('fetch:metars'); + $this->call('fetch:metars'); - $this->info('>> fetch:vatsim running'); - Artisan::call('fetch:vatsim'); + $this->info('>> fetch:tafs running'); + $this->call('fetch:tafs'); - $this->info('>> calc:scores running'); - Artisan::call('calc:scores'); + $this->info('>> fetch:vatsim running'); + $this->call('fetch:vatsim'); $this->info('> Done with all commands in ' . round(microtime(true) - $processTime) . ' seconds!'); diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php deleted file mode 100644 index 1ce88c69..00000000 --- a/app/Console/Kernel.php +++ /dev/null @@ -1,58 +0,0 @@ -command('update:data')->hourlyAt(15); - $schedule->command('update:data')->hourlyAt(40); - - // Fetch flights - $schedule->command('fetch:flights')->everyThirtyMinutes(); - - // Update if airlines have flights - $schedule->command('calc:flights')->daily(); - - // Fetch Github Issues cache - $schedule->command('fetch:github')->everyTenMinutes(); - - // Cleanup sceneries without attached simulators - $schedule->command('cleanup:sceneries')->daily(); - - // Backups - $schedule->command('backup:clean')->daily()->at('01:00'); - $schedule->command('backup:run')->daily()->at('01:30'); - - // Delete users who haven't verified their email address - $schedule->command('account:clear-unverified')->daily(); - - // Clear expired password reset tokens - $schedule->command('auth:clear-resets')->everyFifteenMinutes(); - - // Fetch new disposable domains - $schedule->command('disposable:update')->daily(); - } - - /** - * Register the commands for the application. - * - * @return void - */ - protected function commands() - { - $this->load(__DIR__ . '/Commands'); - - require base_path('routes/console.php'); - } -} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php deleted file mode 100644 index c2e8debc..00000000 --- a/app/Exceptions/Handler.php +++ /dev/null @@ -1,58 +0,0 @@ -, LogLevel::*> - */ - protected $levels = [ - // - ]; - - /** - * A list of the exception types that are not reported. - * - * @var array> - */ - protected $dontReport = [ - // - ]; - - /** - * A list of the inputs that are never flashed to the session on validation exceptions. - * - * @var array - */ - protected $dontFlash = [ - 'current_password', - 'password', - 'password_confirmation', - ]; - - /** - * Register the exception handling callbacks for the application. - * - * @return void - */ - public function register() - { - $this->reportable(function (Throwable $e) { - if (app()->bound('sentry') && $this->shouldReport($e)) { - app('sentry')->configureScope(function (Scope $scope): void { - $scope->setUser(['id' => Auth::id()]); - }); - app('sentry')->captureException($e); - } - }); - } -} diff --git a/app/Helpers/AircraftHelper.php b/app/Helpers/AircraftHelper.php new file mode 100644 index 00000000..f531c4bb --- /dev/null +++ b/app/Helpers/AircraftHelper.php @@ -0,0 +1,51 @@ + ['name' => 'Light GA', 'description' => 'C172/PA28/C182 etc.', 'min_runway_ft' => 100, 'cruise_kts' => 115, 'climb_descend_hours' => 0.13], + 'GAT' => ['name' => 'Turbo GA', 'description' => 'Bonanza/Baron/Caravan etc.', 'min_runway_ft' => 2000, 'cruise_kts' => 190, 'climb_descend_hours' => 0.20], + 'GTP' => ['name' => 'Heavy Turboprop', 'description' => 'TBM/PC-12/King Air etc.', 'min_runway_ft' => 2500, 'cruise_kts' => 280, 'climb_descend_hours' => 0.25], + 'JS' => ['name' => 'Regional Jet', 'description' => 'CRJ/E145/PC-24 etc.', 'min_runway_ft' => 4000, 'cruise_kts' => 340, 'climb_descend_hours' => 0.33], + 'JM' => ['name' => 'Narrow Body', 'description' => 'B737/A320/E190 etc.', 'min_runway_ft' => 5000, 'cruise_kts' => 460, 'climb_descend_hours' => 0.42], + 'JML' => ['name' => 'Mid Wide Body', 'description' => 'B757/B767 etc.', 'min_runway_ft' => 6000, 'cruise_kts' => 480, 'climb_descend_hours' => 0.47], + 'JL' => ['name' => 'Large Wide Body', 'description' => 'B777/B787/A350 etc.', 'min_runway_ft' => 7000, 'cruise_kts' => 510, 'climb_descend_hours' => 0.50], + 'JXL' => ['name' => 'Super Heavy', 'description' => 'B747/A380 etc.', 'min_runway_ft' => 8000, 'cruise_kts' => 520, 'climb_descend_hours' => 0.58], + ]; + + public static function codes(): array + { + return array_keys(self::TYPES); + } + + public static function name(string $code): string + { + return self::TYPES[$code]['name']; + } + + public static function isValidCode(mixed $code): bool + { + return is_string($code) && array_key_exists($code, self::TYPES); + } + + public static function minimumRunwayFt(string $code): int + { + return self::TYPES[$code]['min_runway_ft'] ?? 0; + } + + public static function cruiseKts(string $code): int + { + return self::TYPES[$code]['cruise_kts'] ?? 0; + } + + public static function climbDescendHours(string $code): float + { + return self::TYPES[$code]['climb_descend_hours'] ?? 0; + } +} diff --git a/app/Helpers/AirportCallsignHelper.php b/app/Helpers/AirportCallsignHelper.php index 7721522b..5ada3473 100644 --- a/app/Helpers/AirportCallsignHelper.php +++ b/app/Helpers/AirportCallsignHelper.php @@ -8,15 +8,47 @@ public static function returnAustralianAirport($string) { $australianCallsigns = ['AD' => 'YPAD', 'BN' => 'YBBN', 'CS' => 'YBCS', 'CB' => 'YSCB', 'DN' => 'YPDN', 'EN' => 'YMEN', 'CG' => 'YBCG', 'ML' => 'YMML', 'PH' => 'YPPH', 'SY' => 'YSSY', 'TL' => 'YBTL', 'WLM' => 'YWLM', 'AMB' => 'YAMB', 'CIN' => 'YCIN', 'AF' => 'YBAF', 'AV' => 'YMAV', 'BK' => 'YSBK', 'CN' => 'YSCN', 'HB' => 'YMHB', 'JT' => 'YPJT', 'LT' => 'YMLT', 'MK' => 'YBMK', 'MB' => 'YMMB', 'PF' => 'YPPF', 'RK' => 'YBRK', 'AY' => 'YMAY', 'AS' => 'YBAS', 'BRM' => 'YBRM', 'CFS' => 'YCFS', 'HM' => 'YBHM', 'KA' => 'YPKA', 'SU' => 'YBSU', 'TW' => 'YSTW', 'WR' => 'YPWR']; - if (isset($australianCallsigns[$string])) { - return $australianCallsigns[$string]; - } - - return false; + return $australianCallsigns[$string] ?? false; } public static function returnAmericanIcao($string) { return 'K' . $string; } + + /** + * The facility type of a position callsign — its part after the last + * underscore (EGLL_TWR → TWR). Null when there's no underscore to split on. + */ + public static function facility(string $callsign): ?string + { + $suffix = strrchr($callsign, '_'); + + return $suffix === false ? null : substr($suffix, 1); + } + + /** + * Resolve a position callsign (e.g. EGLL_TWR, JFK_GND) to an ICAO code, + * using the same prefix algorithm fetch:vatsim applies to online controllers. + * Returns null for positions that don't represent a single airport. + */ + public static function resolveIcao(string $callsign): ?string + { + // Enroute, oceanic and ATIS positions don't map to a single airport + if (preg_match('/_(CTR|FSS|ATIS)$/', $callsign)) { + return null; + } + + // Fetch callsign prefix + if (! preg_match('/^([A-Z]*)_/', $callsign, $matches) || $matches[1] === '') { + return null; + } + + // For callsigns with 3 letters or less + if (strlen($matches[1]) <= 3) { + return self::returnAustralianAirport($matches[1]) ?: self::returnAmericanIcao($matches[1]); + } + + return $matches[1]; + } } diff --git a/app/Helpers/AirportFilterHelper.php b/app/Helpers/AirportFilterHelper.php index d38c76b7..f6b0da00 100644 --- a/app/Helpers/AirportFilterHelper.php +++ b/app/Helpers/AirportFilterHelper.php @@ -6,11 +6,11 @@ class AirportFilterHelper { public static function hasCorrectMetcon($metcon, $airport) { - if ($metcon == 'VFR' && ! $airport->hasVisualCondition()) { - return false; + if ($metcon === 'VFR') { + return $airport->hasVisualCondition(); } - if ($metcon == 'IFR' && $airport->hasVisualCondition()) { - return false; + if ($metcon === 'IFR') { + return ! $airport->hasVisualCondition(); } return true; diff --git a/app/Helpers/AviationWeatherHelper.php b/app/Helpers/AviationWeatherHelper.php new file mode 100644 index 00000000..ef425a1e --- /dev/null +++ b/app/Helpers/AviationWeatherHelper.php @@ -0,0 +1,49 @@ +retry(3, 1000)->sink($gzPath)->get($url); + if (! $response->successful()) { + throw new RuntimeException('Failed to download ' . $url . ' (HTTP ' . $response->status() . ')'); + } + + $gz = gzopen($gzPath, 'rb'); + $xml = fopen($xmlPath, 'wb'); + while (! gzeof($gz)) { + fwrite($xml, gzread($gz, 1024 * 1024)); + } + gzclose($gz); + fclose($xml); + + return ['gz' => $gzPath, 'xml' => $xmlPath]; + } + + public static function cleanup(array $paths): void + { + foreach ($paths as $path) { + File::delete($path); + } + } +} diff --git a/app/Helpers/CalculationHelper.php b/app/Helpers/CalculationHelper.php index f720b675..ee1149ef 100644 --- a/app/Helpers/CalculationHelper.php +++ b/app/Helpers/CalculationHelper.php @@ -2,147 +2,57 @@ namespace App\Helpers; +use App\Models\Airport; +use Carbon\Carbon; use InvalidArgumentException; use Location\Coordinate; class CalculationHelper { /** - * Calculate the distance between two points - * - * $param string $code aircraft type code - * - * @return int Required runway length + * The ETA used to time-scope forecast lookups — never shown to the client. + * No buffer: ETA = now + airtime. */ - public static function minimumRequiredRunwayLength(string $code) + public static function forecastEta(float $airtimeHours): Carbon { - switch ($code) { - case 'GA': - return 100; - case 'GAT': - return 2000; - case 'GTP': - return 2500; - case 'JS': - return 4000; - case 'JM': - return 5000; - case 'JML': - return 6000; - case 'JL': - return 7000; - case 'JXL': - return 8000; - default: - return 0; - } + return now()->addSeconds((int) round($airtimeHours * 3600)); } /** - * Calculate aircraft travel nautrical miles per hour - * - * @param string $actCode Aircraft code - * @return int Cruice speed + * The canonical airtime formula: distance at cruise speed plus a fixed + * climb/descend allowance. Keep in sync with its SQL twin forecastEtaSql(). */ - public static function aircraftNmPerHour(string $actCode) + public static function airtimeHours(float $distanceNm, string $codeletter): float { - - $crzSpeed = 0; - switch ($actCode) { - case 'GA': - $crzSpeed = 115; - break; - case 'GAT': - $crzSpeed = 190; - break; - case 'GTP': - $crzSpeed = 280; - break; - case 'JS': - $crzSpeed = 340; - break; - case 'JM': - $crzSpeed = 460; - break; - case 'JML': - $crzSpeed = 480; - break; - case 'JL': - $crzSpeed = 510; - break; - case 'JXL': - $crzSpeed = 520; - break; - default: - $crzSpeed = 0; - } - - return $crzSpeed; + return $distanceNm / AircraftHelper::cruiseKts($codeletter) + AircraftHelper::climbDescendHours($codeletter); } /** - * Calculate minute addition for climbing the aircraft - * - * @param string $actCode Aircraft code - * @return int Additional minutes + * forecastEta() as a SQL expression, since the distance to each candidate + * airport is only known inside the query. SQL twin of airtimeHours(). */ - public static function timeClimbDescend(string $actCode) + public static function forecastEtaSql(Airport $anchorAirport, string $codeletter): string { - - $addMinutes = 0; - switch ($actCode) { - case 'GA': - $addMinutes = 0.13; - break; - case 'GAT': - $addMinutes = 0.20; - break; - case 'GTP': - $addMinutes = 0.25; - break; - case 'JS': - $addMinutes = 0.33; - break; - case 'JM': - $addMinutes = 0.42; - break; - case 'JML': - $addMinutes = 0.47; - break; - case 'JL': - $addMinutes = 0.50; - break; - case 'JXL': - $addMinutes = 0.58; - break; - default: - $addMinutes = 0; - } - - return $addMinutes; - + $connection = $anchorAirport->getConnection(); + $anchorPoint = $anchorAirport->coordinates->toSqlExpression($connection)->getValue($connection->getQueryGrammar()); + + return sprintf( + 'DATE_ADD(NOW(), INTERVAL ((ST_DISTANCE_SPHERE(airports.coordinates, %s) / 1852 / %d + %F) * 3600) SECOND)', + $anchorPoint, + AircraftHelper::cruiseKts($codeletter), + AircraftHelper::climbDescendHours($codeletter) + ); } /** - * Calculate the nautical miles the selected aircraft type will fly in an hour - * - * @param string $actCode Aircraft code - * @param int $minHours Minimum hours - * @param int $maxHours Maximum hours - * @return int Nautical miles + * The distance range (NM) the aircraft covers within the given airtime range */ public static function aircraftNmPerHourRange(string $actCode, int $minHours, int $maxHours) { - $minDistance = self::aircraftNmPerHour($actCode); - $maxDistance = self::aircraftNmPerHour($actCode); - - // Convert to nm and multiply by hours - $minDistance = ($minDistance) * $minHours; - $maxDistance = ($maxDistance) * $maxHours; + $speed = AircraftHelper::cruiseKts($actCode); - if ($minDistance !== 0) { - $minDistance += self::timeClimbDescend($actCode); - } + $minDistance = $speed * $minHours; + $maxDistance = $speed * $maxHours; return [$minDistance, $maxDistance]; } @@ -169,19 +79,8 @@ public static function calculateSphericalDestination(Coordinate $point, float $b $Φ = rad2deg($Φ); $Λ = rad2deg($Λ); - if ($Φ > 90) { - $Φ = 90; - } - if ($Φ < -90) { - $Φ = -90; - } - - if ($Λ > 180) { - $Λ = 180; - } - if ($Λ < -180) { - $Λ = -180; - } + $Φ = max(-90.0, min(90.0, $Φ)); + $Λ = max(-180.0, min(180.0, $Λ)); return new Coordinate($Φ, $Λ); } diff --git a/app/Helpers/CountryHelper.php b/app/Helpers/CountryHelper.php new file mode 100644 index 00000000..eee18cfa --- /dev/null +++ b/app/Helpers/CountryHelper.php @@ -0,0 +1,33 @@ + 'Kosovo']; + + public const US_STATES = ['AL' => 'Alabama', 'AK' => 'Alaska', 'AZ' => 'Arizona', 'AR' => 'Arkansas', 'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware', 'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho', 'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas', 'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine', 'MD' => 'Maryland', 'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MS' => 'Mississippi', 'MO' => 'Missouri', 'MT' => 'Montana', 'NE' => 'Nebraska', 'NV' => 'Nevada', 'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NY' => 'New York', 'NC' => 'North Carolina', 'ND' => 'North Dakota', 'OH' => 'Ohio', 'OK' => 'Oklahoma', 'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina', 'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah', 'VT' => 'Vermont', 'VA' => 'Virginia', 'WA' => 'Washington', 'WV' => 'West Virginia', 'WI' => 'Wisconsin', 'WY' => 'Wyoming']; + + /** + * All country names keyed by ISO 3166-1 alpha-2 code, sorted by name + */ + public static function names(): array + { + $names = Countries::getNames('en') + self::OVERRIDES; + asort($names); + + return $names; + } + + public static function name(?string $code): string + { + if (isset(self::OVERRIDES[$code])) { + return self::OVERRIDES[$code]; + } + + return $code !== null && Countries::exists($code) ? Countries::getName($code, 'en') : 'Unknown Country'; + } +} diff --git a/app/Helpers/SceneryHelper.php b/app/Helpers/SceneryHelper.php index 335018ae..74713ac4 100644 --- a/app/Helpers/SceneryHelper.php +++ b/app/Helpers/SceneryHelper.php @@ -53,10 +53,7 @@ public static function findCheapestStore($stores, $compatibleSimulator) } if (in_array($compatibleSimulator, $store->simulatorVersions)) { - if ($cheapestStore == null) { - $cheapestStore = $store; - } - if ($store->currencyPrice->EUR < $cheapestStore->currencyPrice->EUR) { + if ($cheapestStore === null || $store->currencyPrice->EUR < $cheapestStore->currencyPrice->EUR) { $cheapestStore = $store; } } @@ -75,8 +72,6 @@ public static function prepareSceneryData($sceneryDeveloperData, $sceneryData, $ 'developer' => $sceneryDeveloperData->developer, 'link' => $apiData['link'] ?? $sceneryData->link, 'linkDomain' => isset($apiData) ? null : parse_url($sceneryData->link, PHP_URL_HOST), - 'currencyLink' => $apiData['currencyLink'] ?? null, - 'cheapestLink' => $apiData['cheapestLink'] ?? $sceneryData->link, 'cheapestStore' => $apiData['cheapestStore'] ?? $sceneryDeveloperData->developer, 'cheapestPrice' => $apiData['cheapestPrice'] ?? null, 'ratingAverage' => $apiData['ratingAverage'] ?? null, @@ -111,8 +106,17 @@ public static function sortSceneries(array &$returnData) foreach ($returnData as $simulator => $sceneries) { // First sort by developer name usort($sceneries, fn ($a, $b) => $a['developer'] <=> $b['developer']); - // Then sort by payware/free - usort($sceneries, fn ($a, $b) => $a['payware'] <=> $b['payware']); + // Then sort by payware/free: -1 (bundled) on top, then payware, then freeware + usort($sceneries, function ($a, $b) { + if ($a['payware'] === -1 && $b['payware'] !== -1) { + return -1; + } + if ($a['payware'] !== -1 && $b['payware'] === -1) { + return 1; + } + + return $b['payware'] <=> $a['payware']; + }); $returnData[$simulator] = $sceneries; } } @@ -129,7 +133,7 @@ public static function getEmbeddedUrl($fullUrl) parse_str($urlComponents['query'], $queryParams); // Retrieve the 'url' parameter value - $embeddedUrl = isset($queryParams['url']) ? $queryParams['url'] : null; + $embeddedUrl = $queryParams['url'] ?? null; // Strip 'www.' and 'secure.' and addoncompare from the URL if ($embeddedUrl) { diff --git a/app/Http/Controllers/ScoreController.php b/app/Helpers/ScoreHelper.php similarity index 59% rename from app/Http/Controllers/ScoreController.php rename to app/Helpers/ScoreHelper.php index d2c8d9c4..c4e7b49f 100644 --- a/app/Http/Controllers/ScoreController.php +++ b/app/Helpers/ScoreHelper.php @@ -1,10 +1,11 @@ ['icon' => 'fa-windsock', 'desc' => 'Windy'], 'METAR_GUSTS' => ['icon' => 'fa-wind', 'desc' => 'Gusting Wind'], 'METAR_CROSSWIND' => ['icon' => 'fa-arrows-cross', 'desc' => 'Crosswind'], @@ -18,32 +19,23 @@ class ScoreController extends Controller 'METAR_HEAVY_SNOW' => ['icon' => 'fa-cloud-snow', 'desc' => 'Heavy Snow'], 'METAR_THUNDERSTORM' => ['icon' => 'fa-cloud-bolt', 'desc' => 'Thunderstorm'], - 'VATSIM_ATC' => ['icon' => 'fa-tower-control', 'desc' => 'VATSIM ATC Online'], - 'VATSIM_EVENT' => ['icon' => 'fa-calendar', 'desc' => 'VATSIM Event Ongoing'], + 'VATSIM_ATC' => ['icon' => 'fa-tower-control', 'desc' => 'VATSIM ATC'], + 'VATSIM_EVENT' => ['icon' => 'fa-calendar', 'desc' => 'VATSIM Event'], 'VATSIM_POPULAR' => ['icon' => 'fa-fire', 'desc' => 'VATSIM Popular Airport'], ]; - // Get the score types that are weather related - public static function getWeatherTypes() + public static function weatherTypes(): array { - foreach (self::$score_types as $key => $value) { - if (str_starts_with($key, 'METAR_')) { - $returnArray[] = $key; - } - } - - return $returnArray; + return self::typesWithPrefix('METAR_'); } - // Get the score types that are VATSIM related - public static function getVatsimTypes() + public static function vatsimTypes(): array { - foreach (self::$score_types as $key => $value) { - if (str_starts_with($key, 'VATSIM_')) { - $returnArray[] = $key; - } - } + return self::typesWithPrefix('VATSIM_'); + } - return $returnArray; + private static function typesWithPrefix(string $prefix): array + { + return array_values(array_filter(array_keys(self::TYPES), fn ($key) => str_starts_with($key, $prefix))); } } diff --git a/app/Helpers/WeatherScoreHelper.php b/app/Helpers/WeatherScoreHelper.php new file mode 100644 index 00000000..0ffd8b52 --- /dev/null +++ b/app/Helpers/WeatherScoreHelper.php @@ -0,0 +1,71 @@ + + */ + public static function reasons(Metar|TafForecast $weather): array + { + $reasons = []; + + if ($weather->windAtAbove(15)) { + $reasons[] = 'METAR_WINDY'; + } + + if ($weather->windGusts()) { + $reasons[] = 'METAR_GUSTS'; + } + + if ($weather->sightBelow(5000)) { + $reasons[] = 'METAR_SIGHT'; + } + + if ($weather->ceilingAtAbove(300)) { + $reasons[] = 'METAR_CEILING'; + } + + if ($weather->foggy()) { + $reasons[] = 'METAR_FOGGY'; + } + + if ($weather->heavyRain()) { + $reasons[] = 'METAR_HEAVY_RAIN'; + } + + if ($weather->heavySnow()) { + $reasons[] = 'METAR_HEAVY_SNOW'; + } + + if ($weather->thunderstorm()) { + $reasons[] = 'METAR_THUNDERSTORM'; + } + + return $reasons; + } +} diff --git a/app/Helpers/helpers.php b/app/Helpers/helpers.php index 3bf83b10..a3b5e9cf 100644 --- a/app/Helpers/helpers.php +++ b/app/Helpers/helpers.php @@ -1,5 +1,9 @@ 'Afghanistan', 'AL' => 'Albania', 'DZ' => 'Algeria', 'AS' => 'American Samoa', 'AD' => 'Andorra', 'AO' => 'Angola', 'AI' => 'Anguilla', 'AQ' => 'Antarctica', 'AG' => 'Antigua And Barbuda', 'AR' => 'Argentina', 'AM' => 'Armenia', 'AW' => 'Aruba', 'AU' => 'Australia', 'AT' => 'Austria', 'AZ' => 'Azerbaijan', 'BS' => 'Bahamas', 'BH' => 'Bahrain', 'BD' => 'Bangladesh', 'BB' => 'Barbados', 'BY' => 'Belarus', 'BE' => 'Belgium', 'BZ' => 'Belize', 'BJ' => 'Benin', 'BM' => 'Bermuda', 'BT' => 'Bhutan', 'BO' => 'Bolivia', 'BA' => 'Bosnia And Herzegovina', 'BW' => 'Botswana', 'BV' => 'Bouvet Island', 'BR' => 'Brazil', 'IO' => 'British Indian Ocean Territory', 'BN' => 'Brunei Darussalam', 'BG' => 'Bulgaria', 'BF' => 'Burkina Faso', 'BI' => 'Burundi', 'KH' => 'Cambodia', 'CM' => 'Cameroon', 'CA' => 'Canada', 'CV' => 'Cape Verde', 'KY' => 'Cayman Islands', 'CF' => 'Central African Republic', 'TD' => 'Chad', 'CL' => 'Chile', 'CN' => 'China', 'CX' => 'Christmas Island', 'CC' => 'Cocos (Keeling) Islands', 'CO' => 'Colombia', 'KM' => 'Comoros', 'CG' => 'Congo', 'CD' => 'Congo, Democratic Republic', 'CK' => 'Cook Islands', 'CR' => 'Costa Rica', 'CI' => 'Cote D\'Ivoire', 'HR' => 'Croatia', 'CU' => 'Cuba', 'CY' => 'Cyprus', 'CZ' => 'Czech Republic', 'DK' => 'Denmark', 'DJ' => 'Djibouti', 'DM' => 'Dominica', 'DO' => 'Dominican Republic', 'EC' => 'Ecuador', 'EG' => 'Egypt', 'SV' => 'El Salvador', 'GQ' => 'Equatorial Guinea', 'ER' => 'Eritrea', 'EE' => 'Estonia', 'ET' => 'Ethiopia', 'FK' => 'Falkland Islands (Malvinas)', 'FO' => 'Faroe Islands', 'FJ' => 'Fiji', 'FI' => 'Finland', 'FR' => 'France', 'GF' => 'French Guiana', 'PF' => 'French Polynesia', 'TF' => 'French Southern Territories', 'GA' => 'Gabon', 'GM' => 'Gambia', 'GE' => 'Georgia', 'DE' => 'Germany', 'GH' => 'Ghana', 'GI' => 'Gibraltar', 'GR' => 'Greece', 'GL' => 'Greenland', 'GD' => 'Grenada', 'GP' => 'Guadeloupe', 'GU' => 'Guam', 'GT' => 'Guatemala', 'GG' => 'Guernsey', 'GN' => 'Guinea', 'GW' => 'Guinea-Bissau', 'GY' => 'Guyana', 'HT' => 'Haiti', 'HM' => 'Heard Island & Mcdonald Islands', 'VA' => 'Holy See (Vatican City State)', 'HN' => 'Honduras', 'HK' => 'Hong Kong', 'HU' => 'Hungary', 'IS' => 'Iceland', 'IN' => 'India', 'ID' => 'Indonesia', 'IR' => 'Iran, Islamic Republic Of', 'IQ' => 'Iraq', 'IE' => 'Ireland', 'IM' => 'Isle Of Man', 'IL' => 'Israel', 'IT' => 'Italy', 'JM' => 'Jamaica', 'JP' => 'Japan', 'JE' => 'Jersey', 'JO' => 'Jordan', 'KZ' => 'Kazakhstan', 'KE' => 'Kenya', 'KI' => 'Kiribati', 'KR' => 'Korea', 'KW' => 'Kuwait', 'KG' => 'Kyrgyzstan', 'LA' => 'Lao People\'s Democratic Republic', 'LV' => 'Latvia', 'LB' => 'Lebanon', 'LS' => 'Lesotho', 'LR' => 'Liberia', 'LY' => 'Libyan Arab Jamahiriya', 'LI' => 'Liechtenstein', 'LT' => 'Lithuania', 'LU' => 'Luxembourg', 'MO' => 'Macao', 'MK' => 'Macedonia', 'MG' => 'Madagascar', 'MW' => 'Malawi', 'MY' => 'Malaysia', 'MV' => 'Maldives', 'ML' => 'Mali', 'MT' => 'Malta', 'MH' => 'Marshall Islands', 'MQ' => 'Martinique', 'MR' => 'Mauritania', 'MU' => 'Mauritius', 'YT' => 'Mayotte', 'MX' => 'Mexico', 'FM' => 'Micronesia, Federated States Of', 'MD' => 'Moldova', 'MC' => 'Monaco', 'MN' => 'Mongolia', 'ME' => 'Montenegro', 'MS' => 'Montserrat', 'MA' => 'Morocco', 'MZ' => 'Mozambique', 'MM' => 'Myanmar', 'NA' => 'Namibia', 'NR' => 'Nauru', 'NP' => 'Nepal', 'NL' => 'Netherlands', 'AN' => 'Netherlands Antilles', 'NC' => 'New Caledonia', 'NZ' => 'New Zealand', 'NI' => 'Nicaragua', 'NE' => 'Niger', 'NG' => 'Nigeria', 'NU' => 'Niue', 'NF' => 'Norfolk Island', 'MP' => 'Northern Mariana Islands', 'NO' => 'Norway', 'OM' => 'Oman', 'PK' => 'Pakistan', 'PW' => 'Palau', 'PS' => 'Palestinian Territory, Occupied', 'PA' => 'Panama', 'PG' => 'Papua New Guinea', 'PY' => 'Paraguay', 'PE' => 'Peru', 'PH' => 'Philippines', 'PN' => 'Pitcairn', 'PL' => 'Poland', 'PT' => 'Portugal', 'PR' => 'Puerto Rico', 'QA' => 'Qatar', 'RE' => 'Reunion', 'RO' => 'Romania', 'RU' => 'Russian Federation', 'RW' => 'Rwanda', 'BL' => 'Saint Barthelemy', 'SH' => 'Saint Helena', 'KN' => 'Saint Kitts And Nevis', 'LC' => 'Saint Lucia', 'MF' => 'Saint Martin', 'PM' => 'Saint Pierre And Miquelon', 'VC' => 'Saint Vincent And Grenadines', 'WS' => 'Samoa', 'SM' => 'San Marino', 'ST' => 'Sao Tome And Principe', 'SA' => 'Saudi Arabia', 'SN' => 'Senegal', 'RS' => 'Serbia', 'SC' => 'Seychelles', 'SL' => 'Sierra Leone', 'SG' => 'Singapore', 'SK' => 'Slovakia', 'SI' => 'Slovenia', 'SB' => 'Solomon Islands', 'SO' => 'Somalia', 'ZA' => 'South Africa', 'GS' => 'South Georgia And Sandwich Isl.', 'ES' => 'Spain', 'LK' => 'Sri Lanka', 'SD' => 'Sudan', 'SR' => 'Suriname', 'SJ' => 'Svalbard And Jan Mayen', 'SZ' => 'Swaziland', 'SE' => 'Sweden', 'CH' => 'Switzerland', 'SY' => 'Syrian Arab Republic', 'TW' => 'Taiwan', 'TJ' => 'Tajikistan', 'TZ' => 'Tanzania', 'TH' => 'Thailand', 'TL' => 'Timor-Leste', 'TG' => 'Togo', 'TK' => 'Tokelau', 'TO' => 'Tonga', 'TT' => 'Trinidad And Tobago', 'TN' => 'Tunisia', 'TR' => 'Turkey', 'TM' => 'Turkmenistan', 'TC' => 'Turks And Caicos Islands', 'TV' => 'Tuvalu', 'UG' => 'Uganda', 'UA' => 'Ukraine', 'AE' => 'United Arab Emirates', 'GB' => 'United Kingdom', 'US' => 'United States', 'UM' => 'United States Outlying Islands', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', 'VU' => 'Vanuatu', 'VE' => 'Venezuela', 'VN' => 'Viet Nam', 'VG' => 'Virgin Islands, British', 'VI' => 'Virgin Islands, U.S.', 'WF' => 'Wallis And Futuna', 'EH' => 'Western Sahara', 'XK' => 'Kosovo', 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe']; - if (isset($countries[$countryCode])) { - return $countries[$countryCode]; - } - - return 'Unknown Country'; + return CountryHelper::name($countryCode); } } if (! function_exists('distance')) { - function distance($lat1, $lon1, $lat2, $lon2, $unit) + /** + * Great-circle distance between two points in nautical miles + */ + function distance(float $lat1, float $lon1, float $lat2, float $lon2): float { - - $theta = $lon1 - $lon2; - $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); - $dist = acos($dist); - $dist = rad2deg($dist); - $miles = $dist * 60 * 1.1515; - $unit = strtoupper($unit); - - if ($unit == 'K') { - return $miles * 1.609344; - } elseif ($unit == 'N') { - return $miles * 0.8684; - } else { - return $miles; - } + return (new Haversine)->getDistance(new Coordinate($lat1, $lon1), new Coordinate($lat2, $lon2)) / 1852; } } diff --git a/app/Http/Controllers/API/MapController.php b/app/Http/Controllers/API/MapController.php index 94e35188..c336c4b3 100644 --- a/app/Http/Controllers/API/MapController.php +++ b/app/Http/Controllers/API/MapController.php @@ -102,16 +102,13 @@ public function getAirport(Request $request) } } - // Replace * with '' in all airline iata codes - foreach ($airlines as $airline) { - $airline->iata_code = str_replace('*', '', $airline->iata_code); - } } $airport = Airport::select('id', 'icao', 'name', 'iso_country')->with(['runways' => function ($query) { $query->where('closed', false)->whereNotNull('length_ft'); }])->where('id', $secondaryAirport)->first(); $metar = isset($airport->metar) ? $airport->metar->metar : null; + $taf = optional($airport->taf)->raw_text; // Add name of country $airport->country = getCountryName($airport->iso_country); @@ -125,6 +122,7 @@ public function getAirport(Request $request) return response()->json(['message' => 'Success', 'data' => [ 'airport' => $airport->toArray(), 'metar' => $metar, + 'taf' => $taf, 'airlines' => $airlines, 'lists' => $lists, ]], 200); @@ -164,8 +162,6 @@ public function getFlights(Request $request) } } - $airline->iata_code = str_replace('*', '', $airline->iata_code); - if (isset($flights)) { return response()->json(['message' => 'Success', 'data' => [ 'flights' => $flights, @@ -293,8 +289,6 @@ private function handleSuccessfulFsacResponse($fsacResponse, $airportIcao) // Add scenery to return data $returnData[$supportedApiSimulators[$compatibleSimulator]->shortened_name][] = SceneryHelper::prepareSceneryData($sceneryDeveloperModel, $sceneryModel, [ 'link' => $scenery->link, - 'currencyLink' => $cheapestStore->currencyLink, - 'cheapestLink' => $cheapestStore->link, 'cheapestStore' => $cheapestStore->store, 'cheapestPrice' => $cheapestStore->currencyPrice, 'ratingAverage' => $scenery->ratingAverage, diff --git a/app/Http/Controllers/API/SearchController.php b/app/Http/Controllers/API/SearchController.php index bd857ce7..df1b3c39 100644 --- a/app/Http/Controllers/API/SearchController.php +++ b/app/Http/Controllers/API/SearchController.php @@ -2,12 +2,16 @@ namespace App\Http\Controllers\API; +use App\Helpers\AircraftHelper; use App\Helpers\CalculationHelper; +use App\Helpers\ScoreHelper; use App\Http\Controllers\Controller; -use App\Http\Controllers\ScoreController; +use App\Http\Resources\AirportResource; +use App\Http\Resources\SuggestedAirportResource; use App\Models\Airport; use App\Rules\AirportExists; use App\Rules\ValidDestinations; +use App\Rules\ValidScores; use Illuminate\Http\Request; class SearchController extends Controller @@ -22,10 +26,12 @@ public function search(Request $request) 'departure' => ['nullable', new AirportExists], 'arrival' => ['nullable', new AirportExists], 'destinations' => ['sometimes', 'array', new ValidDestinations], - 'codeletter' => ['required', 'string', 'in:GA,GAT,GTP,JS,JM,JML,JL,JXL'], + 'codeletter' => ['required', 'string', 'in:' . implode(',', AircraftHelper::codes())], 'airtimeMin' => ['sometimes', 'numeric', 'between:0,24'], 'airtimeMax' => ['sometimes', 'numeric', 'between:0,24'], - 'scores' => ['sometimes', 'array'], + 'distanceMin' => ['sometimes', 'numeric', 'min:0'], + 'distanceMax' => ['sometimes', 'numeric', 'min:0'], + 'scores' => ['sometimes', 'array', new ValidScores], 'metcondition' => ['sometimes', 'in:IFR,VFR,ANY'], 'destinationWithRoutesOnly' => ['sometimes', 'numeric', 'between:-1,1'], 'destinationRunwayLights' => ['sometimes', 'numeric', 'between:-1,1'], @@ -42,29 +48,35 @@ public function search(Request $request) 'limit' => ['sometimes', 'integer', 'between:1,30'], ]); - isset($data['departure']) ? $departure = $data['departure'] : $departure = null; - isset($data['arrival']) ? $arrival = $data['arrival'] : $arrival = null; - isset($data['destinations']) ? $destinations = $data['destinations'] : $destinations = ['continents' => null, 'countries' => null, 'states' => null]; + $departure = $data['departure'] ?? null; + $arrival = $data['arrival'] ?? null; + $destinations = $data['destinations'] ?? ['continents' => null, 'countries' => null, 'states' => null]; $codeletter = $data['codeletter']; - isset($data['airtimeMin']) ? $airtimeMin = $data['airtimeMin'] : $airtimeMin = 0; - isset($data['airtimeMax']) ? $airtimeMax = $data['airtimeMax'] : $airtimeMax = 24; - isset($data['scores']) ? $filterByScores = array_map('intval', $data['scores']) : $filterByScores = null; - isset($data['metcondition']) ? $metcon = $data['metcondition'] : $metcon = null; - isset($data['destinationRunwayLights']) ? $destinationRunwayLights = (int) $data['destinationRunwayLights'] : $destinationRunwayLights = 0; - isset($data['destinationAirbases']) ? $destinationAirbases = (int) $data['destinationAirbases'] : $destinationAirbases = -1; - (isset($data['destinationAirportSize']) && ! empty($data['destinationAirportSize'])) ? $destinationAirportSize = $data['destinationAirportSize'] : $destinationAirportSize = ['small_airport', 'medium_airport', 'large_airport']; - isset($data['temperatureMin']) ? $temperatureMin = $data['temperatureMin'] : $temperatureMin = -60; - isset($data['temperatureMax']) ? $temperatureMax = $data['temperatureMax'] : $temperatureMax = 60; - isset($data['elevationMin']) ? $elevationMin = $data['elevationMin'] : $elevationMin = -2000; - isset($data['elevationMax']) ? $elevationMax = $data['elevationMax'] : $elevationMax = 18000; - isset($data['rwyLengthMin']) ? $rwyLengthMin = $data['rwyLengthMin'] : $rwyLengthMin = 0; - isset($data['rwyLengthMax']) ? $rwyLengthMax = $data['rwyLengthMax'] : $rwyLengthMax = 17000; - - isset($data['arrivalWhitelist']) ? $arrivalWhitelist = $data['arrivalWhitelist'] : $arrivalWhitelist = null; - isset($data['limit']) ? $resultLimit = $data['limit'] : $resultLimit = 10; + $airtimeMin = $data['airtimeMin'] ?? 0; + $airtimeMax = $data['airtimeMax'] ?? 24; + $filterByScores = isset($data['scores']) ? array_map('intval', $data['scores']) : null; + $metcon = $data['metcondition'] ?? null; + $destinationRunwayLights = (int) ($data['destinationRunwayLights'] ?? 0); + $destinationAirbases = (int) ($data['destinationAirbases'] ?? -1); + $destinationAirportSize = ! empty($data['destinationAirportSize'] ?? []) ? $data['destinationAirportSize'] : ['small_airport', 'medium_airport', 'large_airport']; + $temperatureMin = $data['temperatureMin'] ?? -60; + $temperatureMax = $data['temperatureMax'] ?? 60; + $elevationMin = $data['elevationMin'] ?? -2000; + $elevationMax = $data['elevationMax'] ?? 18000; + $rwyLengthMin = $data['rwyLengthMin'] ?? 0; + $rwyLengthMax = $data['rwyLengthMax'] ?? 17000; + $arrivalWhitelist = $data['arrivalWhitelist'] ?? null; + $resultLimit = $data['limit'] ?? 10; [$minDistance, $maxDistance] = CalculationHelper::aircraftNmPerHourRange($codeletter, $airtimeMin, $airtimeMax); + // Intersect the airtime-derived range with the explicit distance + // filter (NM); either bound is unbounded when absent + $minDistance = max($minDistance, $data['distanceMin'] ?? 0); + if (isset($data['distanceMax'])) { + $maxDistance = min($maxDistance, $data['distanceMax']); + } + if (($arrival && $departure) || (! $arrival && ! $departure)) { // Dont allow this, return error json return response()->json([ @@ -106,28 +118,46 @@ public function search(Request $request) * Fetch the requested data */ if ($departure) { - $airport = Airport::where('icao', $departure)->orWhere('local_code', $departure)->get()->first(); + $airport = Airport::where('icao', $departure)->orWhere('local_code', $departure)->first(); } else { - $airport = Airport::where('icao', $arrival)->orWhere('local_code', $arrival)->get()->first(); + $airport = Airport::where('icao', $arrival)->orWhere('local_code', $arrival)->first(); } - $airports = collect(); + // Calculate the ETA for sorting + $candidatesAreDepartures = (bool) $arrival; + $eta = $candidatesAreDepartures ? now() : CalculationHelper::forecastEtaSql($airport, $codeletter); + + // Phase 1: fetch the full candidate pool as thin id + score_count rows. + // Selecting only the id keeps the grouped/sorted temp table in memory + // (airports.* drags the GEOMETRY column in, forcing it to disk), while + // the whole pool is still fetched so a refresh can shuffle up a + // different subset among equally-scored airports. $airports = Airport::airportOpen()->notIcao($airport->icao)->isAirportSize($destinationAirportSize) ->inContinent($destinations)->inCountry($destinations, $airport->iso_country)->inState($destinations) ->withinDistance($airport, $minDistance, $maxDistance, $airport->icao) ->filterRunwayLengths($rwyLengthMin, $rwyLengthMax, $codeletter)->filterRunwayLights($destinationRunwayLights) - ->filterAirbases($destinationAirbases)->filterByScores($filterByScores) + ->filterAirbases($destinationAirbases)->filterByScores($filterByScores, $eta, $candidatesAreDepartures) ->returnOnlyWhitelistedIcao($arrivalWhitelist) - ->sortByScores(($filterByScores) ? array_flip($filterByScores) : ScoreController::getWeatherTypes()) - ->has('metar')->with('runways', 'scores', 'metar') + ->select('airports.id') + ->sortByScores(($filterByScores) ? array_keys($filterByScores) : ScoreHelper::weatherTypes(), $eta, $candidatesAreDepartures) + ->has('metar') ->get(); - // Shuffle and limit the results to 20 + // Shuffle within equal-score buckets and limit the results to 20 $airports = $airports->groupBy('score_count')->map(function ($group) { return $group->shuffle(); })->flatten(1)->take(20); - $suggestedAirports = $airports->filterWithCriteria($airport, $codeletter, $airtimeMin, $airtimeMax, $metcon, $temperatureMin, $temperatureMax, $rwyLengthMin, $rwyLengthMax, $elevationMin, $elevationMax); + // Phase 2: hydrate only the picked airports, preserving the shuffled order + $airportIds = $airports->pluck('id')->all(); + $scoreCounts = $airports->pluck('score_count', 'id'); + + $airports = Airport::with('runways', 'scores', 'metar', 'taf.forecasts') + ->findMany($airportIds) + ->sortBy(fn ($suggested) => array_search($suggested->id, $airportIds))->values() + ->each(fn ($suggested) => $suggested->score_count = $scoreCounts->get($suggested->id)); + + $suggestedAirports = $airports->filterWithCriteria($airport, $codeletter, $metcon, $temperatureMin, $temperatureMax, $elevationMin, $elevationMax, $candidatesAreDepartures); /** * Prepare the data for the response @@ -135,9 +165,9 @@ public function search(Request $request) // Then in your main function if ($departure) { - [$airportData, $arrivalData] = $this->prepareAirportData($airport, $suggestedAirports); + [$airportData, $arrivalData] = $this->prepareAirportData($airport, $suggestedAirports, true); } else { - [$airportData, $departureData] = $this->prepareAirportData($airport, $suggestedAirports); + [$airportData, $departureData] = $this->prepareAirportData($airport, $suggestedAirports, false); } // Send the response @@ -151,40 +181,14 @@ public function search(Request $request) } - public function prepareAirportData($airport, $suggestedAirports) + public function prepareAirportData($airport, $suggestedAirports, bool $anchorIsDeparture = false) { - $airportData = [ - 'name' => $airport->name, - 'icao' => $airport->icao, - 'iata' => $airport->iata_code ? $airport->iata_code : null, - 'contient' => $airport->continent, - 'country' => $airport->iso_country, - 'region' => $airport->iso_region, - 'metar' => (config('app.env') == 'production') ? $airport->metar->metar : 'TEST-DATA ' . $airport->metar->metar, - 'longestRwyFt' => $airport->longestRunway(), - 'scores' => $airport->scores->pluck('reason'), - ]; - - $suggestedData = collect(); - foreach ($suggestedAirports as $suggestedAirport) { - $scores = $suggestedAirport->scores->pluck('reason'); - $suggestedData->push([ - 'name' => $suggestedAirport->name, - 'icao' => $suggestedAirport->icao, - 'iata' => $suggestedAirport->iata_code ? $suggestedAirport->iata_code : null, - 'contient' => $suggestedAirport->continent, - 'country' => $suggestedAirport->iso_country, - 'region' => $suggestedAirport->iso_region, - 'metar' => (config('app.env') == 'production') ? $suggestedAirport->metar->metar : 'TEST-DATA ' . $suggestedAirport->metar->metar, - 'longestRwyFt' => $suggestedAirport->longestRunway(), - 'scores' => $scores, - 'airtime' => $suggestedAirport->airtime, - 'distanceNm' => $suggestedAirport->distance, - 'isAirforcebase' => $suggestedAirport->w2f_airforcebase, - 'hasAirlineService' => $suggestedAirport->w2f_scheduled_service, - ]); - } + [$scores] = $airport->scoresAtEta(now(), $anchorIsDeparture); + $airport->setRelation('scores', $scores); - return [$airportData, $suggestedData]; + return [ + new AirportResource($airport), + SuggestedAirportResource::collection($suggestedAirports), + ]; } } diff --git a/app/Http/Controllers/API/TopController.php b/app/Http/Controllers/API/TopController.php index f1275a7e..a54334e4 100644 --- a/app/Http/Controllers/API/TopController.php +++ b/app/Http/Controllers/API/TopController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; +use App\Http\Resources\AirportResource; use App\Models\AirportScore; use Illuminate\Http\Request; @@ -16,10 +17,10 @@ public function index(Request $request) 'limit' => 'sometimes|integer|between:1,30', ]); $continent = $data['continent'] ?? null; - isset($data['limit']) ? $resultLimit = $data['limit'] : $resultLimit = 10; + $resultLimit = $data['limit'] ?? 10; $airportScores = AirportScore::getTopAirports($continent, null, $resultLimit); - $airports = $this->prepareResponse($airportScores); + $airports = AirportResource::collection($airportScores->pluck('airport')); return response()->json([ 'message' => 'Success', @@ -36,10 +37,10 @@ public function indexWhitelist(Request $request) 'limit' => 'sometimes|integer|between:1,30', ]); - isset($data['limit']) ? $resultLimit = $data['limit'] : $resultLimit = 10; + $resultLimit = $data['limit'] ?? 10; $airportScores = AirportScore::getTopAirports(null, $data['whitelist'], $resultLimit); - $airports = $this->prepareResponse($airportScores); + $airports = AirportResource::collection($airportScores->pluck('airport')); return response()->json([ 'message' => 'Success', @@ -47,30 +48,4 @@ public function indexWhitelist(Request $request) ], 200); } - - private function prepareResponse($airportScores) - { - $result = collect(); - - foreach ($airportScores as $as) { - - $scores = $as->airport->scores->pluck('reason'); - - $result->push([ - - 'name' => $as->airport->name, - 'icao' => $as->airport->icao, - 'iata' => $as->airport->iata_code ? $as->airport->iata_code : null, - 'contient' => $as->airport->continent, - 'country' => $as->airport->iso_country, - 'region' => $as->airport->iso_region, - 'metar' => (config('app.env') == 'production') ? $as->airport->metar->metar : 'TEST-DATA ' . $as->airport->metar->metar, - 'longestRwyFt' => $as->airport->longestRunway(), - 'scores' => $scores, - - ]); - } - - return $result; - } } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 7a2c3bc1..9791beac 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -27,16 +27,12 @@ public function login(Request $request, User $user) ]); $user = User::where('username', $request->username)->orWhere('email', $request->username)->first(); - $remember = ($request->remember) ? true : false; + $remember = (bool) $request->remember; // Check if the user exists and the password is correct if ($user && Hash::check($request->password, $user->password)) { - if ($remember) { - Auth::login($user, true); - } else { - Auth::login($user); - } + Auth::login($user, $remember); // Route to the original url the user was trying to access before promoted with login if ($request->session()->has('url.intended')) { diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 6154418c..e7f7c94b 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -3,14 +3,8 @@ namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; -use Illuminate\Foundation\Bus\DispatchesJobs; -use Illuminate\Foundation\Validation\ValidatesRequests; -use Illuminate\Routing\Controller as BaseController; -/** - * Some standard controller extending base. - */ -class Controller extends BaseController +abstract class Controller { - use AuthorizesRequests, DispatchesJobs, ValidatesRequests; + use AuthorizesRequests; } diff --git a/app/Http/Controllers/FeedbackController.php b/app/Http/Controllers/FeedbackController.php index 147efc3d..35989c59 100644 --- a/app/Http/Controllers/FeedbackController.php +++ b/app/Http/Controllers/FeedbackController.php @@ -67,7 +67,7 @@ public function storeVote() ]); // Check if the user has already voted for this issue - $existingVote = FeedbackVote::where('user_id', auth()->user()->id) + $existingVote = FeedbackVote::where('user_id', auth()->id()) ->where('github_issue_number', $data['github_issue_number']) ->first(); @@ -77,7 +77,7 @@ public function storeVote() // Create the vote FeedbackVote::create([ - 'user_id' => auth()->user()->id, + 'user_id' => auth()->id(), 'github_issue_number' => $data['github_issue_number'], ]); @@ -90,7 +90,7 @@ public function storeVote() public function destroyVote(string $id) { // Check if the vote exists - $vote = FeedbackVote::where('user_id', auth()->user()->id) + $vote = FeedbackVote::where('user_id', auth()->id()) ->where('github_issue_number', $id) ->first(); @@ -170,12 +170,10 @@ private function fetchVotes() $allVotes = FeedbackVote::all(); // Group votes by issue number and count them - $groupedVotes = $allVotes->groupBy('github_issue_number')->map(function ($votes) { - return $votes->count(); - }); + $groupedVotes = $allVotes->groupBy('github_issue_number')->map->count(); // Get the votes of the current user - $userVotes = auth()->user() ? $allVotes->where('user_id', auth()->user()->id)->pluck('github_issue_number')->toArray() : null; + $userVotes = auth()->check() ? $allVotes->where('user_id', auth()->id())->pluck('github_issue_number')->toArray() : null; return [$groupedVotes, $userVotes]; } diff --git a/app/Http/Controllers/SceneryController.php b/app/Http/Controllers/SceneryController.php index 45f4dcfc..e854ec1a 100644 --- a/app/Http/Controllers/SceneryController.php +++ b/app/Http/Controllers/SceneryController.php @@ -48,7 +48,7 @@ public function store(Request $request) $scenery = new SceneryDeveloper(); $scenery->icao = strtoupper($request->icao); $scenery->developer = $request->developer; - $scenery->airport_id = Airport::where('icao', $request->icao)->get()->first()->id; + $scenery->airport_id = Airport::where('icao', $request->icao)->first()->id; $scenery->save(); } @@ -59,7 +59,7 @@ public function store(Request $request) 'scenery_developer_id' => $scenery->id, 'simulator_id' => $simulatorId, 'link' => $request->link, - 'payware' => $request->payware ? true : false, + 'payware' => (bool) $request->payware, 'published' => false, 'source' => 'user_contribution', 'suggested_by_user_id' => Auth::id(), @@ -110,8 +110,8 @@ public function update(Request $request, Scenery $scenery) $sceneryDeveloper->save(); $scenery->link = $request->link; - $scenery->payware = $request->payware ? true : false; - $scenery->published = $request->published ? true : false; + $scenery->payware = (bool) $request->payware; + $scenery->published = (bool) $request->published; $scenery->source = 'user_contribution'; $scenery->suggested_by_user_id = ($request->suggested_by_user_id) ? $request->suggested_by_user_id : Auth::id(); $scenery->save(); @@ -139,9 +139,9 @@ public function indexAirports(Request $request, ?string $filteredSim = null) $filteredSimulator = $availableSimulators->where('shortened_name', $filteredSim)->first(); if ($filteredSimulator) { - $airports = Airport::whereHasPublishedSceneries(true, $filteredSimulator->id)->get(); + $airports = Airport::publishedSceneries(true, $filteredSimulator->id)->get(); } else { - $airports = Airport::whereHasPublishedSceneries(true)->get(); + $airports = Airport::publishedSceneries(true)->get(); } $airportMapData = json_encode(MapHelper::generateAirportMapDataFromAirports($airports)); diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 15debe87..8b4b3243 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -2,7 +2,10 @@ namespace App\Http\Controllers; +use App\Helpers\AircraftHelper; use App\Helpers\CalculationHelper; +use App\Helpers\CountryHelper; +use App\Helpers\ScoreHelper; use App\Models\Aircraft; use App\Models\Airline; use App\Models\Airport; @@ -22,10 +25,6 @@ class SearchController extends Controller { - public static $countries = ['AF' => 'Afghanistan', 'AL' => 'Albania', 'DZ' => 'Algeria', 'AS' => 'American Samoa', 'AD' => 'Andorra', 'AO' => 'Angola', 'AI' => 'Anguilla', 'AQ' => 'Antarctica', 'AG' => 'Antigua And Barbuda', 'AR' => 'Argentina', 'AM' => 'Armenia', 'AW' => 'Aruba', 'AU' => 'Australia', 'AT' => 'Austria', 'AZ' => 'Azerbaijan', 'BS' => 'Bahamas', 'BH' => 'Bahrain', 'BD' => 'Bangladesh', 'BB' => 'Barbados', 'BY' => 'Belarus', 'BE' => 'Belgium', 'BZ' => 'Belize', 'BJ' => 'Benin', 'BM' => 'Bermuda', 'BT' => 'Bhutan', 'BO' => 'Bolivia', 'BA' => 'Bosnia And Herzegovina', 'BW' => 'Botswana', 'BV' => 'Bouvet Island', 'BR' => 'Brazil', 'IO' => 'British Indian Ocean Territory', 'BN' => 'Brunei Darussalam', 'BG' => 'Bulgaria', 'BF' => 'Burkina Faso', 'BI' => 'Burundi', 'KH' => 'Cambodia', 'CM' => 'Cameroon', 'CA' => 'Canada', 'CV' => 'Cape Verde', 'KY' => 'Cayman Islands', 'CF' => 'Central African Republic', 'TD' => 'Chad', 'CL' => 'Chile', 'CN' => 'China', 'CX' => 'Christmas Island', 'CC' => 'Cocos (Keeling) Islands', 'CO' => 'Colombia', 'KM' => 'Comoros', 'CG' => 'Congo', 'CD' => 'Congo, Democratic Republic', 'CK' => 'Cook Islands', 'CR' => 'Costa Rica', 'CI' => 'Cote D\'Ivoire', 'HR' => 'Croatia', 'CU' => 'Cuba', 'CY' => 'Cyprus', 'CZ' => 'Czech Republic', 'DK' => 'Denmark', 'DJ' => 'Djibouti', 'DM' => 'Dominica', 'DO' => 'Dominican Republic', 'EC' => 'Ecuador', 'EG' => 'Egypt', 'SV' => 'El Salvador', 'GQ' => 'Equatorial Guinea', 'ER' => 'Eritrea', 'EE' => 'Estonia', 'ET' => 'Ethiopia', 'FK' => 'Falkland Islands (Malvinas)', 'FO' => 'Faroe Islands', 'FJ' => 'Fiji', 'FI' => 'Finland', 'FR' => 'France', 'GF' => 'French Guiana', 'PF' => 'French Polynesia', 'TF' => 'French Southern Territories', 'GA' => 'Gabon', 'GM' => 'Gambia', 'GE' => 'Georgia', 'DE' => 'Germany', 'GH' => 'Ghana', 'GI' => 'Gibraltar', 'GR' => 'Greece', 'GL' => 'Greenland', 'GD' => 'Grenada', 'GP' => 'Guadeloupe', 'GU' => 'Guam', 'GT' => 'Guatemala', 'GG' => 'Guernsey', 'GN' => 'Guinea', 'GW' => 'Guinea-Bissau', 'GY' => 'Guyana', 'HT' => 'Haiti', 'HM' => 'Heard Island & Mcdonald Islands', 'VA' => 'Holy See (Vatican City State)', 'HN' => 'Honduras', 'HK' => 'Hong Kong', 'HU' => 'Hungary', 'IS' => 'Iceland', 'IN' => 'India', 'ID' => 'Indonesia', 'IR' => 'Iran, Islamic Republic Of', 'IQ' => 'Iraq', 'IE' => 'Ireland', 'IM' => 'Isle Of Man', 'IL' => 'Israel', 'IT' => 'Italy', 'JM' => 'Jamaica', 'JP' => 'Japan', 'JE' => 'Jersey', 'JO' => 'Jordan', 'KZ' => 'Kazakhstan', 'KE' => 'Kenya', 'KI' => 'Kiribati', 'KR' => 'Korea', 'KW' => 'Kuwait', 'KG' => 'Kyrgyzstan', 'LA' => 'Lao People\'s Democratic Republic', 'LV' => 'Latvia', 'LB' => 'Lebanon', 'LS' => 'Lesotho', 'LR' => 'Liberia', 'LY' => 'Libyan Arab Jamahiriya', 'LI' => 'Liechtenstein', 'LT' => 'Lithuania', 'LU' => 'Luxembourg', 'MO' => 'Macao', 'MK' => 'Macedonia', 'MG' => 'Madagascar', 'MW' => 'Malawi', 'MY' => 'Malaysia', 'MV' => 'Maldives', 'ML' => 'Mali', 'MT' => 'Malta', 'MH' => 'Marshall Islands', 'MQ' => 'Martinique', 'MR' => 'Mauritania', 'MU' => 'Mauritius', 'YT' => 'Mayotte', 'MX' => 'Mexico', 'FM' => 'Micronesia, Federated States Of', 'MD' => 'Moldova', 'MC' => 'Monaco', 'MN' => 'Mongolia', 'ME' => 'Montenegro', 'MS' => 'Montserrat', 'MA' => 'Morocco', 'MZ' => 'Mozambique', 'MM' => 'Myanmar', 'NA' => 'Namibia', 'NR' => 'Nauru', 'NP' => 'Nepal', 'NL' => 'Netherlands', 'AN' => 'Netherlands Antilles', 'NC' => 'New Caledonia', 'NZ' => 'New Zealand', 'NI' => 'Nicaragua', 'NE' => 'Niger', 'NG' => 'Nigeria', 'NU' => 'Niue', 'NF' => 'Norfolk Island', 'MP' => 'Northern Mariana Islands', 'NO' => 'Norway', 'OM' => 'Oman', 'PK' => 'Pakistan', 'PW' => 'Palau', 'PS' => 'Palestinian Territory, Occupied', 'PA' => 'Panama', 'PG' => 'Papua New Guinea', 'PY' => 'Paraguay', 'PE' => 'Peru', 'PH' => 'Philippines', 'PN' => 'Pitcairn', 'PL' => 'Poland', 'PT' => 'Portugal', 'PR' => 'Puerto Rico', 'QA' => 'Qatar', 'RE' => 'Reunion', 'RO' => 'Romania', 'RU' => 'Russian Federation', 'RW' => 'Rwanda', 'BL' => 'Saint Barthelemy', 'SH' => 'Saint Helena', 'KN' => 'Saint Kitts And Nevis', 'LC' => 'Saint Lucia', 'MF' => 'Saint Martin', 'PM' => 'Saint Pierre And Miquelon', 'VC' => 'Saint Vincent And Grenadines', 'WS' => 'Samoa', 'SM' => 'San Marino', 'ST' => 'Sao Tome And Principe', 'SA' => 'Saudi Arabia', 'SN' => 'Senegal', 'RS' => 'Serbia', 'SC' => 'Seychelles', 'SL' => 'Sierra Leone', 'SG' => 'Singapore', 'SK' => 'Slovakia', 'SI' => 'Slovenia', 'SB' => 'Solomon Islands', 'SO' => 'Somalia', 'ZA' => 'South Africa', 'GS' => 'South Georgia And Sandwich Isl.', 'ES' => 'Spain', 'LK' => 'Sri Lanka', 'SD' => 'Sudan', 'SR' => 'Suriname', 'SJ' => 'Svalbard And Jan Mayen', 'SZ' => 'Swaziland', 'SE' => 'Sweden', 'CH' => 'Switzerland', 'SY' => 'Syrian Arab Republic', 'TW' => 'Taiwan', 'TJ' => 'Tajikistan', 'TZ' => 'Tanzania', 'TH' => 'Thailand', 'TL' => 'Timor-Leste', 'TG' => 'Togo', 'TK' => 'Tokelau', 'TO' => 'Tonga', 'TT' => 'Trinidad And Tobago', 'TN' => 'Tunisia', 'TR' => 'Turkey', 'TM' => 'Turkmenistan', 'TC' => 'Turks And Caicos Islands', 'TV' => 'Tuvalu', 'UG' => 'Uganda', 'UA' => 'Ukraine', 'AE' => 'United Arab Emirates', 'GB' => 'United Kingdom', 'US' => 'United States', 'UM' => 'United States Outlying Islands', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', 'VU' => 'Vanuatu', 'VE' => 'Venezuela', 'VN' => 'Viet Nam', 'VG' => 'Virgin Islands, British', 'VI' => 'Virgin Islands, U.S.', 'WF' => 'Wallis And Futuna', 'EH' => 'Western Sahara', 'XK' => 'Kosovo', 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe']; - - public static $usStates = ['AL' => 'Alabama', 'AK' => 'Alaska', 'AZ' => 'Arizona', 'AR' => 'Arkansas', 'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware', 'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho', 'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas', 'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine', 'MD' => 'Maryland', 'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MS' => 'Mississippi', 'MO' => 'Missouri', 'MT' => 'Montana', 'NE' => 'Nebraska', 'NV' => 'Nevada', 'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NY' => 'New York', 'NC' => 'North Carolina', 'ND' => 'North Dakota', 'OH' => 'Ohio', 'OK' => 'Oklahoma', 'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina', 'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah', 'VT' => 'Vermont', 'VA' => 'Virginia', 'WA' => 'Washington', 'WV' => 'West Virginia', 'WI' => 'Wisconsin', 'WY' => 'Wyoming']; - /** * Display a listing of the resource. * @@ -33,30 +32,21 @@ class SearchController extends Controller */ public function indexArrivalSearch() { - $airlines = Airline::where('has_flights', true)->orderBy('name')->get(); - $aircrafts = Aircraft::all()->pluck('icao')->sort(); - $prefilledIcao = request()->input('icao'); - $destinationInputs = $this->getDestinationInputs(); - $whitelistDatabase = null; - - if (Auth::check()) { - $lists = UserList::where('user_id', Auth::id())->orWhere('public', true)->get(); - } else { - $lists = UserList::where('public', true)->get(); - } - - // Get whitelist table if present in old input - if (old('whitelists') !== null) { - $whitelistDatabase = $this->getWhitelistsFromInput(old('whitelists')); - } - - return view('front.arrivals', compact('airlines', 'aircrafts', 'prefilledIcao', 'lists', 'destinationInputs', 'whitelistDatabase')); + return $this->buildSearchView('front.arrivals'); } /** * Display a listing of the resource. */ public function indexDepartureSearch() + { + return $this->buildSearchView('front.departures'); + } + + /** + * Build the shared view data for the arrival/departure search forms. + */ + private function buildSearchView(string $view): View { $airlines = Airline::where('has_flights', true)->orderBy('name')->get(); $aircrafts = Aircraft::all()->pluck('icao')->sort(); @@ -64,17 +54,15 @@ public function indexDepartureSearch() $destinationInputs = $this->getDestinationInputs(); $whitelistDatabase = null; - if (Auth::check()) { - $lists = UserList::where('user_id', Auth::id())->orWhere('public', true)->get(); - } else { - $lists = UserList::where('public', true)->get(); - } + $lists = UserList::where('public', true) + ->when(Auth::check(), fn ($q) => $q->orWhere('user_id', Auth::id())) + ->get(); if (old('whitelists') !== null) { $whitelistDatabase = $this->getWhitelistsFromInput(old('whitelists')); } - return view('front.departures', compact('airlines', 'aircrafts', 'prefilledIcao', 'lists', 'destinationInputs', 'whitelistDatabase')); + return view($view, compact('airlines', 'aircrafts', 'prefilledIcao', 'lists', 'destinationInputs', 'whitelistDatabase')); } /** @@ -101,9 +89,11 @@ public function search(Request $request) 'direction' => ['required', 'in:arrival,departure'], 'destinations' => ['sometimes', 'array', new ValidDestinations], 'destinationExclusions' => ['sometimes', 'array', new ValidDestinations], - 'codeletter' => ['required', 'string', 'in:GA,GAT,GTP,JS,JM,JML,JL,JXL'], + 'codeletter' => ['required', 'string', 'in:' . implode(',', AircraftHelper::codes())], 'airtimeMin' => ['required', 'numeric', 'between:0,12'], 'airtimeMax' => ['required', 'numeric', 'between:0,12'], + 'distanceMin' => ['sometimes', 'numeric', 'between:0,6000'], + 'distanceMax' => ['sometimes', 'numeric', 'between:0,6000'], 'sortByWeather' => ['in:0,1'], 'sortByATC' => ['in:0,1'], 'whitelists' => ['sometimes', 'array'], @@ -150,10 +140,14 @@ public function search(Request $request) $airtimeMax = 24; } // If airtime is 12+ hours, bump it + // Optional so pre-existing bookmarked searches keep validating + $distanceMin = (int) ($data['distanceMin'] ?? 0); + $distanceMax = (int) ($data['distanceMax'] ?? 6000); + // Create a filter array based on input $sortByScores = []; - isset($data['sortByWeather']) ? $sortByScores = array_merge($sortByScores, ScoreController::getWeatherTypes()) : null; - isset($data['sortByATC']) ? $sortByScores = array_merge($sortByScores, ScoreController::getVatsimTypes()) : null; + isset($data['sortByWeather']) ? $sortByScores = array_merge($sortByScores, ScoreHelper::weatherTypes()) : null; + isset($data['sortByATC']) ? $sortByScores = array_merge($sortByScores, ScoreHelper::vatsimTypes()) : null; $whitelist = null; if (isset($data['whitelists'])) { @@ -178,75 +172,102 @@ public function search(Request $request) $rwyLengthMin = (int) $data['rwyLengthMin']; $rwyLengthMax = (int) $data['rwyLengthMax']; - isset($data['airlines']) ? $filterByAirlines = $data['airlines'] : $filterByAirlines = null; - isset($data['aircrafts']) ? $filterByAircrafts = $data['aircrafts'] : $filterByAircrafts = null; + $filterByAirlines = $data['airlines'] ?? null; + $filterByAircrafts = $data['aircrafts'] ?? null; [$minDistance, $maxDistance] = CalculationHelper::aircraftNmPerHourRange($codeletter, $airtimeMin, $airtimeMax); + // Intersect the airtime-derived range with the distance slider; the + // slider's top position means 6000+, i.e. no upper bound + $minDistance = max($minDistance, $distanceMin); + if ($distanceMax < 6000) { + $maxDistance = min($maxDistance, $distanceMax); + } + /** * Fetch the requested data */ + // The random-anchor candidate pool is identical between retry attempts, so + // fetch the matching ids once — no hydration — and draw per attempt. + $anchorIds = null; + if (! isset($data['icao'])) { + $anchorIds = Airport::airportOpen()->isAirportSize($destinationAirportSize) + ->filterRunwayLengths($rwyLengthMin, $rwyLengthMax, $codeletter)->filterRunwayLights($destinationRunwayLights) + ->filterAirbases($destinationAirbases)->filterByScores($filterByScores, now())->filterRoutesAndAirlines(null, $filterByAirlines, $filterByAircrafts, $destinationWithRoutesOnly) + ->returnOnlyWhitelistedIcao($whitelist) + ->has('metar') + ->pluck('airports.id'); + + if ($anchorIds->isEmpty()) { + return back()->withErrors(['airportNotFound' => 'No suitable airport combination could be found with given criteria'])->withInput(); + } + } + // Lets find an result with the given criteria. Give it a few attempts before we give up. - $maxAttempts = 20; + // With a fixed anchor the destination query is deterministic apart from the + // shuffle — an empty result stays empty, so retrying would only re-run the + // identical query. Retries only help the random-anchor path, where each + // attempt draws a new anchor. + $maxAttempts = isset($data['icao']) ? 1 : 20; for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) { - // Use the supplied departure or select a random airport + // Use the supplied departure or draw a random anchor from the pool $suggestedAirport = false; if (isset($data['icao'])) { - $primaryAirport = Airport::where('icao', $data['icao'])->orWhere('local_code', $data['icao'])->get()->first(); + $primaryAirport = Airport::where('icao', $data['icao'])->orWhere('local_code', $data['icao'])->first(); } else { - // Select primary airport based on the criteria - $primaryAirport = Airport::airportOpen()->isAirportSize($destinationAirportSize) - ->filterRunwayLengths($rwyLengthMin, $rwyLengthMax, $codeletter)->filterRunwayLights($destinationRunwayLights) - ->filterAirbases($destinationAirbases)->filterByScores($filterByScores)->filterRoutesAndAirlines(null, $filterByAirlines, $filterByAircrafts, $destinationWithRoutesOnly) - ->returnOnlyWhitelistedIcao($whitelist) - ->has('metar')->with('runways', 'scores', 'metar') - ->get(); - - // Shuffle and limit the results to 20 - $primaryAirport = $primaryAirport->groupBy('score_count')->map(function ($group) { - return $group->shuffle(); - })->flatten(1)->take(20); - - if (! $primaryAirport || ! $primaryAirport->count()) { - return back()->withErrors(['airportNotFound' => 'No suitable airport combination could be found with given criteria'])->withInput(); - } - - $primaryAirport = $primaryAirport->random(); + $primaryAirport = Airport::with('runways', 'scores', 'metar')->find($anchorIds->random()); $suggestedAirport = true; } - // Get airports according to filter - $airports = collect(); + // Calculate the ETA for sorting + $candidatesAreDepartures = $direction == 'arrival'; + $eta = $candidatesAreDepartures ? now() : CalculationHelper::forecastEtaSql($primaryAirport, $codeletter); + + // Phase 1: fetch the full candidate pool as thin id (+ score_count) rows. + // Selecting only the id keeps the grouped/sorted temp table in memory + // (airports.* drags the GEOMETRY column in, forcing it to disk), while + // the whole pool is still fetched so a refresh can shuffle up a + // different subset among equally-scored airports. $airports = Airport::airportOpen()->notIcao($primaryAirport->icao)->isAirportSize($destinationAirportSize) ->inContinent($destinations)->inCountry($destinations, $primaryAirport->iso_country)->inState($destinations) ->notInContinent($destinationExclusions)->notInCountry($destinationExclusions, $primaryAirport->iso_country)->notInState($destinationExclusions) ->withinDistance($primaryAirport, $minDistance, $maxDistance, $primaryAirport->icao)->withinBearing($primaryAirport, $flightDirection, $minDistance, $maxDistance) ->filterRunwayLengths($rwyLengthMin, $rwyLengthMax, $codeletter)->filterRunwayLights($destinationRunwayLights) - ->filterAirbases($destinationAirbases)->filterByScores($filterByScores)->filterRoutesAndAirlines($primaryAirport->icao, $filterByAirlines, $filterByAircrafts, $destinationWithRoutesOnly) + ->filterAirbases($destinationAirbases)->filterByScores($filterByScores, $eta, $candidatesAreDepartures)->filterRoutesAndAirlines($primaryAirport->icao, $filterByAirlines, $filterByAircrafts, $destinationWithRoutesOnly) ->returnOnlyWhitelistedIcao($whitelist) - ->sortByScores($sortByScores) + ->select('airports.id') + ->sortByScores($sortByScores, $eta, $candidatesAreDepartures) ->has('metar') - ->with([ - 'runways' => function ($query) { - $query->where('closed', false)->whereNotNull('length_ft'); - }, - 'scores', - 'metar', - 'sceneryDevelopers.sceneries' => function ($query) { - $query->where('published', true)->with('simulator'); - }, - ]) ->get(); - // Shuffle and limit the results to 20 + // Shuffle within equal-score buckets and limit the results to 20 $airports = $airports->groupBy('score_count')->map(function ($group) { return $group->shuffle(); })->flatten(1)->take(20); + // Phase 2: hydrate only the picked airports, preserving the shuffled order + $airportIds = $airports->pluck('id')->all(); + $scoreCounts = $airports->pluck('score_count', 'id'); + + $airports = Airport::with([ + 'runways' => function ($query) { + $query->where('closed', false)->whereNotNull('length_ft'); + }, + 'scores', + 'metar', + 'taf.forecasts', + 'sceneryDevelopers.sceneries' => function ($query) { + $query->where('published', true)->with('simulator'); + }, + ]) + ->findMany($airportIds) + ->sortBy(fn ($airport) => array_search($airport->id, $airportIds))->values() + ->each(fn ($airport) => $airport->score_count = $scoreCounts->get($airport->id)); + // Filter the eligible airports - $suggestedAirports = $airports->filterWithCriteria($primaryAirport, $codeletter, $airtimeMin, $airtimeMax, $metcon, $temperatureMin, $temperatureMax, $rwyLengthMin, $rwyLengthMax, $elevationMin, $elevationMax); + $suggestedAirports = $airports->filterWithCriteria($primaryAirport, $codeletter, $metcon, $temperatureMin, $temperatureMax, $elevationMin, $elevationMax, $candidatesAreDepartures); // If max distance is over 1600 and bearing is enabled -> give user warning about inaccuracy $bearingWarning = false; @@ -274,6 +295,11 @@ public function search(Request $request) $airportCoordinates[$airport->icao]['color'] = 'grey'; } + // The primary airport's scores are windowed at now(); when it's the + // departure airport, the current METAR is its weather truth and TAFs are ignored + [$primaryScores] = $primaryAirport->scoresAtEta(now(), $direction == 'departure'); + $primaryAirport->setRelation('scores', $primaryScores); + // To ensure bookmarks works, let's comapre the searchVersion $searchVersionWarning = false; if (isset($data['searchVersion']) && (int) $data['searchVersion'] != config('app.searchVersion')) { @@ -285,11 +311,7 @@ public function search(Request $request) } - if ($direction == 'departure') { - return redirect(route('front'))->withErrors(['airportNotFound' => 'No suitable arrival airport could be found with given criteria', 'bearingWarning' => $bearingWarning])->withInput(); - } else { - return redirect(route('front'))->withErrors(['airportNotFound' => 'No suitable arrival airport could be found with given criteria', 'bearingWarning' => $bearingWarning])->withInput(); - } + return redirect(route('front'))->withErrors(['airportNotFound' => 'No suitable airport could be found with given criteria', 'bearingWarning' => $bearingWarning])->withInput(); } /** @@ -306,8 +328,8 @@ public function searchRoutes(Request $request) 'sort' => ['required', 'in:flight,airline,timestamp'], ]); - $departure = Airport::where('icao', $data['departure'])->orWhere('local_code', $data['departure'])->get()->first(); - $arrival = Airport::where('icao', $data['arrival'])->orWhere('local_code', $data['arrival'])->get()->first(); + $departure = Airport::where('icao', $data['departure'])->orWhere('local_code', $data['departure'])->first(); + $arrival = Airport::where('icao', $data['arrival'])->orWhere('local_code', $data['arrival'])->first(); $routes = Flight::where('airport_dep_id', $departure->id)->where('airport_arr_id', $arrival->id)->whereHas('airline')->with('airline', 'aircrafts')->get(); @@ -315,13 +337,6 @@ public function searchRoutes(Request $request) return redirect()->route('front.routes')->withErrors(['routeNotFound' => 'No routes found between ' . $departure->icao . ' and ' . $arrival->icao]); } - // Strip the stars from IATA codes for the logos to display correctly - $routes = $routes->map(function ($route) { - $route->airline->iata_code = str_replace('*', '', $route->airline->iata_code); - - return $route; - }); - // Sort the routes based on the selected criteria switch ($data['sort']) { case 'flight': @@ -395,11 +410,9 @@ private function getDestinationInputs() 'C-SA' => 'South America', 'C-OC' => 'Oceania', ], - 'Countries' => [ - ...$this::$countries, - ], + 'Countries' => CountryHelper::names(), 'US States' => [ - ...array_combine(array_map(fn ($key) => 'US-' . $key, array_keys($this::$usStates)), $this::$usStates), + ...array_combine(array_map(fn ($key) => 'US-' . $key, array_keys(CountryHelper::US_STATES)), CountryHelper::US_STATES), ], ]; } @@ -427,9 +440,9 @@ private function filterDestinations(array $destinations) 'countries' => 'Domestic', 'states' => null, ]; - } elseif (strpos($destination, 'C-') === 0) { + } elseif (str_starts_with($destination, 'C-')) { $continents[] = substr($destination, 2); - } elseif (strpos($destination, 'US-') === 0) { + } elseif (str_starts_with($destination, 'US-')) { $states[] = $destination; } else { $countries[] = $destination; diff --git a/app/Http/Controllers/TopController.php b/app/Http/Controllers/TopController.php index 0b855511..beb6f96c 100644 --- a/app/Http/Controllers/TopController.php +++ b/app/Http/Controllers/TopController.php @@ -2,22 +2,39 @@ namespace App\Http\Controllers; +use App\Helpers\AircraftHelper; use App\Helpers\MapHelper; use App\Models\AirportScore; -use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\View\View; class TopController extends Controller { + public const CONTINENTS = [ + 'AF' => 'Africa', + 'AS' => 'Asia', + 'EU' => 'Europe', + 'NA' => 'North America', + 'OC' => 'Oceania', + 'SA' => 'South America', + ]; + /** * List all top airports - * - * @return RedirectResponse */ - public function index(Request $request, ?string $continent = null) + public function index(Request $request, ?string $continent = null): View { $exclude = $request->input('exclude'); - $airportScores = AirportScore::getTopAirports($continent, null, 30, $exclude); + + // Defaults to JM; 'all' explicitly disables the aircraft filter + $aircraft = $request->input('aircraft', 'JM'); + if ($aircraft === 'all') { + $aircraft = null; + } elseif (! AircraftHelper::isValidCode($aircraft)) { + $aircraft = 'JM'; + } + + $airportScores = AirportScore::getTopAirports($continent, null, 30, $exclude, $aircraft); $airports = collect(); foreach ($airportScores as $as) { @@ -26,6 +43,6 @@ public function index(Request $request, ?string $continent = null) $airportMapData = json_encode(MapHelper::generateAirportMapDataFromAirports($airports)); - return view('top', compact('airports', 'airportMapData', 'continent', 'exclude')); + return view('top', compact('airports', 'airportMapData', 'continent', 'exclude', 'aircraft')); } } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 7759379b..c8519a9f 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -34,9 +34,6 @@ public function store(Request $request) 'privacy_policy' => ['accepted'], ]); - // Hash the password - $data['password'] = Hash::make($data['password']); - $user = User::create($data); if ($user) { event(new Registered($user)); diff --git a/app/Http/Controllers/UserListController.php b/app/Http/Controllers/UserListController.php index b17d9578..c5c167c8 100644 --- a/app/Http/Controllers/UserListController.php +++ b/app/Http/Controllers/UserListController.php @@ -48,40 +48,23 @@ public function create(Request $request) */ public function store(Request $request) { - $request->validate([ - 'color' => 'required|string|regex:/^#[0-9A-Fa-f]{6}$/', - 'name' => 'required|max:32', - 'simulator' => 'required|exists:simulators,id', - 'airports' => 'required|string', - 'public' => 'boolean', - ]); - - $request->public = $request->public ? true : false; - if ($request->public) { - $this->authorize('public', UserList::class); - } + $this->validateList($request); [$airportIds, $notFoundAirports] = $this->resolveAirports($request->airports); - $list = DB::transaction(function () use ($request, $airportIds) { - $list = new UserList(); - $list->color = $request->color; - $list->name = $request->name; - $list->simulator_id = $request->simulator; - $list->user_id = Auth::id(); - $list->public = $request->public; - $list->save(); + DB::transaction(function () use ($request, $airportIds) { + $list = UserList::create([ + 'color' => $request->color, + 'name' => $request->name, + 'simulator_id' => $request->simulator, + 'user_id' => Auth::id(), + 'public' => $request->boolean('public'), + ]); $list->airports()->sync($airportIds); - - return $list; }); - if (count($notFoundAirports) > 0) { - return redirect()->route('list.index')->with('warning', 'List created successfully, however following airports could not be found: ' . $notFoundAirports->implode(', ')); - } - - return redirect()->route('list.index')->with('success', 'List created successfully'); + return $this->listSavedRedirect('created', $notFoundAirports); } /** @@ -106,18 +89,7 @@ public function edit(UserList $list) public function update(Request $request, UserList $list) { $this->authorize('update', $list); - $request->validate([ - 'color' => 'required|string|regex:/^#[0-9A-Fa-f]{6}$/', - 'name' => 'required|max:32', - 'simulator' => 'required|exists:simulators,id', - 'airports' => 'required|string', - 'public' => 'boolean', - ]); - - $request->public = $request->public ? true : false; - if ($request->public) { - $this->authorize('public', UserList::class); - } + $this->validateList($request); [$airportIds, $notFoundAirports] = $this->resolveAirports($request->airports); @@ -125,17 +97,40 @@ public function update(Request $request, UserList $list) $list->color = $request->color; $list->name = $request->name; $list->simulator_id = $request->simulator; - $list->public = $request->public; + $list->public = $request->boolean('public'); $list->save(); $list->airports()->sync($airportIds); }); - if (count($notFoundAirports) > 0) { - return redirect()->route('list.index')->with('warning', 'List updated successfully, however following airports could not be found: ' . $notFoundAirports->implode(', ')); + return $this->listSavedRedirect('updated', $notFoundAirports); + } + + /** + * Shared store/update validation; going public needs its own permission + */ + private function validateList(Request $request): void + { + $request->validate([ + 'color' => 'required|string|regex:/^#[0-9A-Fa-f]{6}$/', + 'name' => 'required|max:32', + 'simulator' => 'required|exists:simulators,id', + 'airports' => 'required|string', + 'public' => 'boolean', + ]); + + if ($request->boolean('public')) { + $this->authorize('public', UserList::class); } + } - return redirect()->route('list.index')->with('success', 'List updated successfully'); + private function listSavedRedirect(string $action, Collection $notFoundAirports) + { + if ($notFoundAirports->isNotEmpty()) { + return redirect()->route('list.index')->with('warning', "List {$action} successfully, however following airports could not be found: " . $notFoundAirports->implode(', ')); + } + + return redirect()->route('list.index')->with('success', "List {$action} successfully"); } /** @@ -145,12 +140,10 @@ public function update(Request $request, UserList $list) */ private function resolveAirports(string $input): array { - $airportsInput = explode("\r\n", $input); - $airportsInput = array_map('trim', $airportsInput); - $airportsInput = array_map('strtoupper', $airportsInput); - $airportsInput = array_filter($airportsInput, function ($value) { - return ! empty($value); - }); + $airportsInput = collect(explode("\r\n", $input)) + ->map(fn ($v) => strtoupper(trim($v))) + ->filter() + ->all(); $airportModels = Airport::whereIn('icao', $airportsInput) ->orWhereIn('local_code', $airportsInput) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php deleted file mode 100644 index d8e6fde6..00000000 --- a/app/Http/Kernel.php +++ /dev/null @@ -1,97 +0,0 @@ - - */ - protected $middleware = [ - TrustProxies::class, - HandleCors::class, - PreventRequestsDuringMaintenance::class, - ValidatePostSize::class, - TrimStrings::class, - ConvertEmptyStringsToNull::class, - ]; - - /** - * The application's route middleware groups. - * - * @var array> - */ - protected $middlewareGroups = [ - 'web' => [ - EncryptCookies::class, - AddQueuedCookiesToResponse::class, - StartSession::class, - ShareErrorsFromSession::class, - PreventRequestForgery::class, - SubstituteBindings::class, - UserActive::class, - AdminVariables::class, - FeedbackVariables::class, - ], - - 'api' => [ - 'throttle:50,1', - SubstituteBindings::class, - EnsureFrontendRequestsAreStateful::class, - ], - ]; - - /** - * The application's route middleware. - * - * These middleware may be assigned to groups or used individually. - * - * @var array - */ - protected $routeMiddleware = [ - 'auth' => Authenticate::class, - 'auth.basic' => AuthenticateWithBasicAuth::class, - 'auth.session' => AuthenticateSession::class, - 'cache.headers' => SetCacheHeaders::class, - 'can' => Authorize::class, - 'guest' => RedirectIfAuthenticated::class, - 'password.confirm' => RequirePassword::class, - 'signed' => ValidateSignature::class, - 'throttle' => ThrottleRequests::class, - 'verified' => EnsureEmailIsVerified::class, - 'api-token' => ApiToken::class, - ]; -} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 4e8922a5..00000000 --- a/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,22 +0,0 @@ -expectsJson()) { - return route('login'); - } - } -} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php deleted file mode 100644 index 867695bd..00000000 --- a/app/Http/Middleware/EncryptCookies.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php deleted file mode 100644 index 74cbd9a9..00000000 --- a/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php deleted file mode 100644 index 2959501e..00000000 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ /dev/null @@ -1,32 +0,0 @@ -check()) { - return redirect()->route('front'); - } - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php deleted file mode 100644 index 88cadcaa..00000000 --- a/app/Http/Middleware/TrimStrings.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - protected $except = [ - 'current_password', - 'password', - 'password_confirmation', - ]; -} diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php deleted file mode 100644 index 7186414c..00000000 --- a/app/Http/Middleware/TrustHosts.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ - public function hosts() - { - return [ - $this->allSubdomainsOfApplicationUrl(), - ]; - } -} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php deleted file mode 100644 index f0b7dc0f..00000000 --- a/app/Http/Middleware/TrustProxies.php +++ /dev/null @@ -1,52 +0,0 @@ -|string|null - */ - protected $proxies = [ - '173.245.48.0/20', // Cloudflare as of 2025-04-20 - '103.21.244.0/22', - '103.22.200.0/22', - '103.31.4.0/22', - '141.101.64.0/18', - '108.162.192.0/18', - '190.93.240.0/20', - '188.114.96.0/20', - '197.234.240.0/22', - '198.41.128.0/17', - '162.158.0.0/15', - '104.16.0.0/13', - '104.24.0.0/14', - '172.64.0.0/13', - '131.0.72.0/22', - '2400:cb00::/32', - '2606:4700::/32', - '2803:f800::/32', - '2405:b500::/32', - '2405:8100::/32', - '2a06:98c0::/29', - '2c0f:f248::/32', - '172.16.0.0/12', // Docker - ]; - - /** - * The headers that should be used to detect proxies. - * - * @var int - */ - protected $headers = - Request::HEADER_X_FORWARDED_FOR | - Request::HEADER_X_FORWARDED_HOST | - Request::HEADER_X_FORWARDED_PORT | - Request::HEADER_X_FORWARDED_PROTO | - Request::HEADER_X_FORWARDED_AWS_ELB; -} diff --git a/app/Http/Middleware/UserActive.php b/app/Http/Middleware/UserActive.php index 74f922ef..f0f58f50 100644 --- a/app/Http/Middleware/UserActive.php +++ b/app/Http/Middleware/UserActive.php @@ -2,7 +2,6 @@ namespace App\Http\Middleware; -use Carbon\Carbon; use Closure; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -18,10 +17,14 @@ class UserActive */ public function handle(Request $request, Closure $next) { - if (\Auth::check()) { - $user = \Auth::user(); - $user->last_activity_at = Carbon::now(); - $user->save(); + if (auth()->check()) { + $user = auth()->user(); + + if ($user->last_activity_at === null || $user->last_activity_at->lt(now()->subMinutes(5))) { + $user->timestamps = false; + $user->last_activity_at = now(); + $user->save(); + } } return $next($request); diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index 9e865217..00000000 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Resources/AirportResource.php b/app/Http/Resources/AirportResource.php new file mode 100644 index 00000000..9460d583 --- /dev/null +++ b/app/Http/Resources/AirportResource.php @@ -0,0 +1,31 @@ + $this->name, + 'icao' => $this->icao, + 'iata' => $this->iata_code ?: null, + 'continent' => $this->continent, + 'country' => $this->iso_country, + 'region' => $this->iso_region, + 'metar' => app()->isProduction() ? $this->metar->metar : 'TEST-DATA ' . $this->metar->metar, + 'taf' => optional($this->taf)->raw_text, + 'longestRwyFt' => $this->longestRunway(), + 'scores' => $this->displayScores()->map(fn ($s) => [ + 'reason' => $s->reason, + 'data' => $s->data, + 'source' => $s->source, + 'valid_from' => $s->valid_from, + 'valid_to' => $s->valid_to, + ]), + ]; + } +} diff --git a/app/Http/Resources/SuggestedAirportResource.php b/app/Http/Resources/SuggestedAirportResource.php new file mode 100644 index 00000000..fcbe0816 --- /dev/null +++ b/app/Http/Resources/SuggestedAirportResource.php @@ -0,0 +1,19 @@ + $this->airtime, + 'distanceNm' => $this->distance, + 'isAirforcebase' => $this->w2f_airforcebase, + 'hasAirlineService' => $this->w2f_scheduled_service, + 'forecastSource' => $this->forecast_source, + ]); + } +} diff --git a/app/Mixins/CollectionAirportFilter.php b/app/Mixins/CollectionAirportFilter.php index f4619b53..15d52442 100644 --- a/app/Mixins/CollectionAirportFilter.php +++ b/app/Mixins/CollectionAirportFilter.php @@ -9,25 +9,31 @@ class CollectionAirportFilter { public function filterWithCriteria() { - return function ($departureAirport, $codeletter, $airtimeMin, $airtimeMax, $requiredMetcon = null, $temperatureMin = null, $temperatureMax = null, $runwayLengthMin = null, $runwayLengthMax = null, $airportElevationMin = null, $airportElevationMax = null) { + return function ($departureAirport, $codeletter, $requiredMetcon = null, $temperatureMin = null, $temperatureMax = null, $airportElevationMin = null, $airportElevationMax = null, $candidatesAreDepartures = false) { - $returnCollection = $this - ->transform(function ($arrivalAirport) use ($departureAirport, $codeletter) { + return $this + ->transform(function ($arrivalAirport) use ($departureAirport, $codeletter, $candidatesAreDepartures) { // Insert the calculated distance and airtime into the collection - $distance = distance($departureAirport->latitude_deg, $departureAirport->longitude_deg, $arrivalAirport->latitude_deg, $arrivalAirport->longitude_deg, 'N'); + $distance = distance($departureAirport->latitude_deg, $departureAirport->longitude_deg, $arrivalAirport->latitude_deg, $arrivalAirport->longitude_deg); $arrivalAirport->distance = round($distance); - $airtime = ($distance / CalculationHelper::aircraftNmPerHour($codeletter)) + CalculationHelper::timeClimbDescend($codeletter); + $airtime = CalculationHelper::airtimeHours($distance, $codeletter); $arrivalAirport->airtime = round($airtime, 1); + // Narrow down loaded sources to those who are applicable at the time of arrival. + if ($arrivalAirport->relationLoaded('scores')) { + $eta = $candidatesAreDepartures ? now() : CalculationHelper::forecastEta($arrivalAirport->airtime); + [$scores, $hasTafAtEta] = $arrivalAirport->scoresAtEta($eta, $candidatesAreDepartures); + $arrivalAirport->setRelation('scores', $scores); + $arrivalAirport->forecast_source = ! $candidatesAreDepartures && $hasTafAtEta ? 'taf' : 'metar'; + } + return $arrivalAirport; }) ->filter(fn ($a) => AirportFilterHelper::hasCorrectMetcon($requiredMetcon, $a)) ->filter(fn ($a) => AirportFilterHelper::hasRequiredTemperature($temperatureMin, $temperatureMax, $a)) ->filter(fn ($a) => AirportFilterHelper::hasRequiredAirportElevation($airportElevationMin, $airportElevationMax, $a)); - return $returnCollection; - }; } diff --git a/app/Models/Airline.php b/app/Models/Airline.php index d6ec2c72..421c17b7 100644 --- a/app/Models/Airline.php +++ b/app/Models/Airline.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -15,4 +16,13 @@ public function flights() { return $this->hasMany(Flight::class, 'airline_iata', 'iata_code'); } + + /** + * The stored code may carry a * (marks duplicate IATA codes) — strip it + * for display and logo filenames + */ + protected function iataCode(): Attribute + { + return Attribute::get(fn (?string $value) => $value === null ? null : str_replace('*', '', $value)); + } } diff --git a/app/Models/Airport.php b/app/Models/Airport.php index 35ef6200..77e7dbd2 100644 --- a/app/Models/Airport.php +++ b/app/Models/Airport.php @@ -2,10 +2,14 @@ namespace App\Models; +use App\Helpers\AircraftHelper; use App\Helpers\CalculationHelper; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Collection; use Location\Coordinate; use MatanYadaev\EloquentSpatial\Enums\Srid; use MatanYadaev\EloquentSpatial\Objects\LineString; @@ -18,19 +22,35 @@ class Airport extends Model use HasFactory; use HasSpatial; + /** The canonical ground-to-air facility ordering for ATC display (dots, tooltips, stored station lists) */ + public const ATC_FACILITY_ORDER = ['DEL', 'GND', 'TWR', 'APP']; + public $timestamps = false; protected $guarded = []; - protected $casts = [ - 'coordinates' => Point::class, - ]; + protected function casts(): array + { + return [ + 'coordinates' => Point::class, + ]; + } public function metar() { return $this->hasOne(Metar::class); } + public function taf() + { + return $this->hasOne(Taf::class); + } + + public function bookings() + { + return $this->hasMany(Booking::class); + } + public function runways() { return $this->hasMany(Runway::class); @@ -71,9 +91,10 @@ public function sceneryDevelopers() return $this->hasMany(SceneryDeveloper::class); } - public static function whereHasPublishedSceneries($published, $filterSimulatorId = null) + #[Scope] + protected function publishedSceneries(Builder $query, $published, $filterSimulatorId = null): void { - return Airport::whereHas('sceneryDevelopers', function ($query) use ($published, $filterSimulatorId) { + $query->whereHas('sceneryDevelopers', function ($query) use ($published, $filterSimulatorId) { $query->whereHas('sceneries', function ($query) use ($published, $filterSimulatorId) { $query->where('published', $published); if ($filterSimulatorId) { @@ -83,62 +104,152 @@ public static function whereHasPublishedSceneries($published, $filterSimulatorId }); } - public function hasWeatherScore() + /** + * The loaded scores applicable at the given ETA, plus whether a TAF period + * covers it (drives the METAR fallback and the forecastSource indicator). + * + * @return array{0: Collection, 1: bool} + */ + public function scoresAtEta(Carbon $eta, bool $metarOnlyWeather = false): array { - foreach ($this->scores as $s) { - if ($s->isWeatherScore()) { - return true; - } - } + $hasTafAtEta = (bool) $this->taf?->forecasts->contains( + fn ($forecast) => $forecast->valid_from->lte($eta) && $forecast->valid_to->gte($eta) + ); - return false; + return [ + $this->scores->filter(fn ($score) => $score->coversEtaAt($eta, $hasTafAtEta, $metarOnlyWeather))->values(), + $hasTafAtEta, + ]; } - public function weatherScore() + /** + * The loaded, ETA-windowed booking-sourced VATSIM_ATC scores, ordered by + * start time — the tooltip and facility dots on the ATC icon render these. + * A facility booked several times over the exact same window (e.g. two + * positions both resolving to APP) renders as one line; the same facility + * over a different window stays its own line. + */ + public function atcBookingScores() { - $score = 0; - foreach ($this->scores as $s) { - if ($s->isWeatherScore()) { - $score++; - } - } + return $this->scores + ->filter(fn ($score) => $score->reason === 'VATSIM_ATC' && $score->source === AirportScore::SOURCE_BOOKING) + ->unique(fn ($score) => ($score->data['facility'] ?? $score->data['callsign'] ?? '') . '|' . $score->valid_from . '|' . $score->valid_to) + ->sortBy('valid_from') + ->values(); + } - return $score; + /** + * The unique booked facility types (DEL/GND/TWR/APP) among those scores, + * in ground-to-air order. + */ + public function atcBookedFacilities() + { + return $this->sortFacilities( + $this->atcBookingScores()->map(fn ($score) => $score->data['facility'] ?? null) + ); } - public function hasVatsimScore() + /** + * The stations online right now ({facility, logon_time} pairs), in + * ground-to-air order. Read from the live VATSIM_ATC score when present, + * otherwise from the logon-estimate rows still predicting presence at the ETA. + */ + public function atcOnlineStations() { - foreach ($this->scores as $s) { - if ($s->isVatsimScore()) { - return true; - } + $liveAtc = $this->scores->first(fn ($score) => $score->reason === 'VATSIM_ATC' && $score->source === AirportScore::SOURCE_VATSIM); + + $stations = collect($liveAtc?->data['stations'] ?? []); + if ($stations->isEmpty()) { + $stations = $this->scores + ->filter(fn ($score) => $score->reason === 'VATSIM_ATC' && $score->source === AirportScore::SOURCE_LOGON_ESTIMATE) + ->map(fn ($score) => ['facility' => $score->data['facility'] ?? null, 'logon_time' => $score->data['logon_time'] ?? null]) + ->filter(fn ($station) => $station['logon_time'] !== null) + ->unique('facility'); } - return false; + return $stations + ->filter(fn ($station) => in_array($station['facility'] ?? null, self::ATC_FACILITY_ORDER)) + ->sortBy(fn ($station) => array_search($station['facility'], self::ATC_FACILITY_ORDER)) + ->values(); } - public function vatsimScore() + /** + * The facility types online right now. + */ + public function atcOnlineFacilities() { - $score = 0; - foreach ($this->scores as $s) { - if ($s->isVatsimScore()) { - $score++; - } - } + return $this->sortFacilities($this->atcOnlineStations()->pluck('facility')); + } - return $score; + /** + * Every facility type either online or booked — the ATC icon's colored dots. + */ + public function atcFacilities() + { + return $this->sortFacilities($this->atcOnlineFacilities()->merge($this->atcBookedFacilities())); } - public function longestRunway() + private function sortFacilities(Collection $facilities): Collection { - $length = 0; - foreach ($this->runways as $rwy) { - if ($rwy->closed == false && $rwy->length_ft > $length) { - $length = $rwy->length_ft; - } - } + return $facilities + ->filter(fn ($facility) => in_array($facility, self::ATC_FACILITY_ORDER)) + ->unique() + ->sortBy(fn ($facility) => array_search($facility, self::ATC_FACILITY_ORDER)) + ->values(); + } - return $length; + /** + * The loaded scores deduplicated to one row per reason for rendering. + * Several sources can assert the same reason: current signals beat + * forecasts (source order below), a certain row beats an uncertain + * TEMPO/PROB one (matching how the ranking takes each reason's best + * weight), and within a source the latest-starting row wins so the most + * recent forecast period speaks. + */ + public function displayScores() + { + $sourceOrder = array_flip([ + AirportScore::SOURCE_VATSIM, + AirportScore::SOURCE_BOOKING, + AirportScore::SOURCE_EVENT, + AirportScore::SOURCE_LOGON_ESTIMATE, + AirportScore::SOURCE_METAR, + AirportScore::SOURCE_TAF, + ]); + + return $this->scores + ->sortBy([ + fn ($a, $b) => ($sourceOrder[$a->source] ?? 99) <=> ($sourceOrder[$b->source] ?? 99), + fn ($a, $b) => $b->score <=> $a->score, + fn ($a, $b) => $b->valid_from <=> $a->valid_from, + ]) + ->unique('reason') + ->values(); + } + + public function hasWeatherScore() + { + return $this->scores->contains(fn ($s) => $s->isWeatherScore()); + } + + public function weatherScore() + { + return $this->scores->filter(fn ($s) => $s->isWeatherScore())->count(); + } + + public function hasVatsimScore() + { + return $this->scores->contains(fn ($s) => $s->isVatsimScore()); + } + + public function vatsimScore() + { + return $this->scores->filter(fn ($s) => $s->isVatsimScore())->count(); + } + + public function longestRunway() + { + return $this->runways->where('closed', false)->max('length_ft') ?? 0; } public function hasVisualCondition() @@ -155,7 +266,8 @@ public function hasVisualCondition() /** * Scope a query to only include airports that are considered open and have open runways */ - public function scopeAirportOpen(Builder $query) + #[Scope] + protected function airportOpen(Builder $query): void { $query->where('type', '!=', 'closed')->where('w2f_has_open_runway', true); } @@ -163,7 +275,8 @@ public function scopeAirportOpen(Builder $query) /** * Scope a query to only include airports that are not the departure airport */ - public function scopeNotIcao(Builder $query, ?string $icao = null) + #[Scope] + protected function notIcao(Builder $query, ?string $icao = null): void { if (isset($icao)) { $query->where('icao', '!=', $icao); @@ -173,7 +286,8 @@ public function scopeNotIcao(Builder $query, ?string $icao = null) /** * Scope a query to only include airports that are of the given size */ - public function scopeIsAirportSize(Builder $query, ?array $destinationAirportSize = null) + #[Scope] + protected function isAirportSize(Builder $query, ?array $destinationAirportSize = null): void { if (isset($destinationAirportSize)) { $query->whereIn('type', $destinationAirportSize); @@ -185,7 +299,8 @@ public function scopeIsAirportSize(Builder $query, ?array $destinationAirportSiz /** * Scope a query to only include airports in the given continent */ - public function scopeInContinent(Builder $query, array $destinations) + #[Scope] + protected function inContinent(Builder $query, array $destinations): void { if (isset($destinations['continents'])) { $continents = $destinations['continents']; @@ -215,7 +330,8 @@ public function scopeInContinent(Builder $query, array $destinations) /** * Scope a query to exclude airports in the given continents */ - public function scopeNotInContinent(Builder $query, array $destinations) + #[Scope] + protected function notInContinent(Builder $query, array $destinations): void { if (isset($destinations['continents'])) { $continents = $destinations['continents']; @@ -245,7 +361,8 @@ public function scopeNotInContinent(Builder $query, array $destinations) /** * Scope a query to only include airports in the given country */ - public function scopeInCountry(Builder $query, array $destinations, ?string $country = null) + #[Scope] + protected function inCountry(Builder $query, array $destinations, ?string $country = null): void { // If filter is domestic, that should override all other country filters @@ -264,7 +381,8 @@ public function scopeInCountry(Builder $query, array $destinations, ?string $cou /** * Scope a query to only include airports not in the given country */ - public function scopeNotInCountry(Builder $query, array $destinations, ?string $country = null) + #[Scope] + protected function notInCountry(Builder $query, array $destinations, ?string $country = null): void { // If filter is domestic, that should override all other country filters if (isset($destinations['countries']) && $destinations['countries'] == 'Domestic') { @@ -282,7 +400,8 @@ public function scopeNotInCountry(Builder $query, array $destinations, ?string $ /** * Scope a query to only include airports in the US state */ - public function scopeInState(Builder $query, array $destinations) + #[Scope] + protected function inState(Builder $query, array $destinations): void { if (isset($destinations['states'])) { $query->whereIn('iso_region', $destinations['states']); @@ -292,7 +411,8 @@ public function scopeInState(Builder $query, array $destinations) /** * Scope a query to only include airports not in the given US state */ - public function scopeNotInState(Builder $query, array $destinations) + #[Scope] + protected function notInState(Builder $query, array $destinations): void { if (isset($destinations['states'])) { $query->whereNotIn('iso_region', $destinations['states']); @@ -302,17 +422,80 @@ public function scopeNotInState(Builder $query, array $destinations) /** * Scope a query to only include airports within the given distance */ - public function scopeWithinDistance(Builder $query, Airport $departureAirport, float $minDistance, float $maxDistance, string $departureIcao) + #[Scope] + protected function withinDistance(Builder $query, Airport $departureAirport, float $minDistance, float $maxDistance, string $departureIcao): void { if (isset($departureIcao)) { - $query->whereDistanceSphere('coordinates', $departureAirport->coordinates, '<=', $maxDistance * 1852)->whereDistanceSphere('coordinates', $departureAirport->coordinates, '>=', $minDistance * 1852); + $this->applyDistanceBoundingBox($query, $departureAirport, $maxDistance); + + $query->whereDistanceSphere('coordinates', $departureAirport->coordinates, '<=', $maxDistance * 1852); + if ($minDistance > 0) { + $query->whereDistanceSphere('coordinates', $departureAirport->coordinates, '>=', $minDistance * 1852); + } } } + /** + * Bounding-box pre-filter for withinDistance so the SPATIAL index can + * prune candidates before the exact (but slow) distance checks run. + * The box always contains the whole search circle — padded because + * "straight" east-west lines on a sphere bulge toward the poles — and is + * skipped whenever it can't be a simple lat/lon rectangle (huge radii, + * circles wrapping a pole, or crossing ±85°/the date line). + */ + private function applyDistanceBoundingBox(Builder $query, Airport $anchorAirport, float $maxDistanceNm): void + { + // Beyond this the box covers most of the planet and prunes nothing + if ($maxDistanceNm <= 0 || $maxDistanceNm > 4000) { + return; + } + + $lat = $anchorAirport->coordinates->latitude; + $lon = $anchorAirport->coordinates->longitude; + + // Radius as an angle at the Earth's center, with a 5% safety margin + $radiusRad = ($maxDistanceNm * 1852 * 1.05) / 6371009.0; + + $sinRatio = sin($radiusRad) / cos(deg2rad($lat)); + if (abs($sinRatio) >= 1) { + // The circle wraps a pole — no finite longitude bounds exist + return; + } + + $deltaLat = rad2deg($radiusRad); + $deltaLon = rad2deg(asin($sinRatio)); + + // Worst-case poleward bulge of the box's east-west edges + $lonSpanRad = deg2rad($deltaLon) * 2; + $edgeSag = rad2deg($lonSpanRad ** 2 / 8 * 0.5); + + $south = $lat - $deltaLat - $edgeSag; + $north = $lat + $deltaLat + $edgeSag; + $west = $lon - $deltaLon; + $east = $lon + $deltaLon; + + if ($north > 85 || $south < -85 || $west < -180 || $east > 180) { + return; + } + + $box = new Polygon([ + new LineString([ + new Point($south, $west), + new Point($north, $west), + new Point($north, $east), + new Point($south, $east), + new Point($south, $west), + ]), + ], Srid::WGS84); + + $query->whereWithin('coordinates', $box); + } + /** * Scope a query to only include airports that are in the given direction */ - public function scopeWithinBearing(Builder $query, Airport $departureAirport, ?string $direction, float $minDistance, float $maxDistance) + #[Scope] + protected function withinBearing(Builder $query, Airport $departureAirport, ?string $direction, float $minDistance, float $maxDistance): void { // Ignore this scope if direction is not set @@ -323,11 +506,8 @@ public function scopeWithinBearing(Builder $query, Airport $departureAirport, ?s $airportLat = $departureAirport->coordinates->latitude; $airportLon = $departureAirport->coordinates->longitude; - // We calculate bearing in two ways, depending on the distance. - // First we calculate it within a polygon up to a certain limit - // Second we calculate just X/Y coordinates if it's outside the limit - // This is because the polygon gets very skewed after a certain distance - + // Two strategies: a polygon wedge for near distances, plain lat/lon + // comparisons beyond 800nm where the polygon gets too skewed $airportCoordinate = new Coordinate($airportLat, $airportLon); $directions = [ 'N' => 0, @@ -345,10 +525,9 @@ public function scopeWithinBearing(Builder $query, Airport $departureAirport, ?s $highEnd = CalculationHelper::calculateSphericalDestination($airportCoordinate, $directions[$direction] + 45, $polygonDistance); $lowEnd = CalculationHelper::calculateSphericalDestination($airportCoordinate, $directions[$direction] - 45, $polygonDistance); - // If the distance is less than 800nm, we can use a polygon $query->where(function ($q) use ($airportLat, $airportLon, $highEnd, $lowEnd, $minDistance, $maxDistance, $direction) { - // >>> Step 1: Create a polygon from the origin, then the bearing + 45 degrees in each direction + // Polygon wedge from the origin, bearing ±45 degrees if ($minDistance <= 800) { $polygon = new Polygon([ new LineString([ @@ -362,7 +541,7 @@ public function scopeWithinBearing(Builder $query, Airport $departureAirport, ?s $q->whereWithin('coordinates', $polygon); } - // >>> Step 2: Calculate the lat/long's for the max distance + // Beyond the wedge: plain lat/lon comparisons per direction if ($maxDistance > 800) { switch ($direction) { @@ -396,11 +575,12 @@ public function scopeWithinBearing(Builder $query, Airport $departureAirport, ?s }); } - public function scopeFilterRunwayLengths(Builder $query, int $rwyLengthMin, int $rwyLengthMax, string $codeletter) + #[Scope] + protected function filterRunwayLengths(Builder $query, int $rwyLengthMin, int $rwyLengthMax, string $codeletter): void { // Set minimum according to aircraft code unless it's already higher - $codeMinimum = CalculationHelper::minimumRequiredRunwayLength($codeletter); + $codeMinimum = AircraftHelper::minimumRunwayFt($codeletter); if ($rwyLengthMin < $codeMinimum) { $rwyLengthMin = $codeMinimum; } @@ -415,7 +595,8 @@ public function scopeFilterRunwayLengths(Builder $query, int $rwyLengthMin, int /** * Scope a query to only include airports that have runways with lights */ - public function scopeFilterRunwayLights(Builder $query, ?int $destinationRunwayLights = null) + #[Scope] + protected function filterRunwayLights(Builder $query, ?int $destinationRunwayLights = null): void { if (isset($destinationRunwayLights) && $destinationRunwayLights !== 0) { @@ -435,7 +616,8 @@ public function scopeFilterRunwayLights(Builder $query, ?int $destinationRunwayL /** * Scope a query to only include airports that are airbases */ - public function scopeFilterAirbases(Builder $query, ?int $destinationAirbases = null) + #[Scope] + protected function filterAirbases(Builder $query, ?int $destinationAirbases = null): void { if (isset($destinationAirbases) && $destinationAirbases !== 0) { @@ -449,21 +631,30 @@ public function scopeFilterAirbases(Builder $query, ?int $destinationAirbases = } /** - * Scope a query to only include airports that have scores + * Scope a query to only include airports that have scores. When an ETA is + * given (a Carbon instant or a per-candidate SQL expression), only score + * rows whose validity window applies at that ETA count. */ - public function scopeFilterByScores(Builder $query, ?array $filterByScores = null) + #[Scope] + protected function filterByScores(Builder $query, ?array $filterByScores = null, Carbon|string|null $eta = null, bool $metarOnlyWeather = false): void { if (isset($filterByScores) && ! empty($filterByScores)) { - $query->where(function ($query) use ($filterByScores) { + $query->where(function ($query) use ($filterByScores, $eta, $metarOnlyWeather) { foreach ($filterByScores as $score => $value) { if ($value == 1) { - $query->whereHas('scores', function ($query) use ($score) { + $query->whereHas('scores', function ($query) use ($score, $eta, $metarOnlyWeather) { $query->where('reason', $score); + if ($eta) { + $query->coversEta($eta, $metarOnlyWeather); + } }); } elseif ($value == -1) { - $query->whereDoesntHave('scores', function ($query) use ($score) { + $query->whereDoesntHave('scores', function ($query) use ($score, $eta, $metarOnlyWeather) { $query->where('reason', $score); + if ($eta) { + $query->coversEta($eta, $metarOnlyWeather); + } }); } } @@ -475,7 +666,8 @@ public function scopeFilterByScores(Builder $query, ?array $filterByScores = nul /** * Scope a query to only include airports that have routes and airlines */ - public function scopeFilterRoutesAndAirlines(Builder $query, ?string $departureIcao = null, ?array $filterByAirlines = null, ?array $filterByAircrafts = null, ?int $destinationWithRoutesOnly = null, string $flightDirection = 'arrivalFlights') + #[Scope] + protected function filterRoutesAndAirlines(Builder $query, ?string $departureIcao = null, ?array $filterByAirlines = null, ?array $filterByAircrafts = null, ?int $destinationWithRoutesOnly = null, string $flightDirection = 'arrivalFlights'): void { if (isset($destinationWithRoutesOnly) && $destinationWithRoutesOnly !== 0) { @@ -560,7 +752,8 @@ public function scopeFilterRoutesAndAirlines(Builder $query, ?string $departureI /** * Scope a query to only include airports that have the given scores */ - public function scopeReturnOnlyWhitelistedIcao(Builder $query, ?array $whitelistedArrivals = null) + #[Scope] + protected function returnOnlyWhitelistedIcao(Builder $query, ?array $whitelistedArrivals = null): void { if (isset($whitelistedArrivals)) { $query->whereIn('icao', $whitelistedArrivals); @@ -568,17 +761,36 @@ public function scopeReturnOnlyWhitelistedIcao(Builder $query, ?array $whitelist } /** - * Scope a query to only include airports that have the given scores + * Scope a query to sort airports by the summed weight of the given scores, + * counting only rows valid at the ETA when one is given. The conditions + * live in the join (not the where) so airports without scores still appear + * with a count of zero. Each reason contributes its single best weight + * (the MAX(CASE) pivot below) — several sources predicting the same reason + * shouldn't outrank a single real signal, and a certain row asserting a + * reason beats any uncertain TAF row asserting the same one. */ - public function scopeSortByScores(Builder $query, $filterByScores) + #[Scope] + protected function sortByScores(Builder $query, $filterByScores, Carbon|string|null $eta = null, bool $metarOnlyWeather = false) { if (isset($filterByScores) && ! empty($filterByScores)) { - return $query->leftJoin('airport_scores', 'airports.id', '=', 'airport_scores.airport_id') - ->selectRaw('airports.*, COUNT(airport_scores.id) as score_count') - ->where(function ($query) use ($filterByScores) { - $query->whereIn('airport_scores.reason', $filterByScores) - ->orWhereNull('airport_scores.reason'); - }) + // Keep the historic airports.* select unless the caller already + // narrowed the columns (the search pool queries select only the id + // so the grouped temp table stays small and in memory) + if (is_null($query->getQuery()->columns)) { + $query->select('airports.*'); + } + + $reasons = array_values($filterByScores); + $weightedSum = implode(' + ', array_fill(0, count($reasons), 'MAX(CASE WHEN airport_scores.reason = ? THEN airport_scores.score ELSE 0 END)')); + + return $query->leftJoin('airport_scores', function ($join) use ($reasons, $eta, $metarOnlyWeather) { + $join->on('airports.id', '=', 'airport_scores.airport_id') + ->whereIn('airport_scores.reason', $reasons); + if ($eta) { + AirportScore::applyCoversEta($join, $eta, $metarOnlyWeather); + } + }) + ->selectRaw("{$weightedSum} as score_count", $reasons) ->groupBy('airports.id') ->orderBy('score_count', 'desc'); } diff --git a/app/Models/AirportScore.php b/app/Models/AirportScore.php index 50221644..fe10fa71 100644 --- a/app/Models/AirportScore.php +++ b/app/Models/AirportScore.php @@ -2,22 +2,245 @@ namespace App\Models; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; class AirportScore extends Model { use HasFactory; + public const SOURCE_METAR = 'metar'; + + public const SOURCE_TAF = 'taf'; + + public const SOURCE_VATSIM = 'vatsim'; + + public const SOURCE_EVENT = 'event'; + + public const SOURCE_BOOKING = 'booking'; + + public const SOURCE_LOGON_ESTIMATE = 'logon_estimate'; + + /** Sources whose window must contain the ETA exactly */ + public const EXACT_MATCH_SOURCES = [self::SOURCE_METAR, self::SOURCE_TAF, self::SOURCE_VATSIM, self::SOURCE_LOGON_ESTIMATE]; + + /** Scheduled-presence sources, matched with a ±1h interval overlap against the ETA */ + public const OVERLAP_MATCH_SOURCES = [self::SOURCE_BOOKING, self::SOURCE_EVENT]; + + /** Hours of query-time tolerance applied to the inexact sources */ + public const OVERLAP_MATCH_HOURS = 1; + + /** Ranking weight of a bare TEMPO period — intermittent but expected */ + public const WEIGHT_TEMPO = 0.7; + + /** Ranking weights for PROB periods, keyed by the stated probability */ + public const WEIGHT_PROB = [40 => 0.5, 30 => 0.3]; + + /** Ranking weights for combined PROBnn TEMPO periods */ + public const WEIGHT_PROB_TEMPO = [40 => 0.4, 30 => 0.25]; + public $timestamps = false; protected $guarded = []; + protected function casts(): array + { + return [ + 'score' => 'float', + 'data' => 'array', + 'valid_from' => 'datetime', + 'valid_to' => 'datetime', + ]; + } + + /** + * The confidence weight a forecast period's score rows carry: certain + * periods (FM/BECMG — and every non-TAF source) weigh 1.0, uncertain ones + * less, so a PROB30 shower doesn't rank an airport like a firm forecast. + */ + public static function forecastWeight(?int $probability, bool $tempo): float + { + if ($probability === null) { + return $tempo ? self::WEIGHT_TEMPO : 1.0; + } + + $weights = $tempo ? self::WEIGHT_PROB_TEMPO : self::WEIGHT_PROB; + + // TAFs only carry PROB30/PROB40, but don't crash on an oddball value + return $weights[$probability] ?? round($probability / 100, 2); + } + + /** + * Whether this row is an uncertain forecast (TEMPO/PROB) — the icon + * renders faded to show the condition isn't a firm prediction. + */ + public function isUncertain(): bool + { + return $this->score < 1; + } + public function airport() { return $this->belongsTo(Airport::class); } + /** + * Scope score rows to those applicable at the given ETA. $eta is either a + * Carbon instant or a raw SQL expression (for per-candidate ETAs computed + * in the query itself). + * + * With $metarOnlyWeather (departure candidates — the pilot leaves soon), + * TAF rows never match and the current METAR always does: the latest + * observation is the weather truth there, not a forecast. + */ + #[Scope] + protected function coversEta(Builder $query, Carbon|string $eta, bool $metarOnlyWeather = false): void + { + self::applyCoversEta($query, $eta, $metarOnlyWeather); + } + + /** + * PHP-side twin of the coversEta scope, for filtering already-loaded score + * collections per candidate. The caller supplies whether the airport has a + * TAF period covering the ETA (the metar-fallback input), since that spans + * the whole airport, not this row. + */ + public function coversEtaAt(Carbon $eta, bool $airportHasTafAtEta, bool $metarOnlyWeather = false): bool + { + if (in_array($this->source, self::OVERLAP_MATCH_SOURCES)) { + return $this->valid_from->lte($eta->copy()->addHours(self::OVERLAP_MATCH_HOURS)) + && $this->valid_to->gte($eta->copy()->subHours(self::OVERLAP_MATCH_HOURS)); + } + + if ($this->source === self::SOURCE_METAR) { + return $metarOnlyWeather + || ! $airportHasTafAtEta + || ($this->valid_from->lte($eta) && $this->valid_to->gte($eta)); + } + + if ($this->source === self::SOURCE_TAF && $metarOnlyWeather) { + return false; + } + + return $this->valid_from->lte($eta) && $this->valid_to->gte($eta); + } + + /** + * Same conditions as the coversEta scope, but applicable to any query + * builder that has airport_scores in scope (e.g. a join on airports). + * + * Cost warning: when $eta is a per-candidate SQL expression + * (forecastEtaSql's ST_DISTANCE_SPHERE arithmetic), it is inlined 3-4x + * here and re-evaluated per probed row — and search already applies this + * once per filtered reason plus in the sortByScores join. MySQL cannot + * reference a select alias from WHERE/JOIN, so it can't be computed once + * per row; don't add further coversEta call sites inside per-row + * subqueries. + */ + public static function applyCoversEta($query, Carbon|string $eta, bool $metarOnlyWeather = false): void + { + [$etaSql, $bindings] = $eta instanceof Carbon ? ['?', [$eta->toDateTimeString()]] : [$eta, []]; + + // The ETA sits on the left of each BETWEEN so a per-candidate ETA + // expression (forecastEtaSql's ST_DISTANCE_SPHERE arithmetic) is + // evaluated once per comparison, not once per bound; the ±1h overlap + // tolerance is moved onto the window side for the same reason. + $query->where(function ($query) use ($etaSql, $bindings, $metarOnlyWeather) { + // Exact containment for sources with a precise window + $query->where(function ($query) use ($etaSql, $bindings, $metarOnlyWeather) { + $exactSources = $metarOnlyWeather + ? array_diff(self::EXACT_MATCH_SOURCES, [self::SOURCE_METAR, self::SOURCE_TAF]) + : self::EXACT_MATCH_SOURCES; + + $query->whereIn('airport_scores.source', $exactSources) + ->whereRaw("{$etaSql} BETWEEN airport_scores.valid_from AND airport_scores.valid_to", $bindings); + }); + + // Interval overlap with a tolerance for the scheduled-presence signals + $query->orWhere(function ($query) use ($etaSql, $bindings) { + $overlapHours = self::OVERLAP_MATCH_HOURS; + + $query->whereIn('airport_scores.source', self::OVERLAP_MATCH_SOURCES) + ->whereRaw("{$etaSql} BETWEEN DATE_SUB(airport_scores.valid_from, INTERVAL {$overlapHours} HOUR) AND DATE_ADD(airport_scores.valid_to, INTERVAL {$overlapHours} HOUR)", $bindings); + }); + + if ($metarOnlyWeather) { + // Departure candidates: the current METAR is always the weather truth + $query->orWhere('airport_scores.source', self::SOURCE_METAR); + + return; + } + + // The current METAR is the fallback when no TAF period covers the ETA + $query->orWhere(function ($query) use ($etaSql, $bindings) { + $query->where('airport_scores.source', self::SOURCE_METAR) + ->whereNotExists(function ($query) use ($etaSql, $bindings) { + $query->from('taf_forecasts') + ->join('tafs', 'tafs.id', '=', 'taf_forecasts.taf_id') + ->whereColumn('tafs.airport_id', 'airport_scores.airport_id') + ->whereRaw("{$etaSql} BETWEEN taf_forecasts.valid_from AND taf_forecasts.valid_to", $bindings); + }); + }); + }); + } + + /** + * A readable tooltip line built from the structured data payload, + * shaped by which source generated the row. + */ + public function tooltipText(): ?string + { + if (! $this->data) { + return null; + } + + return match ($this->source) { + // Live rows carry either the aggregated station list (VATSIM_ATC) + // or a movement count (VATSIM_POPULAR) + self::SOURCE_VATSIM => match (true) { + isset($this->data['stations']) => collect($this->data['stations'])->map(fn ($station) => $station['facility'] ?? $station)->join(', '), + isset($this->data['movements']) => $this->data['movements'] . ' aircraft in vicinity', + default => null, + }, + + self::SOURCE_EVENT => $this->data['event'] . ' ' . $this->windowText(), + + // A controller online right now — we know when they logged on, not when they'll leave + self::SOURCE_LOGON_ESTIMATE => self::onlineForText($this->data['facility'] ?? $this->data['position'], $this->data['logon_time']), + + self::SOURCE_BOOKING => ($this->data['facility'] ?? $this->data['callsign']) . ' ' . $this->windowText(), + + default => null, + }; + } + + private function windowText(): string + { + return $this->valid_from->format('H:i\z') . ' - ' . $this->valid_to->format('H:i\z'); + } + + /** + * The single "TWR online for 1h 20m" formatter — every online-station line + * renders through here. + */ + public static function onlineForText(string $facility, Carbon|string $logonTime): string + { + return $facility . ' online for ' . self::loggedOnAgo($logonTime); + } + + /** + * How long ago a controller logged on, in hours and/or minutes + */ + public static function loggedOnAgo(Carbon|string $logonTime): string + { + return Carbon::parse($logonTime)->diffForHumans(['parts' => 2, 'short' => true, 'minimumUnit' => 'minute', 'syntax' => Carbon::DIFF_ABSOLUTE]); + } + public function isWeatherScore() { return str_starts_with($this->reason, 'METAR_'); @@ -28,18 +251,42 @@ public function isVatsimScore() return str_starts_with($this->reason, 'VATSIM_'); } - public static function getTopAirports($continent = null, $whitelist = null, $limit = 30, $exclude = null) + public static function getTopAirports($continent = null, $whitelist = null, $limit = 30, $exclude = null, $aircraft = null) { + // Don't cache whitelists + if ($whitelist) { + return self::computeTopAirports($continent, $whitelist, $limit, $exclude, $aircraft); + } - // Establish the return query - $returnQuery = AirportScore::select('airport_id', \DB::raw('count(airport_scores.id) as id_count')) + $cacheKey = 'top-airports:' . ($continent ?? 'all') . ':' . ($exclude ?? 'none') . ':' . ($aircraft ?? 'any') . ':' . $limit; + + // The payload is base64-wrapped because the loaded airports embed raw + // GEOMETRY binary (coordinates), which the database cache store cannot + // put in its text value column + if ($cached = Cache::get($cacheKey)) { + return unserialize(base64_decode($cached)); + } + + // Compute and cache the result + $result = self::computeTopAirports($continent, $whitelist, $limit, $exclude, $aircraft); + Cache::put($cacheKey, base64_encode(serialize($result)), 300); + + return $result; + } + + private static function computeTopAirports($continent, $whitelist, $limit, $exclude, $aircraft = null) + { + + // Establish the return query — counting distinct reasons + $returnQuery = AirportScore::select('airport_id', DB::raw('count(distinct airport_scores.reason) as id_count')) + ->coversEta(now()) ->groupBy('airport_id') ->orderByDesc('id_count') ->join('airports', 'airport_scores.airport_id', '=', 'airports.id'); // Filter out VATSIM scores if requested if ($exclude) { - if ($exclude = 'vatsim') { + if ($exclude == 'vatsim') { $returnQuery = $returnQuery->where('airport_scores.reason', 'NOT LIKE', 'VATSIM_%'); } } @@ -69,9 +316,15 @@ public static function getTopAirports($continent = null, $whitelist = null, $lim $returnQuery = $returnQuery->whereIn('airports.icao', $whitelist); } - // Filter airport type, relevant data and run the query + // Only airports with a runway long enough for the aircraft type + if ($aircraft) { + $returnQuery = $returnQuery->whereIn('airports.id', Airport::filterRunwayLengths(0, PHP_INT_MAX, $aircraft)->select('airports.id')); + } + + // Filter airport type, relevant data and run the query — the loaded scores + // are windowed the same way as the count, so the view renders what was ranked $result = $returnQuery->whereIn('airports.type', ['large_airport', 'medium_airport', 'seaplane_base', 'small_airport']) - ->with('airport', 'airport.metar', 'airport.runways', 'airport.scores') + ->with(['airport', 'airport.metar', 'airport.runways', 'airport.scores' => fn ($query) => $query->coversEta(now())]) ->limit($limit) ->get(); diff --git a/app/Models/ApiKey.php b/app/Models/ApiKey.php index ca758008..190f3acb 100644 --- a/app/Models/ApiKey.php +++ b/app/Models/ApiKey.php @@ -17,9 +17,12 @@ class ApiKey extends Model 'key', 'name', 'ip_address', 'last_used_at', ]; - public $casts = [ - 'disabled' => 'boolean', - ]; + protected function casts(): array + { + return [ + 'disabled' => 'boolean', + ]; + } public function logs() { diff --git a/app/Models/Booking.php b/app/Models/Booking.php new file mode 100644 index 00000000..67bb9449 --- /dev/null +++ b/app/Models/Booking.php @@ -0,0 +1,34 @@ + 'datetime', + 'end' => 'datetime', + 'last_synced_at' => 'datetime', + ]; + } + + public function airport() + { + return $this->belongsTo(Airport::class); + } +} diff --git a/app/Models/Controller.php b/app/Models/Controller.php index 4b6cfceb..8a8e6d47 100644 --- a/app/Models/Controller.php +++ b/app/Models/Controller.php @@ -13,9 +13,12 @@ class Controller extends Model protected $guarded = []; - protected $casts = [ - 'logon_time' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'logon_time' => 'datetime', + ]; + } public function airport() { diff --git a/app/Models/Event.php b/app/Models/Event.php index b35867a8..7ffbf664 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -13,10 +13,13 @@ class Event extends Model protected $guarded = []; - protected $casts = [ - 'start_time' => 'datetime', - 'end_time' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'start_time' => 'datetime', + 'end_time' => 'datetime', + ]; + } public function airport() { diff --git a/app/Models/Flight.php b/app/Models/Flight.php index 01a6f885..18d22f1d 100644 --- a/app/Models/Flight.php +++ b/app/Models/Flight.php @@ -11,10 +11,13 @@ class Flight extends Model public $timestamps = false; - protected $casts = [ - 'last_seen_at' => 'datetime', - 'first_seen_at' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'last_seen_at' => 'datetime', + 'first_seen_at' => 'datetime', + ]; + } public function departureAirport() { diff --git a/app/Models/FlightAircraft.php b/app/Models/FlightAircraft.php index 3e8efddb..502e0162 100644 --- a/app/Models/FlightAircraft.php +++ b/app/Models/FlightAircraft.php @@ -11,10 +11,13 @@ class FlightAircraft extends Model public $timestamps = false; - protected $casts = [ - 'last_seen_at' => 'datetime', - 'first_seen_at' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'last_seen_at' => 'datetime', + 'first_seen_at' => 'datetime', + ]; + } public function flight() { diff --git a/app/Models/Metar.php b/app/Models/Metar.php index 4f249e67..65d0897f 100644 --- a/app/Models/Metar.php +++ b/app/Models/Metar.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Helpers\WeatherScoreHelper; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -11,9 +12,12 @@ class Metar extends Model public $timestamps = false; - protected $cats = [ - 'last_updated' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'last_update' => 'datetime', + ]; + } protected $guarded = []; @@ -45,7 +49,7 @@ public function sightAtAbove(int $meters) // Check american sight. 10SM == 9999 $results = []; if (preg_match('/\s(\d\d?)SM\s/', $this->metarWithoutRemarks(), $results)) { - if ((int) $results[1] * 1609.344 >= $meters) { + if ((int) $results[1] * WeatherScoreHelper::METERS_PER_STATUTE_MILE >= $meters) { return true; } } @@ -71,7 +75,7 @@ public function sightBelow(int $meters) // Check american sight. 10SM == 9999 $results = []; if (preg_match('/\s(\d\d?)SM\s/', $this->metarWithoutRemarks(), $results)) { - if ((int) $results[1] * 1609.344 < $meters) { + if ((int) $results[1] * WeatherScoreHelper::METERS_PER_STATUTE_MILE < $meters) { return true; } } @@ -112,42 +116,22 @@ public function ceilingAtAbove(int $feet) public function foggy() { - $results = []; - if (preg_match('/(FG|HZ)/', $this->metarWithoutRemarks(), $results)) { - return true; - } - - return false; + return preg_match(WeatherScoreHelper::FOG_PATTERN, $this->metarWithoutRemarks()) === 1; } public function heavyRain() { - $results = []; - if (preg_match('/(\+RA|\+SHRA)/', $this->metarWithoutRemarks(), $results)) { - return true; - } - - return false; + return preg_match(WeatherScoreHelper::HEAVY_RAIN_PATTERN, $this->metarWithoutRemarks()) === 1; } public function heavySnow() { - $results = []; - if (preg_match('/(\+SN)/', $this->metarWithoutRemarks(), $results)) { - return true; - } - - return false; + return preg_match(WeatherScoreHelper::HEAVY_SNOW_PATTERN, $this->metarWithoutRemarks()) === 1; } public function thunderstorm() { - $results = []; - if (preg_match('/(TS|\+TSRA)/', $this->metarWithoutRemarks(), $results)) { - return true; - } - - return false; + return preg_match(WeatherScoreHelper::THUNDERSTORM_PATTERN, $this->metarWithoutRemarks()) === 1; } public function rvrAtBelow(string $rwy, int $meters) diff --git a/app/Models/Runway.php b/app/Models/Runway.php index 5a78db80..31253620 100644 --- a/app/Models/Runway.php +++ b/app/Models/Runway.php @@ -13,10 +13,13 @@ class Runway extends Model protected $guarded = []; - protected $casts = [ - 'lighted' => 'boolean', - 'closed' => 'boolean', - ]; + protected function casts(): array + { + return [ + 'lighted' => 'boolean', + 'closed' => 'boolean', + ]; + } public function airport() { diff --git a/app/Models/Taf.php b/app/Models/Taf.php new file mode 100644 index 00000000..9a8e4954 --- /dev/null +++ b/app/Models/Taf.php @@ -0,0 +1,41 @@ + 'datetime', + 'bulletin_time' => 'datetime', + 'valid_from' => 'datetime', + 'valid_to' => 'datetime', + 'last_update' => 'datetime', + ]; + } + + public function airport() + { + return $this->belongsTo(Airport::class); + } + + public function forecasts() + { + return $this->hasMany(TafForecast::class); + } +} diff --git a/app/Models/TafForecast.php b/app/Models/TafForecast.php new file mode 100644 index 00000000..92ff6e6d --- /dev/null +++ b/app/Models/TafForecast.php @@ -0,0 +1,121 @@ + 'datetime', + 'valid_to' => 'datetime', + ]; + } + + public function taf() + { + return $this->belongsTo(Taf::class); + } + + /** + * The lowest ceiling in a cache-XML sky_condition layer list + * + * @param array $layers + */ + public static function ceilingFromSkyCondition(array $layers): ?int + { + $ceiling = null; + foreach ($layers as $layer) { + if (in_array($layer['cover'] ?? null, ['BKN', 'OVC', 'VV', 'OVX']) && isset($layer['base_ft_agl'])) { + $ceiling = $ceiling === null ? $layer['base_ft_agl'] : min($ceiling, $layer['base_ft_agl']); + } + } + + return $ceiling; + } + + public function windAtAbove(int $knots) + { + if ($this->wind_speed_kt) { + return $this->wind_speed_kt >= $knots; + } + + return false; + } + + public function windGusts() + { + if ($this->wind_gust_kt) { + return true; + } + } + + /** + * Visibility in meters, as a float. A trailing `+` (e.g. `6+`) + * means "at or above" that value and is treated as the value itself. + */ + protected function visibilityMeters() + { + if ($this->visibility_statute_mi === null) { + return null; + } + + return (float) rtrim($this->visibility_statute_mi, '+') * WeatherScoreHelper::METERS_PER_STATUTE_MILE; + } + + public function sightAtAbove(int $meters) + { + $visibility = $this->visibilityMeters(); + + return $visibility !== null && $visibility >= $meters; + } + + public function sightBelow(int $meters) + { + $visibility = $this->visibilityMeters(); + + // An unbounded value like `6+` or `10+` can never assert visibility below anything above it + return $visibility !== null && $visibility < $meters && ! str_ends_with($this->visibility_statute_mi, '+'); + } + + public function ceilingAtAbove(int $feet) + { + return $this->ceiling_ft_agl !== null && $this->ceiling_ft_agl <= $feet; + } + + public function foggy() + { + return $this->wx_string !== null && preg_match(WeatherScoreHelper::FOG_PATTERN, $this->wx_string) === 1; + } + + public function heavyRain() + { + return $this->wx_string !== null && preg_match(WeatherScoreHelper::HEAVY_RAIN_PATTERN, $this->wx_string) === 1; + } + + public function heavySnow() + { + return $this->wx_string !== null && preg_match(WeatherScoreHelper::HEAVY_SNOW_PATTERN, $this->wx_string) === 1; + } + + public function thunderstorm() + { + return $this->wx_string !== null && preg_match(WeatherScoreHelper::THUNDERSTORM_PATTERN, $this->wx_string) === 1; + } +} diff --git a/app/Models/User.php b/app/Models/User.php index ac97f0ac..fdedc108 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -35,27 +35,26 @@ class User extends Authenticatable implements MustVerifyEmail ]; /** - * The attributes that should be cast. + * Get the attributes that should be cast. * - * @var array + * @return array */ - protected $casts = [ - 'email_verified_at' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'last_activity_at' => 'datetime', + 'password' => 'hashed', + ]; + } public function getAirportsFromLists() { - - $airports = []; - $userLists = UserList::where('user_id', $this->id)->with('airports', 'airports.metar', 'airports.runways')->get(); - - foreach ($userLists as $list) { - foreach ($list->airports as $airport) { - $airports[] = $airport; - } - } - - return $airports; + return $this->lists()->with('airports', 'airports.metar', 'airports.runways') + ->get() + ->pluck('airports') + ->flatten() + ->all(); } public function lists() diff --git a/app/Models/UserList.php b/app/Models/UserList.php index e517c794..8809d810 100644 --- a/app/Models/UserList.php +++ b/app/Models/UserList.php @@ -9,6 +9,15 @@ class UserList extends Model { use HasFactory; + protected $fillable = [ + 'name', + 'color', + 'simulator_id', + 'user_id', + 'public', + 'hidden', + ]; + public function user() { return $this->belongsTo(User::class); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 4363d3f5..492c3305 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -12,20 +12,16 @@ class AppServiceProvider extends ServiceProvider { /** * Register any application services. - * - * @return void */ - public function register() + public function register(): void { // } /** * Bootstrap any application services. - * - * @return void */ - public function boot() + public function boot(): void { Collection::mixin(new CollectionAirportFilter); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php deleted file mode 100644 index 33b83f56..00000000 --- a/app/Providers/AuthServiceProvider.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ - protected $policies = [ - // 'App\Models\Model' => 'App\Policies\ModelPolicy', - ]; - - /** - * Register any authentication / authorization services. - * - * @return void - */ - public function boot() - { - $this->registerPolicies(); - - // - } -} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php deleted file mode 100644 index 395c518b..00000000 --- a/app/Providers/BroadcastServiceProvider.php +++ /dev/null @@ -1,21 +0,0 @@ -> - */ - protected $listen = [ - Registered::class => [ - SendEmailVerificationNotification::class, - ], - ]; - - /** - * Register any events for your application. - * - * @return void - */ - public function boot() - { - // - } - - /** - * Determine if events and listeners should be automatically discovered. - * - * @return bool - */ - public function shouldDiscoverEvents() - { - return false; - } -} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php deleted file mode 100644 index ea87f2e5..00000000 --- a/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,52 +0,0 @@ -configureRateLimiting(); - - $this->routes(function () { - Route::middleware('api') - ->prefix('api') - ->group(base_path('routes/api.php')); - - Route::middleware('web') - ->group(base_path('routes/web.php')); - }); - } - - /** - * Configure the rate limiters for the application. - * - * @return void - */ - protected function configureRateLimiting() - { - RateLimiter::for('api', function (Request $request) { - return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); - }); - } -} diff --git a/app/Rules/ValidDestinations.php b/app/Rules/ValidDestinations.php index e3a5be01..e82acea9 100644 --- a/app/Rules/ValidDestinations.php +++ b/app/Rules/ValidDestinations.php @@ -2,7 +2,7 @@ namespace App\Rules; -use App\Http\Controllers\SearchController; +use App\Helpers\CountryHelper; use Closure; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Translation\PotentiallyTranslatedString; @@ -17,18 +17,11 @@ class ValidDestinations implements ValidationRule public function validate(string $attribute, mixed $value, Closure $fail): void { - $whitelist = ['Anywhere', 'Domestic', 'C-AF', 'C-AS', 'C-EU', 'C-NA', 'C-OC', 'C-SA']; - - $countries = SearchController::$countries; - $usStates = SearchController::$usStates; - - foreach ($countries as $iso => $country) { - $whitelist[] = $iso; - } - - foreach ($usStates as $iso => $state) { - $whitelist[] = 'US-' . $iso; - } + $whitelist = [ + 'Anywhere', 'Domestic', 'C-AF', 'C-AS', 'C-EU', 'C-NA', 'C-OC', 'C-SA', + ...array_keys(CountryHelper::names()), + ...array_map(fn ($iso) => 'US-' . $iso, array_keys(CountryHelper::US_STATES)), + ]; $exists = ! in_array($value, $whitelist); diff --git a/app/Rules/ValidScores.php b/app/Rules/ValidScores.php index 1b67a476..2b741e3b 100644 --- a/app/Rules/ValidScores.php +++ b/app/Rules/ValidScores.php @@ -2,7 +2,7 @@ namespace App\Rules; -use App\Http\Controllers\ScoreController; +use App\Helpers\ScoreHelper; use Closure; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Translation\PotentiallyTranslatedString; @@ -16,16 +16,21 @@ class ValidScores implements ValidationRule */ public function validate(string $attribute, mixed $value, Closure $fail): void { - - $whitelist = []; - foreach (ScoreController::$score_types as $k => $score_type) { - $whitelist[] = $k; + // The 'array' rule reports non-array input; nothing to validate here + if (! is_array($value)) { + return; } - foreach ($value as $score => $value) { + $whitelist = array_keys(ScoreHelper::TYPES); + + foreach ($value as $score => $scoreValue) { if (! in_array($score, $whitelist)) { $fail('Not a valid parameter.'); } + + if (! in_array((string) $scoreValue, ['-1', '0', '1'], true)) { + $fail('Score values must be -1, 0 or 1.'); + } } } } diff --git a/app/View/Components/ScoreIcon.php b/app/View/Components/ScoreIcon.php new file mode 100644 index 00000000..3d733a6a --- /dev/null +++ b/app/View/Components/ScoreIcon.php @@ -0,0 +1,97 @@ +scoreType = ScoreHelper::TYPES[$score->reason]; + $this->probabilityBadge = isset($score->data['probability']) || ! empty($score->data['tempo']); + $this->uncertain = $score->isUncertain(); + $this->facilityDots = $score->reason === 'VATSIM_ATC' && $airport ? $airport->atcFacilities() : collect(); + $this->tooltipLines = $this->buildTooltipLines(); + } + + /** + * Description, forecast uncertainty on its own line, then the per-source + * detail — for VATSIM_ATC the online stations and booked positions, + * otherwise the row's own text. + */ + private function buildTooltipLines(): array + { + $lines = [e($this->scoreType['desc'])]; + + if (isset($this->score->data['probability'])) { + $lines[] = e($this->score->data['probability'] . '% probability'); + } elseif (! empty($this->score->data['tempo'])) { + $lines[] = 'Temporary condition'; + } + + if ($this->score->reason === 'VATSIM_ATC' && $this->airport) { + return array_merge($lines, $this->atcLines()); + } + + if ($text = $this->score->tooltipText()) { + $lines[] = e($text); + } + + return $lines; + } + + private function atcLines(): array + { + $lines = []; + $onlineStations = $this->airport->atcOnlineStations(); + $bookingScores = $this->airport->atcBookingScores(); + + if ($onlineStations->count()) { + $lines[] = 'Online'; + foreach ($onlineStations as $station) { + $lines[] = e(AirportScore::onlineForText($station['facility'], $station['logon_time'])); + } + } + + if ($bookingScores->count()) { + $lines[] = '' . e($this->bookingsLabel) . ''; + foreach ($bookingScores as $bookingScore) { + $lines[] = e($bookingScore->tooltipText()); + } + } + + // Nothing renderable above (e.g. only a CTR station) — fall back to the row's own text + if (! $lines && ($text = $this->score->tooltipText())) { + $lines[] = e($text); + } + + return $lines; + } + + public function render(): View + { + return view('components.score-icon'); + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index b4a5fc36..ffeb12e8 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,60 +1,87 @@ withRouting( + web: __DIR__ . '/../routes/web.php', + api: __DIR__ . '/../routes/api.php', + commands: __DIR__ . '/../routes/console.php', + ) + ->withMiddleware(function (Middleware $middleware) { + $middleware->trustProxies( + at: [ + '173.245.48.0/20', // Cloudflare as of 2025-04-20 + '103.21.244.0/22', + '103.22.200.0/22', + '103.31.4.0/22', + '141.101.64.0/18', + '108.162.192.0/18', + '190.93.240.0/20', + '188.114.96.0/20', + '197.234.240.0/22', + '198.41.128.0/17', + '162.158.0.0/15', + '104.16.0.0/13', + '104.24.0.0/14', + '172.64.0.0/13', + '131.0.72.0/22', + '2400:cb00::/32', + '2606:4700::/32', + '2803:f800::/32', + '2405:b500::/32', + '2405:8100::/32', + '2a06:98c0::/29', + '2c0f:f248::/32', + '172.16.0.0/12', // Docker + ], + headers: Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB, + ); -$app = new Application( - $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) -); + $middleware->trimStrings(except: [ + 'current_password', + 'password', + 'password_confirmation', + ]); -/* -|-------------------------------------------------------------------------- -| Bind Important Interfaces -|-------------------------------------------------------------------------- -| -| Next, we need to bind some important interfaces into the container so -| we will be able to resolve them when needed. The kernels serve the -| incoming requests to this application from both the web and CLI. -| -*/ + $middleware->web(append: [ + UserActive::class, + AdminVariables::class, + FeedbackVariables::class, + ]); -$app->singleton( - Illuminate\Contracts\Http\Kernel::class, - Kernel::class -); + $middleware->statefulApi(); + $middleware->throttleApi('50,1'); -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); + $middleware->alias([ + 'api-token' => ApiToken::class, + ]); -$app->singleton( - ExceptionHandler::class, - Handler::class -); - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; + $middleware->redirectGuestsTo(fn (Request $request) => route('login')); + $middleware->redirectUsersTo(fn () => route('front')); + }) + ->withExceptions(function (Exceptions $exceptions) { + $exceptions->reportable(function (Throwable $e) { + if (app()->bound('sentry')) { + app('sentry')->configureScope(function (Scope $scope): void { + $scope->setUser(['id' => Auth::id()]); + }); + app('sentry')->captureException($e); + } + }); + }) + ->withCommands() + ->create(); diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 00000000..fc94ae60 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,7 @@ +=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/string": "<7.1" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides access to the localization data of the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v7.4.14" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "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": "2026-06-05T06:22:21+00:00" + }, { "name": "symfony/mailer", "version": "v7.4.8", diff --git a/config/app.php b/config/app.php index a2fcf3a5..baf74ebc 100644 --- a/config/app.php +++ b/config/app.php @@ -1,33 +1,5 @@ env('APP_NAME', 'Where2Fly'), - 'version' => 'v2.8.2', + 'version' => 'v3.0.0', 'searchVersion' => 2, /* @@ -202,75 +174,4 @@ // 'store' => 'redis', ], - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - AuthServiceProvider::class, - BroadcastServiceProvider::class, - BusServiceProvider::class, - CacheServiceProvider::class, - ConsoleSupportServiceProvider::class, - CookieServiceProvider::class, - DatabaseServiceProvider::class, - EncryptionServiceProvider::class, - FilesystemServiceProvider::class, - FoundationServiceProvider::class, - HashServiceProvider::class, - MailServiceProvider::class, - NotificationServiceProvider::class, - PaginationServiceProvider::class, - PipelineServiceProvider::class, - QueueServiceProvider::class, - RedisServiceProvider::class, - PasswordResetServiceProvider::class, - SessionServiceProvider::class, - TranslationServiceProvider::class, - ValidationServiceProvider::class, - ViewServiceProvider::class, - - /* - * Package Service Providers... - */ - - /* - * Application Service Providers... - */ - AppServiceProvider::class, - App\Providers\AuthServiceProvider::class, - // App\Providers\BroadcastServiceProvider::class, - EventServiceProvider::class, - RouteServiceProvider::class, - - MarkdownServiceProvider::class, - - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => Facade::defaultAliases()->merge([ - // 'ExampleClass' => App\Example\ExampleClass::class, - ])->toArray(), - ]; diff --git a/config/database.php b/config/database.php index 8b5766f1..7bb1a202 100644 --- a/config/database.php +++ b/config/database.php @@ -1,6 +1,7 @@ true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + Mysql::ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], diff --git a/container/configs/php.ini b/container/configs/php.ini index 5717c1cd..975b1bcb 100644 --- a/container/configs/php.ini +++ b/container/configs/php.ini @@ -376,7 +376,7 @@ zend.exception_ignore_args = On ; threat in any way, but it makes it possible to determine whether you use PHP ; on your server or not. ; http://php.net/expose-php -expose_php = On +expose_php = Off ;;;;;;;;;;;;;;;;;;; ; Resource Limits ; diff --git a/container/entrypoint.sh b/container/entrypoint.sh index 6350910b..12cc4ae9 100755 --- a/container/entrypoint.sh +++ b/container/entrypoint.sh @@ -10,6 +10,18 @@ if [ ! -f "$SELF_SIGNED_KEY" ] || [ ! -f "$SELF_SIGNED_CERT" ]; then openssl req -x509 -nodes -days 358000 -newkey rsa:2048 -keyout "$SELF_SIGNED_KEY" -out "$SELF_SIGNED_CERT" -subj "/O=Your vACC/CN=Stands" fi +# Normalise ownership/permissions of the writable trees before we drop into the service process. +mkdir -p \ + "$SERVICE_ROOT"/storage/logs \ + "$SERVICE_ROOT"/storage/app/tmp \ + "$SERVICE_ROOT"/storage/app/backup-temp \ + "$SERVICE_ROOT"/storage/framework/cache \ + "$SERVICE_ROOT"/storage/framework/sessions \ + "$SERVICE_ROOT"/storage/framework/views \ + "$SERVICE_ROOT"/bootstrap/cache +chown -R www-data:www-data "$SERVICE_ROOT"/storage "$SERVICE_ROOT"/bootstrap/cache +chmod -R g+w "$SERVICE_ROOT"/storage "$SERVICE_ROOT"/bootstrap/cache + if [ -z "$APP_KEY" ] && [ ! -f "$SERVICE_ROOT/.env" ]; then cp container/default.env .env php artisan key:generate diff --git a/container/install-npm.sh b/container/install-npm.sh index 819e591d..751eda7a 100755 --- a/container/install-npm.sh +++ b/container/install-npm.sh @@ -8,7 +8,7 @@ apt install -y ca-certificates curl gnupg mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -NODE_MAJOR=25 +NODE_MAJOR=26 echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list apt update diff --git a/database/factories/AirportFactory.php b/database/factories/AirportFactory.php new file mode 100644 index 00000000..75d1b30f --- /dev/null +++ b/database/factories/AirportFactory.php @@ -0,0 +1,41 @@ + + */ +class AirportFactory extends Factory +{ + protected $model = Airport::class; + + public function definition(): array + { + $lat = fake()->latitude(); + $lon = fake()->longitude(); + + return [ + 'icao' => strtoupper(fake()->unique()->lexify('K???')), + 'type' => 'medium_airport', + 'name' => fake()->city() . ' Airport', + 'latitude_deg' => $lat, + 'longitude_deg' => $lon, + 'elevation_ft' => fake()->numberBetween(0, 5000), + 'continent' => 'NA', + 'iso_country' => 'US', + 'iso_region' => 'US-CA', + 'municipality' => fake()->city(), + 'scheduled_service' => 'yes', + 'gps_code' => null, + 'iata_code' => null, + 'local_code' => null, + 'total_score' => null, + 'coordinates' => new Point($lat, $lon, Srid::WGS84->value), + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index be6299a4..a85cc41c 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -19,14 +19,22 @@ class UserFactory extends Factory public function definition() { return [ - 'name' => fake()->name(), - 'email' => fake()->safeEmail(), + 'username' => fake()->unique()->userName(), + 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'password' => 'password', 'remember_token' => Str::random(10), + 'admin' => false, ]; } + public function admin() + { + return $this->state(fn (array $attributes) => [ + 'admin' => true, + ]); + } + /** * Indicate that the model's email address should be unverified. * diff --git a/database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php b/database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php index ba908f9d..8ad2486a 100644 --- a/database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php +++ b/database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php @@ -12,6 +12,10 @@ public function up(): void { Schema::table('scenery_simulators', function (Blueprint $table) { + // Add a plain index so the foreign key on scenery_id still has + // index support after the composite unique index is removed. + // MySQL refuses to drop an index that is the sole index backing a FK. + $table->index('scenery_id'); $table->dropUnique(['scenery_id', 'simulator_id']); }); } @@ -23,6 +27,7 @@ public function down(): void { Schema::table('scenery_simulators', function (Blueprint $table) { $table->unique(['scenery_id', 'simulator_id']); + $table->dropIndex(['scenery_id']); }); } }; diff --git a/database/migrations/2025_04_20_091732_index_scores.php b/database/migrations/2025_04_20_091732_index_scores.php index fb007d37..62b8aee9 100644 --- a/database/migrations/2025_04_20_091732_index_scores.php +++ b/database/migrations/2025_04_20_091732_index_scores.php @@ -21,7 +21,7 @@ public function up(): void */ public function down(): void { - Schema::table('runways', function (Blueprint $table) { + Schema::table('airport_scores', function (Blueprint $table) { $table->dropIndex(['airport_id', 'reason']); }); } diff --git a/database/migrations/2026_07_03_100000_create_tafs.php b/database/migrations/2026_07_03_100000_create_tafs.php new file mode 100644 index 00000000..68453ba1 --- /dev/null +++ b/database/migrations/2026_07_03_100000_create_tafs.php @@ -0,0 +1,33 @@ +bigIncrements('id'); + $table->foreignId('airport_id')->constrained('airports')->onDelete('cascade'); + $table->text('raw_text'); + $table->dateTime('issued_at'); + $table->dateTime('bulletin_time')->nullable(); + $table->dateTime('valid_from'); + $table->dateTime('valid_to'); + $table->dateTime('last_update'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tafs'); + } +}; diff --git a/database/migrations/2026_07_03_100001_create_bookings.php b/database/migrations/2026_07_03_100001_create_bookings.php new file mode 100644 index 00000000..d1f50ad2 --- /dev/null +++ b/database/migrations/2026_07_03_100001_create_bookings.php @@ -0,0 +1,33 @@ +unsignedBigInteger('vatsim_booking_id')->primary(); + $table->string('callsign'); + $table->foreignId('airport_id')->constrained('airports')->onDelete('cascade'); + $table->string('division')->nullable(); + $table->string('subdivision')->nullable(); + $table->dateTime('start'); + $table->dateTime('end'); + $table->dateTime('last_synced_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('bookings'); + } +}; diff --git a/database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php b/database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php new file mode 100644 index 00000000..2794d867 --- /dev/null +++ b/database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php @@ -0,0 +1,39 @@ +truncate(); + + Schema::table('airport_scores', function (Blueprint $table) { + $table->unsignedBigInteger('airport_id')->change(); + $table->foreign('airport_id')->references('id')->on('airports')->onDelete('cascade'); + $table->json('data')->nullable()->change(); + $table->string('source')->after('data'); + $table->dateTime('valid_from')->after('source'); + $table->dateTime('valid_to')->after('valid_from'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('airport_scores', function (Blueprint $table) { + $table->dropForeign(['airport_id']); + $table->dropColumn(['source', 'valid_from', 'valid_to']); + $table->text('data')->nullable()->change(); + $table->string('airport_id')->change(); + }); + } +}; diff --git a/database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php b/database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php new file mode 100644 index 00000000..ead27cac --- /dev/null +++ b/database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php @@ -0,0 +1,35 @@ +whereNotIn('airport_id', DB::table('airports')->select('id')) + ->delete(); + + Schema::table('metars', function (Blueprint $table) { + $table->unsignedBigInteger('airport_id')->change(); + $table->foreign('airport_id')->references('id')->on('airports')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('metars', function (Blueprint $table) { + $table->dropForeign(['airport_id']); + $table->string('airport_id')->change(); + }); + } +}; diff --git a/database/migrations/2026_07_03_100004_create_taf_forecasts.php b/database/migrations/2026_07_03_100004_create_taf_forecasts.php new file mode 100644 index 00000000..f725a370 --- /dev/null +++ b/database/migrations/2026_07_03_100004_create_taf_forecasts.php @@ -0,0 +1,37 @@ +bigIncrements('id'); + $table->foreignId('taf_id')->constrained('tafs')->onDelete('cascade'); + $table->string('change_indicator')->nullable(); + $table->unsignedTinyInteger('probability')->nullable(); + $table->string('wind_dir_degrees')->nullable(); + $table->unsignedInteger('wind_speed_kt')->nullable(); + $table->unsignedInteger('wind_gust_kt')->nullable(); + $table->string('visibility_statute_mi')->nullable(); + $table->string('wx_string')->nullable(); + $table->unsignedInteger('ceiling_ft_agl')->nullable(); + $table->dateTime('valid_from'); + $table->dateTime('valid_to'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('taf_forecasts'); + } +}; diff --git a/database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php b/database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php new file mode 100644 index 00000000..e66daf42 --- /dev/null +++ b/database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php @@ -0,0 +1,50 @@ +dropSpatialIndex(['coordinates']); + }); + + Schema::table('airports', function (Blueprint $table) { + $table->geometry('coordinates', subtype: 'point', srid: 4326)->nullable(false)->change(); + }); + + Schema::table('airports', function (Blueprint $table) { + $table->spatialIndex('coordinates'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('airports', function (Blueprint $table) { + $table->dropSpatialIndex(['coordinates']); + }); + + Schema::table('airports', function (Blueprint $table) { + $table->geometry('coordinates', subtype: 'point')->nullable(false)->change(); + }); + + Schema::table('airports', function (Blueprint $table) { + $table->spatialIndex('coordinates'); + }); + } +}; diff --git a/database/migrations/2026_07_07_130000_index_airports_icao.php b/database/migrations/2026_07_07_130000_index_airports_icao.php new file mode 100644 index 00000000..a1123942 --- /dev/null +++ b/database/migrations/2026_07_07_130000_index_airports_icao.php @@ -0,0 +1,32 @@ +index('icao'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('airports', function (Blueprint $table) { + $table->dropIndex(['icao']); + }); + } +}; diff --git a/database/migrations/2026_07_07_130001_index_airports_local_code.php b/database/migrations/2026_07_07_130001_index_airports_local_code.php new file mode 100644 index 00000000..06788ce9 --- /dev/null +++ b/database/migrations/2026_07_07_130001_index_airports_local_code.php @@ -0,0 +1,30 @@ +orWhere('local_code')). + */ + public function up(): void + { + Schema::table('airports', function (Blueprint $table) { + $table->index('local_code'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('airports', function (Blueprint $table) { + $table->dropIndex(['local_code']); + }); + } +}; diff --git a/database/migrations/2026_07_07_130002_index_airport_scores_source_window.php b/database/migrations/2026_07_07_130002_index_airport_scores_source_window.php new file mode 100644 index 00000000..8ef05b18 --- /dev/null +++ b/database/migrations/2026_07_07_130002_index_airport_scores_source_window.php @@ -0,0 +1,33 @@ +index(['airport_id', 'source', 'valid_from', 'valid_to']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('airport_scores', function (Blueprint $table) { + $table->dropIndex(['airport_id', 'source', 'valid_from', 'valid_to']); + }); + } +}; diff --git a/database/migrations/2026_07_07_130003_index_taf_forecasts_window.php b/database/migrations/2026_07_07_130003_index_taf_forecasts_window.php new file mode 100644 index 00000000..904ab342 --- /dev/null +++ b/database/migrations/2026_07_07_130003_index_taf_forecasts_window.php @@ -0,0 +1,31 @@ +index(['taf_id', 'valid_from', 'valid_to']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('taf_forecasts', function (Blueprint $table) { + $table->dropIndex(['taf_id', 'valid_from', 'valid_to']); + }); + } +}; diff --git a/database/migrations/2026_07_15_100000_convert_airport_scores_score_to_weight.php b/database/migrations/2026_07_15_100000_convert_airport_scores_score_to_weight.php new file mode 100644 index 00000000..fb61da5a --- /dev/null +++ b/database/migrations/2026_07_15_100000_convert_airport_scores_score_to_weight.php @@ -0,0 +1,52 @@ +decimal('score', 3, 2)->unsigned()->default(1)->change(); + }); + + // Backfill existing TEMPO/PROB rows: fetch:tafs only rebuilds scores + // when a TAF's issued_at advances, so without this the pre-migration + // rows keep weight 1 (badged as uncertain but ranked/rendered as + // certain) until every TAF has been reissued. The ladder is inlined — + // a migration shouldn't drift with future AirportScore changes. + $weights = [ + 'JSON_EXTRACT(data, "$.probability") = 40 AND JSON_EXTRACT(data, "$.tempo") = true' => 0.4, + 'JSON_EXTRACT(data, "$.probability") = 30 AND JSON_EXTRACT(data, "$.tempo") = true' => 0.25, + 'JSON_EXTRACT(data, "$.probability") = 40' => 0.5, + 'JSON_EXTRACT(data, "$.probability") = 30' => 0.3, + 'JSON_EXTRACT(data, "$.tempo") = true' => 0.7, + ]; + + foreach ($weights as $condition => $weight) { + DB::table('airport_scores') + ->where('source', 'taf') + ->where('score', 1) + ->whereRaw($condition) + ->update(['score' => $weight]); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('airport_scores', function (Blueprint $table) { + $table->tinyInteger('score')->default(1)->change(); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php deleted file mode 100644 index 76d96dc7..00000000 --- a/database/seeders/DatabaseSeeder.php +++ /dev/null @@ -1,24 +0,0 @@ -create(); - - // \App\Models\User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', - // ]); - } -} diff --git a/database/seeders/TestAirportSeeder.php b/database/seeders/TestAirportSeeder.php new file mode 100644 index 00000000..5eb944d4 --- /dev/null +++ b/database/seeders/TestAirportSeeder.php @@ -0,0 +1,144 @@ + 'KLAX', 'name' => 'Los Angeles International', 'lat' => 33.9425, 'lon' => -118.4081, 'type' => 'large_airport', 'iso_country' => 'US', 'iso_region' => 'US-CA', 'continent' => 'NA', 'municipality' => 'Los Angeles'], + ['icao' => 'KSFO', 'name' => 'San Francisco International', 'lat' => 37.6189, 'lon' => -122.3750, 'type' => 'large_airport', 'iso_country' => 'US', 'iso_region' => 'US-CA', 'continent' => 'NA', 'municipality' => 'San Francisco'], + ['icao' => 'KJFK', 'name' => 'John F Kennedy International', 'lat' => 40.6398, 'lon' => -73.7789, 'type' => 'large_airport', 'iso_country' => 'US', 'iso_region' => 'US-NY', 'continent' => 'NA', 'municipality' => 'New York'], + ['icao' => 'KORD', 'name' => "Chicago O'Hare International", 'lat' => 41.9742, 'lon' => -87.9073, 'type' => 'large_airport', 'iso_country' => 'US', 'iso_region' => 'US-IL', 'continent' => 'NA', 'municipality' => 'Chicago'], + ['icao' => 'EGLL', 'name' => 'London Heathrow', 'lat' => 51.4775, 'lon' => -0.4614, 'type' => 'large_airport', 'iso_country' => 'GB', 'iso_region' => 'GB-ENG', 'continent' => 'EU', 'municipality' => 'London'], + ['icao' => 'EDDM', 'name' => 'Munich Airport', 'lat' => 48.3538, 'lon' => 11.7861, 'type' => 'large_airport', 'iso_country' => 'DE', 'iso_region' => 'DE-BY', 'continent' => 'EU', 'municipality' => 'Munich'], + ['icao' => 'EDDF', 'name' => 'Frankfurt Airport', 'lat' => 50.0333, 'lon' => 8.5706, 'type' => 'large_airport', 'iso_country' => 'DE', 'iso_region' => 'DE-HE', 'continent' => 'EU', 'municipality' => 'Frankfurt'], + ['icao' => 'EHAM', 'name' => 'Amsterdam Schiphol', 'lat' => 52.3086, 'lon' => 4.7639, 'type' => 'large_airport', 'iso_country' => 'NL', 'iso_region' => 'NL-NH', 'continent' => 'EU', 'municipality' => 'Amsterdam'], + ['icao' => 'LFPG', 'name' => 'Paris Charles de Gaulle', 'lat' => 49.0128, 'lon' => 2.5500, 'type' => 'large_airport', 'iso_country' => 'FR', 'iso_region' => 'FR-IDF', 'continent' => 'EU', 'municipality' => 'Paris'], + ['icao' => 'RJTT', 'name' => 'Tokyo Haneda', 'lat' => 35.5494, 'lon' => 139.7798, 'type' => 'large_airport', 'iso_country' => 'JP', 'iso_region' => 'JP-13', 'continent' => 'AS', 'municipality' => 'Tokyo'], + ['icao' => 'EDDS', 'name' => 'Stuttgart Airport', 'lat' => 48.69, 'lon' => 9.22, 'type' => 'large_airport', 'iso_country' => 'DE', 'iso_region' => 'DE-BW', 'continent' => 'EU', 'municipality' => 'Stuttgart', 'elevation_ft' => 1276], + ['icao' => 'EDDB', 'name' => 'Berlin Brandenburg Airport', 'lat' => 52.36, 'lon' => 13.50, 'type' => 'large_airport', 'iso_country' => 'DE', 'iso_region' => 'DE-BR', 'continent' => 'EU', 'municipality' => 'Berlin', 'elevation_ft' => 157], + ['icao' => 'ENBR', 'name' => 'Bergen Airport, Flesland', 'lat' => 60.29, 'lon' => 5.22, 'type' => 'large_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-46', 'continent' => 'EU', 'municipality' => 'Bergen', 'elevation_ft' => 170], + ['icao' => 'ENGM', 'name' => 'Oslo Airport, Gardermoen', 'lat' => 60.19, 'lon' => 11.10, 'type' => 'large_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-32', 'continent' => 'EU', 'municipality' => 'Oslo', 'elevation_ft' => 681], + ['icao' => 'ENSO', 'name' => 'Stord Airport, Sørstokken', 'lat' => 59.79, 'lon' => 5.34, 'type' => 'medium_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-46', 'continent' => 'EU', 'municipality' => 'Leirvik', 'elevation_ft' => 160], + ['icao' => 'ENTC', 'name' => 'Tromsø Airport, Langnes', 'lat' => 69.68, 'lon' => 18.92, 'type' => 'large_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-55', 'continent' => 'EU', 'municipality' => 'Tromsø', 'elevation_ft' => 31], + ['icao' => 'ENTO', 'name' => 'Sandefjord Airport, Torp', 'lat' => 59.19, 'lon' => 10.26, 'type' => 'medium_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-39', 'continent' => 'EU', 'municipality' => 'Torp', 'elevation_ft' => 286], + ['icao' => 'ENSG', 'name' => 'Sogndal Airport, Haukåsen', 'lat' => 61.16, 'lon' => 7.14, 'type' => 'small_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-46', 'continent' => 'EU', 'municipality' => 'Sogndal', 'elevation_ft' => 1633], + ['icao' => 'ENSD', 'name' => 'Sandane Airport, Anda', 'lat' => 61.83, 'lon' => 6.11, 'type' => 'small_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-46', 'continent' => 'EU', 'municipality' => 'Sandane', 'elevation_ft' => 196], + // ENBO: unlighted runway — used to test destinationRunwayLights=-1 + ['icao' => 'ENBO', 'name' => 'Bodø Airport', 'lat' => 67.27, 'lon' => 14.37, 'type' => 'medium_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-18', 'continent' => 'EU', 'municipality' => 'Bodø', 'elevation_ft' => 42, 'rwy_lighted' => false], + // ENHF: military airbase — used to test destinationAirbases=1 + ['icao' => 'ENHF', 'name' => 'Hammerfest Airport', 'lat' => 70.68, 'lon' => 23.67, 'type' => 'small_airport', 'iso_country' => 'NO', 'iso_region' => 'NO-54', 'continent' => 'EU', 'municipality' => 'Hammerfest', 'elevation_ft' => 266, 'w2f_airforcebase' => true], + ]; + + foreach ($airports as $data) { + $airport = Airport::updateOrCreate( + ['icao' => $data['icao']], + [ + 'local_code' => $data['icao'], + 'name' => $data['name'], + 'type' => $data['type'], + 'latitude_deg' => $data['lat'], + 'longitude_deg' => $data['lon'], + 'continent' => $data['continent'], + 'iso_country' => $data['iso_country'], + 'iso_region' => $data['iso_region'], + 'municipality' => $data['municipality'], + 'elevation_ft' => $data['elevation_ft'] ?? 100, + 'scheduled_service' => 'yes', + 'w2f_has_open_runway' => true, + 'w2f_airforcebase' => $data['w2f_airforcebase'] ?? false, + 'coordinates' => new Point($data['lat'], $data['lon'], Srid::WGS84->value), + ] + ); + + Runway::firstOrCreate( + ['airport_id' => $airport->id, 'le_ident' => '18'], + [ + 'airport_ident' => $data['icao'], + 'length_ft' => $data['rwy_length_ft'] ?? 9000, + 'width_ft' => 150, + 'surface' => 'ASP', + 'lighted' => $data['rwy_lighted'] ?? true, + 'closed' => false, + 'le_heading' => 180.0, + 'he_ident' => '36', + 'he_heading' => 360.0, + ] + ); + } + + $metars = [ + 'EDDF' => ['last_update' => now(), 'metar' => 'AUTO 03010KT 360V060 CAVOK 12/02 Q1024 NOSIG', 'wind_direction' => 30, 'wind_speed' => 10, 'wind_gusts' => 0, 'temperature' => 12], + 'EDDS' => ['last_update' => now(), 'metar' => 'AUTO VRB03KT CAVOK 14/M01 Q1022 NOSIG', 'wind_direction' => 0, 'wind_speed' => 0, 'wind_gusts' => 0, 'temperature' => 14], + 'EGLL' => ['last_update' => now(), 'metar' => 'COR AUTO 10006KT 010V140 9999 NCD 14/07 Q1026 NOSIG', 'wind_direction' => 100, 'wind_speed' => 6, 'wind_gusts' => 0, 'temperature' => 14], + 'EHAM' => ['last_update' => now(), 'metar' => '08006KT 010V130 9999 FEW027 11/03 Q1026 NOSIG', 'wind_direction' => 80, 'wind_speed' => 6, 'wind_gusts' => 0, 'temperature' => 11], + 'ENBR' => ['last_update' => now(), 'metar' => '36007KT 310V030 CAVOK 05/M07 Q1025 NOSIG RMK WIND 1200FT 02008KT', 'wind_direction' => 360, 'wind_speed' => 7, 'wind_gusts' => 0, 'temperature' => 5], + 'ENGM' => ['last_update' => now(), 'metar' => '01012KT 340V040 CAVOK 07/M11 Q1021 NOSIG', 'wind_direction' => 10, 'wind_speed' => 12, 'wind_gusts' => 0, 'temperature' => 7], + 'ENTC' => ['last_update' => '2020-01-01 00:00:00', 'metar' => '31003KT 270V330 1800 -SN VV011 01/M01 Q1010 TEMPO 0800 SHSN VV006 RMK WIND 2600FT 34024KT', 'wind_direction' => 310, 'wind_speed' => 3, 'wind_gusts' => 0, 'temperature' => 1], + 'ENTO' => ['last_update' => now(), 'metar' => '34006KT CAVOK 07/M10 Q1023 NOSIG', 'wind_direction' => 340, 'wind_speed' => 6, 'wind_gusts' => 0, 'temperature' => 7], + 'KLAX' => ['last_update' => now(), 'metar' => '23005KT 10SM FEW012 BKN025 OVC049 13/12 A2988 RMK AO2 RAE38 SLP117 P0018 60029 T01330117 58007', 'wind_direction' => 230, 'wind_speed' => 5, 'wind_gusts' => 0, 'temperature' => 13], + 'KORD' => ['last_update' => now(), 'metar' => '35003KT 10SM CLR 06/04 A3003 RMK AO2 SLP171 T00610039 53002', 'wind_direction' => 350, 'wind_speed' => 3, 'wind_gusts' => 0, 'temperature' => 6], + 'KSFO' => ['last_update' => now(), 'metar' => '19005KT 10SM FEW012 BKN023 OVC045 13/09 A2984 RMK AO2 SLP103 T01280094 56005 $', 'wind_direction' => 190, 'wind_speed' => 5, 'wind_gusts' => 0, 'temperature' => 13], + 'LFPG' => ['last_update' => now(), 'metar' => '07010KT 040V100 CAVOK 16/02 Q1023 NOSIG', 'wind_direction' => 70, 'wind_speed' => 10, 'wind_gusts' => 0, 'temperature' => 16], + 'RJTT' => ['last_update' => now(), 'metar' => '17009KT 9999 FEW030 BKN/// 19/11 Q1017 NOSIG', 'wind_direction' => 170, 'wind_speed' => 9, 'wind_gusts' => 0, 'temperature' => 19], + 'ENSG' => ['last_update' => now(), 'metar' => 'AUTO 21004KT 110V260 9999 BKN045/// OVC177/// 01/M07 Q1022 RMK WIND 3806FT 26007KT', 'wind_direction' => 210, 'wind_speed' => 4, 'wind_gusts' => 0, 'temperature' => 1], + 'ENSD' => ['last_update' => now(), 'metar' => 'AUTO 27003KT 9999 FEW025/// OVC057/// 04/M03 Q1025 RMK WIND RWY 26 26005KT WIND 1126FT 28004KT', 'wind_direction' => 270, 'wind_speed' => 3, 'wind_gusts' => 0, 'temperature' => 4], + 'EDDB' => ['last_update' => now(), 'metar' => 'AUTO 02007KT 340V070 CAVOK 11/00 Q1024 NOSIG', 'wind_direction' => 20, 'wind_speed' => 7, 'wind_gusts' => 0, 'temperature' => 11], + 'EDDM' => ['last_update' => now(), 'metar' => 'AUTO 06007KT 9999 FEW020 09/M02 Q1023 NOSIG', 'wind_direction' => 60, 'wind_speed' => 7, 'wind_gusts' => 0, 'temperature' => 9], + 'ENBO' => ['last_update' => now(), 'metar' => 'AUTO 02005KT 9999 FEW025 06/01 Q1015 NOSIG', 'wind_direction' => 20, 'wind_speed' => 5, 'wind_gusts' => 0, 'temperature' => 6], + 'ENHF' => ['last_update' => now(), 'metar' => 'AUTO 31004KT 9999 FEW018 03/M01 Q1012 NOSIG', 'wind_direction' => 310, 'wind_speed' => 4, 'wind_gusts' => 0, 'temperature' => 3], + ]; + + foreach ($metars as $icao => $data) { + $airport = Airport::where('icao', $icao)->first(); + if ($airport) { + Metar::updateOrCreate(['airport_id' => $airport->id], $data); + } + } + + // Seed airport scores — one unique score type per airport for clean filter tests + $scores = [ + 'ENBR' => ['METAR_WINDY'], + 'ENTO' => ['METAR_GUSTS'], + 'ENSG' => ['METAR_CROSSWIND'], + 'ENSD' => ['METAR_SIGHT'], + 'EDDB' => ['METAR_RVR'], + 'EHAM' => ['METAR_CEILING'], + 'ENTC' => ['METAR_FOGGY', 'VATSIM_POPULAR'], + 'EGLL' => ['METAR_HEAVY_RAIN'], + 'EDDF' => ['METAR_HEAVY_SNOW'], + 'EDDS' => ['METAR_THUNDERSTORM'], + 'LFPG' => ['VATSIM_ATC'], + 'EDDM' => ['VATSIM_EVENT'], + ]; + + foreach ($scores as $icao => $reasons) { + $airport = Airport::where('icao', $icao)->first(); + if ($airport) { + foreach ($reasons as $reason) { + // Deliberately wide validity windows so any test search's ETA is + // covered — tests exercising the windowing itself seed their own rows + AirportScore::firstOrCreate( + ['airport_id' => $airport->id, 'reason' => $reason], + [ + 'score' => 1, + 'source' => str_starts_with($reason, 'VATSIM_') ? AirportScore::SOURCE_VATSIM : AirportScore::SOURCE_METAR, + 'valid_from' => now()->subHour(), + 'valid_to' => now()->addHours(30), + ] + ); + } + } + } + } +} diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md new file mode 100644 index 00000000..13ce234c --- /dev/null +++ b/graphify-out/GRAPH_REPORT.md @@ -0,0 +1,286 @@ +# Graph Report - . (2026-07-08) + +## Corpus Check +- cluster-only mode — file stats not available + +## Summary +- 1219 nodes · 1838 edges · 227 communities (189 shown, 38 thin omitted) +- Extraction: 87% EXTRACTED · 13% INFERRED · 0% AMBIGUOUS · INFERRED: 247 edges (avg confidence: 0.8) +- Token cost: 0 input · 0 output + +## Graph Freshness +- Built from commit: `7904c0a0` +- Run `git rev-parse HEAD` and compare to check if the graph is stale. +- Run `graphify update .` after code changes (no API cost). + +## Community Hubs (Navigation) +- [[_COMMUNITY_Community 0|Community 0]] +- [[_COMMUNITY_Community 1|Community 1]] +- [[_COMMUNITY_Community 2|Community 2]] +- [[_COMMUNITY_Community 3|Community 3]] +- [[_COMMUNITY_Community 4|Community 4]] +- [[_COMMUNITY_Community 5|Community 5]] +- [[_COMMUNITY_Community 6|Community 6]] +- [[_COMMUNITY_Community 7|Community 7]] +- [[_COMMUNITY_Community 8|Community 8]] +- [[_COMMUNITY_Community 9|Community 9]] +- [[_COMMUNITY_Community 10|Community 10]] +- [[_COMMUNITY_Community 11|Community 11]] +- [[_COMMUNITY_Community 12|Community 12]] +- [[_COMMUNITY_Community 13|Community 13]] +- [[_COMMUNITY_Community 14|Community 14]] +- [[_COMMUNITY_Community 15|Community 15]] +- [[_COMMUNITY_Community 16|Community 16]] +- [[_COMMUNITY_Community 17|Community 17]] +- [[_COMMUNITY_Community 19|Community 19]] +- [[_COMMUNITY_Community 20|Community 20]] +- [[_COMMUNITY_Community 21|Community 21]] +- [[_COMMUNITY_Community 22|Community 22]] +- [[_COMMUNITY_Community 23|Community 23]] +- [[_COMMUNITY_Community 24|Community 24]] +- [[_COMMUNITY_Community 25|Community 25]] +- [[_COMMUNITY_Community 26|Community 26]] +- [[_COMMUNITY_Community 27|Community 27]] +- [[_COMMUNITY_Community 28|Community 28]] +- [[_COMMUNITY_Community 29|Community 29]] +- [[_COMMUNITY_Community 30|Community 30]] +- [[_COMMUNITY_Community 31|Community 31]] +- [[_COMMUNITY_Community 32|Community 32]] +- [[_COMMUNITY_Community 33|Community 33]] +- [[_COMMUNITY_Community 34|Community 34]] +- [[_COMMUNITY_Community 35|Community 35]] +- [[_COMMUNITY_Community 36|Community 36]] +- [[_COMMUNITY_Community 37|Community 37]] +- [[_COMMUNITY_Community 38|Community 38]] +- [[_COMMUNITY_Community 39|Community 39]] +- [[_COMMUNITY_Community 40|Community 40]] +- [[_COMMUNITY_Community 41|Community 41]] +- [[_COMMUNITY_Community 42|Community 42]] +- [[_COMMUNITY_Community 43|Community 43]] +- [[_COMMUNITY_Community 44|Community 44]] +- [[_COMMUNITY_Community 45|Community 45]] +- [[_COMMUNITY_Community 69|Community 69]] +- [[_COMMUNITY_Community 108|Community 108]] +- [[_COMMUNITY_Community 109|Community 109]] +- [[_COMMUNITY_Community 110|Community 110]] +- [[_COMMUNITY_Community 111|Community 111]] +- [[_COMMUNITY_Community 112|Community 112]] +- [[_COMMUNITY_Community 113|Community 113]] +- [[_COMMUNITY_Community 114|Community 114]] +- [[_COMMUNITY_Community 115|Community 115]] +- [[_COMMUNITY_Community 116|Community 116]] +- [[_COMMUNITY_Community 117|Community 117]] +- [[_COMMUNITY_Community 119|Community 119]] +- [[_COMMUNITY_Community 120|Community 120]] +- [[_COMMUNITY_Community 121|Community 121]] +- [[_COMMUNITY_Community 122|Community 122]] +- [[_COMMUNITY_Community 123|Community 123]] +- [[_COMMUNITY_Community 124|Community 124]] +- [[_COMMUNITY_Community 125|Community 125]] +- [[_COMMUNITY_Community 126|Community 126]] +- [[_COMMUNITY_Community 127|Community 127]] +- [[_COMMUNITY_Community 128|Community 128]] +- [[_COMMUNITY_Community 129|Community 129]] +- [[_COMMUNITY_Community 130|Community 130]] +- [[_COMMUNITY_Community 131|Community 131]] +- [[_COMMUNITY_Community 132|Community 132]] +- [[_COMMUNITY_Community 133|Community 133]] +- [[_COMMUNITY_Community 134|Community 134]] + +## God Nodes (most connected - your core abstractions) +1. `Airport` - 84 edges +2. `User` - 68 edges +3. `SearchTest` - 48 edges +4. `AirportScore` - 45 edges +5. `UserList` - 35 edges +6. `Simulator` - 33 edges +7. `TestCase` - 28 edges +8. `ApiTest` - 24 edges +9. `Metar` - 23 edges +10. `Scenery` - 23 edges + +## Surprising Connections (you probably didn't know these) +- `up()` --calls--> `Airport` [INFERRED] + database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php → app/Models/Airport.php +- `Where2Fly Application (Laravel 13 + Blade + React map canvas)` --semantically_similar_to--> `Where2Fly Project (README overview)` [INFERRED] [semantically similar] + CLAUDE.md → README.md +- `up()` --calls--> `FlightAircraft` [INFERRED] + database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php → app/Models/FlightAircraft.php +- `up()` --calls--> `Scenery` [INFERRED] + database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php → app/Models/Scenery.php +- `up()` --calls--> `Simulator` [INFERRED] + database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php → app/Models/Simulator.php + +## Import Cycles +- 1-file cycle: `resources/js/bootstrap.js -> resources/js/bootstrap.js` +- 1-file cycle: `resources/js/nouislider.js -> resources/js/nouislider.js` + +## Hyperedges (group relationships) +- **CI Pipeline: lint -> tests -> container build, all via shared setup-dependencies action** — _github_workflows_ci_lint_job, _github_workflows_ci_tests_job, _github_workflows_ci_build_container_job, _github_actions_setup_dependencies_action_setup_dependencies [EXTRACTED 1.00] +- **Shared where2fly_test MySQL contract between CI services and local test setup** — _github_workflows_ci_tests_job, _github_workflows_tests_phpunit_job, claude_testing_mysql [INFERRED 0.95] +- **where2fly container image lifecycle: CI builds and pushes to ghcr.io, prod compose pulls it, dev compose builds locally instead** — _github_workflows_ci_build_container_job, docker_compose_web_service, docker_compose_dev_web_service [INFERRED 0.85] + +## Communities (227 total, 38 thin omitted) + +### Community 0 - "Community 0" +Cohesion: 0.06 +Nodes (7): FetchMetars, FetchTafs, AviationWeatherHelper, WeatherScoreHelper, Metar, TafForecast, TafForecastTest + +### Community 1 - "Community 1" +Cohesion: 0.08 +Nodes (25): AirportCard(), CardContext, MapContext, FlightsCard(), getInitMapPosition(), isDefaultView(), Map(), MapBound() (+17 more) + +### Community 2 - "Community 2" +Cohesion: 0.06 +Nodes (16): AccountClearUnverified, CalcFlights, CleanupSceneries, CreateApiKey, EnrichAirports, EnrichFlights, EnrichSceneries, FetchBookings (+8 more) + +### Community 3 - "Community 3" +Cohesion: 0.08 +Nodes (9): AirportScore, Builder, Carbon, Collection, View, ScoreIcon, Component, ScorePredictionTest (+1 more) + +### Community 4 - "Community 4" +Cohesion: 0.07 +Nodes (18): AircraftHelper, Request, SearchController, Request, TopController, ScoreController, Request, View (+10 more) + +### Community 6 - "Community 6" +Cohesion: 0.08 +Nodes (9): getCountryName(), rwyIdentToHeading(), MapHelper, Collection, SceneryHelper, MapController, Request, Flight (+1 more) + +### Community 7 - "Community 7" +Cohesion: 0.09 +Nodes (9): User, UserListPolicy, UserPolicy, Authenticatable, CanResetPassword, MustVerifyEmail, Notifiable, AdminTest (+1 more) + +### Community 8 - "Community 8" +Cohesion: 0.07 +Nodes (29): dependencies, bootstrap, @elfalem/leaflet-curve, @joergdietrich/leaflet.terminator, laravel-vite-plugin, leaflet, leaflet.markercluster, lodash (+21 more) + +### Community 9 - "Community 9" +Cohesion: 0.12 +Nodes (3): Simulator, UserList, UserListTest + +### Community 10 - "Community 10" +Cohesion: 0.09 +Nodes (8): AirportFilterHelper, distance(), Request, UserController, CollectionAirportFilter, AppServiceProvider, EmailVerificationRequest, ServiceProvider + +### Community 11 - "Community 11" +Cohesion: 0.12 +Nodes (13): AirportExists, Closure, FlightDirection, Closure, Closure, ValidAircrafts, Closure, ValidAirlines (+5 more) + +### Community 12 - "Community 12" +Cohesion: 0.09 +Nodes (24): Ko-fi Sponsorship (where2fly), Bug Report Issue Template, Issue Template Config (blank issues disabled), Feature Request Issue Template, Aircraft Type Codeletters (GA, GAT, GTP, JS, JM, JML, JL, JXL), API Attribution Requirement (Powered by Where2Fly link), Score Reason Codes (METAR_WINDY..METAR_THUNDERSTORM, VATSIM_ATC, VATSIM_EVENT, VATSIM_POPULAR), POST /api/search Endpoint (departure/arrival, destinations, codeletter, score and airport filters) (+16 more) + +### Community 13 - "Community 13" +Cohesion: 0.14 +Nodes (6): Airline, Controller, Event, Taf, HasFactory, Model + +### Community 14 - "Community 14" +Cohesion: 0.13 +Nodes (4): Booking, Runway, TestAirportSeeder, Seeder + +### Community 20 - "Community 20" +Cohesion: 0.23 +Nodes (5): BaseTestCase, CreatesApplication, RefreshDatabase, ResponseTest, TestCase + +### Community 21 - "Community 21" +Cohesion: 0.18 +Nodes (4): LoginController, Request, Request, SceneryController + +### Community 22 - "Community 22" +Cohesion: 0.13 +Nodes (4): Scenery, SceneryPolicy, up(), up() + +### Community 23 - "Community 23" +Cohesion: 0.12 +Nodes (17): require, graham-campbell/markdown, guzzlehttp/guzzle, laravel/framework, laravel/nightwatch, laravel/sanctum, laravel/tinker, laravel/ui (+9 more) + +### Community 24 - "Community 24" +Cohesion: 0.17 +Nodes (9): AdminVariables, Closure, Request, FeedbackVariables, Closure, Request, Closure, Request (+1 more) + +### Community 25 - "Community 25" +Cohesion: 0.16 +Nodes (3): CalculationHelper, Carbon, Coordinate + +### Community 26 - "Community 26" +Cohesion: 0.26 +Nodes (4): Controller, Request, UserListController, AuthorizesRequests + +### Community 27 - "Community 27" +Cohesion: 0.23 +Nodes (5): ApiToken, Closure, Request, ApiKey, ApiLog + +### Community 28 - "Community 28" +Cohesion: 0.27 +Nodes (10): Setup Dependencies Composite Action (PHP 8.3.2, composer cache, optional Node 22), CI Build Container Job (pushes ghcr.io/blt950/where2fly, injects private fonts repo), CI Lint Job (Pint --test), CI PHPUnit Job (MySQL 8 service, where2fly_test DB), Legacy Linting Workflow (disabled, superseded by ci.yaml), Legacy Tests Workflow (disabled, superseded by ci.yaml), Testing Against Real MySQL (where2fly_test database, PHPUnit only, no sqlite fallback), Dev Compose Web Service (builds local Dockerfile, bind-mounts repo into container where2fly) (+2 more) + +### Community 30 - "Community 30" +Cohesion: 0.20 +Nodes (9): autoload-dev, psr-4, description, keywords, license, name, prefer-stable, Tests\\ (+1 more) + +### Community 31 - "Community 31" +Cohesion: 0.22 +Nodes (9): require-dev, barryvdh/laravel-debugbar, fakerphp/faker, laravel/pint, laravel/sail, mockery/mockery, nunomaduro/collision, phpunit/phpunit (+1 more) + +### Community 32 - "Community 32" +Cohesion: 0.28 +Nodes (3): AirportFactory, UserFactory, Factory + +### Community 36 - "Community 36" +Cohesion: 0.33 +Nodes (6): php-http/discovery, config, allow-plugins, optimize-autoloader, preferred-install, sort-packages + +### Community 37 - "Community 37" +Cohesion: 0.33 +Nodes (6): autoload, files, psr-4, App\\, Database\\Factories\\, Database\\Seeders\\ + +### Community 38 - "Community 38" +Cohesion: 0.40 +Nodes (5): scripts, post-autoload-dump, post-create-project-cmd, post-root-package-install, post-update-cmd + +### Community 39 - "Community 39" +Cohesion: 0.40 +Nodes (4): layouts.footer, parts.map, layouts.header, layouts.menu + +### Community 40 - "Community 40" +Cohesion: 0.60 +Nodes (3): contractFilters(), expandFilters(), toggleFilters() + +### Community 41 - "Community 41" +Cohesion: 0.40 +Nodes (4): front.parts.form, front.parts.sliders, front.parts.tabs, layouts.title + +### Community 42 - "Community 42" +Cohesion: 0.40 +Nodes (4): front.parts.form, front.parts.sliders, front.parts.tabs, layouts.title + +### Community 45 - "Community 45" +Cohesion: 0.67 +Nodes (3): extra, laravel, dont-discover + +## Ambiguous Edges - Review These +- `Data Ingestion Pipeline (update:data -> fetch:metars/tafs/vatsim; fetch:bookings; AWC bulk cache files, not per-airport calls)` → `External Data Sources (OurAirports, Airlabs, metar.vatsim.net, api.met.no TAF, FSAddonCompare, flagicons)` [AMBIGUOUS] + README.md · relation: conceptually_related_to + +## Knowledge Gaps +- **122 isolated node(s):** `name`, `type`, `description`, `keywords`, `license` (+117 more) + These have ≤1 connection - possible missing edges or undocumented components. +- **38 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. + +## Suggested Questions +_Questions this graph is uniquely positioned to answer:_ + +- **What is the exact relationship between `Data Ingestion Pipeline (update:data -> fetch:metars/tafs/vatsim; fetch:bookings; AWC bulk cache files, not per-airport calls)` and `External Data Sources (OurAirports, Airlabs, metar.vatsim.net, api.met.no TAF, FSAddonCompare, flagicons)`?** + _Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._ +- **Why does `Airport` connect `Community 15` to `Community 0`, `Community 2`, `Community 35`, `Community 4`, `Community 3`, `Community 6`, `Community 69`, `Community 34`, `Community 9`, `Community 44`, `Community 13`, `Community 14`, `Community 19`, `Community 20`, `Community 21`, `Community 25`, `Community 26`?** + _High betweenness centrality (0.078) - this node is a cross-community bridge._ +- **Why does `User` connect `Community 7` to `Community 2`, `Community 9`, `Community 10`, `Community 13`, `Community 16`, `Community 17`, `Community 18`, `Community 20`, `Community 21`, `Community 22`?** + _High betweenness centrality (0.052) - this node is a cross-community bridge._ +- **Why does `SearchTest` connect `Community 5` to `Community 9`, `Community 20`?** + _High betweenness centrality (0.031) - this node is a cross-community bridge._ +- **Are the 22 inferred relationships involving `Airport` (e.g. with `.handle()` and `.handle()`) actually correct?** + _`Airport` has 22 INFERRED edges - model-reasoned connections that need verification._ +- **Are the 46 inferred relationships involving `User` (e.g. with `.handle()` and `.showAdmin()`) actually correct?** + _`User` has 46 INFERRED edges - model-reasoned connections that need verification._ +- **Are the 13 inferred relationships involving `AirportScore` (e.g. with `.scoreBookings()` and `.scoreMetars()`) actually correct?** + _`AirportScore` has 13 INFERRED edges - model-reasoned connections that need verification._ \ No newline at end of file diff --git a/graphify-out/graph.json b/graphify-out/graph.json new file mode 100644 index 00000000..8d91bae4 --- /dev/null +++ b/graphify-out/graph.json @@ -0,0 +1,32875 @@ +{ + "directed": false, + "multigraph": false, + "graph": { + "hyperedges": [ + { + "id": "ci_pipeline_flow", + "label": "CI Pipeline: lint -> tests -> container build, all via shared setup-dependencies action", + "nodes": [ + "_github_workflows_ci_lint_job", + "_github_workflows_ci_tests_job", + "_github_workflows_ci_build_container_job", + "_github_actions_setup_dependencies_action_setup_dependencies" + ], + "relation": "form", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/ci.yaml" + }, + { + "id": "mysql_test_database_contract", + "label": "Shared where2fly_test MySQL contract between CI services and local test setup", + "nodes": [ + "_github_workflows_ci_tests_job", + "_github_workflows_tests_phpunit_job", + "claude_testing_mysql" + ], + "relation": "participate_in", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": ".github/workflows/ci.yaml" + }, + { + "id": "container_image_lifecycle", + "label": "where2fly container image lifecycle: CI builds and pushes to ghcr.io, prod compose pulls it, dev compose builds locally instead", + "nodes": [ + "_github_workflows_ci_build_container_job", + "docker_compose_web_service", + "docker_compose_dev_web_service" + ], + "relation": "participate_in", + "confidence": "INFERRED", + "confidence_score": 0.85, + "source_file": "docker-compose.yml" + } + ] + }, + "nodes": [ + { + "label": "AccountClearUnverified.php", + "file_type": "code", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "accountclearunverified.php", + "id": "app_console_commands_accountclearunverified", + "community_name": "Community 2" + }, + { + "label": "AccountClearUnverified", + "file_type": "code", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L8", + "_origin": "ast", + "community": 2, + "norm_label": "accountclearunverified", + "id": "app_console_commands_accountclearunverified_accountclearunverified", + "community_name": "Community 2" + }, + { + "label": "Command", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 2, + "norm_label": "command", + "id": "command", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L27", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_accountclearunverified_accountclearunverified_handle", + "community_name": "Community 2" + }, + { + "label": "CalcFlights.php", + "file_type": "code", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "calcflights.php", + "id": "app_console_commands_calcflights", + "community_name": "Community 2" + }, + { + "label": "CalcFlights", + "file_type": "code", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L8", + "_origin": "ast", + "community": 2, + "norm_label": "calcflights", + "id": "app_console_commands_calcflights_calcflights", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L29", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_calcflights_calcflights_handle", + "community_name": "Community 2" + }, + { + "label": "CleanupSceneries.php", + "file_type": "code", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "cleanupsceneries.php", + "id": "app_console_commands_cleanupsceneries", + "community_name": "Community 2" + }, + { + "label": "CleanupSceneries", + "file_type": "code", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L8", + "_origin": "ast", + "community": 2, + "norm_label": "cleanupsceneries", + "id": "app_console_commands_cleanupsceneries_cleanupsceneries", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L27", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_cleanupsceneries_cleanupsceneries_handle", + "community_name": "Community 2" + }, + { + "label": "CreateApiKey.php", + "file_type": "code", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "createapikey.php", + "id": "app_console_commands_createapikey", + "community_name": "Community 2" + }, + { + "label": "CreateApiKey", + "file_type": "code", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L9", + "_origin": "ast", + "community": 2, + "norm_label": "createapikey", + "id": "app_console_commands_createapikey_createapikey", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L30", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_createapikey_createapikey_handle", + "community_name": "Community 2" + }, + { + "label": "EnrichAirports.php", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "enrichairports.php", + "id": "app_console_commands_enrichairports", + "community_name": "Community 2" + }, + { + "label": "EnrichAirports", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L9", + "_origin": "ast", + "community": 2, + "norm_label": "enrichairports", + "id": "app_console_commands_enrichairports_enrichairports", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L30", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_enrichairports_enrichairports_handle", + "community_name": "Community 2" + }, + { + "label": "EnrichFlights.php", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "enrichflights.php", + "id": "app_console_commands_enrichflights", + "community_name": "Community 18" + }, + { + "label": "EnrichFlights", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L10", + "_origin": "ast", + "community": 2, + "norm_label": "enrichflights", + "id": "app_console_commands_enrichflights_enrichflights", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L31", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_enrichflights_enrichflights_handle", + "community_name": "Community 2" + }, + { + "label": "EnrichSceneries.php", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "enrichsceneries.php", + "id": "app_console_commands_enrichsceneries", + "community_name": "Community 18" + }, + { + "label": "EnrichSceneries", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L9", + "_origin": "ast", + "community": 2, + "norm_label": "enrichsceneries", + "id": "app_console_commands_enrichsceneries_enrichsceneries", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L30", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_enrichsceneries_enrichsceneries_handle", + "community_name": "Community 2" + }, + { + "label": "FetchBookings.php", + "file_type": "code", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "fetchbookings.php", + "id": "app_console_commands_fetchbookings", + "community_name": "Community 14" + }, + { + "label": "FetchBookings", + "file_type": "code", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L13", + "_origin": "ast", + "community": 2, + "norm_label": "fetchbookings", + "id": "app_console_commands_fetchbookings_fetchbookings", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L34", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_fetchbookings_fetchbookings_handle", + "community_name": "Community 2" + }, + { + "label": ".scoreBookings()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L106", + "_origin": "ast", + "community": 2, + "norm_label": ".scorebookings()", + "id": "app_console_commands_fetchbookings_fetchbookings_scorebookings", + "community_name": "Community 2" + }, + { + "label": "FetchFlights.php", + "file_type": "code", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "fetchflights.php", + "id": "app_console_commands_fetchflights", + "community_name": "Community 2" + }, + { + "label": "FetchFlights", + "file_type": "code", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L9", + "_origin": "ast", + "community": 2, + "norm_label": "fetchflights", + "id": "app_console_commands_fetchflights_fetchflights", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L30", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_fetchflights_fetchflights_handle", + "community_name": "Community 2" + }, + { + "label": "FetchGithubIssues.php", + "file_type": "code", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "fetchgithubissues.php", + "id": "app_console_commands_fetchgithubissues", + "community_name": "Community 2" + }, + { + "label": "FetchGithubIssues", + "file_type": "code", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L9", + "_origin": "ast", + "community": 2, + "norm_label": "fetchgithubissues", + "id": "app_console_commands_fetchgithubissues_fetchgithubissues", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L15", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_fetchgithubissues_fetchgithubissues_handle", + "community_name": "Community 2" + }, + { + "label": "FetchMetars.php", + "file_type": "code", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L1", + "_origin": "ast", + "community": 0, + "norm_label": "fetchmetars.php", + "id": "app_console_commands_fetchmetars", + "community_name": "Community 0" + }, + { + "label": "FetchMetars", + "file_type": "code", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L15", + "_origin": "ast", + "community": 0, + "norm_label": "fetchmetars", + "id": "app_console_commands_fetchmetars_fetchmetars", + "community_name": "Community 0" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L41", + "_origin": "ast", + "community": 0, + "norm_label": ".handle()", + "id": "app_console_commands_fetchmetars_fetchmetars_handle", + "community_name": "Community 0" + }, + { + "label": ".scoreMetars()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L127", + "_origin": "ast", + "community": 0, + "norm_label": ".scoremetars()", + "id": "app_console_commands_fetchmetars_fetchmetars_scoremetars", + "community_name": "Community 0" + }, + { + "label": ".metarScores()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L149", + "_origin": "ast", + "community": 0, + "norm_label": ".metarscores()", + "id": "app_console_commands_fetchmetars_fetchmetars_metarscores", + "community_name": "Community 0" + }, + { + "label": "FetchTafs.php", + "file_type": "code", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "fetchtafs.php", + "id": "app_console_commands_fetchtafs", + "community_name": "Community 13" + }, + { + "label": "FetchTafs", + "file_type": "code", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L14", + "_origin": "ast", + "community": 0, + "norm_label": "fetchtafs", + "id": "app_console_commands_fetchtafs_fetchtafs", + "community_name": "Community 0" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L35", + "_origin": "ast", + "community": 0, + "norm_label": ".handle()", + "id": "app_console_commands_fetchtafs_fetchtafs_handle", + "community_name": "Community 0" + }, + { + "label": ".parseTafDocuments()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L147", + "_origin": "ast", + "community": 0, + "norm_label": ".parsetafdocuments()", + "id": "app_console_commands_fetchtafs_fetchtafs_parsetafdocuments", + "community_name": "Community 0" + }, + { + "label": "FetchVatsim.php", + "file_type": "code", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "fetchvatsim.php", + "id": "app_console_commands_fetchvatsim", + "community_name": "Community 14" + }, + { + "label": "FetchVatsim", + "file_type": "code", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L14", + "_origin": "ast", + "community": 2, + "norm_label": "fetchvatsim", + "id": "app_console_commands_fetchvatsim_fetchvatsim", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L45", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_fetchvatsim_fetchvatsim_handle", + "community_name": "Community 2" + }, + { + "label": ".scoreVatsim()", + "file_type": "code", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L140", + "_origin": "ast", + "community": 2, + "norm_label": ".scorevatsim()", + "id": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim", + "community_name": "Community 2" + }, + { + "label": "ReuploadAirlines.php", + "file_type": "code", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "reuploadairlines.php", + "id": "app_console_commands_reuploadairlines", + "community_name": "Community 2" + }, + { + "label": "ReuploadAirlines", + "file_type": "code", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L8", + "_origin": "ast", + "community": 2, + "norm_label": "reuploadairlines", + "id": "app_console_commands_reuploadairlines_reuploadairlines", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L14", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_reuploadairlines_reuploadairlines_handle", + "community_name": "Community 2" + }, + { + "label": "UpdateData.php", + "file_type": "code", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L1", + "_origin": "ast", + "community": 2, + "norm_label": "updatedata.php", + "id": "app_console_commands_updatedata", + "community_name": "Community 2" + }, + { + "label": "UpdateData", + "file_type": "code", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L7", + "_origin": "ast", + "community": 2, + "norm_label": "updatedata", + "id": "app_console_commands_updatedata_updatedata", + "community_name": "Community 2" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L28", + "_origin": "ast", + "community": 2, + "norm_label": ".handle()", + "id": "app_console_commands_updatedata_updatedata_handle", + "community_name": "Community 2" + }, + { + "label": "AircraftHelper.php", + "file_type": "code", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "aircrafthelper.php", + "id": "app_helpers_aircrafthelper", + "community_name": "Community 4" + }, + { + "label": "AircraftHelper", + "file_type": "code", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L5", + "_origin": "ast", + "community": 4, + "norm_label": "aircrafthelper", + "id": "app_helpers_aircrafthelper_aircrafthelper", + "community_name": "Community 4" + }, + { + "label": ".codes()", + "file_type": "code", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L22", + "_origin": "ast", + "community": 4, + "norm_label": ".codes()", + "id": "app_helpers_aircrafthelper_aircrafthelper_codes", + "community_name": "Community 4" + }, + { + "label": ".name()", + "file_type": "code", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L27", + "_origin": "ast", + "community": 4, + "norm_label": ".name()", + "id": "app_helpers_aircrafthelper_aircrafthelper_name", + "community_name": "Community 4" + }, + { + "label": ".isValidCode()", + "file_type": "code", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L32", + "_origin": "ast", + "community": 4, + "norm_label": ".isvalidcode()", + "id": "app_helpers_aircrafthelper_aircrafthelper_isvalidcode", + "community_name": "Community 4" + }, + { + "label": "AirportCallsignHelper.php", + "file_type": "code", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "airportcallsignhelper.php", + "id": "app_helpers_airportcallsignhelper", + "community_name": "Community 14" + }, + { + "label": "AirportCallsignHelper", + "file_type": "code", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L5", + "_origin": "ast", + "community": 2, + "norm_label": "airportcallsignhelper", + "id": "app_helpers_airportcallsignhelper_airportcallsignhelper", + "community_name": "Community 2" + }, + { + "label": ".returnAustralianAirport()", + "file_type": "code", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L7", + "_origin": "ast", + "community": 2, + "norm_label": ".returnaustralianairport()", + "id": "app_helpers_airportcallsignhelper_airportcallsignhelper_returnaustralianairport", + "community_name": "Community 2" + }, + { + "label": ".returnAmericanIcao()", + "file_type": "code", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L14", + "_origin": "ast", + "community": 2, + "norm_label": ".returnamericanicao()", + "id": "app_helpers_airportcallsignhelper_airportcallsignhelper_returnamericanicao", + "community_name": "Community 2" + }, + { + "label": ".facility()", + "file_type": "code", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L23", + "_origin": "ast", + "community": 2, + "norm_label": ".facility()", + "id": "app_helpers_airportcallsignhelper_airportcallsignhelper_facility", + "community_name": "Community 2" + }, + { + "label": ".resolveIcao()", + "file_type": "code", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L35", + "_origin": "ast", + "community": 2, + "norm_label": ".resolveicao()", + "id": "app_helpers_airportcallsignhelper_airportcallsignhelper_resolveicao", + "community_name": "Community 2" + }, + { + "label": "AirportFilterHelper.php", + "file_type": "code", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 10, + "norm_label": "airportfilterhelper.php", + "id": "app_helpers_airportfilterhelper", + "community_name": "Community 10" + }, + { + "label": "AirportFilterHelper", + "file_type": "code", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L5", + "_origin": "ast", + "community": 10, + "norm_label": "airportfilterhelper", + "id": "app_helpers_airportfilterhelper_airportfilterhelper", + "community_name": "Community 10" + }, + { + "label": ".hasCorrectMetcon()", + "file_type": "code", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L7", + "_origin": "ast", + "community": 10, + "norm_label": ".hascorrectmetcon()", + "id": "app_helpers_airportfilterhelper_airportfilterhelper_hascorrectmetcon", + "community_name": "Community 10" + }, + { + "label": ".hasRequiredAirportElevation()", + "file_type": "code", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L19", + "_origin": "ast", + "community": 10, + "norm_label": ".hasrequiredairportelevation()", + "id": "app_helpers_airportfilterhelper_airportfilterhelper_hasrequiredairportelevation", + "community_name": "Community 10" + }, + { + "label": ".hasRequiredTemperature()", + "file_type": "code", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L32", + "_origin": "ast", + "community": 10, + "norm_label": ".hasrequiredtemperature()", + "id": "app_helpers_airportfilterhelper_airportfilterhelper_hasrequiredtemperature", + "community_name": "Community 10" + }, + { + "label": "AviationWeatherHelper.php", + "file_type": "code", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 0, + "norm_label": "aviationweatherhelper.php", + "id": "app_helpers_aviationweatherhelper", + "community_name": "Community 0" + }, + { + "label": "AviationWeatherHelper", + "file_type": "code", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L9", + "_origin": "ast", + "community": 0, + "norm_label": "aviationweatherhelper", + "id": "app_helpers_aviationweatherhelper_aviationweatherhelper", + "community_name": "Community 0" + }, + { + "label": ".downloadCache()", + "file_type": "code", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L19", + "_origin": "ast", + "community": 0, + "norm_label": ".downloadcache()", + "id": "app_helpers_aviationweatherhelper_aviationweatherhelper_downloadcache", + "community_name": "Community 0" + }, + { + "label": ".cleanup()", + "file_type": "code", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L43", + "_origin": "ast", + "community": 0, + "norm_label": ".cleanup()", + "id": "app_helpers_aviationweatherhelper_aviationweatherhelper_cleanup", + "community_name": "Community 0" + }, + { + "label": "CalculationHelper.php", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 25, + "norm_label": "calculationhelper.php", + "id": "app_helpers_calculationhelper", + "community_name": "Community 25" + }, + { + "label": "CalculationHelper", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L10", + "_origin": "ast", + "community": 25, + "norm_label": "calculationhelper", + "id": "app_helpers_calculationhelper_calculationhelper", + "community_name": "Community 25" + }, + { + "label": ".forecastEta()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L17", + "_origin": "ast", + "community": 25, + "norm_label": ".forecasteta()", + "id": "app_helpers_calculationhelper_calculationhelper_forecasteta", + "community_name": "Community 25" + }, + { + "label": "Carbon", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 25, + "norm_label": "carbon", + "id": "app_helpers_calculationhelper_php_carbon", + "community_name": "Community 25" + }, + { + "label": ".airtimeHours()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L27", + "_origin": "ast", + "community": 25, + "norm_label": ".airtimehours()", + "id": "app_helpers_calculationhelper_calculationhelper_airtimehours", + "community_name": "Community 25" + }, + { + "label": ".forecastEtaSql()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L38", + "_origin": "ast", + "community": 25, + "norm_label": ".forecastetasql()", + "id": "app_helpers_calculationhelper_calculationhelper_forecastetasql", + "community_name": "Community 25" + }, + { + "label": ".minimumRequiredRunwayLength()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L58", + "_origin": "ast", + "community": 25, + "norm_label": ".minimumrequiredrunwaylength()", + "id": "app_helpers_calculationhelper_calculationhelper_minimumrequiredrunwaylength", + "community_name": "Community 25" + }, + { + "label": ".aircraftNmPerHour()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L79", + "_origin": "ast", + "community": 25, + "norm_label": ".aircraftnmperhour()", + "id": "app_helpers_calculationhelper_calculationhelper_aircraftnmperhour", + "community_name": "Community 25" + }, + { + "label": ".timeClimbDescend()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L101", + "_origin": "ast", + "community": 25, + "norm_label": ".timeclimbdescend()", + "id": "app_helpers_calculationhelper_calculationhelper_timeclimbdescend", + "community_name": "Community 25" + }, + { + "label": ".aircraftNmPerHourRange()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L126", + "_origin": "ast", + "community": 25, + "norm_label": ".aircraftnmperhourrange()", + "id": "app_helpers_calculationhelper_calculationhelper_aircraftnmperhourrange", + "community_name": "Community 25" + }, + { + "label": ".calculateSphericalDestination()", + "file_type": "code", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L150", + "_origin": "ast", + "community": 25, + "norm_label": ".calculatesphericaldestination()", + "id": "app_helpers_calculationhelper_calculationhelper_calculatesphericaldestination", + "community_name": "Community 25" + }, + { + "label": "Coordinate", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 25, + "norm_label": "coordinate", + "id": "coordinate", + "community_name": "Community 25" + }, + { + "label": "MapHelper.php", + "file_type": "code", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "maphelper.php", + "id": "app_helpers_maphelper", + "community_name": "Community 18" + }, + { + "label": "MapHelper", + "file_type": "code", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L8", + "_origin": "ast", + "community": 6, + "norm_label": "maphelper", + "id": "app_helpers_maphelper_maphelper", + "community_name": "Community 6" + }, + { + "label": ".generateAirportMapDataFromAirports()", + "file_type": "code", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L15", + "_origin": "ast", + "community": 6, + "norm_label": ".generateairportmapdatafromairports()", + "id": "app_helpers_maphelper_maphelper_generateairportmapdatafromairports", + "community_name": "Community 6" + }, + { + "label": "Collection", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 6, + "norm_label": "collection", + "id": "app_helpers_maphelper_php_collection", + "community_name": "Community 6" + }, + { + "label": ".getAirportsFromUserLists()", + "file_type": "code", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L38", + "_origin": "ast", + "community": 6, + "norm_label": ".getairportsfromuserlists()", + "id": "app_helpers_maphelper_maphelper_getairportsfromuserlists", + "community_name": "Community 6" + }, + { + "label": "SceneryHelper.php", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "sceneryhelper.php", + "id": "app_helpers_sceneryhelper", + "community_name": "Community 18" + }, + { + "label": "SceneryHelper", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L7", + "_origin": "ast", + "community": 6, + "norm_label": "sceneryhelper", + "id": "app_helpers_sceneryhelper_sceneryhelper", + "community_name": "Community 6" + }, + { + "label": ".findOfficialOrMarketStore()", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L12", + "_origin": "ast", + "community": 6, + "norm_label": ".findofficialormarketstore()", + "id": "app_helpers_sceneryhelper_sceneryhelper_findofficialormarketstore", + "community_name": "Community 6" + }, + { + "label": ".findCheapestStore()", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L46", + "_origin": "ast", + "community": 6, + "norm_label": ".findcheapeststore()", + "id": "app_helpers_sceneryhelper_sceneryhelper_findcheapeststore", + "community_name": "Community 6" + }, + { + "label": ".prepareSceneryData()", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L68", + "_origin": "ast", + "community": 6, + "norm_label": ".preparescenerydata()", + "id": "app_helpers_sceneryhelper_sceneryhelper_preparescenerydata", + "community_name": "Community 6" + }, + { + "label": ".fetchW2fSceneries()", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L83", + "_origin": "ast", + "community": 6, + "norm_label": ".fetchw2fsceneries()", + "id": "app_helpers_sceneryhelper_sceneryhelper_fetchw2fsceneries", + "community_name": "Community 6" + }, + { + "label": ".sortSceneries()", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L104", + "_origin": "ast", + "community": 6, + "norm_label": ".sortsceneries()", + "id": "app_helpers_sceneryhelper_sceneryhelper_sortsceneries", + "community_name": "Community 6" + }, + { + "label": ".getEmbeddedUrl()", + "file_type": "code", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L124", + "_origin": "ast", + "community": 6, + "norm_label": ".getembeddedurl()", + "id": "app_helpers_sceneryhelper_sceneryhelper_getembeddedurl", + "community_name": "Community 6" + }, + { + "label": "WeatherScoreHelper.php", + "file_type": "code", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "weatherscorehelper.php", + "id": "app_helpers_weatherscorehelper", + "community_name": "Community 13" + }, + { + "label": "WeatherScoreHelper", + "file_type": "code", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L8", + "_origin": "ast", + "community": 0, + "norm_label": "weatherscorehelper", + "id": "app_helpers_weatherscorehelper_weatherscorehelper", + "community_name": "Community 0" + }, + { + "label": ".reasons()", + "file_type": "code", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L33", + "_origin": "ast", + "community": 0, + "norm_label": ".reasons()", + "id": "app_helpers_weatherscorehelper_weatherscorehelper_reasons", + "community_name": "Community 0" + }, + { + "label": "helpers.php", + "file_type": "code", + "source_file": "app/Helpers/helpers.php", + "source_location": "L1", + "_origin": "ast", + "community": 6, + "norm_label": "helpers.php", + "id": "app_helpers_helpers", + "community_name": "Community 6" + }, + { + "label": "correctHeading()", + "file_type": "code", + "source_file": "app/Helpers/helpers.php", + "source_location": "L4", + "_origin": "ast", + "community": 6, + "norm_label": "correctheading()", + "id": "app_helpers_helpers_correctheading", + "community_name": "Community 6" + }, + { + "label": "getCountryName()", + "file_type": "code", + "source_file": "app/Helpers/helpers.php", + "source_location": "L17", + "_origin": "ast", + "community": 6, + "norm_label": "getcountryname()", + "id": "app_helpers_helpers_getcountryname", + "community_name": "Community 6" + }, + { + "label": "distance()", + "file_type": "code", + "source_file": "app/Helpers/helpers.php", + "source_location": "L26", + "_origin": "ast", + "community": 10, + "norm_label": "distance()", + "id": "app_helpers_helpers_distance", + "community_name": "Community 10" + }, + { + "label": "rwyIdentToHeading()", + "file_type": "code", + "source_file": "app/Helpers/helpers.php", + "source_location": "L48", + "_origin": "ast", + "community": 6, + "norm_label": "rwyidenttoheading()", + "id": "app_helpers_helpers_rwyidenttoheading", + "community_name": "Community 6" + }, + { + "label": "getRussianAsianRegions()", + "file_type": "code", + "source_file": "app/Helpers/helpers.php", + "source_location": "L62", + "_origin": "ast", + "community": 19, + "norm_label": "getrussianasianregions()", + "id": "app_helpers_helpers_getrussianasianregions", + "community_name": "Community 19" + }, + { + "label": "MapController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "mapcontroller.php", + "id": "app_http_controllers_api_mapcontroller", + "community_name": "Community 18" + }, + { + "label": "MapController", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L19", + "_origin": "ast", + "community": 6, + "norm_label": "mapcontroller", + "id": "app_http_controllers_api_mapcontroller_mapcontroller", + "community_name": "Community 6" + }, + { + "label": "Controller", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "controller", + "id": "controller", + "community_name": "Community 4" + }, + { + "label": ".isAuthenticated()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L24", + "_origin": "ast", + "community": 6, + "norm_label": ".isauthenticated()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_isauthenticated", + "community_name": "Community 6" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 6, + "norm_label": "request", + "id": "app_http_controllers_api_mapcontroller_php_request", + "community_name": "Community 6" + }, + { + "label": ".getListAirports()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L34", + "_origin": "ast", + "community": 6, + "norm_label": ".getlistairports()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_getlistairports", + "community_name": "Community 6" + }, + { + "label": ".getMapdataFromIcao()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L47", + "_origin": "ast", + "community": 6, + "norm_label": ".getmapdatafromicao()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_getmapdatafromicao", + "community_name": "Community 6" + }, + { + "label": ".getAirport()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L66", + "_origin": "ast", + "community": 6, + "norm_label": ".getairport()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "community_name": "Community 6" + }, + { + "label": ".getFlights()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L141", + "_origin": "ast", + "community": 6, + "norm_label": ".getflights()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_getflights", + "community_name": "Community 6" + }, + { + "label": ".getScenery()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L184", + "_origin": "ast", + "community": 6, + "norm_label": ".getscenery()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery", + "community_name": "Community 6" + }, + { + "label": ".fetchFsacSceneries()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L216", + "_origin": "ast", + "community": 6, + "norm_label": ".fetchfsacsceneries()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_fetchfsacsceneries", + "community_name": "Community 6" + }, + { + "label": ".handleSuccessfulFsacResponse()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L226", + "_origin": "ast", + "community": 6, + "norm_label": ".handlesuccessfulfsacresponse()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse", + "community_name": "Community 6" + }, + { + "label": ".handleFsacFailure()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L317", + "_origin": "ast", + "community": 6, + "norm_label": ".handlefsacfailure()", + "id": "app_http_controllers_api_mapcontroller_mapcontroller_handlefsacfailure", + "community_name": "Community 6" + }, + { + "label": "SearchController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "searchcontroller.php", + "id": "app_http_controllers_api_searchcontroller", + "community_name": "Community 4" + }, + { + "label": "SearchController", + "file_type": "code", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L17", + "_origin": "ast", + "community": 4, + "norm_label": "searchcontroller", + "id": "app_http_controllers_api_searchcontroller_searchcontroller", + "community_name": "Community 4" + }, + { + "label": ".search()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L19", + "_origin": "ast", + "community": 4, + "norm_label": ".search()", + "id": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "community_name": "Community 4" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "request", + "id": "app_http_controllers_api_searchcontroller_php_request", + "community_name": "Community 4" + }, + { + "label": ".prepareAirportData()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L184", + "_origin": "ast", + "community": 4, + "norm_label": ".prepareairportdata()", + "id": "app_http_controllers_api_searchcontroller_searchcontroller_prepareairportdata", + "community_name": "Community 4" + }, + { + "label": "TopController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "topcontroller.php", + "id": "app_http_controllers_api_topcontroller", + "community_name": "Community 4" + }, + { + "label": "TopController", + "file_type": "code", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L10", + "_origin": "ast", + "community": 4, + "norm_label": "topcontroller", + "id": "app_http_controllers_api_topcontroller_topcontroller", + "community_name": "Community 4" + }, + { + "label": ".index()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L12", + "_origin": "ast", + "community": 4, + "norm_label": ".index()", + "id": "app_http_controllers_api_topcontroller_topcontroller_index", + "community_name": "Community 4" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "request", + "id": "app_http_controllers_api_topcontroller_php_request", + "community_name": "Community 4" + }, + { + "label": ".indexWhitelist()", + "file_type": "code", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L32", + "_origin": "ast", + "community": 4, + "norm_label": ".indexwhitelist()", + "id": "app_http_controllers_api_topcontroller_topcontroller_indexwhitelist", + "community_name": "Community 4" + }, + { + "label": "LoginController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "logincontroller.php", + "id": "app_http_controllers_auth_logincontroller", + "community_name": "Community 18" + }, + { + "label": "LoginController", + "file_type": "code", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L13", + "_origin": "ast", + "community": 21, + "norm_label": "logincontroller", + "id": "app_http_controllers_auth_logincontroller_logincontroller", + "community_name": "Community 21" + }, + { + "label": ".login()", + "file_type": "code", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L20", + "_origin": "ast", + "community": 21, + "norm_label": ".login()", + "id": "app_http_controllers_auth_logincontroller_logincontroller_login", + "community_name": "Community 21" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 21, + "norm_label": "request", + "id": "app_http_controllers_auth_logincontroller_php_request", + "community_name": "Community 21" + }, + { + "label": ".logout()", + "file_type": "code", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L53", + "_origin": "ast", + "community": 21, + "norm_label": ".logout()", + "id": "app_http_controllers_auth_logincontroller_logincontroller_logout", + "community_name": "Community 21" + }, + { + "label": ".showRegister()", + "file_type": "code", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L65", + "_origin": "ast", + "community": 21, + "norm_label": ".showregister()", + "id": "app_http_controllers_auth_logincontroller_logincontroller_showregister", + "community_name": "Community 21" + }, + { + "label": ".showLogin()", + "file_type": "code", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L75", + "_origin": "ast", + "community": 21, + "norm_label": ".showlogin()", + "id": "app_http_controllers_auth_logincontroller_logincontroller_showlogin", + "community_name": "Community 21" + }, + { + "label": "Controller.php", + "file_type": "code", + "source_file": "app/Http/Controllers/Controller.php", + "source_location": "L1", + "_origin": "ast", + "community": 26, + "norm_label": "controller.php", + "id": "app_http_controllers_controller", + "community_name": "Community 26" + }, + { + "label": "Controller", + "file_type": "code", + "source_file": "app/Http/Controllers/Controller.php", + "source_location": "L7", + "_origin": "ast", + "community": 26, + "norm_label": "controller", + "id": "app_http_controllers_controller_controller", + "community_name": "Community 26" + }, + { + "label": "AuthorizesRequests", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 26, + "norm_label": "authorizesrequests", + "id": "authorizesrequests", + "community_name": "Community 26" + }, + { + "label": "FeedbackController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "feedbackcontroller.php", + "id": "app_http_controllers_feedbackcontroller", + "community_name": "Community 13" + }, + { + "label": "FeedbackController", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L9", + "_origin": "ast", + "community": 29, + "norm_label": "feedbackcontroller", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "community_name": "Community 29" + }, + { + "label": ".index()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L14", + "_origin": "ast", + "community": 29, + "norm_label": ".index()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_index", + "community_name": "Community 29" + }, + { + "label": ".show()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L37", + "_origin": "ast", + "community": 29, + "norm_label": ".show()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_show", + "community_name": "Community 29" + }, + { + "label": ".storeVote()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L63", + "_origin": "ast", + "community": 29, + "norm_label": ".storevote()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_storevote", + "community_name": "Community 29" + }, + { + "label": ".destroyVote()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L90", + "_origin": "ast", + "community": 29, + "norm_label": ".destroyvote()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_destroyvote", + "community_name": "Community 29" + }, + { + "label": ".fetchIssuesAndVotes()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L110", + "_origin": "ast", + "community": 29, + "norm_label": ".fetchissuesandvotes()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissuesandvotes", + "community_name": "Community 29" + }, + { + "label": ".fetchIssues()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L140", + "_origin": "ast", + "community": 29, + "norm_label": ".fetchissues()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissues", + "community_name": "Community 29" + }, + { + "label": ".fetchVotes()", + "file_type": "code", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L168", + "_origin": "ast", + "community": 29, + "norm_label": ".fetchvotes()", + "id": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchvotes", + "community_name": "Community 29" + }, + { + "label": "SceneryController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "scenerycontroller.php", + "id": "app_http_controllers_scenerycontroller", + "community_name": "Community 18" + }, + { + "label": "SceneryController", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L14", + "_origin": "ast", + "community": 21, + "norm_label": "scenerycontroller", + "id": "app_http_controllers_scenerycontroller_scenerycontroller", + "community_name": "Community 21" + }, + { + "label": ".create()", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L19", + "_origin": "ast", + "community": 21, + "norm_label": ".create()", + "id": "app_http_controllers_scenerycontroller_scenerycontroller_create", + "community_name": "Community 21" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 21, + "norm_label": "request", + "id": "app_http_controllers_scenerycontroller_php_request", + "community_name": "Community 21" + }, + { + "label": ".store()", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L35", + "_origin": "ast", + "community": 21, + "norm_label": ".store()", + "id": "app_http_controllers_scenerycontroller_scenerycontroller_store", + "community_name": "Community 21" + }, + { + "label": ".edit()", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L76", + "_origin": "ast", + "community": 21, + "norm_label": ".edit()", + "id": "app_http_controllers_scenerycontroller_scenerycontroller_edit", + "community_name": "Community 21" + }, + { + "label": ".update()", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L93", + "_origin": "ast", + "community": 21, + "norm_label": ".update()", + "id": "app_http_controllers_scenerycontroller_scenerycontroller_update", + "community_name": "Community 21" + }, + { + "label": ".destroy()", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L125", + "_origin": "ast", + "community": 21, + "norm_label": ".destroy()", + "id": "app_http_controllers_scenerycontroller_scenerycontroller_destroy", + "community_name": "Community 21" + }, + { + "label": ".indexAirports()", + "file_type": "code", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L136", + "_origin": "ast", + "community": 21, + "norm_label": ".indexairports()", + "id": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports", + "community_name": "Community 21" + }, + { + "label": "ScoreController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "scorecontroller.php", + "id": "app_http_controllers_scorecontroller", + "community_name": "Community 4" + }, + { + "label": "ScoreController", + "file_type": "code", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L5", + "_origin": "ast", + "community": 4, + "norm_label": "scorecontroller", + "id": "app_http_controllers_scorecontroller_scorecontroller", + "community_name": "Community 4" + }, + { + "label": ".getWeatherTypes()", + "file_type": "code", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L27", + "_origin": "ast", + "community": 4, + "norm_label": ".getweathertypes()", + "id": "app_http_controllers_scorecontroller_scorecontroller_getweathertypes", + "community_name": "Community 4" + }, + { + "label": ".getVatsimTypes()", + "file_type": "code", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L39", + "_origin": "ast", + "community": 4, + "norm_label": ".getvatsimtypes()", + "id": "app_http_controllers_scorecontroller_scorecontroller_getvatsimtypes", + "community_name": "Community 4" + }, + { + "label": "SearchController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "searchcontroller.php", + "id": "app_http_controllers_searchcontroller", + "community_name": "Community 18" + }, + { + "label": "SearchController", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L24", + "_origin": "ast", + "community": 4, + "norm_label": "searchcontroller", + "id": "app_http_controllers_searchcontroller_searchcontroller", + "community_name": "Community 4" + }, + { + "label": ".indexArrivalSearch()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L35", + "_origin": "ast", + "community": 4, + "norm_label": ".indexarrivalsearch()", + "id": "app_http_controllers_searchcontroller_searchcontroller_indexarrivalsearch", + "community_name": "Community 4" + }, + { + "label": ".indexDepartureSearch()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L43", + "_origin": "ast", + "community": 4, + "norm_label": ".indexdeparturesearch()", + "id": "app_http_controllers_searchcontroller_searchcontroller_indexdeparturesearch", + "community_name": "Community 4" + }, + { + "label": ".buildSearchView()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L51", + "_origin": "ast", + "community": 4, + "norm_label": ".buildsearchview()", + "id": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "community_name": "Community 4" + }, + { + "label": "View", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "view", + "id": "app_http_controllers_searchcontroller_php_view", + "community_name": "Community 4" + }, + { + "label": ".indexRouteSearch()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L73", + "_origin": "ast", + "community": 4, + "norm_label": ".indexroutesearch()", + "id": "app_http_controllers_searchcontroller_searchcontroller_indexroutesearch", + "community_name": "Community 4" + }, + { + "label": ".search()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L83", + "_origin": "ast", + "community": 4, + "norm_label": ".search()", + "id": "app_http_controllers_searchcontroller_searchcontroller_search", + "community_name": "Community 4" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "request", + "id": "app_http_controllers_searchcontroller_php_request", + "community_name": "Community 4" + }, + { + "label": ".searchRoutes()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L324", + "_origin": "ast", + "community": 4, + "norm_label": ".searchroutes()", + "id": "app_http_controllers_searchcontroller_searchcontroller_searchroutes", + "community_name": "Community 4" + }, + { + "label": ".searchEdit()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L386", + "_origin": "ast", + "community": 4, + "norm_label": ".searchedit()", + "id": "app_http_controllers_searchcontroller_searchcontroller_searchedit", + "community_name": "Community 4" + }, + { + "label": ".getWhitelistsFromInput()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L401", + "_origin": "ast", + "community": 4, + "norm_label": ".getwhitelistsfrominput()", + "id": "app_http_controllers_searchcontroller_searchcontroller_getwhitelistsfrominput", + "community_name": "Community 4" + }, + { + "label": ".getDestinationInputs()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L409", + "_origin": "ast", + "community": 4, + "norm_label": ".getdestinationinputs()", + "id": "app_http_controllers_searchcontroller_searchcontroller_getdestinationinputs", + "community_name": "Community 4" + }, + { + "label": ".filterDestinations()", + "file_type": "code", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L434", + "_origin": "ast", + "community": 4, + "norm_label": ".filterdestinations()", + "id": "app_http_controllers_searchcontroller_searchcontroller_filterdestinations", + "community_name": "Community 4" + }, + { + "label": "TopController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "topcontroller.php", + "id": "app_http_controllers_topcontroller", + "community_name": "Community 4" + }, + { + "label": "TopController", + "file_type": "code", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L11", + "_origin": "ast", + "community": 4, + "norm_label": "topcontroller", + "id": "app_http_controllers_topcontroller_topcontroller", + "community_name": "Community 4" + }, + { + "label": ".index()", + "file_type": "code", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L25", + "_origin": "ast", + "community": 4, + "norm_label": ".index()", + "id": "app_http_controllers_topcontroller_topcontroller_index", + "community_name": "Community 4" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "request", + "id": "app_http_controllers_topcontroller_php_request", + "community_name": "Community 4" + }, + { + "label": "View", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "view", + "id": "app_http_controllers_topcontroller_php_view", + "community_name": "Community 4" + }, + { + "label": "UserController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "usercontroller.php", + "id": "app_http_controllers_usercontroller", + "community_name": "Community 18" + }, + { + "label": "UserController", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L20", + "_origin": "ast", + "community": 10, + "norm_label": "usercontroller", + "id": "app_http_controllers_usercontroller_usercontroller", + "community_name": "Community 10" + }, + { + "label": ".store()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L27", + "_origin": "ast", + "community": 10, + "norm_label": ".store()", + "id": "app_http_controllers_usercontroller_usercontroller_store", + "community_name": "Community 10" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 10, + "norm_label": "request", + "id": "app_http_controllers_usercontroller_php_request", + "community_name": "Community 10" + }, + { + "label": ".show()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L53", + "_origin": "ast", + "community": 10, + "norm_label": ".show()", + "id": "app_http_controllers_usercontroller_usercontroller_show", + "community_name": "Community 10" + }, + { + "label": ".destroy()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L63", + "_origin": "ast", + "community": 10, + "norm_label": ".destroy()", + "id": "app_http_controllers_usercontroller_usercontroller_destroy", + "community_name": "Community 10" + }, + { + "label": ".verifyNotice()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L76", + "_origin": "ast", + "community": 10, + "norm_label": ".verifynotice()", + "id": "app_http_controllers_usercontroller_usercontroller_verifynotice", + "community_name": "Community 10" + }, + { + "label": ".verifyEmail()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L90", + "_origin": "ast", + "community": 10, + "norm_label": ".verifyemail()", + "id": "app_http_controllers_usercontroller_usercontroller_verifyemail", + "community_name": "Community 10" + }, + { + "label": "EmailVerificationRequest", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 10, + "norm_label": "emailverificationrequest", + "id": "emailverificationrequest", + "community_name": "Community 10" + }, + { + "label": ".verifyResendEmail()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L102", + "_origin": "ast", + "community": 10, + "norm_label": ".verifyresendemail()", + "id": "app_http_controllers_usercontroller_usercontroller_verifyresendemail", + "community_name": "Community 10" + }, + { + "label": ".resetRequestForm()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L114", + "_origin": "ast", + "community": 10, + "norm_label": ".resetrequestform()", + "id": "app_http_controllers_usercontroller_usercontroller_resetrequestform", + "community_name": "Community 10" + }, + { + "label": ".resetForm()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L125", + "_origin": "ast", + "community": 10, + "norm_label": ".resetform()", + "id": "app_http_controllers_usercontroller_usercontroller_resetform", + "community_name": "Community 10" + }, + { + "label": ".resetSendLink()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L137", + "_origin": "ast", + "community": 10, + "norm_label": ".resetsendlink()", + "id": "app_http_controllers_usercontroller_usercontroller_resetsendlink", + "community_name": "Community 10" + }, + { + "label": ".resetPassword()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L155", + "_origin": "ast", + "community": 10, + "norm_label": ".resetpassword()", + "id": "app_http_controllers_usercontroller_usercontroller_resetpassword", + "community_name": "Community 10" + }, + { + "label": ".showAdmin()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L184", + "_origin": "ast", + "community": 21, + "norm_label": ".showadmin()", + "id": "app_http_controllers_usercontroller_usercontroller_showadmin", + "community_name": "Community 21" + }, + { + "label": "UserListController.php", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "userlistcontroller.php", + "id": "app_http_controllers_userlistcontroller", + "community_name": "Community 18" + }, + { + "label": "UserListController", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L16", + "_origin": "ast", + "community": 26, + "norm_label": "userlistcontroller", + "id": "app_http_controllers_userlistcontroller_userlistcontroller", + "community_name": "Community 26" + }, + { + "label": ".index()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L25", + "_origin": "ast", + "community": 26, + "norm_label": ".index()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_index", + "community_name": "Community 26" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 26, + "norm_label": "request", + "id": "app_http_controllers_userlistcontroller_php_request", + "community_name": "Community 26" + }, + { + "label": ".create()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L37", + "_origin": "ast", + "community": 26, + "norm_label": ".create()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_create", + "community_name": "Community 26" + }, + { + "label": ".store()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L49", + "_origin": "ast", + "community": 26, + "norm_label": ".store()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_store", + "community_name": "Community 26" + }, + { + "label": ".edit()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L92", + "_origin": "ast", + "community": 21, + "norm_label": ".edit()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_edit", + "community_name": "Community 21" + }, + { + "label": ".update()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L106", + "_origin": "ast", + "community": 26, + "norm_label": ".update()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_update", + "community_name": "Community 26" + }, + { + "label": ".resolveAirports()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L146", + "_origin": "ast", + "community": 26, + "norm_label": ".resolveairports()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_resolveairports", + "community_name": "Community 26" + }, + { + "label": ".destroy()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L180", + "_origin": "ast", + "community": 26, + "norm_label": ".destroy()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_destroy", + "community_name": "Community 26" + }, + { + "label": ".toggle()", + "file_type": "code", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L193", + "_origin": "ast", + "community": 26, + "norm_label": ".toggle()", + "id": "app_http_controllers_userlistcontroller_userlistcontroller_toggle", + "community_name": "Community 26" + }, + { + "label": "AdminVariables.php", + "file_type": "code", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L1", + "_origin": "ast", + "community": 24, + "norm_label": "adminvariables.php", + "id": "app_http_middleware_adminvariables", + "community_name": "Community 24" + }, + { + "label": "AdminVariables", + "file_type": "code", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L13", + "_origin": "ast", + "community": 24, + "norm_label": "adminvariables", + "id": "app_http_middleware_adminvariables_adminvariables", + "community_name": "Community 24" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L21", + "_origin": "ast", + "community": 24, + "norm_label": ".handle()", + "id": "app_http_middleware_adminvariables_adminvariables_handle", + "community_name": "Community 24" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 24, + "norm_label": "request", + "id": "app_http_middleware_adminvariables_php_request", + "community_name": "Community 24" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 24, + "norm_label": "closure", + "id": "app_http_middleware_adminvariables_php_closure", + "community_name": "Community 24" + }, + { + "label": "ApiToken.php", + "file_type": "code", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L1", + "_origin": "ast", + "community": 27, + "norm_label": "apitoken.php", + "id": "app_http_middleware_apitoken", + "community_name": "Community 27" + }, + { + "label": "ApiToken", + "file_type": "code", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L12", + "_origin": "ast", + "community": 27, + "norm_label": "apitoken", + "id": "app_http_middleware_apitoken_apitoken", + "community_name": "Community 27" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L21", + "_origin": "ast", + "community": 27, + "norm_label": ".handle()", + "id": "app_http_middleware_apitoken_apitoken_handle", + "community_name": "Community 27" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 27, + "norm_label": "request", + "id": "app_http_middleware_apitoken_php_request", + "community_name": "Community 27" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 27, + "norm_label": "closure", + "id": "app_http_middleware_apitoken_php_closure", + "community_name": "Community 27" + }, + { + "label": "FeedbackVariables.php", + "file_type": "code", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L1", + "_origin": "ast", + "community": 24, + "norm_label": "feedbackvariables.php", + "id": "app_http_middleware_feedbackvariables", + "community_name": "Community 24" + }, + { + "label": "FeedbackVariables", + "file_type": "code", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L13", + "_origin": "ast", + "community": 24, + "norm_label": "feedbackvariables", + "id": "app_http_middleware_feedbackvariables_feedbackvariables", + "community_name": "Community 24" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L21", + "_origin": "ast", + "community": 24, + "norm_label": ".handle()", + "id": "app_http_middleware_feedbackvariables_feedbackvariables_handle", + "community_name": "Community 24" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 24, + "norm_label": "request", + "id": "app_http_middleware_feedbackvariables_php_request", + "community_name": "Community 24" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 24, + "norm_label": "closure", + "id": "app_http_middleware_feedbackvariables_php_closure", + "community_name": "Community 24" + }, + { + "label": "UserActive.php", + "file_type": "code", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L1", + "_origin": "ast", + "community": 24, + "norm_label": "useractive.php", + "id": "app_http_middleware_useractive", + "community_name": "Community 24" + }, + { + "label": "UserActive", + "file_type": "code", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L10", + "_origin": "ast", + "community": 24, + "norm_label": "useractive", + "id": "app_http_middleware_useractive_useractive", + "community_name": "Community 24" + }, + { + "label": ".handle()", + "file_type": "code", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L18", + "_origin": "ast", + "community": 24, + "norm_label": ".handle()", + "id": "app_http_middleware_useractive_useractive_handle", + "community_name": "Community 24" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 24, + "norm_label": "request", + "id": "app_http_middleware_useractive_php_request", + "community_name": "Community 24" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 24, + "norm_label": "closure", + "id": "app_http_middleware_useractive_php_closure", + "community_name": "Community 24" + }, + { + "label": "AirportResource.php", + "file_type": "code", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "airportresource.php", + "id": "app_http_resources_airportresource", + "community_name": "Community 4" + }, + { + "label": "AirportResource", + "file_type": "code", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L8", + "_origin": "ast", + "community": 4, + "norm_label": "airportresource", + "id": "app_http_resources_airportresource_airportresource", + "community_name": "Community 4" + }, + { + "label": "JsonResource", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "jsonresource", + "id": "jsonresource", + "community_name": "Community 4" + }, + { + "label": ".toArray()", + "file_type": "code", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L10", + "_origin": "ast", + "community": 4, + "norm_label": ".toarray()", + "id": "app_http_resources_airportresource_airportresource_toarray", + "community_name": "Community 4" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "request", + "id": "app_http_resources_airportresource_php_request", + "community_name": "Community 4" + }, + { + "label": "SuggestedAirportResource.php", + "file_type": "code", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L1", + "_origin": "ast", + "community": 4, + "norm_label": "suggestedairportresource.php", + "id": "app_http_resources_suggestedairportresource", + "community_name": "Community 4" + }, + { + "label": "SuggestedAirportResource", + "file_type": "code", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L7", + "_origin": "ast", + "community": 4, + "norm_label": "suggestedairportresource", + "id": "app_http_resources_suggestedairportresource_suggestedairportresource", + "community_name": "Community 4" + }, + { + "label": ".toArray()", + "file_type": "code", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L9", + "_origin": "ast", + "community": 4, + "norm_label": ".toarray()", + "id": "app_http_resources_suggestedairportresource_suggestedairportresource_toarray", + "community_name": "Community 4" + }, + { + "label": "Request", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 4, + "norm_label": "request", + "id": "app_http_resources_suggestedairportresource_php_request", + "community_name": "Community 4" + }, + { + "label": "CollectionAirportFilter.php", + "file_type": "code", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L1", + "_origin": "ast", + "community": 10, + "norm_label": "collectionairportfilter.php", + "id": "app_mixins_collectionairportfilter", + "community_name": "Community 10" + }, + { + "label": "CollectionAirportFilter", + "file_type": "code", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L8", + "_origin": "ast", + "community": 10, + "norm_label": "collectionairportfilter", + "id": "app_mixins_collectionairportfilter_collectionairportfilter", + "community_name": "Community 10" + }, + { + "label": ".filterWithCriteria()", + "file_type": "code", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L10", + "_origin": "ast", + "community": 10, + "norm_label": ".filterwithcriteria()", + "id": "app_mixins_collectionairportfilter_collectionairportfilter_filterwithcriteria", + "community_name": "Community 10" + }, + { + "label": "Aircraft.php", + "file_type": "code", + "source_file": "app/Models/Aircraft.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "aircraft.php", + "id": "app_models_aircraft", + "community_name": "Community 18" + }, + { + "label": "Aircraft", + "file_type": "code", + "source_file": "app/Models/Aircraft.php", + "source_location": "L8", + "_origin": "ast", + "community": 43, + "norm_label": "aircraft", + "id": "app_models_aircraft_aircraft", + "community_name": "Community 43" + }, + { + "label": "Model", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 13, + "norm_label": "model", + "id": "model", + "community_name": "Community 13" + }, + { + "label": "HasFactory", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 13, + "norm_label": "hasfactory", + "id": "hasfactory", + "community_name": "Community 13" + }, + { + "label": ".flightAircrafts()", + "file_type": "code", + "source_file": "app/Models/Aircraft.php", + "source_location": "L18", + "_origin": "ast", + "community": 43, + "norm_label": ".flightaircrafts()", + "id": "app_models_aircraft_aircraft_flightaircrafts", + "community_name": "Community 43" + }, + { + "label": ".flights()", + "file_type": "code", + "source_file": "app/Models/Aircraft.php", + "source_location": "L23", + "_origin": "ast", + "community": 43, + "norm_label": ".flights()", + "id": "app_models_aircraft_aircraft_flights", + "community_name": "Community 43" + }, + { + "label": ".scenery()", + "file_type": "code", + "source_file": "app/Models/Aircraft.php", + "source_location": "L28", + "_origin": "ast", + "community": 43, + "norm_label": ".scenery()", + "id": "app_models_aircraft_aircraft_scenery", + "community_name": "Community 43" + }, + { + "label": "Airline.php", + "file_type": "code", + "source_file": "app/Models/Airline.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "airline.php", + "id": "app_models_airline", + "community_name": "Community 13" + }, + { + "label": "Airline", + "file_type": "code", + "source_file": "app/Models/Airline.php", + "source_location": "L8", + "_origin": "ast", + "community": 13, + "norm_label": "airline", + "id": "app_models_airline_airline", + "community_name": "Community 13" + }, + { + "label": ".flights()", + "file_type": "code", + "source_file": "app/Models/Airline.php", + "source_location": "L14", + "_origin": "ast", + "community": 13, + "norm_label": ".flights()", + "id": "app_models_airline_airline_flights", + "community_name": "Community 13" + }, + { + "label": "Airport.php", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "airport.php", + "id": "app_models_airport", + "community_name": "Community 14" + }, + { + "label": "Airport", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L19", + "_origin": "ast", + "community": 15, + "norm_label": "airport", + "id": "app_models_airport_airport", + "community_name": "Community 15" + }, + { + "label": "HasSpatial", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 15, + "norm_label": "hasspatial", + "id": "hasspatial", + "community_name": "Community 15" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L31", + "_origin": "ast", + "community": 15, + "norm_label": ".casts()", + "id": "app_models_airport_airport_casts", + "community_name": "Community 15" + }, + { + "label": ".metar()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L38", + "_origin": "ast", + "community": 15, + "norm_label": ".metar()", + "id": "app_models_airport_airport_metar", + "community_name": "Community 15" + }, + { + "label": ".taf()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L43", + "_origin": "ast", + "community": 15, + "norm_label": ".taf()", + "id": "app_models_airport_airport_taf", + "community_name": "Community 15" + }, + { + "label": ".bookings()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L48", + "_origin": "ast", + "community": 15, + "norm_label": ".bookings()", + "id": "app_models_airport_airport_bookings", + "community_name": "Community 15" + }, + { + "label": ".runways()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L53", + "_origin": "ast", + "community": 15, + "norm_label": ".runways()", + "id": "app_models_airport_airport_runways", + "community_name": "Community 15" + }, + { + "label": ".scores()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L58", + "_origin": "ast", + "community": 15, + "norm_label": ".scores()", + "id": "app_models_airport_airport_scores", + "community_name": "Community 15" + }, + { + "label": ".events()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L63", + "_origin": "ast", + "community": 15, + "norm_label": ".events()", + "id": "app_models_airport_airport_events", + "community_name": "Community 15" + }, + { + "label": ".controllers()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L68", + "_origin": "ast", + "community": 15, + "norm_label": ".controllers()", + "id": "app_models_airport_airport_controllers", + "community_name": "Community 15" + }, + { + "label": ".arrivalFlights()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L73", + "_origin": "ast", + "community": 15, + "norm_label": ".arrivalflights()", + "id": "app_models_airport_airport_arrivalflights", + "community_name": "Community 15" + }, + { + "label": ".departureFlights()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L78", + "_origin": "ast", + "community": 15, + "norm_label": ".departureflights()", + "id": "app_models_airport_airport_departureflights", + "community_name": "Community 15" + }, + { + "label": ".departureFlightsTo()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L83", + "_origin": "ast", + "community": 15, + "norm_label": ".departureflightsto()", + "id": "app_models_airport_airport_departureflightsto", + "community_name": "Community 15" + }, + { + "label": ".sceneryDevelopers()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L88", + "_origin": "ast", + "community": 15, + "norm_label": ".scenerydevelopers()", + "id": "app_models_airport_airport_scenerydevelopers", + "community_name": "Community 15" + }, + { + "label": ".publishedSceneries()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L93", + "_origin": "ast", + "community": 19, + "norm_label": ".publishedsceneries()", + "id": "app_models_airport_airport_publishedsceneries", + "community_name": "Community 19" + }, + { + "label": "Builder", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 19, + "norm_label": "builder", + "id": "app_models_airport_php_builder", + "community_name": "Community 19" + }, + { + "label": ".scoresAtEta()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L113", + "_origin": "ast", + "community": 44, + "norm_label": ".scoresateta()", + "id": "app_models_airport_airport_scoresateta", + "community_name": "Community 44" + }, + { + "label": "Carbon", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 44, + "norm_label": "carbon", + "id": "app_models_airport_php_carbon", + "community_name": "Community 44" + }, + { + "label": ".atcBookingScores()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L129", + "_origin": "ast", + "community": 35, + "norm_label": ".atcbookingscores()", + "id": "app_models_airport_airport_atcbookingscores", + "community_name": "Community 35" + }, + { + "label": ".atcBookedFacilities()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L141", + "_origin": "ast", + "community": 35, + "norm_label": ".atcbookedfacilities()", + "id": "app_models_airport_airport_atcbookedfacilities", + "community_name": "Community 35" + }, + { + "label": ".atcOnlineStations()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L155", + "_origin": "ast", + "community": 35, + "norm_label": ".atconlinestations()", + "id": "app_models_airport_airport_atconlinestations", + "community_name": "Community 35" + }, + { + "label": ".atcOnlineFacilities()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L177", + "_origin": "ast", + "community": 35, + "norm_label": ".atconlinefacilities()", + "id": "app_models_airport_airport_atconlinefacilities", + "community_name": "Community 35" + }, + { + "label": ".atcFacilities()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L185", + "_origin": "ast", + "community": 35, + "norm_label": ".atcfacilities()", + "id": "app_models_airport_airport_atcfacilities", + "community_name": "Community 35" + }, + { + "label": ".sortFacilities()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L190", + "_origin": "ast", + "community": 35, + "norm_label": ".sortfacilities()", + "id": "app_models_airport_airport_sortfacilities", + "community_name": "Community 35" + }, + { + "label": "Collection", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 35, + "norm_label": "collection", + "id": "app_models_airport_php_collection", + "community_name": "Community 35" + }, + { + "label": ".displayScores()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L208", + "_origin": "ast", + "community": 15, + "norm_label": ".displayscores()", + "id": "app_models_airport_airport_displayscores", + "community_name": "Community 15" + }, + { + "label": ".hasWeatherScore()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L228", + "_origin": "ast", + "community": 15, + "norm_label": ".hasweatherscore()", + "id": "app_models_airport_airport_hasweatherscore", + "community_name": "Community 15" + }, + { + "label": ".weatherScore()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L233", + "_origin": "ast", + "community": 15, + "norm_label": ".weatherscore()", + "id": "app_models_airport_airport_weatherscore", + "community_name": "Community 15" + }, + { + "label": ".hasVatsimScore()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L238", + "_origin": "ast", + "community": 15, + "norm_label": ".hasvatsimscore()", + "id": "app_models_airport_airport_hasvatsimscore", + "community_name": "Community 15" + }, + { + "label": ".vatsimScore()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L243", + "_origin": "ast", + "community": 15, + "norm_label": ".vatsimscore()", + "id": "app_models_airport_airport_vatsimscore", + "community_name": "Community 15" + }, + { + "label": ".longestRunway()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L248", + "_origin": "ast", + "community": 15, + "norm_label": ".longestrunway()", + "id": "app_models_airport_airport_longestrunway", + "community_name": "Community 15" + }, + { + "label": ".hasVisualCondition()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L253", + "_origin": "ast", + "community": 15, + "norm_label": ".hasvisualcondition()", + "id": "app_models_airport_airport_hasvisualcondition", + "community_name": "Community 15" + }, + { + "label": ".airportOpen()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L267", + "_origin": "ast", + "community": 19, + "norm_label": ".airportopen()", + "id": "app_models_airport_airport_airportopen", + "community_name": "Community 19" + }, + { + "label": ".notIcao()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L276", + "_origin": "ast", + "community": 19, + "norm_label": ".noticao()", + "id": "app_models_airport_airport_noticao", + "community_name": "Community 19" + }, + { + "label": ".isAirportSize()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L287", + "_origin": "ast", + "community": 19, + "norm_label": ".isairportsize()", + "id": "app_models_airport_airport_isairportsize", + "community_name": "Community 19" + }, + { + "label": ".inContinent()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L300", + "_origin": "ast", + "community": 19, + "norm_label": ".incontinent()", + "id": "app_models_airport_airport_incontinent", + "community_name": "Community 19" + }, + { + "label": ".notInContinent()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L331", + "_origin": "ast", + "community": 19, + "norm_label": ".notincontinent()", + "id": "app_models_airport_airport_notincontinent", + "community_name": "Community 19" + }, + { + "label": ".inCountry()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L362", + "_origin": "ast", + "community": 19, + "norm_label": ".incountry()", + "id": "app_models_airport_airport_incountry", + "community_name": "Community 19" + }, + { + "label": ".notInCountry()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L382", + "_origin": "ast", + "community": 19, + "norm_label": ".notincountry()", + "id": "app_models_airport_airport_notincountry", + "community_name": "Community 19" + }, + { + "label": ".inState()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L401", + "_origin": "ast", + "community": 19, + "norm_label": ".instate()", + "id": "app_models_airport_airport_instate", + "community_name": "Community 19" + }, + { + "label": ".notInState()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L412", + "_origin": "ast", + "community": 19, + "norm_label": ".notinstate()", + "id": "app_models_airport_airport_notinstate", + "community_name": "Community 19" + }, + { + "label": ".withinDistance()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L423", + "_origin": "ast", + "community": 19, + "norm_label": ".withindistance()", + "id": "app_models_airport_airport_withindistance", + "community_name": "Community 19" + }, + { + "label": ".applyDistanceBoundingBox()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L453", + "_origin": "ast", + "community": 19, + "norm_label": ".applydistanceboundingbox()", + "id": "app_models_airport_airport_applydistanceboundingbox", + "community_name": "Community 19" + }, + { + "label": ".withinBearing()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L504", + "_origin": "ast", + "community": 25, + "norm_label": ".withinbearing()", + "id": "app_models_airport_airport_withinbearing", + "community_name": "Community 25" + }, + { + "label": ".filterRunwayLengths()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L589", + "_origin": "ast", + "community": 25, + "norm_label": ".filterrunwaylengths()", + "id": "app_models_airport_airport_filterrunwaylengths", + "community_name": "Community 25" + }, + { + "label": ".filterRunwayLights()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L609", + "_origin": "ast", + "community": 19, + "norm_label": ".filterrunwaylights()", + "id": "app_models_airport_airport_filterrunwaylights", + "community_name": "Community 19" + }, + { + "label": ".filterAirbases()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L630", + "_origin": "ast", + "community": 19, + "norm_label": ".filterairbases()", + "id": "app_models_airport_airport_filterairbases", + "community_name": "Community 19" + }, + { + "label": ".filterByScores()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L649", + "_origin": "ast", + "community": 44, + "norm_label": ".filterbyscores()", + "id": "app_models_airport_airport_filterbyscores", + "community_name": "Community 44" + }, + { + "label": ".filterRoutesAndAirlines()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L680", + "_origin": "ast", + "community": 19, + "norm_label": ".filterroutesandairlines()", + "id": "app_models_airport_airport_filterroutesandairlines", + "community_name": "Community 19" + }, + { + "label": ".returnOnlyWhitelistedIcao()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L766", + "_origin": "ast", + "community": 19, + "norm_label": ".returnonlywhitelistedicao()", + "id": "app_models_airport_airport_returnonlywhitelistedicao", + "community_name": "Community 19" + }, + { + "label": ".sortByScores()", + "file_type": "code", + "source_file": "app/Models/Airport.php", + "source_location": "L783", + "_origin": "ast", + "community": 44, + "norm_label": ".sortbyscores()", + "id": "app_models_airport_airport_sortbyscores", + "community_name": "Community 44" + }, + { + "label": "AirportScore.php", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "airportscore.php", + "id": "app_models_airportscore", + "community_name": "Community 14" + }, + { + "label": "AirportScore", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L13", + "_origin": "ast", + "community": 3, + "norm_label": "airportscore", + "id": "app_models_airportscore_airportscore", + "community_name": "Community 3" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L42", + "_origin": "ast", + "community": 3, + "norm_label": ".casts()", + "id": "app_models_airportscore_airportscore_casts", + "community_name": "Community 3" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L51", + "_origin": "ast", + "community": 3, + "norm_label": ".airport()", + "id": "app_models_airportscore_airportscore_airport", + "community_name": "Community 3" + }, + { + "label": ".coversEta()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L65", + "_origin": "ast", + "community": 3, + "norm_label": ".coverseta()", + "id": "app_models_airportscore_airportscore_coverseta", + "community_name": "Community 3" + }, + { + "label": "Builder", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 3, + "norm_label": "builder", + "id": "app_models_airportscore_php_builder", + "community_name": "Community 3" + }, + { + "label": "Carbon", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 3, + "norm_label": "carbon", + "id": "app_models_airportscore_php_carbon", + "community_name": "Community 3" + }, + { + "label": ".coversEtaAt()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L77", + "_origin": "ast", + "community": 3, + "norm_label": ".coversetaat()", + "id": "app_models_airportscore_airportscore_coversetaat", + "community_name": "Community 3" + }, + { + "label": ".applyCoversEta()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L109", + "_origin": "ast", + "community": 3, + "norm_label": ".applycoverseta()", + "id": "app_models_airportscore_airportscore_applycoverseta", + "community_name": "Community 3" + }, + { + "label": ".tooltipText()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L160", + "_origin": "ast", + "community": 3, + "norm_label": ".tooltiptext()", + "id": "app_models_airportscore_airportscore_tooltiptext", + "community_name": "Community 3" + }, + { + "label": ".windowText()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L186", + "_origin": "ast", + "community": 3, + "norm_label": ".windowtext()", + "id": "app_models_airportscore_airportscore_windowtext", + "community_name": "Community 3" + }, + { + "label": ".onlineForText()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L195", + "_origin": "ast", + "community": 3, + "norm_label": ".onlinefortext()", + "id": "app_models_airportscore_airportscore_onlinefortext", + "community_name": "Community 3" + }, + { + "label": ".loggedOnAgo()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L203", + "_origin": "ast", + "community": 3, + "norm_label": ".loggedonago()", + "id": "app_models_airportscore_airportscore_loggedonago", + "community_name": "Community 3" + }, + { + "label": ".isWeatherScore()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L208", + "_origin": "ast", + "community": 3, + "norm_label": ".isweatherscore()", + "id": "app_models_airportscore_airportscore_isweatherscore", + "community_name": "Community 3" + }, + { + "label": ".isVatsimScore()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L213", + "_origin": "ast", + "community": 3, + "norm_label": ".isvatsimscore()", + "id": "app_models_airportscore_airportscore_isvatsimscore", + "community_name": "Community 3" + }, + { + "label": ".getTopAirports()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L218", + "_origin": "ast", + "community": 3, + "norm_label": ".gettopairports()", + "id": "app_models_airportscore_airportscore_gettopairports", + "community_name": "Community 3" + }, + { + "label": ".computeTopAirports()", + "file_type": "code", + "source_file": "app/Models/AirportScore.php", + "source_location": "L241", + "_origin": "ast", + "community": 3, + "norm_label": ".computetopairports()", + "id": "app_models_airportscore_airportscore_computetopairports", + "community_name": "Community 3" + }, + { + "label": "ApiKey.php", + "file_type": "code", + "source_file": "app/Models/ApiKey.php", + "source_location": "L1", + "_origin": "ast", + "community": 27, + "norm_label": "apikey.php", + "id": "app_models_apikey", + "community_name": "Community 27" + }, + { + "label": "ApiKey", + "file_type": "code", + "source_file": "app/Models/ApiKey.php", + "source_location": "L8", + "_origin": "ast", + "community": 27, + "norm_label": "apikey", + "id": "app_models_apikey_apikey", + "community_name": "Community 27" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/ApiKey.php", + "source_location": "L20", + "_origin": "ast", + "community": 27, + "norm_label": ".casts()", + "id": "app_models_apikey_apikey_casts", + "community_name": "Community 27" + }, + { + "label": ".logs()", + "file_type": "code", + "source_file": "app/Models/ApiKey.php", + "source_location": "L27", + "_origin": "ast", + "community": 27, + "norm_label": ".logs()", + "id": "app_models_apikey_apikey_logs", + "community_name": "Community 27" + }, + { + "label": "ApiLog.php", + "file_type": "code", + "source_file": "app/Models/ApiLog.php", + "source_location": "L1", + "_origin": "ast", + "community": 27, + "norm_label": "apilog.php", + "id": "app_models_apilog", + "community_name": "Community 27" + }, + { + "label": "ApiLog", + "file_type": "code", + "source_file": "app/Models/ApiLog.php", + "source_location": "L8", + "_origin": "ast", + "community": 27, + "norm_label": "apilog", + "id": "app_models_apilog_apilog", + "community_name": "Community 27" + }, + { + "label": ".key()", + "file_type": "code", + "source_file": "app/Models/ApiLog.php", + "source_location": "L16", + "_origin": "ast", + "community": 27, + "norm_label": ".key()", + "id": "app_models_apilog_apilog_key", + "community_name": "Community 27" + }, + { + "label": "Booking.php", + "file_type": "code", + "source_file": "app/Models/Booking.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "booking.php", + "id": "app_models_booking", + "community_name": "Community 14" + }, + { + "label": "Booking", + "file_type": "code", + "source_file": "app/Models/Booking.php", + "source_location": "L8", + "_origin": "ast", + "community": 14, + "norm_label": "booking", + "id": "app_models_booking_booking", + "community_name": "Community 14" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Booking.php", + "source_location": "L21", + "_origin": "ast", + "community": 14, + "norm_label": ".casts()", + "id": "app_models_booking_booking_casts", + "community_name": "Community 14" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Booking.php", + "source_location": "L30", + "_origin": "ast", + "community": 14, + "norm_label": ".airport()", + "id": "app_models_booking_booking_airport", + "community_name": "Community 14" + }, + { + "label": "Controller.php", + "file_type": "code", + "source_file": "app/Models/Controller.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "controller.php", + "id": "app_models_controller", + "community_name": "Community 13" + }, + { + "label": "Controller", + "file_type": "code", + "source_file": "app/Models/Controller.php", + "source_location": "L8", + "_origin": "ast", + "community": 13, + "norm_label": "controller", + "id": "app_models_controller_controller", + "community_name": "Community 13" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Controller.php", + "source_location": "L16", + "_origin": "ast", + "community": 13, + "norm_label": ".casts()", + "id": "app_models_controller_controller_casts", + "community_name": "Community 13" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Controller.php", + "source_location": "L23", + "_origin": "ast", + "community": 13, + "norm_label": ".airport()", + "id": "app_models_controller_controller_airport", + "community_name": "Community 13" + }, + { + "label": "Event.php", + "file_type": "code", + "source_file": "app/Models/Event.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "event.php", + "id": "app_models_event", + "community_name": "Community 14" + }, + { + "label": "Event", + "file_type": "code", + "source_file": "app/Models/Event.php", + "source_location": "L8", + "_origin": "ast", + "community": 13, + "norm_label": "event", + "id": "app_models_event_event", + "community_name": "Community 13" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Event.php", + "source_location": "L16", + "_origin": "ast", + "community": 13, + "norm_label": ".casts()", + "id": "app_models_event_event_casts", + "community_name": "Community 13" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Event.php", + "source_location": "L24", + "_origin": "ast", + "community": 13, + "norm_label": ".airport()", + "id": "app_models_event_event_airport", + "community_name": "Community 13" + }, + { + "label": "FeedbackVote.php", + "file_type": "code", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "feedbackvote.php", + "id": "app_models_feedbackvote", + "community_name": "Community 13" + }, + { + "label": "FeedbackVote", + "file_type": "code", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L8", + "_origin": "ast", + "community": 29, + "norm_label": "feedbackvote", + "id": "app_models_feedbackvote_feedbackvote", + "community_name": "Community 29" + }, + { + "label": ".user()", + "file_type": "code", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L14", + "_origin": "ast", + "community": 29, + "norm_label": ".user()", + "id": "app_models_feedbackvote_feedbackvote_user", + "community_name": "Community 29" + }, + { + "label": "Flight.php", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "flight.php", + "id": "app_models_flight", + "community_name": "Community 18" + }, + { + "label": "Flight", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L8", + "_origin": "ast", + "community": 6, + "norm_label": "flight", + "id": "app_models_flight_flight", + "community_name": "Community 6" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L14", + "_origin": "ast", + "community": 6, + "norm_label": ".casts()", + "id": "app_models_flight_flight_casts", + "community_name": "Community 6" + }, + { + "label": ".departureAirport()", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L22", + "_origin": "ast", + "community": 6, + "norm_label": ".departureairport()", + "id": "app_models_flight_flight_departureairport", + "community_name": "Community 6" + }, + { + "label": ".arrivalAirport()", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L27", + "_origin": "ast", + "community": 6, + "norm_label": ".arrivalairport()", + "id": "app_models_flight_flight_arrivalairport", + "community_name": "Community 6" + }, + { + "label": ".airline()", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L32", + "_origin": "ast", + "community": 6, + "norm_label": ".airline()", + "id": "app_models_flight_flight_airline", + "community_name": "Community 6" + }, + { + "label": ".aircrafts()", + "file_type": "code", + "source_file": "app/Models/Flight.php", + "source_location": "L37", + "_origin": "ast", + "community": 6, + "norm_label": ".aircrafts()", + "id": "app_models_flight_flight_aircrafts", + "community_name": "Community 6" + }, + { + "label": "FlightAircraft.php", + "file_type": "code", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L1", + "_origin": "ast", + "community": 33, + "norm_label": "flightaircraft.php", + "id": "app_models_flightaircraft", + "community_name": "Community 33" + }, + { + "label": "FlightAircraft", + "file_type": "code", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L8", + "_origin": "ast", + "community": 33, + "norm_label": "flightaircraft", + "id": "app_models_flightaircraft_flightaircraft", + "community_name": "Community 33" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L14", + "_origin": "ast", + "community": 33, + "norm_label": ".casts()", + "id": "app_models_flightaircraft_flightaircraft_casts", + "community_name": "Community 33" + }, + { + "label": ".flight()", + "file_type": "code", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L22", + "_origin": "ast", + "community": 33, + "norm_label": ".flight()", + "id": "app_models_flightaircraft_flightaircraft_flight", + "community_name": "Community 33" + }, + { + "label": ".aircraft()", + "file_type": "code", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L27", + "_origin": "ast", + "community": 33, + "norm_label": ".aircraft()", + "id": "app_models_flightaircraft_flightaircraft_aircraft", + "community_name": "Community 33" + }, + { + "label": "Metar.php", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "metar.php", + "id": "app_models_metar", + "community_name": "Community 13" + }, + { + "label": "Metar", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L9", + "_origin": "ast", + "community": 0, + "norm_label": "metar", + "id": "app_models_metar_metar", + "community_name": "Community 0" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L15", + "_origin": "ast", + "community": 0, + "norm_label": ".casts()", + "id": "app_models_metar_metar_casts", + "community_name": "Community 0" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L24", + "_origin": "ast", + "community": 0, + "norm_label": ".airport()", + "id": "app_models_metar_metar_airport", + "community_name": "Community 0" + }, + { + "label": ".metarWithoutRemarks()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L29", + "_origin": "ast", + "community": 0, + "norm_label": ".metarwithoutremarks()", + "id": "app_models_metar_metar_metarwithoutremarks", + "community_name": "Community 0" + }, + { + "label": ".isVisualCondition()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L34", + "_origin": "ast", + "community": 0, + "norm_label": ".isvisualcondition()", + "id": "app_models_metar_metar_isvisualcondition", + "community_name": "Community 0" + }, + { + "label": ".sightAtAbove()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L39", + "_origin": "ast", + "community": 0, + "norm_label": ".sightatabove()", + "id": "app_models_metar_metar_sightatabove", + "community_name": "Community 0" + }, + { + "label": ".sightBelow()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L65", + "_origin": "ast", + "community": 0, + "norm_label": ".sightbelow()", + "id": "app_models_metar_metar_sightbelow", + "community_name": "Community 0" + }, + { + "label": ".windAtAbove()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L86", + "_origin": "ast", + "community": 0, + "norm_label": ".windatabove()", + "id": "app_models_metar_metar_windatabove", + "community_name": "Community 0" + }, + { + "label": ".windGusts()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L95", + "_origin": "ast", + "community": 0, + "norm_label": ".windgusts()", + "id": "app_models_metar_metar_windgusts", + "community_name": "Community 0" + }, + { + "label": ".ceilingAtAbove()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L102", + "_origin": "ast", + "community": 0, + "norm_label": ".ceilingatabove()", + "id": "app_models_metar_metar_ceilingatabove", + "community_name": "Community 0" + }, + { + "label": ".foggy()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L117", + "_origin": "ast", + "community": 0, + "norm_label": ".foggy()", + "id": "app_models_metar_metar_foggy", + "community_name": "Community 0" + }, + { + "label": ".heavyRain()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L122", + "_origin": "ast", + "community": 0, + "norm_label": ".heavyrain()", + "id": "app_models_metar_metar_heavyrain", + "community_name": "Community 0" + }, + { + "label": ".heavySnow()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L127", + "_origin": "ast", + "community": 0, + "norm_label": ".heavysnow()", + "id": "app_models_metar_metar_heavysnow", + "community_name": "Community 0" + }, + { + "label": ".thunderstorm()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L132", + "_origin": "ast", + "community": 0, + "norm_label": ".thunderstorm()", + "id": "app_models_metar_metar_thunderstorm", + "community_name": "Community 0" + }, + { + "label": ".rvrAtBelow()", + "file_type": "code", + "source_file": "app/Models/Metar.php", + "source_location": "L137", + "_origin": "ast", + "community": 0, + "norm_label": ".rvratbelow()", + "id": "app_models_metar_metar_rvratbelow", + "community_name": "Community 0" + }, + { + "label": "Runway.php", + "file_type": "code", + "source_file": "app/Models/Runway.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "runway.php", + "id": "app_models_runway", + "community_name": "Community 14" + }, + { + "label": "Runway", + "file_type": "code", + "source_file": "app/Models/Runway.php", + "source_location": "L8", + "_origin": "ast", + "community": 14, + "norm_label": "runway", + "id": "app_models_runway_runway", + "community_name": "Community 14" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Runway.php", + "source_location": "L16", + "_origin": "ast", + "community": 14, + "norm_label": ".casts()", + "id": "app_models_runway_runway_casts", + "community_name": "Community 14" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Runway.php", + "source_location": "L24", + "_origin": "ast", + "community": 14, + "norm_label": ".airport()", + "id": "app_models_runway_runway_airport", + "community_name": "Community 14" + }, + { + "label": "Scenery.php", + "file_type": "code", + "source_file": "app/Models/Scenery.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "scenery.php", + "id": "app_models_scenery", + "community_name": "Community 18" + }, + { + "label": "Scenery", + "file_type": "code", + "source_file": "app/Models/Scenery.php", + "source_location": "L8", + "_origin": "ast", + "community": 22, + "norm_label": "scenery", + "id": "app_models_scenery_scenery", + "community_name": "Community 22" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Scenery.php", + "source_location": "L14", + "_origin": "ast", + "community": 22, + "norm_label": ".airport()", + "id": "app_models_scenery_scenery_airport", + "community_name": "Community 22" + }, + { + "label": ".developer()", + "file_type": "code", + "source_file": "app/Models/Scenery.php", + "source_location": "L19", + "_origin": "ast", + "community": 22, + "norm_label": ".developer()", + "id": "app_models_scenery_scenery_developer", + "community_name": "Community 22" + }, + { + "label": ".simulator()", + "file_type": "code", + "source_file": "app/Models/Scenery.php", + "source_location": "L24", + "_origin": "ast", + "community": 22, + "norm_label": ".simulator()", + "id": "app_models_scenery_scenery_simulator", + "community_name": "Community 22" + }, + { + "label": ".suggestedByUser()", + "file_type": "code", + "source_file": "app/Models/Scenery.php", + "source_location": "L29", + "_origin": "ast", + "community": 22, + "norm_label": ".suggestedbyuser()", + "id": "app_models_scenery_scenery_suggestedbyuser", + "community_name": "Community 22" + }, + { + "label": "SceneryDeveloper.php", + "file_type": "code", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "scenerydeveloper.php", + "id": "app_models_scenerydeveloper", + "community_name": "Community 18" + }, + { + "label": "SceneryDeveloper", + "file_type": "code", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L8", + "_origin": "ast", + "community": 6, + "norm_label": "scenerydeveloper", + "id": "app_models_scenerydeveloper_scenerydeveloper", + "community_name": "Community 6" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L14", + "_origin": "ast", + "community": 6, + "norm_label": ".airport()", + "id": "app_models_scenerydeveloper_scenerydeveloper_airport", + "community_name": "Community 6" + }, + { + "label": ".sceneries()", + "file_type": "code", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L19", + "_origin": "ast", + "community": 6, + "norm_label": ".sceneries()", + "id": "app_models_scenerydeveloper_scenerydeveloper_sceneries", + "community_name": "Community 6" + }, + { + "label": "Simulator.php", + "file_type": "code", + "source_file": "app/Models/Simulator.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "simulator.php", + "id": "app_models_simulator", + "community_name": "Community 20" + }, + { + "label": "Simulator", + "file_type": "code", + "source_file": "app/Models/Simulator.php", + "source_location": "L8", + "_origin": "ast", + "community": 9, + "norm_label": "simulator", + "id": "app_models_simulator_simulator", + "community_name": "Community 9" + }, + { + "label": ".lists()", + "file_type": "code", + "source_file": "app/Models/Simulator.php", + "source_location": "L14", + "_origin": "ast", + "community": 9, + "norm_label": ".lists()", + "id": "app_models_simulator_simulator_lists", + "community_name": "Community 9" + }, + { + "label": ".sceneries()", + "file_type": "code", + "source_file": "app/Models/Simulator.php", + "source_location": "L19", + "_origin": "ast", + "community": 9, + "norm_label": ".sceneries()", + "id": "app_models_simulator_simulator_sceneries", + "community_name": "Community 9" + }, + { + "label": "Taf.php", + "file_type": "code", + "source_file": "app/Models/Taf.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "taf.php", + "id": "app_models_taf", + "community_name": "Community 13" + }, + { + "label": "Taf", + "file_type": "code", + "source_file": "app/Models/Taf.php", + "source_location": "L13", + "_origin": "ast", + "community": 13, + "norm_label": "taf", + "id": "app_models_taf_taf", + "community_name": "Community 13" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/Taf.php", + "source_location": "L21", + "_origin": "ast", + "community": 13, + "norm_label": ".casts()", + "id": "app_models_taf_taf_casts", + "community_name": "Community 13" + }, + { + "label": ".airport()", + "file_type": "code", + "source_file": "app/Models/Taf.php", + "source_location": "L32", + "_origin": "ast", + "community": 13, + "norm_label": ".airport()", + "id": "app_models_taf_taf_airport", + "community_name": "Community 13" + }, + { + "label": ".forecasts()", + "file_type": "code", + "source_file": "app/Models/Taf.php", + "source_location": "L37", + "_origin": "ast", + "community": 13, + "norm_label": ".forecasts()", + "id": "app_models_taf_taf_forecasts", + "community_name": "Community 13" + }, + { + "label": "TafForecast.php", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "tafforecast.php", + "id": "app_models_tafforecast", + "community_name": "Community 13" + }, + { + "label": "TafForecast", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L15", + "_origin": "ast", + "community": 0, + "norm_label": "tafforecast", + "id": "app_models_tafforecast_tafforecast", + "community_name": "Community 0" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L23", + "_origin": "ast", + "community": 0, + "norm_label": ".casts()", + "id": "app_models_tafforecast_tafforecast_casts", + "community_name": "Community 0" + }, + { + "label": ".taf()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L31", + "_origin": "ast", + "community": 0, + "norm_label": ".taf()", + "id": "app_models_tafforecast_tafforecast_taf", + "community_name": "Community 0" + }, + { + "label": ".ceilingFromSkyCondition()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L41", + "_origin": "ast", + "community": 0, + "norm_label": ".ceilingfromskycondition()", + "id": "app_models_tafforecast_tafforecast_ceilingfromskycondition", + "community_name": "Community 0" + }, + { + "label": ".windAtAbove()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L53", + "_origin": "ast", + "community": 0, + "norm_label": ".windatabove()", + "id": "app_models_tafforecast_tafforecast_windatabove", + "community_name": "Community 0" + }, + { + "label": ".windGusts()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L62", + "_origin": "ast", + "community": 0, + "norm_label": ".windgusts()", + "id": "app_models_tafforecast_tafforecast_windgusts", + "community_name": "Community 0" + }, + { + "label": ".visibilityMeters()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L73", + "_origin": "ast", + "community": 0, + "norm_label": ".visibilitymeters()", + "id": "app_models_tafforecast_tafforecast_visibilitymeters", + "community_name": "Community 0" + }, + { + "label": ".sightAtAbove()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L82", + "_origin": "ast", + "community": 0, + "norm_label": ".sightatabove()", + "id": "app_models_tafforecast_tafforecast_sightatabove", + "community_name": "Community 0" + }, + { + "label": ".sightBelow()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L89", + "_origin": "ast", + "community": 0, + "norm_label": ".sightbelow()", + "id": "app_models_tafforecast_tafforecast_sightbelow", + "community_name": "Community 0" + }, + { + "label": ".ceilingAtAbove()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L97", + "_origin": "ast", + "community": 0, + "norm_label": ".ceilingatabove()", + "id": "app_models_tafforecast_tafforecast_ceilingatabove", + "community_name": "Community 0" + }, + { + "label": ".foggy()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L102", + "_origin": "ast", + "community": 0, + "norm_label": ".foggy()", + "id": "app_models_tafforecast_tafforecast_foggy", + "community_name": "Community 0" + }, + { + "label": ".heavyRain()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L107", + "_origin": "ast", + "community": 0, + "norm_label": ".heavyrain()", + "id": "app_models_tafforecast_tafforecast_heavyrain", + "community_name": "Community 0" + }, + { + "label": ".heavySnow()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L112", + "_origin": "ast", + "community": 0, + "norm_label": ".heavysnow()", + "id": "app_models_tafforecast_tafforecast_heavysnow", + "community_name": "Community 0" + }, + { + "label": ".thunderstorm()", + "file_type": "code", + "source_file": "app/Models/TafForecast.php", + "source_location": "L117", + "_origin": "ast", + "community": 0, + "norm_label": ".thunderstorm()", + "id": "app_models_tafforecast_tafforecast_thunderstorm", + "community_name": "Community 0" + }, + { + "label": "User.php", + "file_type": "code", + "source_file": "app/Models/User.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "user.php", + "id": "app_models_user", + "community_name": "Community 20" + }, + { + "label": "User", + "file_type": "code", + "source_file": "app/Models/User.php", + "source_location": "L11", + "_origin": "ast", + "community": 7, + "norm_label": "user", + "id": "app_models_user_user", + "community_name": "Community 7" + }, + { + "label": "Authenticatable", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 7, + "norm_label": "authenticatable", + "id": "authenticatable", + "community_name": "Community 7" + }, + { + "label": "MustVerifyEmail", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 7, + "norm_label": "mustverifyemail", + "id": "mustverifyemail", + "community_name": "Community 7" + }, + { + "label": "CanResetPassword", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 7, + "norm_label": "canresetpassword", + "id": "canresetpassword", + "community_name": "Community 7" + }, + { + "label": "Notifiable", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 7, + "norm_label": "notifiable", + "id": "notifiable", + "community_name": "Community 7" + }, + { + "label": ".casts()", + "file_type": "code", + "source_file": "app/Models/User.php", + "source_location": "L42", + "_origin": "ast", + "community": 7, + "norm_label": ".casts()", + "id": "app_models_user_user_casts", + "community_name": "Community 7" + }, + { + "label": ".getAirportsFromLists()", + "file_type": "code", + "source_file": "app/Models/User.php", + "source_location": "L51", + "_origin": "ast", + "community": 7, + "norm_label": ".getairportsfromlists()", + "id": "app_models_user_user_getairportsfromlists", + "community_name": "Community 7" + }, + { + "label": ".lists()", + "file_type": "code", + "source_file": "app/Models/User.php", + "source_location": "L60", + "_origin": "ast", + "community": 7, + "norm_label": ".lists()", + "id": "app_models_user_user_lists", + "community_name": "Community 7" + }, + { + "label": ".feedbackVotes()", + "file_type": "code", + "source_file": "app/Models/User.php", + "source_location": "L65", + "_origin": "ast", + "community": 7, + "norm_label": ".feedbackvotes()", + "id": "app_models_user_user_feedbackvotes", + "community_name": "Community 7" + }, + { + "label": "UserList.php", + "file_type": "code", + "source_file": "app/Models/UserList.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "userlist.php", + "id": "app_models_userlist", + "community_name": "Community 20" + }, + { + "label": "UserList", + "file_type": "code", + "source_file": "app/Models/UserList.php", + "source_location": "L8", + "_origin": "ast", + "community": 9, + "norm_label": "userlist", + "id": "app_models_userlist_userlist", + "community_name": "Community 9" + }, + { + "label": ".user()", + "file_type": "code", + "source_file": "app/Models/UserList.php", + "source_location": "L21", + "_origin": "ast", + "community": 9, + "norm_label": ".user()", + "id": "app_models_userlist_userlist_user", + "community_name": "Community 9" + }, + { + "label": ".simulator()", + "file_type": "code", + "source_file": "app/Models/UserList.php", + "source_location": "L26", + "_origin": "ast", + "community": 9, + "norm_label": ".simulator()", + "id": "app_models_userlist_userlist_simulator", + "community_name": "Community 9" + }, + { + "label": ".airports()", + "file_type": "code", + "source_file": "app/Models/UserList.php", + "source_location": "L31", + "_origin": "ast", + "community": 9, + "norm_label": ".airports()", + "id": "app_models_userlist_userlist_airports", + "community_name": "Community 9" + }, + { + "label": "SceneryPolicy.php", + "file_type": "code", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L1", + "_origin": "ast", + "community": 22, + "norm_label": "scenerypolicy.php", + "id": "app_policies_scenerypolicy", + "community_name": "Community 22" + }, + { + "label": "SceneryPolicy", + "file_type": "code", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L8", + "_origin": "ast", + "community": 22, + "norm_label": "scenerypolicy", + "id": "app_policies_scenerypolicy_scenerypolicy", + "community_name": "Community 22" + }, + { + "label": ".update()", + "file_type": "code", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L13", + "_origin": "ast", + "community": 22, + "norm_label": ".update()", + "id": "app_policies_scenerypolicy_scenerypolicy_update", + "community_name": "Community 22" + }, + { + "label": ".delete()", + "file_type": "code", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L21", + "_origin": "ast", + "community": 22, + "norm_label": ".delete()", + "id": "app_policies_scenerypolicy_scenerypolicy_delete", + "community_name": "Community 22" + }, + { + "label": "UserListPolicy.php", + "file_type": "code", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L1", + "_origin": "ast", + "community": 7, + "norm_label": "userlistpolicy.php", + "id": "app_policies_userlistpolicy", + "community_name": "Community 7" + }, + { + "label": "UserListPolicy", + "file_type": "code", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L8", + "_origin": "ast", + "community": 7, + "norm_label": "userlistpolicy", + "id": "app_policies_userlistpolicy_userlistpolicy", + "community_name": "Community 7" + }, + { + "label": ".view()", + "file_type": "code", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L13", + "_origin": "ast", + "community": 21, + "norm_label": ".view()", + "id": "app_policies_userlistpolicy_userlistpolicy_view", + "community_name": "Community 21" + }, + { + "label": ".update()", + "file_type": "code", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L21", + "_origin": "ast", + "community": 7, + "norm_label": ".update()", + "id": "app_policies_userlistpolicy_userlistpolicy_update", + "community_name": "Community 7" + }, + { + "label": ".delete()", + "file_type": "code", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L29", + "_origin": "ast", + "community": 7, + "norm_label": ".delete()", + "id": "app_policies_userlistpolicy_userlistpolicy_delete", + "community_name": "Community 7" + }, + { + "label": ".public()", + "file_type": "code", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L37", + "_origin": "ast", + "community": 7, + "norm_label": ".public()", + "id": "app_policies_userlistpolicy_userlistpolicy_public", + "community_name": "Community 7" + }, + { + "label": "UserPolicy.php", + "file_type": "code", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L1", + "_origin": "ast", + "community": 7, + "norm_label": "userpolicy.php", + "id": "app_policies_userpolicy", + "community_name": "Community 7" + }, + { + "label": "UserPolicy", + "file_type": "code", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L7", + "_origin": "ast", + "community": 7, + "norm_label": "userpolicy", + "id": "app_policies_userpolicy_userpolicy", + "community_name": "Community 7" + }, + { + "label": ".showAdmin()", + "file_type": "code", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L12", + "_origin": "ast", + "community": 7, + "norm_label": ".showadmin()", + "id": "app_policies_userpolicy_userpolicy_showadmin", + "community_name": "Community 7" + }, + { + "label": "AppServiceProvider.php", + "file_type": "code", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L1", + "_origin": "ast", + "community": 10, + "norm_label": "appserviceprovider.php", + "id": "app_providers_appserviceprovider", + "community_name": "Community 10" + }, + { + "label": "AppServiceProvider", + "file_type": "code", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L11", + "_origin": "ast", + "community": 10, + "norm_label": "appserviceprovider", + "id": "app_providers_appserviceprovider_appserviceprovider", + "community_name": "Community 10" + }, + { + "label": "ServiceProvider", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 10, + "norm_label": "serviceprovider", + "id": "serviceprovider", + "community_name": "Community 10" + }, + { + "label": ".register()", + "file_type": "code", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L16", + "_origin": "ast", + "community": 10, + "norm_label": ".register()", + "id": "app_providers_appserviceprovider_appserviceprovider_register", + "community_name": "Community 10" + }, + { + "label": ".boot()", + "file_type": "code", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L24", + "_origin": "ast", + "community": 10, + "norm_label": ".boot()", + "id": "app_providers_appserviceprovider_appserviceprovider_boot", + "community_name": "Community 10" + }, + { + "label": "AirportExists.php", + "file_type": "code", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L1", + "_origin": "ast", + "community": 11, + "norm_label": "airportexists.php", + "id": "app_rules_airportexists", + "community_name": "Community 11" + }, + { + "label": "AirportExists", + "file_type": "code", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L10", + "_origin": "ast", + "community": 11, + "norm_label": "airportexists", + "id": "app_rules_airportexists_airportexists", + "community_name": "Community 11" + }, + { + "label": "ValidationRule", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "validationrule", + "id": "validationrule", + "community_name": "Community 11" + }, + { + "label": ".validate()", + "file_type": "code", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L17", + "_origin": "ast", + "community": 11, + "norm_label": ".validate()", + "id": "app_rules_airportexists_airportexists_validate", + "community_name": "Community 11" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "closure", + "id": "app_rules_airportexists_php_closure", + "community_name": "Community 11" + }, + { + "label": "FlightDirection.php", + "file_type": "code", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L1", + "_origin": "ast", + "community": 11, + "norm_label": "flightdirection.php", + "id": "app_rules_flightdirection", + "community_name": "Community 11" + }, + { + "label": "FlightDirection", + "file_type": "code", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L9", + "_origin": "ast", + "community": 11, + "norm_label": "flightdirection", + "id": "app_rules_flightdirection_flightdirection", + "community_name": "Community 11" + }, + { + "label": ".validate()", + "file_type": "code", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L16", + "_origin": "ast", + "community": 11, + "norm_label": ".validate()", + "id": "app_rules_flightdirection_flightdirection_validate", + "community_name": "Community 11" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "closure", + "id": "app_rules_flightdirection_php_closure", + "community_name": "Community 11" + }, + { + "label": "ValidAircrafts.php", + "file_type": "code", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L1", + "_origin": "ast", + "community": 11, + "norm_label": "validaircrafts.php", + "id": "app_rules_validaircrafts", + "community_name": "Community 11" + }, + { + "label": "ValidAircrafts", + "file_type": "code", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L10", + "_origin": "ast", + "community": 11, + "norm_label": "validaircrafts", + "id": "app_rules_validaircrafts_validaircrafts", + "community_name": "Community 11" + }, + { + "label": ".validate()", + "file_type": "code", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L17", + "_origin": "ast", + "community": 11, + "norm_label": ".validate()", + "id": "app_rules_validaircrafts_validaircrafts_validate", + "community_name": "Community 11" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "closure", + "id": "app_rules_validaircrafts_php_closure", + "community_name": "Community 11" + }, + { + "label": "ValidAirlines.php", + "file_type": "code", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L1", + "_origin": "ast", + "community": 11, + "norm_label": "validairlines.php", + "id": "app_rules_validairlines", + "community_name": "Community 11" + }, + { + "label": "ValidAirlines", + "file_type": "code", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L10", + "_origin": "ast", + "community": 11, + "norm_label": "validairlines", + "id": "app_rules_validairlines_validairlines", + "community_name": "Community 11" + }, + { + "label": ".validate()", + "file_type": "code", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L17", + "_origin": "ast", + "community": 11, + "norm_label": ".validate()", + "id": "app_rules_validairlines_validairlines_validate", + "community_name": "Community 11" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "closure", + "id": "app_rules_validairlines_php_closure", + "community_name": "Community 11" + }, + { + "label": "ValidDestinations.php", + "file_type": "code", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L1", + "_origin": "ast", + "community": 11, + "norm_label": "validdestinations.php", + "id": "app_rules_validdestinations", + "community_name": "Community 11" + }, + { + "label": "ValidDestinations", + "file_type": "code", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L10", + "_origin": "ast", + "community": 11, + "norm_label": "validdestinations", + "id": "app_rules_validdestinations_validdestinations", + "community_name": "Community 11" + }, + { + "label": ".validate()", + "file_type": "code", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L17", + "_origin": "ast", + "community": 11, + "norm_label": ".validate()", + "id": "app_rules_validdestinations_validdestinations_validate", + "community_name": "Community 11" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "closure", + "id": "app_rules_validdestinations_php_closure", + "community_name": "Community 11" + }, + { + "label": "ValidScores.php", + "file_type": "code", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L1", + "_origin": "ast", + "community": 11, + "norm_label": "validscores.php", + "id": "app_rules_validscores", + "community_name": "Community 11" + }, + { + "label": "ValidScores", + "file_type": "code", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L10", + "_origin": "ast", + "community": 11, + "norm_label": "validscores", + "id": "app_rules_validscores_validscores", + "community_name": "Community 11" + }, + { + "label": ".validate()", + "file_type": "code", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L17", + "_origin": "ast", + "community": 11, + "norm_label": ".validate()", + "id": "app_rules_validscores_validscores_validate", + "community_name": "Community 11" + }, + { + "label": "Closure", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 11, + "norm_label": "closure", + "id": "app_rules_validscores_php_closure", + "community_name": "Community 11" + }, + { + "label": "ScoreIcon.php", + "file_type": "code", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L1", + "_origin": "ast", + "community": 3, + "norm_label": "scoreicon.php", + "id": "app_view_components_scoreicon", + "community_name": "Community 3" + }, + { + "label": "ScoreIcon", + "file_type": "code", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L12", + "_origin": "ast", + "community": 3, + "norm_label": "scoreicon", + "id": "app_view_components_scoreicon_scoreicon", + "community_name": "Community 3" + }, + { + "label": "Component", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 3, + "norm_label": "component", + "id": "component", + "community_name": "Community 3" + }, + { + "label": "Collection", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 3, + "norm_label": "collection", + "id": "app_view_components_scoreicon_php_collection", + "community_name": "Community 3" + }, + { + "label": ".__construct()", + "file_type": "code", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L23", + "_origin": "ast", + "community": 3, + "norm_label": ".__construct()", + "id": "app_view_components_scoreicon_scoreicon_construct", + "community_name": "Community 3" + }, + { + "label": ".buildTooltipLines()", + "file_type": "code", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L40", + "_origin": "ast", + "community": 3, + "norm_label": ".buildtooltiplines()", + "id": "app_view_components_scoreicon_scoreicon_buildtooltiplines", + "community_name": "Community 3" + }, + { + "label": ".atcLines()", + "file_type": "code", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L61", + "_origin": "ast", + "community": 3, + "norm_label": ".atclines()", + "id": "app_view_components_scoreicon_scoreicon_atclines", + "community_name": "Community 3" + }, + { + "label": ".render()", + "file_type": "code", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L89", + "_origin": "ast", + "community": 3, + "norm_label": ".render()", + "id": "app_view_components_scoreicon_scoreicon_render", + "community_name": "Community 3" + }, + { + "label": "View", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 3, + "norm_label": "view", + "id": "app_view_components_scoreicon_php_view", + "community_name": "Community 3" + }, + { + "label": "app.php", + "file_type": "code", + "source_file": "bootstrap/app.php", + "source_location": "L1", + "_origin": "ast", + "community": 24, + "norm_label": "app.php", + "id": "bootstrap_app", + "community_name": "Community 24" + }, + { + "label": "packages.php", + "file_type": "code", + "source_file": "bootstrap/cache/packages.php", + "source_location": "L1", + "_origin": "ast", + "community": 136, + "norm_label": "packages.php", + "id": "bootstrap_cache_packages", + "community_name": "Community 136" + }, + { + "label": "services.php", + "file_type": "code", + "source_file": "bootstrap/cache/services.php", + "source_location": "L1", + "_origin": "ast", + "community": 137, + "norm_label": "services.php", + "id": "bootstrap_cache_services", + "community_name": "Community 137" + }, + { + "label": "providers.php", + "file_type": "code", + "source_file": "bootstrap/providers.php", + "source_location": "L1", + "_origin": "ast", + "community": 10, + "norm_label": "providers.php", + "id": "bootstrap_providers", + "community_name": "Community 10" + }, + { + "label": "composer.json", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L1", + "_origin": "ast", + "community": 30, + "norm_label": "composer.json", + "id": "composer", + "community_name": "Community 30" + }, + { + "label": "name", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L2", + "_origin": "ast", + "community": 30, + "norm_label": "name", + "id": "composer_name", + "community_name": "Community 30" + }, + { + "label": "type", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L3", + "_origin": "ast", + "community": 30, + "norm_label": "type", + "id": "composer_type", + "community_name": "Community 30" + }, + { + "label": "description", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L4", + "_origin": "ast", + "community": 30, + "norm_label": "description", + "id": "composer_description", + "community_name": "Community 30" + }, + { + "label": "keywords", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L5", + "_origin": "ast", + "community": 30, + "norm_label": "keywords", + "id": "composer_keywords", + "community_name": "Community 30" + }, + { + "label": "license", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L6", + "_origin": "ast", + "community": 30, + "norm_label": "license", + "id": "composer_license", + "community_name": "Community 30" + }, + { + "label": "require", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L7", + "_origin": "ast", + "community": 23, + "norm_label": "require", + "id": "composer_require", + "community_name": "Community 23" + }, + { + "label": "php", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L8", + "_origin": "ast", + "community": 23, + "norm_label": "php", + "id": "composer_require_php", + "community_name": "Community 23" + }, + { + "label": "graham-campbell/markdown", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L9", + "_origin": "ast", + "community": 23, + "norm_label": "graham-campbell/markdown", + "id": "composer_require_graham_campbell_markdown", + "community_name": "Community 23" + }, + { + "label": "guzzlehttp/guzzle", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L10", + "_origin": "ast", + "community": 23, + "norm_label": "guzzlehttp/guzzle", + "id": "composer_require_guzzlehttp_guzzle", + "community_name": "Community 23" + }, + { + "label": "laravel/framework", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L11", + "_origin": "ast", + "community": 23, + "norm_label": "laravel/framework", + "id": "composer_require_laravel_framework", + "community_name": "Community 23" + }, + { + "label": "laravel/nightwatch", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L12", + "_origin": "ast", + "community": 23, + "norm_label": "laravel/nightwatch", + "id": "composer_require_laravel_nightwatch", + "community_name": "Community 23" + }, + { + "label": "laravel/sanctum", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L13", + "_origin": "ast", + "community": 23, + "norm_label": "laravel/sanctum", + "id": "composer_require_laravel_sanctum", + "community_name": "Community 23" + }, + { + "label": "laravel/tinker", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L14", + "_origin": "ast", + "community": 23, + "norm_label": "laravel/tinker", + "id": "composer_require_laravel_tinker", + "community_name": "Community 23" + }, + { + "label": "laravel/ui", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L15", + "_origin": "ast", + "community": 23, + "norm_label": "laravel/ui", + "id": "composer_require_laravel_ui", + "community_name": "Community 23" + }, + { + "label": "league/flysystem-aws-s3-v3", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L16", + "_origin": "ast", + "community": 23, + "norm_label": "league/flysystem-aws-s3-v3", + "id": "composer_require_league_flysystem_aws_s3_v3", + "community_name": "Community 23" + }, + { + "label": "matanyadaev/laravel-eloquent-spatial", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L17", + "_origin": "ast", + "community": 23, + "norm_label": "matanyadaev/laravel-eloquent-spatial", + "id": "composer_require_matanyadaev_laravel_eloquent_spatial", + "community_name": "Community 23" + }, + { + "label": "mjaschen/phpgeo", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L18", + "_origin": "ast", + "community": 23, + "norm_label": "mjaschen/phpgeo", + "id": "composer_require_mjaschen_phpgeo", + "community_name": "Community 23" + }, + { + "label": "propaganistas/laravel-disposable-email", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L19", + "_origin": "ast", + "community": 23, + "norm_label": "propaganistas/laravel-disposable-email", + "id": "composer_require_propaganistas_laravel_disposable_email", + "community_name": "Community 23" + }, + { + "label": "ryangjchandler/laravel-cloudflare-turnstile", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L20", + "_origin": "ast", + "community": 23, + "norm_label": "ryangjchandler/laravel-cloudflare-turnstile", + "id": "composer_require_ryangjchandler_laravel_cloudflare_turnstile", + "community_name": "Community 23" + }, + { + "label": "sentry/sentry-laravel", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L21", + "_origin": "ast", + "community": 23, + "norm_label": "sentry/sentry-laravel", + "id": "composer_require_sentry_sentry_laravel", + "community_name": "Community 23" + }, + { + "label": "spatie/laravel-backup", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L22", + "_origin": "ast", + "community": 23, + "norm_label": "spatie/laravel-backup", + "id": "composer_require_spatie_laravel_backup", + "community_name": "Community 23" + }, + { + "label": "tightenco/ziggy", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L23", + "_origin": "ast", + "community": 23, + "norm_label": "tightenco/ziggy", + "id": "composer_require_tightenco_ziggy", + "community_name": "Community 23" + }, + { + "label": "require-dev", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L25", + "_origin": "ast", + "community": 31, + "norm_label": "require-dev", + "id": "composer_require_dev", + "community_name": "Community 31" + }, + { + "label": "barryvdh/laravel-debugbar", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L26", + "_origin": "ast", + "community": 31, + "norm_label": "barryvdh/laravel-debugbar", + "id": "composer_require_dev_barryvdh_laravel_debugbar", + "community_name": "Community 31" + }, + { + "label": "fakerphp/faker", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L27", + "_origin": "ast", + "community": 31, + "norm_label": "fakerphp/faker", + "id": "composer_require_dev_fakerphp_faker", + "community_name": "Community 31" + }, + { + "label": "laravel/pint", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L28", + "_origin": "ast", + "community": 31, + "norm_label": "laravel/pint", + "id": "composer_require_dev_laravel_pint", + "community_name": "Community 31" + }, + { + "label": "laravel/sail", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L29", + "_origin": "ast", + "community": 31, + "norm_label": "laravel/sail", + "id": "composer_require_dev_laravel_sail", + "community_name": "Community 31" + }, + { + "label": "mockery/mockery", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L30", + "_origin": "ast", + "community": 31, + "norm_label": "mockery/mockery", + "id": "composer_require_dev_mockery_mockery", + "community_name": "Community 31" + }, + { + "label": "nunomaduro/collision", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L31", + "_origin": "ast", + "community": 31, + "norm_label": "nunomaduro/collision", + "id": "composer_require_dev_nunomaduro_collision", + "community_name": "Community 31" + }, + { + "label": "phpunit/phpunit", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L32", + "_origin": "ast", + "community": 31, + "norm_label": "phpunit/phpunit", + "id": "composer_require_dev_phpunit_phpunit", + "community_name": "Community 31" + }, + { + "label": "spatie/laravel-ignition", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L33", + "_origin": "ast", + "community": 31, + "norm_label": "spatie/laravel-ignition", + "id": "composer_require_dev_spatie_laravel_ignition", + "community_name": "Community 31" + }, + { + "label": "autoload", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L35", + "_origin": "ast", + "community": 37, + "norm_label": "autoload", + "id": "composer_autoload", + "community_name": "Community 37" + }, + { + "label": "psr-4", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L36", + "_origin": "ast", + "community": 37, + "norm_label": "psr-4", + "id": "composer_autoload_psr_4", + "community_name": "Community 37" + }, + { + "label": "App\\\\", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L37", + "_origin": "ast", + "community": 37, + "norm_label": "app\\\\", + "id": "composer_psr_4_app", + "community_name": "Community 37" + }, + { + "label": "Database\\\\Factories\\\\", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L38", + "_origin": "ast", + "community": 37, + "norm_label": "database\\\\factories\\\\", + "id": "composer_psr_4_database_factories", + "community_name": "Community 37" + }, + { + "label": "Database\\\\Seeders\\\\", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L39", + "_origin": "ast", + "community": 37, + "norm_label": "database\\\\seeders\\\\", + "id": "composer_psr_4_database_seeders", + "community_name": "Community 37" + }, + { + "label": "files", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L41", + "_origin": "ast", + "community": 37, + "norm_label": "files", + "id": "composer_autoload_files", + "community_name": "Community 37" + }, + { + "label": "autoload-dev", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L45", + "_origin": "ast", + "community": 30, + "norm_label": "autoload-dev", + "id": "composer_autoload_dev", + "community_name": "Community 30" + }, + { + "label": "psr-4", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L46", + "_origin": "ast", + "community": 30, + "norm_label": "psr-4", + "id": "composer_autoload_dev_psr_4", + "community_name": "Community 30" + }, + { + "label": "Tests\\\\", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L47", + "_origin": "ast", + "community": 30, + "norm_label": "tests\\\\", + "id": "composer_psr_4_tests", + "community_name": "Community 30" + }, + { + "label": "scripts", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L50", + "_origin": "ast", + "community": 38, + "norm_label": "scripts", + "id": "composer_scripts", + "community_name": "Community 38" + }, + { + "label": "post-autoload-dump", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L51", + "_origin": "ast", + "community": 38, + "norm_label": "post-autoload-dump", + "id": "composer_scripts_post_autoload_dump", + "community_name": "Community 38" + }, + { + "label": "post-update-cmd", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L55", + "_origin": "ast", + "community": 38, + "norm_label": "post-update-cmd", + "id": "composer_scripts_post_update_cmd", + "community_name": "Community 38" + }, + { + "label": "post-root-package-install", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L58", + "_origin": "ast", + "community": 38, + "norm_label": "post-root-package-install", + "id": "composer_scripts_post_root_package_install", + "community_name": "Community 38" + }, + { + "label": "post-create-project-cmd", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L61", + "_origin": "ast", + "community": 38, + "norm_label": "post-create-project-cmd", + "id": "composer_scripts_post_create_project_cmd", + "community_name": "Community 38" + }, + { + "label": "extra", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L65", + "_origin": "ast", + "community": 45, + "norm_label": "extra", + "id": "composer_extra", + "community_name": "Community 45" + }, + { + "label": "laravel", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L66", + "_origin": "ast", + "community": 45, + "norm_label": "laravel", + "id": "composer_extra_laravel", + "community_name": "Community 45" + }, + { + "label": "dont-discover", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L67", + "_origin": "ast", + "community": 45, + "norm_label": "dont-discover", + "id": "composer_laravel_dont_discover", + "community_name": "Community 45" + }, + { + "label": "config", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L70", + "_origin": "ast", + "community": 36, + "norm_label": "config", + "id": "composer_config", + "community_name": "Community 36" + }, + { + "label": "optimize-autoloader", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L71", + "_origin": "ast", + "community": 36, + "norm_label": "optimize-autoloader", + "id": "composer_config_optimize_autoloader", + "community_name": "Community 36" + }, + { + "label": "preferred-install", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L72", + "_origin": "ast", + "community": 36, + "norm_label": "preferred-install", + "id": "composer_config_preferred_install", + "community_name": "Community 36" + }, + { + "label": "sort-packages", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L73", + "_origin": "ast", + "community": 36, + "norm_label": "sort-packages", + "id": "composer_config_sort_packages", + "community_name": "Community 36" + }, + { + "label": "allow-plugins", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L74", + "_origin": "ast", + "community": 36, + "norm_label": "allow-plugins", + "id": "composer_config_allow_plugins", + "community_name": "Community 36" + }, + { + "label": "php-http/discovery", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L75", + "_origin": "ast", + "community": 36, + "norm_label": "php-http/discovery", + "id": "composer_allow_plugins_php_http_discovery", + "community_name": "Community 36" + }, + { + "label": "prefer-stable", + "file_type": "code", + "source_file": "composer.json", + "source_location": "L78", + "_origin": "ast", + "community": 30, + "norm_label": "prefer-stable", + "id": "composer_prefer_stable", + "community_name": "Community 30" + }, + { + "label": "app.php", + "file_type": "code", + "source_file": "config/app.php", + "source_location": "L1", + "_origin": "ast", + "community": 138, + "norm_label": "app.php", + "id": "config_app", + "community_name": "Community 138" + }, + { + "label": "auth.php", + "file_type": "code", + "source_file": "config/auth.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "auth.php", + "id": "config_auth", + "community_name": "Community 18" + }, + { + "label": "backup.php", + "file_type": "code", + "source_file": "config/backup.php", + "source_location": "L1", + "_origin": "ast", + "community": 7, + "norm_label": "backup.php", + "id": "config_backup", + "community_name": "Community 7" + }, + { + "label": "broadcasting.php", + "file_type": "code", + "source_file": "config/broadcasting.php", + "source_location": "L1", + "_origin": "ast", + "community": 139, + "norm_label": "broadcasting.php", + "id": "config_broadcasting", + "community_name": "Community 139" + }, + { + "label": "cache.php", + "file_type": "code", + "source_file": "config/cache.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "cache.php", + "id": "config_cache", + "community_name": "Community 14" + }, + { + "label": "cors.php", + "file_type": "code", + "source_file": "config/cors.php", + "source_location": "L1", + "_origin": "ast", + "community": 140, + "norm_label": "cors.php", + "id": "config_cors", + "community_name": "Community 140" + }, + { + "label": "database.php", + "file_type": "code", + "source_file": "config/database.php", + "source_location": "L1", + "_origin": "ast", + "community": 141, + "norm_label": "database.php", + "id": "config_database", + "community_name": "Community 141" + }, + { + "label": "disposable-email.php", + "file_type": "code", + "source_file": "config/disposable-email.php", + "source_location": "L1", + "_origin": "ast", + "community": 142, + "norm_label": "disposable-email.php", + "id": "config_disposable_email", + "community_name": "Community 142" + }, + { + "label": "filesystems.php", + "file_type": "code", + "source_file": "config/filesystems.php", + "source_location": "L1", + "_origin": "ast", + "community": 143, + "norm_label": "filesystems.php", + "id": "config_filesystems", + "community_name": "Community 143" + }, + { + "label": "hashing.php", + "file_type": "code", + "source_file": "config/hashing.php", + "source_location": "L1", + "_origin": "ast", + "community": 144, + "norm_label": "hashing.php", + "id": "config_hashing", + "community_name": "Community 144" + }, + { + "label": "logging.php", + "file_type": "code", + "source_file": "config/logging.php", + "source_location": "L1", + "_origin": "ast", + "community": 145, + "norm_label": "logging.php", + "id": "config_logging", + "community_name": "Community 145" + }, + { + "label": "mail.php", + "file_type": "code", + "source_file": "config/mail.php", + "source_location": "L1", + "_origin": "ast", + "community": 146, + "norm_label": "mail.php", + "id": "config_mail", + "community_name": "Community 146" + }, + { + "label": "queue.php", + "file_type": "code", + "source_file": "config/queue.php", + "source_location": "L1", + "_origin": "ast", + "community": 147, + "norm_label": "queue.php", + "id": "config_queue", + "community_name": "Community 147" + }, + { + "label": "sentry.php", + "file_type": "code", + "source_file": "config/sentry.php", + "source_location": "L1", + "_origin": "ast", + "community": 148, + "norm_label": "sentry.php", + "id": "config_sentry", + "community_name": "Community 148" + }, + { + "label": "services.php", + "file_type": "code", + "source_file": "config/services.php", + "source_location": "L1", + "_origin": "ast", + "community": 149, + "norm_label": "services.php", + "id": "config_services", + "community_name": "Community 149" + }, + { + "label": "session.php", + "file_type": "code", + "source_file": "config/session.php", + "source_location": "L1", + "_origin": "ast", + "community": 150, + "norm_label": "session.php", + "id": "config_session", + "community_name": "Community 150" + }, + { + "label": "umami.php", + "file_type": "code", + "source_file": "config/umami.php", + "source_location": "L1", + "_origin": "ast", + "community": 151, + "norm_label": "umami.php", + "id": "config_umami", + "community_name": "Community 151" + }, + { + "label": "view.php", + "file_type": "code", + "source_file": "config/view.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "view.php", + "id": "config_view", + "community_name": "Community 18" + }, + { + "label": "entrypoint.sh", + "file_type": "code", + "source_file": "container/entrypoint.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "file" + }, + "_origin": "ast", + "community": 114, + "norm_label": "entrypoint.sh", + "id": "container_entrypoint", + "community_name": "Community 114" + }, + { + "label": "entrypoint.sh script", + "file_type": "code", + "source_file": "container/entrypoint.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "bash_entrypoint" + }, + "_origin": "ast", + "community": 114, + "norm_label": "entrypoint.sh script", + "id": "container_entrypoint_sh__entry", + "community_name": "Community 114" + }, + { + "label": "install-npm.sh", + "file_type": "code", + "source_file": "container/install-npm.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "file" + }, + "_origin": "ast", + "community": 115, + "norm_label": "install-npm.sh", + "id": "container_install_npm", + "community_name": "Community 115" + }, + { + "label": "install-npm.sh script", + "file_type": "code", + "source_file": "container/install-npm.sh", + "source_location": "L1", + "metadata": { + "language": "bash", + "kind": "bash_entrypoint" + }, + "_origin": "ast", + "community": 115, + "norm_label": "install-npm.sh script", + "id": "container_install_npm_sh__entry", + "community_name": "Community 115" + }, + { + "label": "AirportFactory.php", + "file_type": "code", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L1", + "_origin": "ast", + "community": 32, + "norm_label": "airportfactory.php", + "id": "database_factories_airportfactory", + "community_name": "Community 32" + }, + { + "label": "AirportFactory", + "file_type": "code", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L13", + "_origin": "ast", + "community": 32, + "norm_label": "airportfactory", + "id": "database_factories_airportfactory_airportfactory", + "community_name": "Community 32" + }, + { + "label": "Factory", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 32, + "norm_label": "factory", + "id": "factory", + "community_name": "Community 32" + }, + { + "label": ".definition()", + "file_type": "code", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L17", + "_origin": "ast", + "community": 32, + "norm_label": ".definition()", + "id": "database_factories_airportfactory_airportfactory_definition", + "community_name": "Community 32" + }, + { + "label": "UserFactory.php", + "file_type": "code", + "source_file": "database/factories/UserFactory.php", + "source_location": "L1", + "_origin": "ast", + "community": 32, + "norm_label": "userfactory.php", + "id": "database_factories_userfactory", + "community_name": "Community 32" + }, + { + "label": "UserFactory", + "file_type": "code", + "source_file": "database/factories/UserFactory.php", + "source_location": "L12", + "_origin": "ast", + "community": 32, + "norm_label": "userfactory", + "id": "database_factories_userfactory_userfactory", + "community_name": "Community 32" + }, + { + "label": ".definition()", + "file_type": "code", + "source_file": "database/factories/UserFactory.php", + "source_location": "L19", + "_origin": "ast", + "community": 32, + "norm_label": ".definition()", + "id": "database_factories_userfactory_userfactory_definition", + "community_name": "Community 32" + }, + { + "label": ".admin()", + "file_type": "code", + "source_file": "database/factories/UserFactory.php", + "source_location": "L31", + "_origin": "ast", + "community": 32, + "norm_label": ".admin()", + "id": "database_factories_userfactory_userfactory_admin", + "community_name": "Community 32" + }, + { + "label": ".unverified()", + "file_type": "code", + "source_file": "database/factories/UserFactory.php", + "source_location": "L43", + "_origin": "ast", + "community": 32, + "norm_label": ".unverified()", + "id": "database_factories_userfactory_userfactory_unverified", + "community_name": "Community 32" + }, + { + "label": "2014_10_12_000000_create_users_table.php", + "file_type": "code", + "source_file": "database/migrations/2014_10_12_000000_create_users_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 46, + "norm_label": "2014_10_12_000000_create_users_table.php", + "id": "database_migrations_2014_10_12_000000_create_users_table", + "community_name": "Community 46" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2014_10_12_000000_create_users_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 46, + "norm_label": "up()", + "id": "database_migrations_2014_10_12_000000_create_users_table_up", + "community_name": "Community 46" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2014_10_12_000000_create_users_table.php", + "source_location": "L32", + "_origin": "ast", + "community": 46, + "norm_label": "down()", + "id": "database_migrations_2014_10_12_000000_create_users_table_down", + "community_name": "Community 46" + }, + { + "label": "2014_10_12_100000_create_password_resets_table.php", + "file_type": "code", + "source_file": "database/migrations/2014_10_12_100000_create_password_resets_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 47, + "norm_label": "2014_10_12_100000_create_password_resets_table.php", + "id": "database_migrations_2014_10_12_100000_create_password_resets_table", + "community_name": "Community 47" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2014_10_12_100000_create_password_resets_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 47, + "norm_label": "up()", + "id": "database_migrations_2014_10_12_100000_create_password_resets_table_up", + "community_name": "Community 47" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2014_10_12_100000_create_password_resets_table.php", + "source_location": "L28", + "_origin": "ast", + "community": 47, + "norm_label": "down()", + "id": "database_migrations_2014_10_12_100000_create_password_resets_table_down", + "community_name": "Community 47" + }, + { + "label": "2019_08_19_000000_create_failed_jobs_table.php", + "file_type": "code", + "source_file": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 48, + "norm_label": "2019_08_19_000000_create_failed_jobs_table.php", + "id": "database_migrations_2019_08_19_000000_create_failed_jobs_table", + "community_name": "Community 48" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 48, + "norm_label": "up()", + "id": "database_migrations_2019_08_19_000000_create_failed_jobs_table_up", + "community_name": "Community 48" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php", + "source_location": "L32", + "_origin": "ast", + "community": 48, + "norm_label": "down()", + "id": "database_migrations_2019_08_19_000000_create_failed_jobs_table_down", + "community_name": "Community 48" + }, + { + "label": "2019_12_14_000001_create_personal_access_tokens_table.php", + "file_type": "code", + "source_file": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 49, + "norm_label": "2019_12_14_000001_create_personal_access_tokens_table.php", + "id": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table", + "community_name": "Community 49" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 49, + "norm_label": "up()", + "id": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table_up", + "community_name": "Community 49" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php", + "source_location": "L32", + "_origin": "ast", + "community": 49, + "norm_label": "down()", + "id": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table_down", + "community_name": "Community 49" + }, + { + "label": "2022_10_01_131313_create_airports.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_131313_create_airports.php", + "source_location": "L1", + "_origin": "ast", + "community": 50, + "norm_label": "2022_10_01_131313_create_airports.php", + "id": "database_migrations_2022_10_01_131313_create_airports", + "community_name": "Community 50" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_131313_create_airports.php", + "source_location": "L14", + "_origin": "ast", + "community": 50, + "norm_label": "up()", + "id": "database_migrations_2022_10_01_131313_create_airports_up", + "community_name": "Community 50" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_131313_create_airports.php", + "source_location": "L40", + "_origin": "ast", + "community": 50, + "norm_label": "down()", + "id": "database_migrations_2022_10_01_131313_create_airports_down", + "community_name": "Community 50" + }, + { + "label": "2022_10_01_135505_create_runways.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_135505_create_runways.php", + "source_location": "L1", + "_origin": "ast", + "community": 51, + "norm_label": "2022_10_01_135505_create_runways.php", + "id": "database_migrations_2022_10_01_135505_create_runways", + "community_name": "Community 51" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_135505_create_runways.php", + "source_location": "L14", + "_origin": "ast", + "community": 51, + "norm_label": "up()", + "id": "database_migrations_2022_10_01_135505_create_runways_up", + "community_name": "Community 51" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_135505_create_runways.php", + "source_location": "L37", + "_origin": "ast", + "community": 51, + "norm_label": "down()", + "id": "database_migrations_2022_10_01_135505_create_runways_down", + "community_name": "Community 51" + }, + { + "label": "2022_10_01_142642_create_metars.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_142642_create_metars.php", + "source_location": "L1", + "_origin": "ast", + "community": 52, + "norm_label": "2022_10_01_142642_create_metars.php", + "id": "database_migrations_2022_10_01_142642_create_metars", + "community_name": "Community 52" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_142642_create_metars.php", + "source_location": "L14", + "_origin": "ast", + "community": 52, + "norm_label": "up()", + "id": "database_migrations_2022_10_01_142642_create_metars_up", + "community_name": "Community 52" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_01_142642_create_metars.php", + "source_location": "L32", + "_origin": "ast", + "community": 52, + "norm_label": "down()", + "id": "database_migrations_2022_10_01_142642_create_metars_down", + "community_name": "Community 52" + }, + { + "label": "2022_10_15_140037_create_airport_points.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_15_140037_create_airport_points.php", + "source_location": "L1", + "_origin": "ast", + "community": 53, + "norm_label": "2022_10_15_140037_create_airport_points.php", + "id": "database_migrations_2022_10_15_140037_create_airport_points", + "community_name": "Community 53" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_15_140037_create_airport_points.php", + "source_location": "L14", + "_origin": "ast", + "community": 53, + "norm_label": "up()", + "id": "database_migrations_2022_10_15_140037_create_airport_points_up", + "community_name": "Community 53" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_15_140037_create_airport_points.php", + "source_location": "L29", + "_origin": "ast", + "community": 53, + "norm_label": "down()", + "id": "database_migrations_2022_10_15_140037_create_airport_points_down", + "community_name": "Community 53" + }, + { + "label": "2022_10_16_111541_create_events.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_16_111541_create_events.php", + "source_location": "L1", + "_origin": "ast", + "community": 54, + "norm_label": "2022_10_16_111541_create_events.php", + "id": "database_migrations_2022_10_16_111541_create_events", + "community_name": "Community 54" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_16_111541_create_events.php", + "source_location": "L14", + "_origin": "ast", + "community": 54, + "norm_label": "up()", + "id": "database_migrations_2022_10_16_111541_create_events_up", + "community_name": "Community 54" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_16_111541_create_events.php", + "source_location": "L30", + "_origin": "ast", + "community": 54, + "norm_label": "down()", + "id": "database_migrations_2022_10_16_111541_create_events_down", + "community_name": "Community 54" + }, + { + "label": "2022_10_16_111912_create_controllers.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_16_111912_create_controllers.php", + "source_location": "L1", + "_origin": "ast", + "community": 55, + "norm_label": "2022_10_16_111912_create_controllers.php", + "id": "database_migrations_2022_10_16_111912_create_controllers", + "community_name": "Community 55" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_16_111912_create_controllers.php", + "source_location": "L14", + "_origin": "ast", + "community": 55, + "norm_label": "up()", + "id": "database_migrations_2022_10_16_111912_create_controllers_up", + "community_name": "Community 55" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_16_111912_create_controllers.php", + "source_location": "L29", + "_origin": "ast", + "community": 55, + "norm_label": "down()", + "id": "database_migrations_2022_10_16_111912_create_controllers_down", + "community_name": "Community 55" + }, + { + "label": "2022_10_30_214209_add_data_airport_scores.php", + "file_type": "code", + "source_file": "database/migrations/2022_10_30_214209_add_data_airport_scores.php", + "source_location": "L1", + "_origin": "ast", + "community": 56, + "norm_label": "2022_10_30_214209_add_data_airport_scores.php", + "id": "database_migrations_2022_10_30_214209_add_data_airport_scores", + "community_name": "Community 56" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_10_30_214209_add_data_airport_scores.php", + "source_location": "L14", + "_origin": "ast", + "community": 56, + "norm_label": "up()", + "id": "database_migrations_2022_10_30_214209_add_data_airport_scores_up", + "community_name": "Community 56" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_10_30_214209_add_data_airport_scores.php", + "source_location": "L26", + "_origin": "ast", + "community": 56, + "norm_label": "down()", + "id": "database_migrations_2022_10_30_214209_add_data_airport_scores_down", + "community_name": "Community 56" + }, + { + "label": "2022_11_01_211600_remove_total_score_column.php", + "file_type": "code", + "source_file": "database/migrations/2022_11_01_211600_remove_total_score_column.php", + "source_location": "L1", + "_origin": "ast", + "community": 57, + "norm_label": "2022_11_01_211600_remove_total_score_column.php", + "id": "database_migrations_2022_11_01_211600_remove_total_score_column", + "community_name": "Community 57" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2022_11_01_211600_remove_total_score_column.php", + "source_location": "L14", + "_origin": "ast", + "community": 57, + "norm_label": "up()", + "id": "database_migrations_2022_11_01_211600_remove_total_score_column_up", + "community_name": "Community 57" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2022_11_01_211600_remove_total_score_column.php", + "source_location": "L26", + "_origin": "ast", + "community": 57, + "norm_label": "down()", + "id": "database_migrations_2022_11_01_211600_remove_total_score_column_down", + "community_name": "Community 57" + }, + { + "label": "2023_07_24_075209_create_api_keys_table.php", + "file_type": "code", + "source_file": "database/migrations/2023_07_24_075209_create_api_keys_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 58, + "norm_label": "2023_07_24_075209_create_api_keys_table.php", + "id": "database_migrations_2023_07_24_075209_create_api_keys_table", + "community_name": "Community 58" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2023_07_24_075209_create_api_keys_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 58, + "norm_label": "up()", + "id": "database_migrations_2023_07_24_075209_create_api_keys_table_up", + "community_name": "Community 58" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2023_07_24_075209_create_api_keys_table.php", + "source_location": "L32", + "_origin": "ast", + "community": 58, + "norm_label": "down()", + "id": "database_migrations_2023_07_24_075209_create_api_keys_table_down", + "community_name": "Community 58" + }, + { + "label": "2023_07_29_103301_add_airbase_airline_boolean.php", + "file_type": "code", + "source_file": "database/migrations/2023_07_29_103301_add_airbase_airline_boolean.php", + "source_location": "L1", + "_origin": "ast", + "community": 59, + "norm_label": "2023_07_29_103301_add_airbase_airline_boolean.php", + "id": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean", + "community_name": "Community 59" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2023_07_29_103301_add_airbase_airline_boolean.php", + "source_location": "L14", + "_origin": "ast", + "community": 59, + "norm_label": "up()", + "id": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean_up", + "community_name": "Community 59" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2023_07_29_103301_add_airbase_airline_boolean.php", + "source_location": "L28", + "_origin": "ast", + "community": 59, + "norm_label": "down()", + "id": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean_down", + "community_name": "Community 59" + }, + { + "label": "2023_07_29_124150_create_api_logs_table.php", + "file_type": "code", + "source_file": "database/migrations/2023_07_29_124150_create_api_logs_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 60, + "norm_label": "2023_07_29_124150_create_api_logs_table.php", + "id": "database_migrations_2023_07_29_124150_create_api_logs_table", + "community_name": "Community 60" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2023_07_29_124150_create_api_logs_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 60, + "norm_label": "up()", + "id": "database_migrations_2023_07_29_124150_create_api_logs_table_up", + "community_name": "Community 60" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2023_07_29_124150_create_api_logs_table.php", + "source_location": "L30", + "_origin": "ast", + "community": 60, + "norm_label": "down()", + "id": "database_migrations_2023_07_29_124150_create_api_logs_table_down", + "community_name": "Community 60" + }, + { + "label": "2023_08_13_093925_create_flights_table.php", + "file_type": "code", + "source_file": "database/migrations/2023_08_13_093925_create_flights_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 61, + "norm_label": "2023_08_13_093925_create_flights_table.php", + "id": "database_migrations_2023_08_13_093925_create_flights_table", + "community_name": "Community 61" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2023_08_13_093925_create_flights_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 61, + "norm_label": "up()", + "id": "database_migrations_2023_08_13_093925_create_flights_table_up", + "community_name": "Community 61" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2023_08_13_093925_create_flights_table.php", + "source_location": "L50", + "_origin": "ast", + "community": 61, + "norm_label": "down()", + "id": "database_migrations_2023_08_13_093925_create_flights_table_down", + "community_name": "Community 61" + }, + { + "label": "2023_08_20_100237_create_airlines_table.php", + "file_type": "code", + "source_file": "database/migrations/2023_08_20_100237_create_airlines_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 62, + "norm_label": "2023_08_20_100237_create_airlines_table.php", + "id": "database_migrations_2023_08_20_100237_create_airlines_table", + "community_name": "Community 62" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2023_08_20_100237_create_airlines_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 62, + "norm_label": "up()", + "id": "database_migrations_2023_08_20_100237_create_airlines_table_up", + "community_name": "Community 62" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2023_08_20_100237_create_airlines_table.php", + "source_location": "L29", + "_origin": "ast", + "community": 62, + "norm_label": "down()", + "id": "database_migrations_2023_08_20_100237_create_airlines_table_down", + "community_name": "Community 62" + }, + { + "label": "2024_01_13_152706_create_flight_aircrafts_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_01_13_152706_create_flight_aircrafts_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 63, + "norm_label": "2024_01_13_152706_create_flight_aircrafts_table.php", + "id": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table", + "community_name": "Community 63" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_01_13_152706_create_flight_aircrafts_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 63, + "norm_label": "up()", + "id": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table_up", + "community_name": "Community 63" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_01_13_152706_create_flight_aircrafts_table.php", + "source_location": "L35", + "_origin": "ast", + "community": 63, + "norm_label": "down()", + "id": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table_down", + "community_name": "Community 63" + }, + { + "label": "2024_01_14_104204_move_aircraft_icao.php", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_104204_move_aircraft_icao.php", + "source_location": "L1", + "_origin": "ast", + "community": 64, + "norm_label": "2024_01_14_104204_move_aircraft_icao.php", + "id": "database_migrations_2024_01_14_104204_move_aircraft_icao", + "community_name": "Community 64" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_104204_move_aircraft_icao.php", + "source_location": "L12", + "_origin": "ast", + "community": 64, + "norm_label": "up()", + "id": "database_migrations_2024_01_14_104204_move_aircraft_icao_up", + "community_name": "Community 64" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_104204_move_aircraft_icao.php", + "source_location": "L37", + "_origin": "ast", + "community": 64, + "norm_label": "down()", + "id": "database_migrations_2024_01_14_104204_move_aircraft_icao_down", + "community_name": "Community 64" + }, + { + "label": "2024_01_14_111020_rename_aircraft_icao_column.php", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_111020_rename_aircraft_icao_column.php", + "source_location": "L1", + "_origin": "ast", + "community": 65, + "norm_label": "2024_01_14_111020_rename_aircraft_icao_column.php", + "id": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column", + "community_name": "Community 65" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_111020_rename_aircraft_icao_column.php", + "source_location": "L14", + "_origin": "ast", + "community": 65, + "norm_label": "up()", + "id": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column_up", + "community_name": "Community 65" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_111020_rename_aircraft_icao_column.php", + "source_location": "L26", + "_origin": "ast", + "community": 65, + "norm_label": "down()", + "id": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column_down", + "community_name": "Community 65" + }, + { + "label": "2024_01_14_114906_add_airline_flight_counter_column.php", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_114906_add_airline_flight_counter_column.php", + "source_location": "L1", + "_origin": "ast", + "community": 66, + "norm_label": "2024_01_14_114906_add_airline_flight_counter_column.php", + "id": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column", + "community_name": "Community 66" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_114906_add_airline_flight_counter_column.php", + "source_location": "L14", + "_origin": "ast", + "community": 66, + "norm_label": "up()", + "id": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column_up", + "community_name": "Community 66" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_01_14_114906_add_airline_flight_counter_column.php", + "source_location": "L26", + "_origin": "ast", + "community": 66, + "norm_label": "down()", + "id": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column_down", + "community_name": "Community 66" + }, + { + "label": "2024_03_17_205614_add_aircraft_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_205614_add_aircraft_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 67, + "norm_label": "2024_03_17_205614_add_aircraft_table.php", + "id": "database_migrations_2024_03_17_205614_add_aircraft_table", + "community_name": "Community 67" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_205614_add_aircraft_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 67, + "norm_label": "up()", + "id": "database_migrations_2024_03_17_205614_add_aircraft_table_up", + "community_name": "Community 67" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_205614_add_aircraft_table.php", + "source_location": "L29", + "_origin": "ast", + "community": 67, + "norm_label": "down()", + "id": "database_migrations_2024_03_17_205614_add_aircraft_table_down", + "community_name": "Community 67" + }, + { + "label": "2024_03_17_210345_add_aircraft_to_new_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 33, + "norm_label": "2024_03_17_210345_add_aircraft_to_new_table.php", + "id": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table", + "community_name": "Community 33" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L13", + "_origin": "ast", + "community": 33, + "norm_label": "up()", + "id": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table_up", + "community_name": "Community 33" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L33", + "_origin": "ast", + "community": 33, + "norm_label": "down()", + "id": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table_down", + "community_name": "Community 33" + }, + { + "label": "2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 68, + "norm_label": "2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "id": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table", + "community_name": "Community 68" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "source_location": "L14", + "_origin": "ast", + "community": 68, + "norm_label": "up()", + "id": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table_up", + "community_name": "Community 68" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "source_location": "L39", + "_origin": "ast", + "community": 68, + "norm_label": "down()", + "id": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table_down", + "community_name": "Community 68" + }, + { + "label": "2024_07_22_072158_add_geospacial_airport_coordinates.php", + "file_type": "code", + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L1", + "_origin": "ast", + "community": 69, + "norm_label": "2024_07_22_072158_add_geospacial_airport_coordinates.php", + "id": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates", + "community_name": "Community 69" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L17", + "_origin": "ast", + "community": 69, + "norm_label": "up()", + "id": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates_up", + "community_name": "Community 69" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L46", + "_origin": "ast", + "community": 69, + "norm_label": "down()", + "id": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates_down", + "community_name": "Community 69" + }, + { + "label": "2024_08_16_200001_new_users_fields.php", + "file_type": "code", + "source_file": "database/migrations/2024_08_16_200001_new_users_fields.php", + "source_location": "L1", + "_origin": "ast", + "community": 70, + "norm_label": "2024_08_16_200001_new_users_fields.php", + "id": "database_migrations_2024_08_16_200001_new_users_fields", + "community_name": "Community 70" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_08_16_200001_new_users_fields.php", + "source_location": "L12", + "_origin": "ast", + "community": 70, + "norm_label": "up()", + "id": "database_migrations_2024_08_16_200001_new_users_fields_up", + "community_name": "Community 70" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_08_16_200001_new_users_fields.php", + "source_location": "L26", + "_origin": "ast", + "community": 70, + "norm_label": "down()", + "id": "database_migrations_2024_08_16_200001_new_users_fields_down", + "community_name": "Community 70" + }, + { + "label": "2024_08_19_194615_create_simulators.php", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_194615_create_simulators.php", + "source_location": "L1", + "_origin": "ast", + "community": 71, + "norm_label": "2024_08_19_194615_create_simulators.php", + "id": "database_migrations_2024_08_19_194615_create_simulators", + "community_name": "Community 71" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_194615_create_simulators.php", + "source_location": "L12", + "_origin": "ast", + "community": 71, + "norm_label": "up()", + "id": "database_migrations_2024_08_19_194615_create_simulators_up", + "community_name": "Community 71" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_194615_create_simulators.php", + "source_location": "L38", + "_origin": "ast", + "community": 71, + "norm_label": "down()", + "id": "database_migrations_2024_08_19_194615_create_simulators_down", + "community_name": "Community 71" + }, + { + "label": "2024_08_19_195929_create_user_lists.php", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_195929_create_user_lists.php", + "source_location": "L1", + "_origin": "ast", + "community": 72, + "norm_label": "2024_08_19_195929_create_user_lists.php", + "id": "database_migrations_2024_08_19_195929_create_user_lists", + "community_name": "Community 72" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_195929_create_user_lists.php", + "source_location": "L12", + "_origin": "ast", + "community": 72, + "norm_label": "up()", + "id": "database_migrations_2024_08_19_195929_create_user_lists_up", + "community_name": "Community 72" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_195929_create_user_lists.php", + "source_location": "L28", + "_origin": "ast", + "community": 72, + "norm_label": "down()", + "id": "database_migrations_2024_08_19_195929_create_user_lists_down", + "community_name": "Community 72" + }, + { + "label": "2024_08_19_201759_create_airport_user_list_pivot.php", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_201759_create_airport_user_list_pivot.php", + "source_location": "L1", + "_origin": "ast", + "community": 73, + "norm_label": "2024_08_19_201759_create_airport_user_list_pivot.php", + "id": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot", + "community_name": "Community 73" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_201759_create_airport_user_list_pivot.php", + "source_location": "L12", + "_origin": "ast", + "community": 73, + "norm_label": "up()", + "id": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot_up", + "community_name": "Community 73" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_08_19_201759_create_airport_user_list_pivot.php", + "source_location": "L24", + "_origin": "ast", + "community": 73, + "norm_label": "down()", + "id": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot_down", + "community_name": "Community 73" + }, + { + "label": "2024_08_24_170220_create_scenery_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_08_24_170220_create_scenery_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 74, + "norm_label": "2024_08_24_170220_create_scenery_table.php", + "id": "database_migrations_2024_08_24_170220_create_scenery_table", + "community_name": "Community 74" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_08_24_170220_create_scenery_table.php", + "source_location": "L12", + "_origin": "ast", + "community": 74, + "norm_label": "up()", + "id": "database_migrations_2024_08_24_170220_create_scenery_table_up", + "community_name": "Community 74" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_08_24_170220_create_scenery_table.php", + "source_location": "L31", + "_origin": "ast", + "community": 74, + "norm_label": "down()", + "id": "database_migrations_2024_08_24_170220_create_scenery_table_down", + "community_name": "Community 74" + }, + { + "label": "2024_09_29_110835_create_sceneries_simulators_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_09_29_110835_create_sceneries_simulators_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 75, + "norm_label": "2024_09_29_110835_create_sceneries_simulators_table.php", + "id": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table", + "community_name": "Community 75" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_09_29_110835_create_sceneries_simulators_table.php", + "source_location": "L12", + "_origin": "ast", + "community": 75, + "norm_label": "up()", + "id": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table_up", + "community_name": "Community 75" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_09_29_110835_create_sceneries_simulators_table.php", + "source_location": "L23", + "_origin": "ast", + "community": 75, + "norm_label": "down()", + "id": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table_down", + "community_name": "Community 75" + }, + { + "label": "2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 22, + "norm_label": "2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "id": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table", + "community_name": "Community 22" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L13", + "_origin": "ast", + "community": 22, + "norm_label": "up()", + "id": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table_up", + "community_name": "Community 22" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L29", + "_origin": "ast", + "community": 22, + "norm_label": "down()", + "id": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table_down", + "community_name": "Community 22" + }, + { + "label": "2024_11_03_090929_add_hidden_column_to_lists.php", + "file_type": "code", + "source_file": "database/migrations/2024_11_03_090929_add_hidden_column_to_lists.php", + "source_location": "L1", + "_origin": "ast", + "community": 76, + "norm_label": "2024_11_03_090929_add_hidden_column_to_lists.php", + "id": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists", + "community_name": "Community 76" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_11_03_090929_add_hidden_column_to_lists.php", + "source_location": "L12", + "_origin": "ast", + "community": 76, + "norm_label": "up()", + "id": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists_up", + "community_name": "Community 76" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_11_03_090929_add_hidden_column_to_lists.php", + "source_location": "L22", + "_origin": "ast", + "community": 76, + "norm_label": "down()", + "id": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists_down", + "community_name": "Community 76" + }, + { + "label": "2024_11_17_085152_index_flights_table.php", + "file_type": "code", + "source_file": "database/migrations/2024_11_17_085152_index_flights_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 77, + "norm_label": "2024_11_17_085152_index_flights_table.php", + "id": "database_migrations_2024_11_17_085152_index_flights_table", + "community_name": "Community 77" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_11_17_085152_index_flights_table.php", + "source_location": "L12", + "_origin": "ast", + "community": 77, + "norm_label": "up()", + "id": "database_migrations_2024_11_17_085152_index_flights_table_up", + "community_name": "Community 77" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_11_17_085152_index_flights_table.php", + "source_location": "L27", + "_origin": "ast", + "community": 77, + "norm_label": "down()", + "id": "database_migrations_2024_11_17_085152_index_flights_table_down", + "community_name": "Community 77" + }, + { + "label": "2024_11_30_135220_add_msfs2024_support.php", + "file_type": "code", + "source_file": "database/migrations/2024_11_30_135220_add_msfs2024_support.php", + "source_location": "L1", + "_origin": "ast", + "community": 78, + "norm_label": "2024_11_30_135220_add_msfs2024_support.php", + "id": "database_migrations_2024_11_30_135220_add_msfs2024_support", + "community_name": "Community 78" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_11_30_135220_add_msfs2024_support.php", + "source_location": "L13", + "_origin": "ast", + "community": 78, + "norm_label": "up()", + "id": "database_migrations_2024_11_30_135220_add_msfs2024_support_up", + "community_name": "Community 78" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_11_30_135220_add_msfs2024_support.php", + "source_location": "L42", + "_origin": "ast", + "community": 78, + "norm_label": "down()", + "id": "database_migrations_2024_11_30_135220_add_msfs2024_support_down", + "community_name": "Community 78" + }, + { + "label": "2024_12_21_160704_add_temperature_to_metars.php", + "file_type": "code", + "source_file": "database/migrations/2024_12_21_160704_add_temperature_to_metars.php", + "source_location": "L1", + "_origin": "ast", + "community": 79, + "norm_label": "2024_12_21_160704_add_temperature_to_metars.php", + "id": "database_migrations_2024_12_21_160704_add_temperature_to_metars", + "community_name": "Community 79" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2024_12_21_160704_add_temperature_to_metars.php", + "source_location": "L12", + "_origin": "ast", + "community": 79, + "norm_label": "up()", + "id": "database_migrations_2024_12_21_160704_add_temperature_to_metars_up", + "community_name": "Community 79" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2024_12_21_160704_add_temperature_to_metars.php", + "source_location": "L22", + "_origin": "ast", + "community": 79, + "norm_label": "down()", + "id": "database_migrations_2024_12_21_160704_add_temperature_to_metars_down", + "community_name": "Community 79" + }, + { + "label": "2025_01_31_200732_add_new_scenery_sim_pivots.php", + "file_type": "code", + "source_file": "database/migrations/2025_01_31_200732_add_new_scenery_sim_pivots.php", + "source_location": "L1", + "_origin": "ast", + "community": 80, + "norm_label": "2025_01_31_200732_add_new_scenery_sim_pivots.php", + "id": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots", + "community_name": "Community 80" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_01_31_200732_add_new_scenery_sim_pivots.php", + "source_location": "L12", + "_origin": "ast", + "community": 80, + "norm_label": "up()", + "id": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots_up", + "community_name": "Community 80" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_01_31_200732_add_new_scenery_sim_pivots.php", + "source_location": "L27", + "_origin": "ast", + "community": 80, + "norm_label": "down()", + "id": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots_down", + "community_name": "Community 80" + }, + { + "label": "2025_02_01_073332_rename_author_to_developer.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_073332_rename_author_to_developer.php", + "source_location": "L1", + "_origin": "ast", + "community": 81, + "norm_label": "2025_02_01_073332_rename_author_to_developer.php", + "id": "database_migrations_2025_02_01_073332_rename_author_to_developer", + "community_name": "Community 81" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_073332_rename_author_to_developer.php", + "source_location": "L12", + "_origin": "ast", + "community": 81, + "norm_label": "up()", + "id": "database_migrations_2025_02_01_073332_rename_author_to_developer_up", + "community_name": "Community 81" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_073332_rename_author_to_developer.php", + "source_location": "L22", + "_origin": "ast", + "community": 81, + "norm_label": "down()", + "id": "database_migrations_2025_02_01_073332_rename_author_to_developer_down", + "community_name": "Community 81" + }, + { + "label": "2025_02_01_085034_pivot_unique.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085034_pivot_unique.php", + "source_location": "L1", + "_origin": "ast", + "community": 82, + "norm_label": "2025_02_01_085034_pivot_unique.php", + "id": "database_migrations_2025_02_01_085034_pivot_unique", + "community_name": "Community 82" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085034_pivot_unique.php", + "source_location": "L12", + "_origin": "ast", + "community": 82, + "norm_label": "up()", + "id": "database_migrations_2025_02_01_085034_pivot_unique_up", + "community_name": "Community 82" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085034_pivot_unique.php", + "source_location": "L22", + "_origin": "ast", + "community": 82, + "norm_label": "down()", + "id": "database_migrations_2025_02_01_085034_pivot_unique_down", + "community_name": "Community 82" + }, + { + "label": "2025_02_01_085035_transfer_sceneries_to_pivot.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L1", + "_origin": "ast", + "community": 22, + "norm_label": "2025_02_01_085035_transfer_sceneries_to_pivot.php", + "id": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot", + "community_name": "Community 22" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L12", + "_origin": "ast", + "community": 22, + "norm_label": "up()", + "id": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot_up", + "community_name": "Community 22" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L66", + "_origin": "ast", + "community": 22, + "norm_label": "down()", + "id": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot_down", + "community_name": "Community 22" + }, + { + "label": "2025_02_01_085036_cleanup_scenery_columns.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085036_cleanup_scenery_columns.php", + "source_location": "L1", + "_origin": "ast", + "community": 83, + "norm_label": "2025_02_01_085036_cleanup_scenery_columns.php", + "id": "database_migrations_2025_02_01_085036_cleanup_scenery_columns", + "community_name": "Community 83" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085036_cleanup_scenery_columns.php", + "source_location": "L12", + "_origin": "ast", + "community": 83, + "norm_label": "up()", + "id": "database_migrations_2025_02_01_085036_cleanup_scenery_columns_up", + "community_name": "Community 83" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_01_085036_cleanup_scenery_columns.php", + "source_location": "L26", + "_origin": "ast", + "community": 83, + "norm_label": "down()", + "id": "database_migrations_2025_02_01_085036_cleanup_scenery_columns_down", + "community_name": "Community 83" + }, + { + "label": "2025_02_02_094303_remove_unique_in_scener_simulators.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php", + "source_location": "L1", + "_origin": "ast", + "community": 84, + "norm_label": "2025_02_02_094303_remove_unique_in_scener_simulators.php", + "id": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators", + "community_name": "Community 84" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php", + "source_location": "L12", + "_origin": "ast", + "community": 84, + "norm_label": "up()", + "id": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators_up", + "community_name": "Community 84" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php", + "source_location": "L26", + "_origin": "ast", + "community": 84, + "norm_label": "down()", + "id": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators_down", + "community_name": "Community 84" + }, + { + "label": "2025_02_02_094304_rename_sceneries_to_developers.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_094304_rename_sceneries_to_developers.php", + "source_location": "L1", + "_origin": "ast", + "community": 85, + "norm_label": "2025_02_02_094304_rename_sceneries_to_developers.php", + "id": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers", + "community_name": "Community 85" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_094304_rename_sceneries_to_developers.php", + "source_location": "L12", + "_origin": "ast", + "community": 85, + "norm_label": "up()", + "id": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers_up", + "community_name": "Community 85" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_094304_rename_sceneries_to_developers.php", + "source_location": "L23", + "_origin": "ast", + "community": 85, + "norm_label": "down()", + "id": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers_down", + "community_name": "Community 85" + }, + { + "label": "2025_02_02_100140_move_scenery_sims_to_own_model.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_100140_move_scenery_sims_to_own_model.php", + "source_location": "L1", + "_origin": "ast", + "community": 86, + "norm_label": "2025_02_02_100140_move_scenery_sims_to_own_model.php", + "id": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model", + "community_name": "Community 86" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_100140_move_scenery_sims_to_own_model.php", + "source_location": "L12", + "_origin": "ast", + "community": 86, + "norm_label": "up()", + "id": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model_up", + "community_name": "Community 86" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_100140_move_scenery_sims_to_own_model.php", + "source_location": "L23", + "_origin": "ast", + "community": 86, + "norm_label": "down()", + "id": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model_down", + "community_name": "Community 86" + }, + { + "label": "2025_02_02_101402_rename_scenery_id_to_developer.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_101402_rename_scenery_id_to_developer.php", + "source_location": "L1", + "_origin": "ast", + "community": 87, + "norm_label": "2025_02_02_101402_rename_scenery_id_to_developer.php", + "id": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer", + "community_name": "Community 87" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_101402_rename_scenery_id_to_developer.php", + "source_location": "L12", + "_origin": "ast", + "community": 87, + "norm_label": "up()", + "id": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer_up", + "community_name": "Community 87" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_101402_rename_scenery_id_to_developer.php", + "source_location": "L22", + "_origin": "ast", + "community": 87, + "norm_label": "down()", + "id": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer_down", + "community_name": "Community 87" + }, + { + "label": "2025_02_02_111315_add_source_reference_id.php", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_111315_add_source_reference_id.php", + "source_location": "L1", + "_origin": "ast", + "community": 88, + "norm_label": "2025_02_02_111315_add_source_reference_id.php", + "id": "database_migrations_2025_02_02_111315_add_source_reference_id", + "community_name": "Community 88" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_111315_add_source_reference_id.php", + "source_location": "L12", + "_origin": "ast", + "community": 88, + "norm_label": "up()", + "id": "database_migrations_2025_02_02_111315_add_source_reference_id_up", + "community_name": "Community 88" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_02_02_111315_add_source_reference_id.php", + "source_location": "L22", + "_origin": "ast", + "community": 88, + "norm_label": "down()", + "id": "database_migrations_2025_02_02_111315_add_source_reference_id_down", + "community_name": "Community 88" + }, + { + "label": "2025_04_20_085806_add_w2f_runway_column.php", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_085806_add_w2f_runway_column.php", + "source_location": "L1", + "_origin": "ast", + "community": 89, + "norm_label": "2025_04_20_085806_add_w2f_runway_column.php", + "id": "database_migrations_2025_04_20_085806_add_w2f_runway_column", + "community_name": "Community 89" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_085806_add_w2f_runway_column.php", + "source_location": "L12", + "_origin": "ast", + "community": 89, + "norm_label": "up()", + "id": "database_migrations_2025_04_20_085806_add_w2f_runway_column_up", + "community_name": "Community 89" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_085806_add_w2f_runway_column.php", + "source_location": "L22", + "_origin": "ast", + "community": 89, + "norm_label": "down()", + "id": "database_migrations_2025_04_20_085806_add_w2f_runway_column_down", + "community_name": "Community 89" + }, + { + "label": "2025_04_20_091731_index_runways.php", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_091731_index_runways.php", + "source_location": "L1", + "_origin": "ast", + "community": 90, + "norm_label": "2025_04_20_091731_index_runways.php", + "id": "database_migrations_2025_04_20_091731_index_runways", + "community_name": "Community 90" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_091731_index_runways.php", + "source_location": "L12", + "_origin": "ast", + "community": 90, + "norm_label": "up()", + "id": "database_migrations_2025_04_20_091731_index_runways_up", + "community_name": "Community 90" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_091731_index_runways.php", + "source_location": "L22", + "_origin": "ast", + "community": 90, + "norm_label": "down()", + "id": "database_migrations_2025_04_20_091731_index_runways_down", + "community_name": "Community 90" + }, + { + "label": "2025_04_20_091732_index_scores.php", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_091732_index_scores.php", + "source_location": "L1", + "_origin": "ast", + "community": 91, + "norm_label": "2025_04_20_091732_index_scores.php", + "id": "database_migrations_2025_04_20_091732_index_scores", + "community_name": "Community 91" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_091732_index_scores.php", + "source_location": "L12", + "_origin": "ast", + "community": 91, + "norm_label": "up()", + "id": "database_migrations_2025_04_20_091732_index_scores_up", + "community_name": "Community 91" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_091732_index_scores.php", + "source_location": "L22", + "_origin": "ast", + "community": 91, + "norm_label": "down()", + "id": "database_migrations_2025_04_20_091732_index_scores_down", + "community_name": "Community 91" + }, + { + "label": "2025_04_20_102726_index_flights.php", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_102726_index_flights.php", + "source_location": "L1", + "_origin": "ast", + "community": 92, + "norm_label": "2025_04_20_102726_index_flights.php", + "id": "database_migrations_2025_04_20_102726_index_flights", + "community_name": "Community 92" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_102726_index_flights.php", + "source_location": "L12", + "_origin": "ast", + "community": 92, + "norm_label": "up()", + "id": "database_migrations_2025_04_20_102726_index_flights_up", + "community_name": "Community 92" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2025_04_20_102726_index_flights.php", + "source_location": "L22", + "_origin": "ast", + "community": 92, + "norm_label": "down()", + "id": "database_migrations_2025_04_20_102726_index_flights_down", + "community_name": "Community 92" + }, + { + "label": "2026_03_15_154239_add_endpoint_to_api_logs.php", + "file_type": "code", + "source_file": "database/migrations/2026_03_15_154239_add_endpoint_to_api_logs.php", + "source_location": "L1", + "_origin": "ast", + "community": 93, + "norm_label": "2026_03_15_154239_add_endpoint_to_api_logs.php", + "id": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs", + "community_name": "Community 93" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_03_15_154239_add_endpoint_to_api_logs.php", + "source_location": "L12", + "_origin": "ast", + "community": 93, + "norm_label": "up()", + "id": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs_up", + "community_name": "Community 93" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_03_15_154239_add_endpoint_to_api_logs.php", + "source_location": "L22", + "_origin": "ast", + "community": 93, + "norm_label": "down()", + "id": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs_down", + "community_name": "Community 93" + }, + { + "label": "2026_04_05_070653_add_feedback_votes_table.php", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_070653_add_feedback_votes_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 94, + "norm_label": "2026_04_05_070653_add_feedback_votes_table.php", + "id": "database_migrations_2026_04_05_070653_add_feedback_votes_table", + "community_name": "Community 94" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_070653_add_feedback_votes_table.php", + "source_location": "L12", + "_origin": "ast", + "community": 94, + "norm_label": "up()", + "id": "database_migrations_2026_04_05_070653_add_feedback_votes_table_up", + "community_name": "Community 94" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_070653_add_feedback_votes_table.php", + "source_location": "L26", + "_origin": "ast", + "community": 94, + "norm_label": "down()", + "id": "database_migrations_2026_04_05_070653_add_feedback_votes_table_down", + "community_name": "Community 94" + }, + { + "label": "2026_04_05_134527_create_cache_table.php", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_134527_create_cache_table.php", + "source_location": "L1", + "_origin": "ast", + "community": 95, + "norm_label": "2026_04_05_134527_create_cache_table.php", + "id": "database_migrations_2026_04_05_134527_create_cache_table", + "community_name": "Community 95" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_134527_create_cache_table.php", + "source_location": "L12", + "_origin": "ast", + "community": 95, + "norm_label": "up()", + "id": "database_migrations_2026_04_05_134527_create_cache_table_up", + "community_name": "Community 95" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_134527_create_cache_table.php", + "source_location": "L30", + "_origin": "ast", + "community": 95, + "norm_label": "down()", + "id": "database_migrations_2026_04_05_134527_create_cache_table_down", + "community_name": "Community 95" + }, + { + "label": "2026_04_05_134735_add_feedback_last_read.php", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_134735_add_feedback_last_read.php", + "source_location": "L1", + "_origin": "ast", + "community": 96, + "norm_label": "2026_04_05_134735_add_feedback_last_read.php", + "id": "database_migrations_2026_04_05_134735_add_feedback_last_read", + "community_name": "Community 96" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_134735_add_feedback_last_read.php", + "source_location": "L12", + "_origin": "ast", + "community": 96, + "norm_label": "up()", + "id": "database_migrations_2026_04_05_134735_add_feedback_last_read_up", + "community_name": "Community 96" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_04_05_134735_add_feedback_last_read.php", + "source_location": "L22", + "_origin": "ast", + "community": 96, + "norm_label": "down()", + "id": "database_migrations_2026_04_05_134735_add_feedback_last_read_down", + "community_name": "Community 96" + }, + { + "label": "2026_07_03_100000_create_tafs.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100000_create_tafs.php", + "source_location": "L1", + "_origin": "ast", + "community": 97, + "norm_label": "2026_07_03_100000_create_tafs.php", + "id": "database_migrations_2026_07_03_100000_create_tafs", + "community_name": "Community 97" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100000_create_tafs.php", + "source_location": "L12", + "_origin": "ast", + "community": 97, + "norm_label": "up()", + "id": "database_migrations_2026_07_03_100000_create_tafs_up", + "community_name": "Community 97" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100000_create_tafs.php", + "source_location": "L29", + "_origin": "ast", + "community": 97, + "norm_label": "down()", + "id": "database_migrations_2026_07_03_100000_create_tafs_down", + "community_name": "Community 97" + }, + { + "label": "2026_07_03_100001_create_bookings.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100001_create_bookings.php", + "source_location": "L1", + "_origin": "ast", + "community": 98, + "norm_label": "2026_07_03_100001_create_bookings.php", + "id": "database_migrations_2026_07_03_100001_create_bookings", + "community_name": "Community 98" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100001_create_bookings.php", + "source_location": "L12", + "_origin": "ast", + "community": 98, + "norm_label": "up()", + "id": "database_migrations_2026_07_03_100001_create_bookings_up", + "community_name": "Community 98" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100001_create_bookings.php", + "source_location": "L29", + "_origin": "ast", + "community": 98, + "norm_label": "down()", + "id": "database_migrations_2026_07_03_100001_create_bookings_down", + "community_name": "Community 98" + }, + { + "label": "2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "source_location": "L1", + "_origin": "ast", + "community": 99, + "norm_label": "2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "id": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores", + "community_name": "Community 99" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "source_location": "L13", + "_origin": "ast", + "community": 99, + "norm_label": "up()", + "id": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores_up", + "community_name": "Community 99" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "source_location": "L30", + "_origin": "ast", + "community": 99, + "norm_label": "down()", + "id": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores_down", + "community_name": "Community 99" + }, + { + "label": "2026_07_03_100003_fix_metars_airport_id_type.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php", + "source_location": "L1", + "_origin": "ast", + "community": 100, + "norm_label": "2026_07_03_100003_fix_metars_airport_id_type.php", + "id": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type", + "community_name": "Community 100" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php", + "source_location": "L13", + "_origin": "ast", + "community": 100, + "norm_label": "up()", + "id": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type_up", + "community_name": "Community 100" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php", + "source_location": "L28", + "_origin": "ast", + "community": 100, + "norm_label": "down()", + "id": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type_down", + "community_name": "Community 100" + }, + { + "label": "2026_07_03_100004_create_taf_forecasts.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100004_create_taf_forecasts.php", + "source_location": "L1", + "_origin": "ast", + "community": 101, + "norm_label": "2026_07_03_100004_create_taf_forecasts.php", + "id": "database_migrations_2026_07_03_100004_create_taf_forecasts", + "community_name": "Community 101" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100004_create_taf_forecasts.php", + "source_location": "L12", + "_origin": "ast", + "community": 101, + "norm_label": "up()", + "id": "database_migrations_2026_07_03_100004_create_taf_forecasts_up", + "community_name": "Community 101" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_03_100004_create_taf_forecasts.php", + "source_location": "L33", + "_origin": "ast", + "community": 101, + "norm_label": "down()", + "id": "database_migrations_2026_07_03_100004_create_taf_forecasts_down", + "community_name": "Community 101" + }, + { + "label": "2026_07_07_120000_add_srid_to_airport_coordinates.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php", + "source_location": "L1", + "_origin": "ast", + "community": 102, + "norm_label": "2026_07_07_120000_add_srid_to_airport_coordinates.php", + "id": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates", + "community_name": "Community 102" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php", + "source_location": "L18", + "_origin": "ast", + "community": 102, + "norm_label": "up()", + "id": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates_up", + "community_name": "Community 102" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php", + "source_location": "L36", + "_origin": "ast", + "community": 102, + "norm_label": "down()", + "id": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates_down", + "community_name": "Community 102" + }, + { + "label": "2026_07_07_130000_index_airports_icao.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130000_index_airports_icao.php", + "source_location": "L1", + "_origin": "ast", + "community": 103, + "norm_label": "2026_07_07_130000_index_airports_icao.php", + "id": "database_migrations_2026_07_07_130000_index_airports_icao", + "community_name": "Community 103" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130000_index_airports_icao.php", + "source_location": "L16", + "_origin": "ast", + "community": 103, + "norm_label": "up()", + "id": "database_migrations_2026_07_07_130000_index_airports_icao_up", + "community_name": "Community 103" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130000_index_airports_icao.php", + "source_location": "L26", + "_origin": "ast", + "community": 103, + "norm_label": "down()", + "id": "database_migrations_2026_07_07_130000_index_airports_icao_down", + "community_name": "Community 103" + }, + { + "label": "2026_07_07_130001_index_airports_local_code.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130001_index_airports_local_code.php", + "source_location": "L1", + "_origin": "ast", + "community": 104, + "norm_label": "2026_07_07_130001_index_airports_local_code.php", + "id": "database_migrations_2026_07_07_130001_index_airports_local_code", + "community_name": "Community 104" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130001_index_airports_local_code.php", + "source_location": "L14", + "_origin": "ast", + "community": 104, + "norm_label": "up()", + "id": "database_migrations_2026_07_07_130001_index_airports_local_code_up", + "community_name": "Community 104" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130001_index_airports_local_code.php", + "source_location": "L24", + "_origin": "ast", + "community": 104, + "norm_label": "down()", + "id": "database_migrations_2026_07_07_130001_index_airports_local_code_down", + "community_name": "Community 104" + }, + { + "label": "2026_07_07_130002_index_airport_scores_source_window.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130002_index_airport_scores_source_window.php", + "source_location": "L1", + "_origin": "ast", + "community": 105, + "norm_label": "2026_07_07_130002_index_airport_scores_source_window.php", + "id": "database_migrations_2026_07_07_130002_index_airport_scores_source_window", + "community_name": "Community 105" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130002_index_airport_scores_source_window.php", + "source_location": "L17", + "_origin": "ast", + "community": 105, + "norm_label": "up()", + "id": "database_migrations_2026_07_07_130002_index_airport_scores_source_window_up", + "community_name": "Community 105" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130002_index_airport_scores_source_window.php", + "source_location": "L27", + "_origin": "ast", + "community": 105, + "norm_label": "down()", + "id": "database_migrations_2026_07_07_130002_index_airport_scores_source_window_down", + "community_name": "Community 105" + }, + { + "label": "2026_07_07_130003_index_taf_forecasts_window.php", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130003_index_taf_forecasts_window.php", + "source_location": "L1", + "_origin": "ast", + "community": 106, + "norm_label": "2026_07_07_130003_index_taf_forecasts_window.php", + "id": "database_migrations_2026_07_07_130003_index_taf_forecasts_window", + "community_name": "Community 106" + }, + { + "label": "up()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130003_index_taf_forecasts_window.php", + "source_location": "L15", + "_origin": "ast", + "community": 106, + "norm_label": "up()", + "id": "database_migrations_2026_07_07_130003_index_taf_forecasts_window_up", + "community_name": "Community 106" + }, + { + "label": "down()", + "file_type": "code", + "source_file": "database/migrations/2026_07_07_130003_index_taf_forecasts_window.php", + "source_location": "L25", + "_origin": "ast", + "community": 106, + "norm_label": "down()", + "id": "database_migrations_2026_07_07_130003_index_taf_forecasts_window_down", + "community_name": "Community 106" + }, + { + "label": "TestAirportSeeder.php", + "file_type": "code", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "testairportseeder.php", + "id": "database_seeders_testairportseeder", + "community_name": "Community 14" + }, + { + "label": "TestAirportSeeder", + "file_type": "code", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L13", + "_origin": "ast", + "community": 14, + "norm_label": "testairportseeder", + "id": "database_seeders_testairportseeder_testairportseeder", + "community_name": "Community 14" + }, + { + "label": "Seeder", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 14, + "norm_label": "seeder", + "id": "seeder", + "community_name": "Community 14" + }, + { + "label": ".run()", + "file_type": "code", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L15", + "_origin": "ast", + "community": 14, + "norm_label": ".run()", + "id": "database_seeders_testairportseeder_testairportseeder_run", + "community_name": "Community 14" + }, + { + "label": "auth.php", + "file_type": "code", + "source_file": "lang/en/auth.php", + "source_location": "L1", + "_origin": "ast", + "community": 152, + "norm_label": "auth.php", + "id": "lang_en_auth", + "community_name": "Community 152" + }, + { + "label": "pagination.php", + "file_type": "code", + "source_file": "lang/en/pagination.php", + "source_location": "L1", + "_origin": "ast", + "community": 153, + "norm_label": "pagination.php", + "id": "lang_en_pagination", + "community_name": "Community 153" + }, + { + "label": "validation.php", + "file_type": "code", + "source_file": "lang/en/validation.php", + "source_location": "L1", + "_origin": "ast", + "community": 154, + "norm_label": "validation.php", + "id": "lang_en_validation", + "community_name": "Community 154" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/ar/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 155, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_ar_notifications", + "community_name": "Community 155" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/bg/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 156, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_bg_notifications", + "community_name": "Community 156" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/bn/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 157, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_bn_notifications", + "community_name": "Community 157" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/cs/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 158, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_cs_notifications", + "community_name": "Community 158" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/da/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 159, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_da_notifications", + "community_name": "Community 159" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/de/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 160, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_de_notifications", + "community_name": "Community 160" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/en/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 161, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_en_notifications", + "community_name": "Community 161" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/es/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 162, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_es_notifications", + "community_name": "Community 162" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/fa/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 163, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_fa_notifications", + "community_name": "Community 163" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/fi/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 164, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_fi_notifications", + "community_name": "Community 164" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/fr/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 165, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_fr_notifications", + "community_name": "Community 165" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/he/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 166, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_he_notifications", + "community_name": "Community 166" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/hi/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 167, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_hi_notifications", + "community_name": "Community 167" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/hr/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 168, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_hr_notifications", + "community_name": "Community 168" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/id/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 169, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_id_notifications", + "community_name": "Community 169" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/it/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 170, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_it_notifications", + "community_name": "Community 170" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/ja/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 171, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_ja_notifications", + "community_name": "Community 171" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/ko/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 172, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_ko_notifications", + "community_name": "Community 172" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/nl/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 173, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_nl_notifications", + "community_name": "Community 173" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/no/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 174, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_no_notifications", + "community_name": "Community 174" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/pl/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 175, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_pl_notifications", + "community_name": "Community 175" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/pt-BR/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 176, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_pt_br_notifications", + "community_name": "Community 176" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/pt/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 177, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_pt_notifications", + "community_name": "Community 177" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/ro/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 178, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_ro_notifications", + "community_name": "Community 178" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/ru/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 179, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_ru_notifications", + "community_name": "Community 179" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/tr/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 180, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_tr_notifications", + "community_name": "Community 180" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/uk/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 181, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_uk_notifications", + "community_name": "Community 181" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/zh-CN/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 182, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_zh_cn_notifications", + "community_name": "Community 182" + }, + { + "label": "notifications.php", + "file_type": "code", + "source_file": "lang/vendor/backup/zh-TW/notifications.php", + "source_location": "L1", + "_origin": "ast", + "community": 183, + "norm_label": "notifications.php", + "id": "lang_vendor_backup_zh_tw_notifications", + "community_name": "Community 183" + }, + { + "label": "package.json", + "file_type": "code", + "source_file": "package.json", + "source_location": "L1", + "_origin": "ast", + "community": 8, + "norm_label": "package.json", + "id": "package", + "community_name": "Community 8" + }, + { + "label": "private", + "file_type": "code", + "source_file": "package.json", + "source_location": "L2", + "_origin": "ast", + "community": 8, + "norm_label": "private", + "id": "package_private", + "community_name": "Community 8" + }, + { + "label": "scripts", + "file_type": "code", + "source_file": "package.json", + "source_location": "L3", + "_origin": "ast", + "community": 8, + "norm_label": "scripts", + "id": "package_scripts", + "community_name": "Community 8" + }, + { + "label": "dev", + "file_type": "code", + "source_file": "package.json", + "source_location": "L4", + "_origin": "ast", + "community": 8, + "norm_label": "dev", + "id": "package_scripts_dev", + "community_name": "Community 8" + }, + { + "label": "build", + "file_type": "code", + "source_file": "package.json", + "source_location": "L5", + "_origin": "ast", + "community": 8, + "norm_label": "build", + "id": "package_scripts_build", + "community_name": "Community 8" + }, + { + "label": "dependencies", + "file_type": "code", + "source_file": "package.json", + "source_location": "L7", + "_origin": "ast", + "community": 8, + "norm_label": "dependencies", + "id": "package_dependencies", + "community_name": "Community 8" + }, + { + "label": "@elfalem/leaflet-curve", + "file_type": "code", + "source_file": "package.json", + "source_location": "L8", + "_origin": "ast", + "community": 8, + "norm_label": "@elfalem/leaflet-curve", + "id": "package_dependencies_elfalem_leaflet_curve", + "community_name": "Community 8" + }, + { + "label": "@joergdietrich/leaflet.terminator", + "file_type": "code", + "source_file": "package.json", + "source_location": "L9", + "_origin": "ast", + "community": 8, + "norm_label": "@joergdietrich/leaflet.terminator", + "id": "package_dependencies_joergdietrich_leaflet_terminator", + "community_name": "Community 8" + }, + { + "label": "@popperjs/core", + "file_type": "code", + "source_file": "package.json", + "source_location": "L10", + "_origin": "ast", + "community": 8, + "norm_label": "@popperjs/core", + "id": "package_dependencies_popperjs_core", + "community_name": "Community 8" + }, + { + "label": "@u-elements/u-combobox", + "file_type": "code", + "source_file": "package.json", + "source_location": "L11", + "_origin": "ast", + "community": 8, + "norm_label": "@u-elements/u-combobox", + "id": "package_dependencies_u_elements_u_combobox", + "community_name": "Community 8" + }, + { + "label": "@u-elements/u-datalist", + "file_type": "code", + "source_file": "package.json", + "source_location": "L12", + "_origin": "ast", + "community": 8, + "norm_label": "@u-elements/u-datalist", + "id": "package_dependencies_u_elements_u_datalist", + "community_name": "Community 8" + }, + { + "label": "@u-elements/u-tabs", + "file_type": "code", + "source_file": "package.json", + "source_location": "L13", + "_origin": "ast", + "community": 8, + "norm_label": "@u-elements/u-tabs", + "id": "package_dependencies_u_elements_u_tabs", + "community_name": "Community 8" + }, + { + "label": "@vitejs/plugin-react", + "file_type": "code", + "source_file": "package.json", + "source_location": "L14", + "_origin": "ast", + "community": 8, + "norm_label": "@vitejs/plugin-react", + "id": "package_dependencies_vitejs_plugin_react", + "community_name": "Community 8" + }, + { + "label": "bootstrap", + "file_type": "code", + "source_file": "package.json", + "source_location": "L15", + "_origin": "ast", + "community": 8, + "norm_label": "bootstrap", + "id": "package_dependencies_bootstrap", + "community_name": "Community 8" + }, + { + "label": "laravel-vite-plugin", + "file_type": "code", + "source_file": "package.json", + "source_location": "L16", + "_origin": "ast", + "community": 8, + "norm_label": "laravel-vite-plugin", + "id": "package_dependencies_laravel_vite_plugin", + "community_name": "Community 8" + }, + { + "label": "leaflet", + "file_type": "code", + "source_file": "package.json", + "source_location": "L17", + "_origin": "ast", + "community": 8, + "norm_label": "leaflet", + "id": "package_dependencies_leaflet", + "community_name": "Community 8" + }, + { + "label": "leaflet.markercluster", + "file_type": "code", + "source_file": "package.json", + "source_location": "L18", + "_origin": "ast", + "community": 8, + "norm_label": "leaflet.markercluster", + "id": "package_dependencies_leaflet_markercluster", + "community_name": "Community 8" + }, + { + "label": "lodash", + "file_type": "code", + "source_file": "package.json", + "source_location": "L19", + "_origin": "ast", + "community": 8, + "norm_label": "lodash", + "id": "package_dependencies_lodash", + "community_name": "Community 8" + }, + { + "label": "moment", + "file_type": "code", + "source_file": "package.json", + "source_location": "L20", + "_origin": "ast", + "community": 8, + "norm_label": "moment", + "id": "package_dependencies_moment", + "community_name": "Community 8" + }, + { + "label": "nouislider", + "file_type": "code", + "source_file": "package.json", + "source_location": "L21", + "_origin": "ast", + "community": 8, + "norm_label": "nouislider", + "id": "package_dependencies_nouislider", + "community_name": "Community 8" + }, + { + "label": "postcss", + "file_type": "code", + "source_file": "package.json", + "source_location": "L22", + "_origin": "ast", + "community": 8, + "norm_label": "postcss", + "id": "package_dependencies_postcss", + "community_name": "Community 8" + }, + { + "label": "react", + "file_type": "code", + "source_file": "package.json", + "source_location": "L23", + "_origin": "ast", + "community": 8, + "norm_label": "react", + "id": "package_dependencies_react", + "community_name": "Community 8" + }, + { + "label": "react-dom", + "file_type": "code", + "source_file": "package.json", + "source_location": "L24", + "_origin": "ast", + "community": 8, + "norm_label": "react-dom", + "id": "package_dependencies_react_dom", + "community_name": "Community 8" + }, + { + "label": "react-leaflet", + "file_type": "code", + "source_file": "package.json", + "source_location": "L25", + "_origin": "ast", + "community": 8, + "norm_label": "react-leaflet", + "id": "package_dependencies_react_leaflet", + "community_name": "Community 8" + }, + { + "label": "react-leaflet-cluster", + "file_type": "code", + "source_file": "package.json", + "source_location": "L26", + "_origin": "ast", + "community": 8, + "norm_label": "react-leaflet-cluster", + "id": "package_dependencies_react_leaflet_cluster", + "community_name": "Community 8" + }, + { + "label": "sass", + "file_type": "code", + "source_file": "package.json", + "source_location": "L27", + "_origin": "ast", + "community": 8, + "norm_label": "sass", + "id": "package_dependencies_sass", + "community_name": "Community 8" + }, + { + "label": "sortable-tablesort", + "file_type": "code", + "source_file": "package.json", + "source_location": "L28", + "_origin": "ast", + "community": 8, + "norm_label": "sortable-tablesort", + "id": "package_dependencies_sortable_tablesort", + "community_name": "Community 8" + }, + { + "label": "vite", + "file_type": "code", + "source_file": "package.json", + "source_location": "L29", + "_origin": "ast", + "community": 8, + "norm_label": "vite", + "id": "package_dependencies_vite", + "community_name": "Community 8" + }, + { + "label": "devDependencies", + "file_type": "code", + "source_file": "package.json", + "source_location": "L31", + "_origin": "ast", + "community": 8, + "norm_label": "devdependencies", + "id": "package_devdependencies", + "community_name": "Community 8" + }, + { + "label": "@types/leaflet", + "file_type": "code", + "source_file": "package.json", + "source_location": "L32", + "_origin": "ast", + "community": 8, + "norm_label": "@types/leaflet", + "id": "package_devdependencies_types_leaflet", + "community_name": "Community 8" + }, + { + "label": "app.js", + "file_type": "code", + "source_file": "resources/js/app.js", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "app.js", + "id": "resources_js_app", + "community_name": "Community 1" + }, + { + "label": "bootstrap.js", + "file_type": "code", + "source_file": "resources/js/bootstrap.js", + "source_location": "L1", + "_origin": "ast", + "community": 8, + "norm_label": "bootstrap.js", + "id": "resources_js_bootstrap", + "community_name": "Community 8" + }, + { + "label": "AirportCard.jsx", + "file_type": "code", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "airportcard.jsx", + "id": "resources_js_components_airportcard", + "community_name": "Community 1" + }, + { + "label": "AirportCard()", + "file_type": "code", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L13", + "_origin": "ast", + "community": 1, + "norm_label": "airportcard()", + "id": "resources_js_components_airportcard_airportcard", + "community_name": "Community 1" + }, + { + "label": "FlightsCard.jsx", + "file_type": "code", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "flightscard.jsx", + "id": "resources_js_components_flightscard", + "community_name": "Community 1" + }, + { + "label": "FlightsCard()", + "file_type": "code", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L6", + "_origin": "ast", + "community": 1, + "norm_label": "flightscard()", + "id": "resources_js_components_flightscard_flightscard", + "community_name": "Community 1" + }, + { + "label": "Map.jsx", + "file_type": "code", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "map.jsx", + "id": "resources_js_components_map", + "community_name": "Community 1" + }, + { + "label": "isDefaultView()", + "file_type": "code", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L21", + "_origin": "ast", + "community": 1, + "norm_label": "isdefaultview()", + "id": "resources_js_components_map_isdefaultview", + "community_name": "Community 1" + }, + { + "label": "getInitMapPosition()", + "file_type": "code", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L35", + "_origin": "ast", + "community": 1, + "norm_label": "getinitmapposition()", + "id": "resources_js_components_map_getinitmapposition", + "community_name": "Community 1" + }, + { + "label": "Map()", + "file_type": "code", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L66", + "_origin": "ast", + "community": 1, + "norm_label": "map()", + "id": "resources_js_components_map_map", + "community_name": "Community 1" + }, + { + "label": "mapElement", + "file_type": "code", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L253", + "_origin": "ast", + "community": 1, + "norm_label": "mapelement", + "id": "resources_js_components_map_mapelement", + "community_name": "Community 1" + }, + { + "label": "PopupContainer.jsx", + "file_type": "code", + "source_file": "resources/js/components/PopupContainer.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "popupcontainer.jsx", + "id": "resources_js_components_popupcontainer", + "community_name": "Community 1" + }, + { + "label": "PopupContainer()", + "file_type": "code", + "source_file": "resources/js/components/PopupContainer.jsx", + "source_location": "L4", + "_origin": "ast", + "community": 1, + "norm_label": "popupcontainer()", + "id": "resources_js_components_popupcontainer_popupcontainer", + "community_name": "Community 1" + }, + { + "label": "SceneryCard.jsx", + "file_type": "code", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "scenerycard.jsx", + "id": "resources_js_components_scenerycard", + "community_name": "Community 1" + }, + { + "label": "SceneryCard()", + "file_type": "code", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L8", + "_origin": "ast", + "community": 1, + "norm_label": "scenerycard()", + "id": "resources_js_components_scenerycard_scenerycard", + "community_name": "Community 1" + }, + { + "label": "CardContext.js", + "file_type": "code", + "source_file": "resources/js/components/context/CardContext.js", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "cardcontext.js", + "id": "resources_js_components_context_cardcontext", + "community_name": "Community 1" + }, + { + "label": "CardContext", + "file_type": "code", + "source_file": "resources/js/components/context/CardContext.js", + "source_location": "L3", + "_origin": "ast", + "community": 1, + "norm_label": "cardcontext", + "id": "resources_js_components_context_cardcontext_cardcontext", + "community_name": "Community 1" + }, + { + "label": "MapContext.js", + "file_type": "code", + "source_file": "resources/js/components/context/MapContext.js", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapcontext.js", + "id": "resources_js_components_context_mapcontext", + "community_name": "Community 1" + }, + { + "label": "MapContext", + "file_type": "code", + "source_file": "resources/js/components/context/MapContext.js", + "source_location": "L3", + "_origin": "ast", + "community": 1, + "norm_label": "mapcontext", + "id": "resources_js_components_context_mapcontext_mapcontext", + "community_name": "Community 1" + }, + { + "label": "MapBound.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapBound.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapbound.jsx", + "id": "resources_js_components_map_mapbound", + "community_name": "Community 1" + }, + { + "label": "MapBound()", + "file_type": "code", + "source_file": "resources/js/components/map/MapBound.jsx", + "source_location": "L4", + "_origin": "ast", + "community": 1, + "norm_label": "mapbound()", + "id": "resources_js_components_map_mapbound_mapbound", + "community_name": "Community 1" + }, + { + "label": "MapDrawRoute.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapDrawRoute.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapdrawroute.jsx", + "id": "resources_js_components_map_mapdrawroute", + "community_name": "Community 1" + }, + { + "label": "MapDrawRoute()", + "file_type": "code", + "source_file": "resources/js/components/map/MapDrawRoute.jsx", + "source_location": "L8", + "_origin": "ast", + "community": 1, + "norm_label": "mapdrawroute()", + "id": "resources_js_components_map_mapdrawroute_mapdrawroute", + "community_name": "Community 1" + }, + { + "label": "MapMarker.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapMarker.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapmarker.jsx", + "id": "resources_js_components_map_mapmarker", + "community_name": "Community 1" + }, + { + "label": "MapMarker()", + "file_type": "code", + "source_file": "resources/js/components/map/MapMarker.jsx", + "source_location": "L5", + "_origin": "ast", + "community": 1, + "norm_label": "mapmarker()", + "id": "resources_js_components_map_mapmarker_mapmarker", + "community_name": "Community 1" + }, + { + "label": "MapMarkerGroup.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapMarkerGroup.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapmarkergroup.jsx", + "id": "resources_js_components_map_mapmarkergroup", + "community_name": "Community 1" + }, + { + "label": "MapMarkerGroup()", + "file_type": "code", + "source_file": "resources/js/components/map/MapMarkerGroup.jsx", + "source_location": "L5", + "_origin": "ast", + "community": 1, + "norm_label": "mapmarkergroup()", + "id": "resources_js_components_map_mapmarkergroup_mapmarkergroup", + "community_name": "Community 1" + }, + { + "label": "MapPan.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapPan.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mappan.jsx", + "id": "resources_js_components_map_mappan", + "community_name": "Community 1" + }, + { + "label": "MapPan()", + "file_type": "code", + "source_file": "resources/js/components/map/MapPan.jsx", + "source_location": "L4", + "_origin": "ast", + "community": 1, + "norm_label": "mappan()", + "id": "resources_js_components_map_mappan_mappan", + "community_name": "Community 1" + }, + { + "label": "MapSaveView.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapSaveView.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapsaveview.jsx", + "id": "resources_js_components_map_mapsaveview", + "community_name": "Community 1" + }, + { + "label": "MapSaveView()", + "file_type": "code", + "source_file": "resources/js/components/map/MapSaveView.jsx", + "source_location": "L3", + "_origin": "ast", + "community": 1, + "norm_label": "mapsaveview()", + "id": "resources_js_components_map_mapsaveview_mapsaveview", + "community_name": "Community 1" + }, + { + "label": "MapTerminator.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapTerminator.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "mapterminator.jsx", + "id": "resources_js_components_map_mapterminator", + "community_name": "Community 1" + }, + { + "label": "MapTerminator()", + "file_type": "code", + "source_file": "resources/js/components/map/MapTerminator.jsx", + "source_location": "L6", + "_origin": "ast", + "community": 1, + "norm_label": "mapterminator()", + "id": "resources_js_components_map_mapterminator_mapterminator", + "community_name": "Community 1" + }, + { + "label": "MapTooltipZoom.jsx", + "file_type": "code", + "source_file": "resources/js/components/map/MapTooltipZoom.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "maptooltipzoom.jsx", + "id": "resources_js_components_map_maptooltipzoom", + "community_name": "Community 1" + }, + { + "label": "applyZoomClasses()", + "file_type": "code", + "source_file": "resources/js/components/map/MapTooltipZoom.jsx", + "source_location": "L5", + "_origin": "ast", + "community": 1, + "norm_label": "applyzoomclasses()", + "id": "resources_js_components_map_maptooltipzoom_applyzoomclasses", + "community_name": "Community 1" + }, + { + "label": "MapTooltipZoom()", + "file_type": "code", + "source_file": "resources/js/components/map/MapTooltipZoom.jsx", + "source_location": "L17", + "_origin": "ast", + "community": 1, + "norm_label": "maptooltipzoom()", + "id": "resources_js_components_map_maptooltipzoom_maptooltipzoom", + "community_name": "Community 1" + }, + { + "label": "CurrencyDropdown.jsx", + "file_type": "code", + "source_file": "resources/js/components/ui/CurrencyDropdown.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "currencydropdown.jsx", + "id": "resources_js_components_ui_currencydropdown", + "community_name": "Community 1" + }, + { + "label": "CurrencyDropdown()", + "file_type": "code", + "source_file": "resources/js/components/ui/CurrencyDropdown.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "currencydropdown()", + "id": "resources_js_components_ui_currencydropdown_currencydropdown", + "community_name": "Community 1" + }, + { + "label": "SimbriefLink.jsx", + "file_type": "code", + "source_file": "resources/js/components/ui/SimbriefLink.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "simbrieflink.jsx", + "id": "resources_js_components_ui_simbrieflink", + "community_name": "Community 1" + }, + { + "label": "SimbriefLink()", + "file_type": "code", + "source_file": "resources/js/components/ui/SimbriefLink.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "simbrieflink()", + "id": "resources_js_components_ui_simbrieflink_simbrieflink", + "community_name": "Community 1" + }, + { + "label": "TAF.jsx", + "file_type": "code", + "source_file": "resources/js/components/ui/TAF.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "taf.jsx", + "id": "resources_js_components_ui_taf", + "community_name": "Community 1" + }, + { + "label": "TAF()", + "file_type": "code", + "source_file": "resources/js/components/ui/TAF.jsx", + "source_location": "L3", + "_origin": "ast", + "community": 1, + "norm_label": "taf()", + "id": "resources_js_components_ui_taf_taf", + "community_name": "Community 1" + }, + { + "label": "ClusterIcon.jsx", + "file_type": "code", + "source_file": "resources/js/components/utils/ClusterIcon.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "clustericon.jsx", + "id": "resources_js_components_utils_clustericon", + "community_name": "Community 1" + }, + { + "label": "createClusterIcon()", + "file_type": "code", + "source_file": "resources/js/components/utils/ClusterIcon.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "createclustericon()", + "id": "resources_js_components_utils_clustericon_createclustericon", + "community_name": "Community 1" + }, + { + "label": "ExternalLinkTracker.jsx", + "file_type": "code", + "source_file": "resources/js/components/utils/ExternalLinkTracker.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "externallinktracker.jsx", + "id": "resources_js_components_utils_externallinktracker", + "community_name": "Community 1" + }, + { + "label": "ExternalLinkTracker()", + "file_type": "code", + "source_file": "resources/js/components/utils/ExternalLinkTracker.jsx", + "source_location": "L3", + "_origin": "ast", + "community": 1, + "norm_label": "externallinktracker()", + "id": "resources_js_components_utils_externallinktracker_externallinktracker", + "community_name": "Community 1" + }, + { + "label": "MarkerIcon.jsx", + "file_type": "code", + "source_file": "resources/js/components/utils/MarkerIcon.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "markericon.jsx", + "id": "resources_js_components_utils_markericon", + "community_name": "Community 1" + }, + { + "label": "createMarkerIcon()", + "file_type": "code", + "source_file": "resources/js/components/utils/MarkerIcon.jsx", + "source_location": "L3", + "_origin": "ast", + "community": 1, + "norm_label": "createmarkericon()", + "id": "resources_js_components_utils_markericon_createmarkericon", + "community_name": "Community 1" + }, + { + "label": "TooltipRefresh.jsx", + "file_type": "code", + "source_file": "resources/js/components/utils/TooltipRefresh.jsx", + "source_location": "L1", + "_origin": "ast", + "community": 1, + "norm_label": "tooltiprefresh.jsx", + "id": "resources_js_components_utils_tooltiprefresh", + "community_name": "Community 1" + }, + { + "label": "TooltipRefresh()", + "file_type": "code", + "source_file": "resources/js/components/utils/TooltipRefresh.jsx", + "source_location": "L2", + "_origin": "ast", + "community": 1, + "norm_label": "tooltiprefresh()", + "id": "resources_js_components_utils_tooltiprefresh_tooltiprefresh", + "community_name": "Community 1" + }, + { + "label": "combobox.js", + "file_type": "code", + "source_file": "resources/js/functions/combobox.js", + "source_location": "L1", + "_origin": "ast", + "community": 117, + "norm_label": "combobox.js", + "id": "resources_js_functions_combobox", + "community_name": "Community 117" + }, + { + "label": "placeholderConfigs", + "file_type": "code", + "source_file": "resources/js/functions/combobox.js", + "source_location": "L2", + "_origin": "ast", + "community": 117, + "norm_label": "placeholderconfigs", + "id": "resources_js_functions_combobox_placeholderconfigs", + "community_name": "Community 117" + }, + { + "label": "searchForm.js", + "file_type": "code", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L1", + "_origin": "ast", + "community": 40, + "norm_label": "searchform.js", + "id": "resources_js_functions_searchform", + "community_name": "Community 40" + }, + { + "label": "submitFormMetrics()", + "file_type": "code", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L11", + "_origin": "ast", + "community": 40, + "norm_label": "submitformmetrics()", + "id": "resources_js_functions_searchform_submitformmetrics", + "community_name": "Community 40" + }, + { + "label": "toggleFilters()", + "file_type": "code", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L152", + "_origin": "ast", + "community": 40, + "norm_label": "togglefilters()", + "id": "resources_js_functions_searchform_togglefilters", + "community_name": "Community 40" + }, + { + "label": "contractFilters()", + "file_type": "code", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L167", + "_origin": "ast", + "community": 40, + "norm_label": "contractfilters()", + "id": "resources_js_functions_searchform_contractfilters", + "community_name": "Community 40" + }, + { + "label": "expandFilters()", + "file_type": "code", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L179", + "_origin": "ast", + "community": 40, + "norm_label": "expandfilters()", + "id": "resources_js_functions_searchform_expandfilters", + "community_name": "Community 40" + }, + { + "label": "searchResults.js", + "file_type": "code", + "source_file": "resources/js/functions/searchResults.js", + "source_location": "L1", + "_origin": "ast", + "community": 107, + "norm_label": "searchresults.js", + "id": "resources_js_functions_searchresults", + "community_name": "Community 107" + }, + { + "label": "expandAllRows()", + "file_type": "code", + "source_file": "resources/js/functions/searchResults.js", + "source_location": "L22", + "_origin": "ast", + "community": 107, + "norm_label": "expandallrows()", + "id": "resources_js_functions_searchresults_expandallrows", + "community_name": "Community 107" + }, + { + "label": "syncDetailRows()", + "file_type": "code", + "source_file": "resources/js/functions/searchResults.js", + "source_location": "L36", + "_origin": "ast", + "community": 107, + "norm_label": "syncdetailrows()", + "id": "resources_js_functions_searchresults_syncdetailrows", + "community_name": "Community 107" + }, + { + "label": "taf.js", + "file_type": "code", + "source_file": "resources/js/functions/taf.js", + "source_location": "L1", + "_origin": "ast", + "community": 118, + "norm_label": "taf.js", + "id": "resources_js_functions_taf", + "community_name": "Community 118" + }, + { + "label": "revealTAF()", + "file_type": "code", + "source_file": "resources/js/functions/taf.js", + "source_location": "L14", + "_origin": "ast", + "community": 118, + "norm_label": "revealtaf()", + "id": "resources_js_functions_taf_revealtaf", + "community_name": "Community 118" + }, + { + "label": "tooltip.js", + "file_type": "code", + "source_file": "resources/js/functions/tooltip.js", + "source_location": "L1", + "_origin": "ast", + "community": 184, + "norm_label": "tooltip.js", + "id": "resources_js_functions_tooltip", + "community_name": "Community 184" + }, + { + "label": "nouislider.js", + "file_type": "code", + "source_file": "resources/js/nouislider.js", + "source_location": "L1", + "_origin": "ast", + "community": 8, + "norm_label": "nouislider.js", + "id": "resources_js_nouislider", + "community_name": "Community 8" + }, + { + "label": "sortable.js", + "file_type": "code", + "source_file": "resources/js/sortable.js", + "source_location": "L1", + "_origin": "ast", + "community": 185, + "norm_label": "sortable.js", + "id": "resources_js_sortable", + "community_name": "Community 185" + }, + { + "label": "admin.blade.php", + "file_type": "code", + "source_file": "resources/views/account/admin.blade.php", + "source_location": null, + "_origin": "ast", + "community": 119, + "norm_label": "admin.blade.php", + "id": "resources_views_account_admin_blade", + "community_name": "Community 119" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/account/admin.blade.php", + "source_location": null, + "_origin": "ast", + "community": 119, + "norm_label": "layouts.title", + "id": "resources_views_account_admin_blade_php_layouts_title", + "community_name": "Community 119" + }, + { + "label": "login.blade.php", + "file_type": "code", + "source_file": "resources/views/account/login.blade.php", + "source_location": null, + "_origin": "ast", + "community": 120, + "norm_label": "login.blade.php", + "id": "resources_views_account_login_blade", + "community_name": "Community 120" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/account/login.blade.php", + "source_location": null, + "_origin": "ast", + "community": 120, + "norm_label": "layouts.title", + "id": "resources_views_account_login_blade_php_layouts_title", + "community_name": "Community 120" + }, + { + "label": "register.blade.php", + "file_type": "code", + "source_file": "resources/views/account/register.blade.php", + "source_location": null, + "_origin": "ast", + "community": 121, + "norm_label": "register.blade.php", + "id": "resources_views_account_register_blade", + "community_name": "Community 121" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/account/register.blade.php", + "source_location": null, + "_origin": "ast", + "community": 121, + "norm_label": "layouts.title", + "id": "resources_views_account_register_blade_php_layouts_title", + "community_name": "Community 121" + }, + { + "label": "resetForm.blade.php", + "file_type": "code", + "source_file": "resources/views/account/resetForm.blade.php", + "source_location": null, + "_origin": "ast", + "community": 122, + "norm_label": "resetform.blade.php", + "id": "resources_views_account_resetform_blade", + "community_name": "Community 122" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/account/resetForm.blade.php", + "source_location": null, + "_origin": "ast", + "community": 122, + "norm_label": "layouts.title", + "id": "resources_views_account_resetform_blade_php_layouts_title", + "community_name": "Community 122" + }, + { + "label": "resetRequest.blade.php", + "file_type": "code", + "source_file": "resources/views/account/resetRequest.blade.php", + "source_location": null, + "_origin": "ast", + "community": 123, + "norm_label": "resetrequest.blade.php", + "id": "resources_views_account_resetrequest_blade", + "community_name": "Community 123" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/account/resetRequest.blade.php", + "source_location": null, + "_origin": "ast", + "community": 123, + "norm_label": "layouts.title", + "id": "resources_views_account_resetrequest_blade_php_layouts_title", + "community_name": "Community 123" + }, + { + "label": "settings.blade.php", + "file_type": "code", + "source_file": "resources/views/account/settings.blade.php", + "source_location": null, + "_origin": "ast", + "community": 124, + "norm_label": "settings.blade.php", + "id": "resources_views_account_settings_blade", + "community_name": "Community 124" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/account/settings.blade.php", + "source_location": null, + "_origin": "ast", + "community": 124, + "norm_label": "layouts.title", + "id": "resources_views_account_settings_blade_php_layouts_title", + "community_name": "Community 124" + }, + { + "label": "api.blade.php", + "file_type": "code", + "source_file": "resources/views/api.blade.php", + "source_location": null, + "_origin": "ast", + "community": 125, + "norm_label": "api.blade.php", + "id": "resources_views_api_blade", + "community_name": "Community 125" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/api.blade.php", + "source_location": null, + "_origin": "ast", + "community": 125, + "norm_label": "layouts.title", + "id": "resources_views_api_blade_php_layouts_title", + "community_name": "Community 125" + }, + { + "label": "changelog.blade.php", + "file_type": "code", + "source_file": "resources/views/changelog.blade.php", + "source_location": null, + "_origin": "ast", + "community": 126, + "norm_label": "changelog.blade.php", + "id": "resources_views_changelog_blade", + "community_name": "Community 126" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/changelog.blade.php", + "source_location": null, + "_origin": "ast", + "community": 126, + "norm_label": "layouts.title", + "id": "resources_views_changelog_blade_php_layouts_title", + "community_name": "Community 126" + }, + { + "label": "score-icon.blade.php", + "file_type": "code", + "source_file": "resources/views/components/score-icon.blade.php", + "source_location": null, + "_origin": "ast", + "community": 186, + "norm_label": "score-icon.blade.php", + "id": "resources_views_components_score_icon_blade", + "community_name": "Community 186" + }, + { + "label": "401.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/401.blade.php", + "source_location": null, + "_origin": "ast", + "community": 187, + "norm_label": "401.blade.php", + "id": "resources_views_errors_401_blade", + "community_name": "Community 187" + }, + { + "label": "402.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/402.blade.php", + "source_location": null, + "_origin": "ast", + "community": 188, + "norm_label": "402.blade.php", + "id": "resources_views_errors_402_blade", + "community_name": "Community 188" + }, + { + "label": "403.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/403.blade.php", + "source_location": null, + "_origin": "ast", + "community": 189, + "norm_label": "403.blade.php", + "id": "resources_views_errors_403_blade", + "community_name": "Community 189" + }, + { + "label": "404.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/404.blade.php", + "source_location": null, + "_origin": "ast", + "community": 190, + "norm_label": "404.blade.php", + "id": "resources_views_errors_404_blade", + "community_name": "Community 190" + }, + { + "label": "419.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/419.blade.php", + "source_location": null, + "_origin": "ast", + "community": 191, + "norm_label": "419.blade.php", + "id": "resources_views_errors_419_blade", + "community_name": "Community 191" + }, + { + "label": "429.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/429.blade.php", + "source_location": null, + "_origin": "ast", + "community": 192, + "norm_label": "429.blade.php", + "id": "resources_views_errors_429_blade", + "community_name": "Community 192" + }, + { + "label": "500.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/500.blade.php", + "source_location": null, + "_origin": "ast", + "community": 193, + "norm_label": "500.blade.php", + "id": "resources_views_errors_500_blade", + "community_name": "Community 193" + }, + { + "label": "503.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/503.blade.php", + "source_location": null, + "_origin": "ast", + "community": 194, + "norm_label": "503.blade.php", + "id": "resources_views_errors_503_blade", + "community_name": "Community 194" + }, + { + "label": "layout.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/layout.blade.php", + "source_location": null, + "_origin": "ast", + "community": 195, + "norm_label": "layout.blade.php", + "id": "resources_views_errors_layout_blade", + "community_name": "Community 195" + }, + { + "label": "minimal.blade.php", + "file_type": "code", + "source_file": "resources/views/errors/minimal.blade.php", + "source_location": null, + "_origin": "ast", + "community": 196, + "norm_label": "minimal.blade.php", + "id": "resources_views_errors_minimal_blade", + "community_name": "Community 196" + }, + { + "label": "index.blade.php", + "file_type": "code", + "source_file": "resources/views/feedback/index.blade.php", + "source_location": null, + "_origin": "ast", + "community": 108, + "norm_label": "index.blade.php", + "id": "resources_views_feedback_index_blade", + "community_name": "Community 108" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/feedback/index.blade.php", + "source_location": null, + "_origin": "ast", + "community": 108, + "norm_label": "layouts.title", + "id": "resources_views_feedback_index_blade_php_layouts_title", + "community_name": "Community 108" + }, + { + "label": "feedback.sidebar", + "file_type": "code", + "source_file": "resources/views/feedback/index.blade.php", + "source_location": null, + "_origin": "ast", + "community": 108, + "norm_label": "feedback.sidebar", + "id": "resources_views_feedback_index_blade_php_feedback_sidebar", + "community_name": "Community 108" + }, + { + "label": "show.blade.php", + "file_type": "code", + "source_file": "resources/views/feedback/show.blade.php", + "source_location": null, + "_origin": "ast", + "community": 109, + "norm_label": "show.blade.php", + "id": "resources_views_feedback_show_blade", + "community_name": "Community 109" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/feedback/show.blade.php", + "source_location": null, + "_origin": "ast", + "community": 109, + "norm_label": "layouts.title", + "id": "resources_views_feedback_show_blade_php_layouts_title", + "community_name": "Community 109" + }, + { + "label": "feedback.sidebar", + "file_type": "code", + "source_file": "resources/views/feedback/show.blade.php", + "source_location": null, + "_origin": "ast", + "community": 109, + "norm_label": "feedback.sidebar", + "id": "resources_views_feedback_show_blade_php_feedback_sidebar", + "community_name": "Community 109" + }, + { + "label": "sidebar.blade.php", + "file_type": "code", + "source_file": "resources/views/feedback/sidebar.blade.php", + "source_location": null, + "_origin": "ast", + "community": 197, + "norm_label": "sidebar.blade.php", + "id": "resources_views_feedback_sidebar_blade", + "community_name": "Community 197" + }, + { + "label": "arrivals.blade.php", + "file_type": "code", + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "_origin": "ast", + "community": 41, + "norm_label": "arrivals.blade.php", + "id": "resources_views_front_arrivals_blade", + "community_name": "Community 41" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "_origin": "ast", + "community": 41, + "norm_label": "layouts.title", + "id": "resources_views_front_arrivals_blade_php_layouts_title", + "community_name": "Community 41" + }, + { + "label": "front.parts.tabs", + "file_type": "code", + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "_origin": "ast", + "community": 41, + "norm_label": "front.parts.tabs", + "id": "resources_views_front_arrivals_blade_php_front_parts_tabs", + "community_name": "Community 41" + }, + { + "label": "front.parts.form", + "file_type": "code", + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "_origin": "ast", + "community": 41, + "norm_label": "front.parts.form", + "id": "resources_views_front_arrivals_blade_php_front_parts_form", + "community_name": "Community 41" + }, + { + "label": "front.parts.sliders", + "file_type": "code", + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "_origin": "ast", + "community": 41, + "norm_label": "front.parts.sliders", + "id": "resources_views_front_arrivals_blade_php_front_parts_sliders", + "community_name": "Community 41" + }, + { + "label": "departures.blade.php", + "file_type": "code", + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "_origin": "ast", + "community": 42, + "norm_label": "departures.blade.php", + "id": "resources_views_front_departures_blade", + "community_name": "Community 42" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "_origin": "ast", + "community": 42, + "norm_label": "layouts.title", + "id": "resources_views_front_departures_blade_php_layouts_title", + "community_name": "Community 42" + }, + { + "label": "front.parts.tabs", + "file_type": "code", + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "_origin": "ast", + "community": 42, + "norm_label": "front.parts.tabs", + "id": "resources_views_front_departures_blade_php_front_parts_tabs", + "community_name": "Community 42" + }, + { + "label": "front.parts.form", + "file_type": "code", + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "_origin": "ast", + "community": 42, + "norm_label": "front.parts.form", + "id": "resources_views_front_departures_blade_php_front_parts_form", + "community_name": "Community 42" + }, + { + "label": "front.parts.sliders", + "file_type": "code", + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "_origin": "ast", + "community": 42, + "norm_label": "front.parts.sliders", + "id": "resources_views_front_departures_blade_php_front_parts_sliders", + "community_name": "Community 42" + }, + { + "label": "form.blade.php", + "file_type": "code", + "source_file": "resources/views/front/parts/form.blade.php", + "source_location": null, + "_origin": "ast", + "community": 198, + "norm_label": "form.blade.php", + "id": "resources_views_front_parts_form_blade", + "community_name": "Community 198" + }, + { + "label": "sliders.blade.php", + "file_type": "code", + "source_file": "resources/views/front/parts/sliders.blade.php", + "source_location": null, + "_origin": "ast", + "community": 199, + "norm_label": "sliders.blade.php", + "id": "resources_views_front_parts_sliders_blade", + "community_name": "Community 199" + }, + { + "label": "tabs.blade.php", + "file_type": "code", + "source_file": "resources/views/front/parts/tabs.blade.php", + "source_location": null, + "_origin": "ast", + "community": 200, + "norm_label": "tabs.blade.php", + "id": "resources_views_front_parts_tabs_blade", + "community_name": "Community 200" + }, + { + "label": "routes.blade.php", + "file_type": "code", + "source_file": "resources/views/front/routes.blade.php", + "source_location": null, + "_origin": "ast", + "community": 110, + "norm_label": "routes.blade.php", + "id": "resources_views_front_routes_blade", + "community_name": "Community 110" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/front/routes.blade.php", + "source_location": null, + "_origin": "ast", + "community": 110, + "norm_label": "layouts.title", + "id": "resources_views_front_routes_blade_php_layouts_title", + "community_name": "Community 110" + }, + { + "label": "front.parts.tabs", + "file_type": "code", + "source_file": "resources/views/front/routes.blade.php", + "source_location": null, + "_origin": "ast", + "community": 110, + "norm_label": "front.parts.tabs", + "id": "resources_views_front_routes_blade_php_front_parts_tabs", + "community_name": "Community 110" + }, + { + "label": "app.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "_origin": "ast", + "community": 39, + "norm_label": "app.blade.php", + "id": "resources_views_layouts_app_blade", + "community_name": "Community 39" + }, + { + "label": "layouts.header", + "file_type": "code", + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "_origin": "ast", + "community": 39, + "norm_label": "layouts.header", + "id": "resources_views_layouts_app_blade_php_layouts_header", + "community_name": "Community 39" + }, + { + "label": "layouts.menu", + "file_type": "code", + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "_origin": "ast", + "community": 39, + "norm_label": "layouts.menu", + "id": "resources_views_layouts_app_blade_php_layouts_menu", + "community_name": "Community 39" + }, + { + "label": "parts.map", + "file_type": "code", + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "_origin": "ast", + "community": 39, + "norm_label": "parts.map", + "id": "parts_map", + "community_name": "Community 39" + }, + { + "label": "layouts.footer", + "file_type": "code", + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "_origin": "ast", + "community": 39, + "norm_label": "layouts.footer", + "id": "layouts_footer", + "community_name": "Community 39" + }, + { + "label": "appStatic.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/appStatic.blade.php", + "source_location": null, + "_origin": "ast", + "community": 111, + "norm_label": "appstatic.blade.php", + "id": "resources_views_layouts_appstatic_blade", + "community_name": "Community 111" + }, + { + "label": "layouts.header", + "file_type": "code", + "source_file": "resources/views/layouts/appStatic.blade.php", + "source_location": null, + "_origin": "ast", + "community": 111, + "norm_label": "layouts.header", + "id": "resources_views_layouts_appstatic_blade_php_layouts_header", + "community_name": "Community 111" + }, + { + "label": "layouts.menu", + "file_type": "code", + "source_file": "resources/views/layouts/appStatic.blade.php", + "source_location": null, + "_origin": "ast", + "community": 111, + "norm_label": "layouts.menu", + "id": "resources_views_layouts_appstatic_blade_php_layouts_menu", + "community_name": "Community 111" + }, + { + "label": "footer.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/footer.blade.php", + "source_location": null, + "_origin": "ast", + "community": 201, + "norm_label": "footer.blade.php", + "id": "resources_views_layouts_footer_blade", + "community_name": "Community 201" + }, + { + "label": "header.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/header.blade.php", + "source_location": null, + "_origin": "ast", + "community": 116, + "norm_label": "header.blade.php", + "id": "resources_views_layouts_header_blade", + "community_name": "Community 116" + }, + { + "label": "layouts.tracking", + "file_type": "code", + "source_file": "resources/views/layouts/header.blade.php", + "source_location": null, + "_origin": "ast", + "community": 116, + "norm_label": "layouts.tracking", + "id": "layouts_tracking", + "community_name": "Community 116" + }, + { + "label": "legend.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/legend.blade.php", + "source_location": null, + "_origin": "ast", + "community": 202, + "norm_label": "legend.blade.php", + "id": "resources_views_layouts_legend_blade", + "community_name": "Community 202" + }, + { + "label": "menu.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/menu.blade.php", + "source_location": null, + "_origin": "ast", + "community": 203, + "norm_label": "menu.blade.php", + "id": "resources_views_layouts_menu_blade", + "community_name": "Community 203" + }, + { + "label": "title.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/title.blade.php", + "source_location": null, + "_origin": "ast", + "community": 204, + "norm_label": "title.blade.php", + "id": "resources_views_layouts_title_blade", + "community_name": "Community 204" + }, + { + "label": "tracking.blade.php", + "file_type": "code", + "source_file": "resources/views/layouts/tracking.blade.php", + "source_location": null, + "_origin": "ast", + "community": 205, + "norm_label": "tracking.blade.php", + "id": "resources_views_layouts_tracking_blade", + "community_name": "Community 205" + }, + { + "label": "create.blade.php", + "file_type": "code", + "source_file": "resources/views/list/create.blade.php", + "source_location": null, + "_origin": "ast", + "community": 127, + "norm_label": "create.blade.php", + "id": "resources_views_list_create_blade", + "community_name": "Community 127" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/list/create.blade.php", + "source_location": null, + "_origin": "ast", + "community": 127, + "norm_label": "layouts.title", + "id": "resources_views_list_create_blade_php_layouts_title", + "community_name": "Community 127" + }, + { + "label": "edit.blade.php", + "file_type": "code", + "source_file": "resources/views/list/edit.blade.php", + "source_location": null, + "_origin": "ast", + "community": 128, + "norm_label": "edit.blade.php", + "id": "resources_views_list_edit_blade", + "community_name": "Community 128" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/list/edit.blade.php", + "source_location": null, + "_origin": "ast", + "community": 128, + "norm_label": "layouts.title", + "id": "resources_views_list_edit_blade_php_layouts_title", + "community_name": "Community 128" + }, + { + "label": "index.blade.php", + "file_type": "code", + "source_file": "resources/views/list/index.blade.php", + "source_location": null, + "_origin": "ast", + "community": 129, + "norm_label": "index.blade.php", + "id": "resources_views_list_index_blade", + "community_name": "Community 129" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/list/index.blade.php", + "source_location": null, + "_origin": "ast", + "community": 129, + "norm_label": "layouts.title", + "id": "resources_views_list_index_blade_php_layouts_title", + "community_name": "Community 129" + }, + { + "label": "discord.blade.php", + "file_type": "code", + "source_file": "resources/views/parts/discord.blade.php", + "source_location": null, + "_origin": "ast", + "community": 206, + "norm_label": "discord.blade.php", + "id": "resources_views_parts_discord_blade", + "community_name": "Community 206" + }, + { + "label": "map.blade.php", + "file_type": "code", + "source_file": "resources/views/parts/map.blade.php", + "source_location": null, + "_origin": "ast", + "community": 207, + "norm_label": "map.blade.php", + "id": "resources_views_parts_map_blade", + "community_name": "Community 207" + }, + { + "label": "privacy.blade.php", + "file_type": "code", + "source_file": "resources/views/privacy.blade.php", + "source_location": null, + "_origin": "ast", + "community": 130, + "norm_label": "privacy.blade.php", + "id": "resources_views_privacy_blade", + "community_name": "Community 130" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/privacy.blade.php", + "source_location": null, + "_origin": "ast", + "community": 130, + "norm_label": "layouts.title", + "id": "resources_views_privacy_blade_php_layouts_title", + "community_name": "Community 130" + }, + { + "label": "scenery.blade.php", + "file_type": "code", + "source_file": "resources/views/scenery.blade.php", + "source_location": null, + "_origin": "ast", + "community": 131, + "norm_label": "scenery.blade.php", + "id": "resources_views_scenery_blade", + "community_name": "Community 131" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/scenery.blade.php", + "source_location": null, + "_origin": "ast", + "community": 131, + "norm_label": "layouts.title", + "id": "resources_views_scenery_blade_php_layouts_title", + "community_name": "Community 131" + }, + { + "label": "create.blade.php", + "file_type": "code", + "source_file": "resources/views/scenery/create.blade.php", + "source_location": null, + "_origin": "ast", + "community": 132, + "norm_label": "create.blade.php", + "id": "resources_views_scenery_create_blade", + "community_name": "Community 132" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/scenery/create.blade.php", + "source_location": null, + "_origin": "ast", + "community": 132, + "norm_label": "layouts.title", + "id": "resources_views_scenery_create_blade_php_layouts_title", + "community_name": "Community 132" + }, + { + "label": "edit.blade.php", + "file_type": "code", + "source_file": "resources/views/scenery/edit.blade.php", + "source_location": null, + "_origin": "ast", + "community": 133, + "norm_label": "edit.blade.php", + "id": "resources_views_scenery_edit_blade", + "community_name": "Community 133" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/scenery/edit.blade.php", + "source_location": null, + "_origin": "ast", + "community": 133, + "norm_label": "layouts.title", + "id": "resources_views_scenery_edit_blade_php_layouts_title", + "community_name": "Community 133" + }, + { + "label": "airports.blade.php", + "file_type": "code", + "source_file": "resources/views/search/airports.blade.php", + "source_location": null, + "_origin": "ast", + "community": 112, + "norm_label": "airports.blade.php", + "id": "resources_views_search_airports_blade", + "community_name": "Community 112" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/search/airports.blade.php", + "source_location": null, + "_origin": "ast", + "community": 112, + "norm_label": "layouts.title", + "id": "resources_views_search_airports_blade_php_layouts_title", + "community_name": "Community 112" + }, + { + "label": "layouts.legend", + "file_type": "code", + "source_file": "resources/views/search/airports.blade.php", + "source_location": null, + "_origin": "ast", + "community": 112, + "norm_label": "layouts.legend", + "id": "resources_views_search_airports_blade_php_layouts_legend", + "community_name": "Community 112" + }, + { + "label": "routes.blade.php", + "file_type": "code", + "source_file": "resources/views/search/routes.blade.php", + "source_location": null, + "_origin": "ast", + "community": 134, + "norm_label": "routes.blade.php", + "id": "resources_views_search_routes_blade", + "community_name": "Community 134" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/search/routes.blade.php", + "source_location": null, + "_origin": "ast", + "community": 134, + "norm_label": "layouts.title", + "id": "resources_views_search_routes_blade_php_layouts_title", + "community_name": "Community 134" + }, + { + "label": "top.blade.php", + "file_type": "code", + "source_file": "resources/views/top.blade.php", + "source_location": null, + "_origin": "ast", + "community": 113, + "norm_label": "top.blade.php", + "id": "resources_views_top_blade", + "community_name": "Community 113" + }, + { + "label": "layouts.title", + "file_type": "code", + "source_file": "resources/views/top.blade.php", + "source_location": null, + "_origin": "ast", + "community": 113, + "norm_label": "layouts.title", + "id": "resources_views_top_blade_php_layouts_title", + "community_name": "Community 113" + }, + { + "label": "layouts.legend", + "file_type": "code", + "source_file": "resources/views/top.blade.php", + "source_location": null, + "_origin": "ast", + "community": 113, + "norm_label": "layouts.legend", + "id": "resources_views_top_blade_php_layouts_legend", + "community_name": "Community 113" + }, + { + "label": "button.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/button.blade.php", + "source_location": null, + "_origin": "ast", + "community": 208, + "norm_label": "button.blade.php", + "id": "resources_views_vendor_mail_html_button_blade", + "community_name": "Community 208" + }, + { + "label": "footer.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/footer.blade.php", + "source_location": null, + "_origin": "ast", + "community": 209, + "norm_label": "footer.blade.php", + "id": "resources_views_vendor_mail_html_footer_blade", + "community_name": "Community 209" + }, + { + "label": "header.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/header.blade.php", + "source_location": null, + "_origin": "ast", + "community": 210, + "norm_label": "header.blade.php", + "id": "resources_views_vendor_mail_html_header_blade", + "community_name": "Community 210" + }, + { + "label": "layout.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/layout.blade.php", + "source_location": null, + "_origin": "ast", + "community": 211, + "norm_label": "layout.blade.php", + "id": "resources_views_vendor_mail_html_layout_blade", + "community_name": "Community 211" + }, + { + "label": "message.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/message.blade.php", + "source_location": null, + "_origin": "ast", + "community": 212, + "norm_label": "message.blade.php", + "id": "resources_views_vendor_mail_html_message_blade", + "community_name": "Community 212" + }, + { + "label": "panel.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/panel.blade.php", + "source_location": null, + "_origin": "ast", + "community": 213, + "norm_label": "panel.blade.php", + "id": "resources_views_vendor_mail_html_panel_blade", + "community_name": "Community 213" + }, + { + "label": "subcopy.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/subcopy.blade.php", + "source_location": null, + "_origin": "ast", + "community": 214, + "norm_label": "subcopy.blade.php", + "id": "resources_views_vendor_mail_html_subcopy_blade", + "community_name": "Community 214" + }, + { + "label": "table.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/html/table.blade.php", + "source_location": null, + "_origin": "ast", + "community": 215, + "norm_label": "table.blade.php", + "id": "resources_views_vendor_mail_html_table_blade", + "community_name": "Community 215" + }, + { + "label": "button.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/button.blade.php", + "source_location": null, + "_origin": "ast", + "community": 216, + "norm_label": "button.blade.php", + "id": "resources_views_vendor_mail_text_button_blade", + "community_name": "Community 216" + }, + { + "label": "footer.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/footer.blade.php", + "source_location": null, + "_origin": "ast", + "community": 217, + "norm_label": "footer.blade.php", + "id": "resources_views_vendor_mail_text_footer_blade", + "community_name": "Community 217" + }, + { + "label": "header.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/header.blade.php", + "source_location": null, + "_origin": "ast", + "community": 218, + "norm_label": "header.blade.php", + "id": "resources_views_vendor_mail_text_header_blade", + "community_name": "Community 218" + }, + { + "label": "layout.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/layout.blade.php", + "source_location": null, + "_origin": "ast", + "community": 219, + "norm_label": "layout.blade.php", + "id": "resources_views_vendor_mail_text_layout_blade", + "community_name": "Community 219" + }, + { + "label": "message.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/message.blade.php", + "source_location": null, + "_origin": "ast", + "community": 220, + "norm_label": "message.blade.php", + "id": "resources_views_vendor_mail_text_message_blade", + "community_name": "Community 220" + }, + { + "label": "panel.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/panel.blade.php", + "source_location": null, + "_origin": "ast", + "community": 221, + "norm_label": "panel.blade.php", + "id": "resources_views_vendor_mail_text_panel_blade", + "community_name": "Community 221" + }, + { + "label": "subcopy.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/subcopy.blade.php", + "source_location": null, + "_origin": "ast", + "community": 222, + "norm_label": "subcopy.blade.php", + "id": "resources_views_vendor_mail_text_subcopy_blade", + "community_name": "Community 222" + }, + { + "label": "table.blade.php", + "file_type": "code", + "source_file": "resources/views/vendor/mail/text/table.blade.php", + "source_location": null, + "_origin": "ast", + "community": 223, + "norm_label": "table.blade.php", + "id": "resources_views_vendor_mail_text_table_blade", + "community_name": "Community 223" + }, + { + "label": "api.php", + "file_type": "code", + "source_file": "routes/api.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "api.php", + "id": "routes_api", + "community_name": "Community 18" + }, + { + "label": "channels.php", + "file_type": "code", + "source_file": "routes/channels.php", + "source_location": "L1", + "_origin": "ast", + "community": 224, + "norm_label": "channels.php", + "id": "routes_channels", + "community_name": "Community 224" + }, + { + "label": "console.php", + "file_type": "code", + "source_file": "routes/console.php", + "source_location": "L1", + "_origin": "ast", + "community": 225, + "norm_label": "console.php", + "id": "routes_console", + "community_name": "Community 225" + }, + { + "label": "web.php", + "file_type": "code", + "source_file": "routes/web.php", + "source_location": "L1", + "_origin": "ast", + "community": 18, + "norm_label": "web.php", + "id": "routes_web", + "community_name": "Community 18" + }, + { + "label": "CreatesApplication.php", + "file_type": "code", + "source_file": "tests/CreatesApplication.php", + "source_location": "L1", + "_origin": "ast", + "community": 135, + "norm_label": "createsapplication.php", + "id": "tests_createsapplication", + "community_name": "Community 135" + }, + { + "label": "createApplication()", + "file_type": "code", + "source_file": "tests/CreatesApplication.php", + "source_location": "L15", + "_origin": "ast", + "community": 135, + "norm_label": "createapplication()", + "id": "tests_createsapplication_createapplication", + "community_name": "Community 135" + }, + { + "label": "AdminTest.php", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "admintest.php", + "id": "tests_feature_admintest", + "community_name": "Community 20" + }, + { + "label": "AdminTest", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L9", + "_origin": "ast", + "community": 7, + "norm_label": "admintest", + "id": "tests_feature_admintest_admintest", + "community_name": "Community 7" + }, + { + "label": "RefreshDatabase", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 20, + "norm_label": "refreshdatabase", + "id": "refreshdatabase", + "community_name": "Community 20" + }, + { + "label": ".test_admin_page_requires_authentication()", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L17", + "_origin": "ast", + "community": 7, + "norm_label": ".test_admin_page_requires_authentication()", + "id": "tests_feature_admintest_admintest_test_admin_page_requires_authentication", + "community_name": "Community 7" + }, + { + "label": ".test_non_admin_user_cannot_access_admin_page()", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L24", + "_origin": "ast", + "community": 7, + "norm_label": ".test_non_admin_user_cannot_access_admin_page()", + "id": "tests_feature_admintest_admintest_test_non_admin_user_cannot_access_admin_page", + "community_name": "Community 7" + }, + { + "label": ".test_admin_user_can_access_admin_page()", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L33", + "_origin": "ast", + "community": 7, + "norm_label": ".test_admin_user_can_access_admin_page()", + "id": "tests_feature_admintest_admintest_test_admin_user_can_access_admin_page", + "community_name": "Community 7" + }, + { + "label": ".test_admin_flag_is_false_for_regular_users()", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L46", + "_origin": "ast", + "community": 7, + "norm_label": ".test_admin_flag_is_false_for_regular_users()", + "id": "tests_feature_admintest_admintest_test_admin_flag_is_false_for_regular_users", + "community_name": "Community 7" + }, + { + "label": ".test_admin_flag_is_true_for_admin_users()", + "file_type": "code", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L53", + "_origin": "ast", + "community": 7, + "norm_label": ".test_admin_flag_is_true_for_admin_users()", + "id": "tests_feature_admintest_admintest_test_admin_flag_is_true_for_admin_users", + "community_name": "Community 7" + }, + { + "label": "ApiTest.php", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "apitest.php", + "id": "tests_feature_apitest", + "community_name": "Community 20" + }, + { + "label": "ApiTest", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L12", + "_origin": "ast", + "community": 16, + "norm_label": "apitest", + "id": "tests_feature_apitest_apitest", + "community_name": "Community 16" + }, + { + "label": ".createApiKey()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L23", + "_origin": "ast", + "community": 16, + "norm_label": ".createapikey()", + "id": "tests_feature_apitest_apitest_createapikey", + "community_name": "Community 16" + }, + { + "label": ".test_authenticated_check_returns_false_for_guest()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L37", + "_origin": "ast", + "community": 16, + "norm_label": ".test_authenticated_check_returns_false_for_guest()", + "id": "tests_feature_apitest_apitest_test_authenticated_check_returns_false_for_guest", + "community_name": "Community 16" + }, + { + "label": ".test_authenticated_check_returns_true_for_logged_in_user()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L45", + "_origin": "ast", + "community": 16, + "norm_label": ".test_authenticated_check_returns_true_for_logged_in_user()", + "id": "tests_feature_apitest_apitest_test_authenticated_check_returns_true_for_logged_in_user", + "community_name": "Community 16" + }, + { + "label": ".test_get_mapdata_from_known_icao_returns_success()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L59", + "_origin": "ast", + "community": 16, + "norm_label": ".test_get_mapdata_from_known_icao_returns_success()", + "id": "tests_feature_apitest_apitest_test_get_mapdata_from_known_icao_returns_success", + "community_name": "Community 16" + }, + { + "label": ".test_get_mapdata_from_unknown_icao_returns_validation_error()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L67", + "_origin": "ast", + "community": 16, + "norm_label": ".test_get_mapdata_from_unknown_icao_returns_validation_error()", + "id": "tests_feature_apitest_apitest_test_get_mapdata_from_unknown_icao_returns_validation_error", + "community_name": "Community 16" + }, + { + "label": ".test_get_mapdata_requires_icao_field()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L75", + "_origin": "ast", + "community": 16, + "norm_label": ".test_get_mapdata_requires_icao_field()", + "id": "tests_feature_apitest_apitest_test_get_mapdata_requires_icao_field", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_requires_valid_token()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L87", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_requires_valid_token()", + "id": "tests_feature_apitest_apitest_test_api_search_requires_valid_token", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_is_rejected_with_disabled_token()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L97", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_is_rejected_with_disabled_token()", + "id": "tests_feature_apitest_apitest_test_api_search_is_rejected_with_disabled_token", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_fails_validation_without_codeletter()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L111", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_fails_validation_without_codeletter()", + "id": "tests_feature_apitest_apitest_test_api_search_fails_validation_without_codeletter", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_rejects_unknown_score_reason()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L123", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_rejects_unknown_score_reason()", + "id": "tests_feature_apitest_apitest_test_api_search_rejects_unknown_score_reason", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_rejects_non_array_scores()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L138", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_rejects_non_array_scores()", + "id": "tests_feature_apitest_apitest_test_api_search_rejects_non_array_scores", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_rejects_out_of_range_score_value()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L151", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_rejects_out_of_range_score_value()", + "id": "tests_feature_apitest_apitest_test_api_search_rejects_out_of_range_score_value", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_accepts_valid_scores()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L164", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_accepts_valid_scores()", + "id": "tests_feature_apitest_apitest_test_api_search_accepts_valid_scores", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_restricts_results_to_distance_bounds()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L177", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_restricts_results_to_distance_bounds()", + "id": "tests_feature_apitest_apitest_test_api_search_restricts_results_to_distance_bounds", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_rejects_negative_distance()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L195", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_rejects_negative_distance()", + "id": "tests_feature_apitest_apitest_test_api_search_rejects_negative_distance", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_returns_error_when_both_arrival_and_departure_given()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L208", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_returns_error_when_both_arrival_and_departure_given()", + "id": "tests_feature_apitest_apitest_test_api_search_returns_error_when_both_arrival_and_departure_given", + "community_name": "Community 16" + }, + { + "label": ".test_api_search_returns_error_when_neither_arrival_nor_departure_given()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L221", + "_origin": "ast", + "community": 16, + "norm_label": ".test_api_search_returns_error_when_neither_arrival_nor_departure_given()", + "id": "tests_feature_apitest_apitest_test_api_search_returns_error_when_neither_arrival_nor_departure_given", + "community_name": "Community 16" + }, + { + "label": ".test_list_airports_endpoint_requires_auth()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L236", + "_origin": "ast", + "community": 16, + "norm_label": ".test_list_airports_endpoint_requires_auth()", + "id": "tests_feature_apitest_apitest_test_list_airports_endpoint_requires_auth", + "community_name": "Community 16" + }, + { + "label": ".test_list_airports_endpoint_returns_success_for_authenticated_user()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L243", + "_origin": "ast", + "community": 9, + "norm_label": ".test_list_airports_endpoint_returns_success_for_authenticated_user()", + "id": "tests_feature_apitest_apitest_test_list_airports_endpoint_returns_success_for_authenticated_user", + "community_name": "Community 9" + }, + { + "label": ".test_airport_endpoint_returns_422_for_nonexistent_airport_id()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L266", + "_origin": "ast", + "community": 16, + "norm_label": ".test_airport_endpoint_returns_422_for_nonexistent_airport_id()", + "id": "tests_feature_apitest_apitest_test_airport_endpoint_returns_422_for_nonexistent_airport_id", + "community_name": "Community 16" + }, + { + "label": ".test_airport_endpoint_returns_422_when_required_field_is_missing()", + "file_type": "code", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L276", + "_origin": "ast", + "community": 16, + "norm_label": ".test_airport_endpoint_returns_422_when_required_field_is_missing()", + "id": "tests_feature_apitest_apitest_test_airport_endpoint_returns_422_when_required_field_is_missing", + "community_name": "Community 16" + }, + { + "label": "ResponseTest.php", + "file_type": "code", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "responsetest.php", + "id": "tests_feature_responsetest", + "community_name": "Community 20" + }, + { + "label": "ResponseTest", + "file_type": "code", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L7", + "_origin": "ast", + "community": 20, + "norm_label": "responsetest", + "id": "tests_feature_responsetest_responsetest", + "community_name": "Community 20" + }, + { + "label": ".test_the_application_returns_a_successful_response()", + "file_type": "code", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L14", + "_origin": "ast", + "community": 20, + "norm_label": ".test_the_application_returns_a_successful_response()", + "id": "tests_feature_responsetest_responsetest_test_the_application_returns_a_successful_response", + "community_name": "Community 20" + }, + { + "label": "SceneryTest.php", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "scenerytest.php", + "id": "tests_feature_scenerytest", + "community_name": "Community 20" + }, + { + "label": "SceneryTest", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L12", + "_origin": "ast", + "community": 7, + "norm_label": "scenerytest", + "id": "tests_feature_scenerytest_scenerytest", + "community_name": "Community 7" + }, + { + "label": ".test_scenery_create_page_requires_authentication()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L20", + "_origin": "ast", + "community": 7, + "norm_label": ".test_scenery_create_page_requires_authentication()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_create_page_requires_authentication", + "community_name": "Community 7" + }, + { + "label": ".test_authenticated_user_can_view_scenery_create_page()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L27", + "_origin": "ast", + "community": 7, + "norm_label": ".test_authenticated_user_can_view_scenery_create_page()", + "id": "tests_feature_scenerytest_scenerytest_test_authenticated_user_can_view_scenery_create_page", + "community_name": "Community 7" + }, + { + "label": ".test_scenery_create_page_shows_existing_developers_for_known_icao()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L36", + "_origin": "ast", + "community": 7, + "norm_label": ".test_scenery_create_page_shows_existing_developers_for_known_icao()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_create_page_shows_existing_developers_for_known_icao", + "community_name": "Community 7" + }, + { + "label": ".test_user_can_submit_a_scenery_suggestion()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L49", + "_origin": "ast", + "community": 7, + "norm_label": ".test_user_can_submit_a_scenery_suggestion()", + "id": "tests_feature_scenerytest_scenerytest_test_user_can_submit_a_scenery_suggestion", + "community_name": "Community 7" + }, + { + "label": ".test_scenery_suggestion_is_stored_as_unpublished()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L70", + "_origin": "ast", + "community": 22, + "norm_label": ".test_scenery_suggestion_is_stored_as_unpublished()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_is_stored_as_unpublished", + "community_name": "Community 22" + }, + { + "label": ".test_scenery_suggestion_fails_with_invalid_icao()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L91", + "_origin": "ast", + "community": 7, + "norm_label": ".test_scenery_suggestion_fails_with_invalid_icao()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_icao", + "community_name": "Community 7" + }, + { + "label": ".test_scenery_suggestion_fails_with_invalid_url()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L106", + "_origin": "ast", + "community": 7, + "norm_label": ".test_scenery_suggestion_fails_with_invalid_url()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_url", + "community_name": "Community 7" + }, + { + "label": ".test_scenery_suggestion_requires_at_least_one_simulator()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L122", + "_origin": "ast", + "community": 7, + "norm_label": ".test_scenery_suggestion_requires_at_least_one_simulator()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_requires_at_least_one_simulator", + "community_name": "Community 7" + }, + { + "label": ".test_scenery_suggestion_associates_suggested_by_user()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L137", + "_origin": "ast", + "community": 22, + "norm_label": ".test_scenery_suggestion_associates_suggested_by_user()", + "id": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_associates_suggested_by_user", + "community_name": "Community 22" + }, + { + "label": ".test_duplicate_developer_is_reused_for_new_simulator()", + "file_type": "code", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L156", + "_origin": "ast", + "community": 7, + "norm_label": ".test_duplicate_developer_is_reused_for_new_simulator()", + "id": "tests_feature_scenerytest_scenerytest_test_duplicate_developer_is_reused_for_new_simulator", + "community_name": "Community 7" + }, + { + "label": "ScorePredictionTest.php", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "scorepredictiontest.php", + "id": "tests_feature_scorepredictiontest", + "community_name": "Community 20" + }, + { + "label": "ScorePredictionTest", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L11", + "_origin": "ast", + "community": 3, + "norm_label": "scorepredictiontest", + "id": "tests_feature_scorepredictiontest_scorepredictiontest", + "community_name": "Community 3" + }, + { + "label": ".makeScore()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L15", + "_origin": "ast", + "community": 3, + "norm_label": ".makescore()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_makescore", + "community_name": "Community 3" + }, + { + "label": ".makeTafPeriod()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L25", + "_origin": "ast", + "community": 3, + "norm_label": ".maketafperiod()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod", + "community_name": "Community 3" + }, + { + "label": ".matchedIds()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L41", + "_origin": "ast", + "community": 3, + "norm_label": ".matchedids()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids", + "community_name": "Community 3" + }, + { + "label": ".test_exact_sources_match_only_when_window_contains_eta()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L53", + "_origin": "ast", + "community": 3, + "norm_label": ".test_exact_sources_match_only_when_window_contains_eta()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_exact_sources_match_only_when_window_contains_eta", + "community_name": "Community 3" + }, + { + "label": ".test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L65", + "_origin": "ast", + "community": 3, + "norm_label": ".test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon", + "community_name": "Community 3" + }, + { + "label": ".test_predicted_presence_matches_with_one_hour_overlap()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L88", + "_origin": "ast", + "community": 3, + "norm_label": ".test_predicted_presence_matches_with_one_hour_overlap()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_predicted_presence_matches_with_one_hour_overlap", + "community_name": "Community 3" + }, + { + "label": ".test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L111", + "_origin": "ast", + "community": 3, + "norm_label": ".test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar", + "community_name": "Community 3" + }, + { + "label": ".test_metar_falls_back_when_no_taf_covers_eta()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L135", + "_origin": "ast", + "community": 3, + "norm_label": ".test_metar_falls_back_when_no_taf_covers_eta()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_falls_back_when_no_taf_covers_eta", + "community_name": "Community 3" + }, + { + "label": ".test_scores_at_eta_mirrors_the_query_matching()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L156", + "_origin": "ast", + "community": 3, + "norm_label": ".test_scores_at_eta_mirrors_the_query_matching()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_scores_at_eta_mirrors_the_query_matching", + "community_name": "Community 3" + }, + { + "label": ".test_display_scores_serve_current_status_before_forecasts()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L177", + "_origin": "ast", + "community": 3, + "norm_label": ".test_display_scores_serve_current_status_before_forecasts()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_display_scores_serve_current_status_before_forecasts", + "community_name": "Community 3" + }, + { + "label": ".test_popular_tooltip_shows_the_movement_count()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L197", + "_origin": "ast", + "community": 3, + "norm_label": ".test_popular_tooltip_shows_the_movement_count()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_popular_tooltip_shows_the_movement_count", + "community_name": "Community 3" + }, + { + "label": ".test_atc_booking_helpers_expose_facilities_in_order()", + "file_type": "code", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L208", + "_origin": "ast", + "community": 3, + "norm_label": ".test_atc_booking_helpers_expose_facilities_in_order()", + "id": "tests_feature_scorepredictiontest_scorepredictiontest_test_atc_booking_helpers_expose_facilities_in_order", + "community_name": "Community 3" + }, + { + "label": "SearchTest.php", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "searchtest.php", + "id": "tests_feature_searchtest", + "community_name": "Community 20" + }, + { + "label": "SearchTest", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L11", + "_origin": "ast", + "community": 5, + "norm_label": "searchtest", + "id": "tests_feature_searchtest_searchtest", + "community_name": "Community 5" + }, + { + "label": ".test_arrival_search_page_loads()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L59", + "_origin": "ast", + "community": 5, + "norm_label": ".test_arrival_search_page_loads()", + "id": "tests_feature_searchtest_searchtest_test_arrival_search_page_loads", + "community_name": "Community 5" + }, + { + "label": ".test_departure_search_page_loads()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L66", + "_origin": "ast", + "community": 5, + "norm_label": ".test_departure_search_page_loads()", + "id": "tests_feature_searchtest_searchtest_test_departure_search_page_loads", + "community_name": "Community 5" + }, + { + "label": ".test_route_search_page_loads()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L73", + "_origin": "ast", + "community": 5, + "norm_label": ".test_route_search_page_loads()", + "id": "tests_feature_searchtest_searchtest_test_route_search_page_loads", + "community_name": "Community 5" + }, + { + "label": ".test_search_requires_direction()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L84", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_requires_direction()", + "id": "tests_feature_searchtest_searchtest_test_search_requires_direction", + "community_name": "Community 5" + }, + { + "label": ".test_search_fails_with_invalid_codeletter()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L94", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_fails_with_invalid_codeletter()", + "id": "tests_feature_searchtest_searchtest_test_search_fails_with_invalid_codeletter", + "community_name": "Community 5" + }, + { + "label": ".test_search_fails_with_non_array_scores()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L103", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_fails_with_non_array_scores()", + "id": "tests_feature_searchtest_searchtest_test_search_fails_with_non_array_scores", + "community_name": "Community 5" + }, + { + "label": ".test_search_fails_with_invalid_metcondition()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L112", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_fails_with_invalid_metcondition()", + "id": "tests_feature_searchtest_searchtest_test_search_fails_with_invalid_metcondition", + "community_name": "Community 5" + }, + { + "label": ".test_search_edit_redirects_to_arrival_page_for_departure_direction()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L125", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_edit_redirects_to_arrival_page_for_departure_direction()", + "id": "tests_feature_searchtest_searchtest_test_search_edit_redirects_to_arrival_page_for_departure_direction", + "community_name": "Community 5" + }, + { + "label": ".test_search_edit_redirects_to_departure_page_for_arrival_direction()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L134", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_edit_redirects_to_departure_page_for_arrival_direction()", + "id": "tests_feature_searchtest_searchtest_test_search_edit_redirects_to_departure_page_for_arrival_direction", + "community_name": "Community 5" + }, + { + "label": ".test_search_fails_with_unrealistic_flight_length_and_destinations()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L147", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_fails_with_unrealistic_flight_length_and_destinations()", + "id": "tests_feature_searchtest_searchtest_test_search_fails_with_unrealistic_flight_length_and_destinations", + "community_name": "Community 5" + }, + { + "label": ".test_search_doesnt_show_airport_without_metar()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L159", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_doesnt_show_airport_without_metar()", + "id": "tests_feature_searchtest_searchtest_test_search_doesnt_show_airport_without_metar", + "community_name": "Community 5" + }, + { + "label": ".test_search_only_shows_domestic_when_searching_for_domestic()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L174", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_only_shows_domestic_when_searching_for_domestic()", + "id": "tests_feature_searchtest_searchtest_test_search_only_shows_domestic_when_searching_for_domestic", + "community_name": "Community 5" + }, + { + "label": ".test_default_search_returns_at_least_3_results()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L190", + "_origin": "ast", + "community": 5, + "norm_label": ".test_default_search_returns_at_least_3_results()", + "id": "tests_feature_searchtest_searchtest_test_default_search_returns_at_least_3_results", + "community_name": "Community 5" + }, + { + "label": ".test_search_returns_at_most_20_suggestions_ordered_by_score_count()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L200", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_returns_at_most_20_suggestions_ordered_by_score_count()", + "id": "tests_feature_searchtest_searchtest_test_search_returns_at_most_20_suggestions_ordered_by_score_count", + "community_name": "Community 5" + }, + { + "label": ".test_whitelist_restricts_results_to_whitelisted_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L213", + "_origin": "ast", + "community": 9, + "norm_label": ".test_whitelist_restricts_results_to_whitelisted_airports()", + "id": "tests_feature_searchtest_searchtest_test_whitelist_restricts_results_to_whitelisted_airports", + "community_name": "Community 9" + }, + { + "label": ".test_search_airtime_is_within_searched_bounds()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L231", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_airtime_is_within_searched_bounds()", + "id": "tests_feature_searchtest_searchtest_test_search_airtime_is_within_searched_bounds", + "community_name": "Community 5" + }, + { + "label": ".test_search_distance_is_within_searched_bounds()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L246", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_distance_is_within_searched_bounds()", + "id": "tests_feature_searchtest_searchtest_test_search_distance_is_within_searched_bounds", + "community_name": "Community 5" + }, + { + "label": ".test_search_fails_with_out_of_range_distance()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L261", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_fails_with_out_of_range_distance()", + "id": "tests_feature_searchtest_searchtest_test_search_fails_with_out_of_range_distance", + "community_name": "Community 5" + }, + { + "label": ".test_search_foggy_score_filter_returns_only_foggy_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L270", + "_origin": "ast", + "community": 5, + "norm_label": ".test_search_foggy_score_filter_returns_only_foggy_airports()", + "id": "tests_feature_searchtest_searchtest_test_search_foggy_score_filter_returns_only_foggy_airports", + "community_name": "Community 5" + }, + { + "label": ".test_metcondition_vfr_excludes_ifr_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L288", + "_origin": "ast", + "community": 5, + "norm_label": ".test_metcondition_vfr_excludes_ifr_airports()", + "id": "tests_feature_searchtest_searchtest_test_metcondition_vfr_excludes_ifr_airports", + "community_name": "Community 5" + }, + { + "label": ".test_metcondition_ifr_only_returns_ifr_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L302", + "_origin": "ast", + "community": 5, + "norm_label": ".test_metcondition_ifr_only_returns_ifr_airports()", + "id": "tests_feature_searchtest_searchtest_test_metcondition_ifr_only_returns_ifr_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_windy_only_shows_windy_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L320", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_windy_only_shows_windy_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_windy_only_shows_windy_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_gusts_only_shows_gusty_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L331", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_gusts_only_shows_gusty_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_gusts_only_shows_gusty_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_crosswind_only_shows_crosswind_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L342", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_crosswind_only_shows_crosswind_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_crosswind_only_shows_crosswind_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_sight_only_shows_reduced_sight_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L353", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_sight_only_shows_reduced_sight_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_sight_only_shows_reduced_sight_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_rvr_only_shows_rvr_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L364", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_rvr_only_shows_rvr_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_rvr_only_shows_rvr_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_ceiling_only_shows_low_ceiling_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L375", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_ceiling_only_shows_low_ceiling_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_ceiling_only_shows_low_ceiling_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_heavy_rain_only_shows_heavy_rain_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L386", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_heavy_rain_only_shows_heavy_rain_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_heavy_rain_only_shows_heavy_rain_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_heavy_snow_only_shows_heavy_snow_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L397", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_heavy_snow_only_shows_heavy_snow_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_heavy_snow_only_shows_heavy_snow_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_thunderstorm_only_shows_thunderstorm_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L408", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_thunderstorm_only_shows_thunderstorm_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_thunderstorm_only_shows_thunderstorm_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_vatsim_atc_only_shows_atc_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L419", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_vatsim_atc_only_shows_atc_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_vatsim_atc_only_shows_atc_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_vatsim_event_only_shows_event_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L430", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_vatsim_event_only_shows_event_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_vatsim_event_only_shows_event_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_vatsim_popular_only_shows_popular_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L441", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_vatsim_popular_only_shows_popular_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_vatsim_popular_only_shows_popular_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_foggy_exclusion_hides_scored_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L456", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_foggy_exclusion_hides_scored_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_foggy_exclusion_hides_scored_airports", + "community_name": "Community 5" + }, + { + "label": ".test_score_vatsim_popular_exclusion_hides_scored_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L467", + "_origin": "ast", + "community": 5, + "norm_label": ".test_score_vatsim_popular_exclusion_hides_scored_airports()", + "id": "tests_feature_searchtest_searchtest_test_score_vatsim_popular_exclusion_hides_scored_airports", + "community_name": "Community 5" + }, + { + "label": ".test_destination_small_airports_only_returns_small_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L482", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_small_airports_only_returns_small_airports()", + "id": "tests_feature_searchtest_searchtest_test_destination_small_airports_only_returns_small_airports", + "community_name": "Community 5" + }, + { + "label": ".test_destination_large_airports_only_excludes_smaller_types()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L495", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_large_airports_only_excludes_smaller_types()", + "id": "tests_feature_searchtest_searchtest_test_destination_large_airports_only_excludes_smaller_types", + "community_name": "Community 5" + }, + { + "label": ".test_destination_country_filter_returns_only_matching_country()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L508", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_country_filter_returns_only_matching_country()", + "id": "tests_feature_searchtest_searchtest_test_destination_country_filter_returns_only_matching_country", + "community_name": "Community 5" + }, + { + "label": ".test_destination_continent_filter_returns_only_matching_continent()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L521", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_continent_filter_returns_only_matching_continent()", + "id": "tests_feature_searchtest_searchtest_test_destination_continent_filter_returns_only_matching_continent", + "community_name": "Community 5" + }, + { + "label": ".test_destination_lighted_runways_only_excludes_unlighted_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L537", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_lighted_runways_only_excludes_unlighted_airports()", + "id": "tests_feature_searchtest_searchtest_test_destination_lighted_runways_only_excludes_unlighted_airports", + "community_name": "Community 5" + }, + { + "label": ".test_destination_unlighted_runways_only_returns_unlighted_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L551", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_unlighted_runways_only_returns_unlighted_airports()", + "id": "tests_feature_searchtest_searchtest_test_destination_unlighted_runways_only_returns_unlighted_airports", + "community_name": "Community 5" + }, + { + "label": ".test_destination_airbases_only_returns_airbase_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L565", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_airbases_only_returns_airbase_airports()", + "id": "tests_feature_searchtest_searchtest_test_destination_airbases_only_returns_airbase_airports", + "community_name": "Community 5" + }, + { + "label": ".test_destination_exclude_airbases_hides_airbase_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L579", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_exclude_airbases_hides_airbase_airports()", + "id": "tests_feature_searchtest_searchtest_test_destination_exclude_airbases_hides_airbase_airports", + "community_name": "Community 5" + }, + { + "label": ".test_destination_flight_direction_south_excludes_northern_airports()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L592", + "_origin": "ast", + "community": 5, + "norm_label": ".test_destination_flight_direction_south_excludes_northern_airports()", + "id": "tests_feature_searchtest_searchtest_test_destination_flight_direction_south_excludes_northern_airports", + "community_name": "Community 5" + }, + { + "label": ".paramsWithScore()", + "file_type": "code", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L610", + "_origin": "ast", + "community": 5, + "norm_label": ".paramswithscore()", + "id": "tests_feature_searchtest_searchtest_paramswithscore", + "community_name": "Community 5" + }, + { + "label": "TopAirportsTest.php", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "topairportstest.php", + "id": "tests_feature_topairportstest", + "community_name": "Community 14" + }, + { + "label": "TopAirportsTest", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L11", + "_origin": "ast", + "community": 3, + "norm_label": "topairportstest", + "id": "tests_feature_topairportstest_topairportstest", + "community_name": "Community 3" + }, + { + "label": ".test_top_page_loads()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L15", + "_origin": "ast", + "community": 3, + "norm_label": ".test_top_page_loads()", + "id": "tests_feature_topairportstest_topairportstest_test_top_page_loads", + "community_name": "Community 3" + }, + { + "label": ".test_top_airports_are_cached_per_variant()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L22", + "_origin": "ast", + "community": 3, + "norm_label": ".test_top_airports_are_cached_per_variant()", + "id": "tests_feature_topairportstest_topairportstest_test_top_airports_are_cached_per_variant", + "community_name": "Community 3" + }, + { + "label": ".test_aircraft_filter_excludes_airports_with_short_runways()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L35", + "_origin": "ast", + "community": 3, + "norm_label": ".test_aircraft_filter_excludes_airports_with_short_runways()", + "id": "tests_feature_topairportstest_topairportstest_test_aircraft_filter_excludes_airports_with_short_runways", + "community_name": "Community 3" + }, + { + "label": ".test_top_page_loads_with_aircraft_filter()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L52", + "_origin": "ast", + "community": 3, + "norm_label": ".test_top_page_loads_with_aircraft_filter()", + "id": "tests_feature_topairportstest_topairportstest_test_top_page_loads_with_aircraft_filter", + "community_name": "Community 3" + }, + { + "label": ".test_top_page_defaults_to_jm_aircraft()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L60", + "_origin": "ast", + "community": 3, + "norm_label": ".test_top_page_defaults_to_jm_aircraft()", + "id": "tests_feature_topairportstest_topairportstest_test_top_page_defaults_to_jm_aircraft", + "community_name": "Community 3" + }, + { + "label": ".test_top_page_aircraft_all_disables_the_filter()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L68", + "_origin": "ast", + "community": 3, + "norm_label": ".test_top_page_aircraft_all_disables_the_filter()", + "id": "tests_feature_topairportstest_topairportstest_test_top_page_aircraft_all_disables_the_filter", + "community_name": "Community 3" + }, + { + "label": ".test_top_page_invalid_aircraft_falls_back_to_default()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L76", + "_origin": "ast", + "community": 3, + "norm_label": ".test_top_page_invalid_aircraft_falls_back_to_default()", + "id": "tests_feature_topairportstest_topairportstest_test_top_page_invalid_aircraft_falls_back_to_default", + "community_name": "Community 3" + }, + { + "label": ".test_cached_result_is_served_without_recomputing()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L84", + "_origin": "ast", + "community": 3, + "norm_label": ".test_cached_result_is_served_without_recomputing()", + "id": "tests_feature_topairportstest_topairportstest_test_cached_result_is_served_without_recomputing", + "community_name": "Community 3" + }, + { + "label": ".test_whitelist_variant_bypasses_the_cache()", + "file_type": "code", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L97", + "_origin": "ast", + "community": 3, + "norm_label": ".test_whitelist_variant_bypasses_the_cache()", + "id": "tests_feature_topairportstest_topairportstest_test_whitelist_variant_bypasses_the_cache", + "community_name": "Community 3" + }, + { + "label": "UserAccountTest.php", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "useraccounttest.php", + "id": "tests_feature_useraccounttest", + "community_name": "Community 20" + }, + { + "label": "UserAccountTest", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L10", + "_origin": "ast", + "community": 17, + "norm_label": "useraccounttest", + "id": "tests_feature_useraccounttest_useraccounttest", + "community_name": "Community 17" + }, + { + "label": ".fakeTurnstile()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L18", + "_origin": "ast", + "community": 17, + "norm_label": ".faketurnstile()", + "id": "tests_feature_useraccounttest_useraccounttest_faketurnstile", + "community_name": "Community 17" + }, + { + "label": ".test_registration_page_loads()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L32", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_page_loads()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_page_loads", + "community_name": "Community 17" + }, + { + "label": ".test_user_can_register()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L43", + "_origin": "ast", + "community": 17, + "norm_label": ".test_user_can_register()", + "id": "tests_feature_useraccounttest_useraccounttest_test_user_can_register", + "community_name": "Community 17" + }, + { + "label": ".test_registration_fails_with_short_password()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L60", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_fails_with_short_password()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_short_password", + "community_name": "Community 17" + }, + { + "label": ".test_registration_fails_with_mismatched_passwords()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L77", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_fails_with_mismatched_passwords()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_mismatched_passwords", + "community_name": "Community 17" + }, + { + "label": ".test_registration_fails_with_duplicate_username()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L94", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_fails_with_duplicate_username()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_username", + "community_name": "Community 17" + }, + { + "label": ".test_registration_fails_with_duplicate_email()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L112", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_fails_with_duplicate_email()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_email", + "community_name": "Community 17" + }, + { + "label": ".test_registration_fails_without_privacy_policy_acceptance()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L130", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_fails_without_privacy_policy_acceptance()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_without_privacy_policy_acceptance", + "community_name": "Community 17" + }, + { + "label": ".test_registration_is_blocked_for_authenticated_users()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L146", + "_origin": "ast", + "community": 17, + "norm_label": ".test_registration_is_blocked_for_authenticated_users()", + "id": "tests_feature_useraccounttest_useraccounttest_test_registration_is_blocked_for_authenticated_users", + "community_name": "Community 17" + }, + { + "label": ".test_login_page_loads()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L170", + "_origin": "ast", + "community": 17, + "norm_label": ".test_login_page_loads()", + "id": "tests_feature_useraccounttest_useraccounttest_test_login_page_loads", + "community_name": "Community 17" + }, + { + "label": ".test_user_can_login()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L181", + "_origin": "ast", + "community": 17, + "norm_label": ".test_user_can_login()", + "id": "tests_feature_useraccounttest_useraccounttest_test_user_can_login", + "community_name": "Community 17" + }, + { + "label": ".test_user_can_login_with_email()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L200", + "_origin": "ast", + "community": 17, + "norm_label": ".test_user_can_login_with_email()", + "id": "tests_feature_useraccounttest_useraccounttest_test_user_can_login_with_email", + "community_name": "Community 17" + }, + { + "label": ".test_login_fails_with_wrong_password()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L219", + "_origin": "ast", + "community": 17, + "norm_label": ".test_login_fails_with_wrong_password()", + "id": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_wrong_password", + "community_name": "Community 17" + }, + { + "label": ".test_login_fails_with_nonexistent_username()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L238", + "_origin": "ast", + "community": 17, + "norm_label": ".test_login_fails_with_nonexistent_username()", + "id": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_nonexistent_username", + "community_name": "Community 17" + }, + { + "label": ".test_user_can_logout()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L256", + "_origin": "ast", + "community": 17, + "norm_label": ".test_user_can_logout()", + "id": "tests_feature_useraccounttest_useraccounttest_test_user_can_logout", + "community_name": "Community 17" + }, + { + "label": ".test_user_can_delete_own_account()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L270", + "_origin": "ast", + "community": 17, + "norm_label": ".test_user_can_delete_own_account()", + "id": "tests_feature_useraccounttest_useraccounttest_test_user_can_delete_own_account", + "community_name": "Community 17" + }, + { + "label": ".test_guest_cannot_access_delete_account_route()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L280", + "_origin": "ast", + "community": 17, + "norm_label": ".test_guest_cannot_access_delete_account_route()", + "id": "tests_feature_useraccounttest_useraccounttest_test_guest_cannot_access_delete_account_route", + "community_name": "Community 17" + }, + { + "label": ".test_account_settings_requires_auth()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L292", + "_origin": "ast", + "community": 17, + "norm_label": ".test_account_settings_requires_auth()", + "id": "tests_feature_useraccounttest_useraccounttest_test_account_settings_requires_auth", + "community_name": "Community 17" + }, + { + "label": ".test_authenticated_user_can_view_account_settings()", + "file_type": "code", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L299", + "_origin": "ast", + "community": 17, + "norm_label": ".test_authenticated_user_can_view_account_settings()", + "id": "tests_feature_useraccounttest_useraccounttest_test_authenticated_user_can_view_account_settings", + "community_name": "Community 17" + }, + { + "label": "UserListTest.php", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "userlisttest.php", + "id": "tests_feature_userlisttest", + "community_name": "Community 20" + }, + { + "label": "UserListTest", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L11", + "_origin": "ast", + "community": 9, + "norm_label": "userlisttest", + "id": "tests_feature_userlisttest_userlisttest", + "community_name": "Community 9" + }, + { + "label": ".test_list_index_requires_authentication()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L19", + "_origin": "ast", + "community": 9, + "norm_label": ".test_list_index_requires_authentication()", + "id": "tests_feature_userlisttest_userlisttest_test_list_index_requires_authentication", + "community_name": "Community 9" + }, + { + "label": ".test_authenticated_user_can_view_list_index()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L26", + "_origin": "ast", + "community": 9, + "norm_label": ".test_authenticated_user_can_view_list_index()", + "id": "tests_feature_userlisttest_userlisttest_test_authenticated_user_can_view_list_index", + "community_name": "Community 9" + }, + { + "label": ".test_list_create_page_requires_authentication()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L39", + "_origin": "ast", + "community": 9, + "norm_label": ".test_list_create_page_requires_authentication()", + "id": "tests_feature_userlisttest_userlisttest_test_list_create_page_requires_authentication", + "community_name": "Community 9" + }, + { + "label": ".test_authenticated_user_can_view_create_list_page()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L46", + "_origin": "ast", + "community": 9, + "norm_label": ".test_authenticated_user_can_view_create_list_page()", + "id": "tests_feature_userlisttest_userlisttest_test_authenticated_user_can_view_create_list_page", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_create_a_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L59", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_create_a_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_create_a_list_with_airports()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L78", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_create_a_list_with_airports()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list_with_airports", + "community_name": "Community 9" + }, + { + "label": ".test_creating_list_with_unknown_airport_shows_warning()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L96", + "_origin": "ast", + "community": 9, + "norm_label": ".test_creating_list_with_unknown_airport_shows_warning()", + "id": "tests_feature_userlisttest_userlisttest_test_creating_list_with_unknown_airport_shows_warning", + "community_name": "Community 9" + }, + { + "label": ".test_list_creation_requires_name()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L112", + "_origin": "ast", + "community": 9, + "norm_label": ".test_list_creation_requires_name()", + "id": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_name", + "community_name": "Community 9" + }, + { + "label": ".test_list_creation_requires_valid_color()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L126", + "_origin": "ast", + "community": 9, + "norm_label": ".test_list_creation_requires_valid_color()", + "id": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_color", + "community_name": "Community 9" + }, + { + "label": ".test_list_creation_requires_valid_simulator()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L141", + "_origin": "ast", + "community": 9, + "norm_label": ".test_list_creation_requires_valid_simulator()", + "id": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_simulator", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_edit_own_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L159", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_edit_own_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_edit_own_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_cannot_edit_another_users_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L185", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_cannot_edit_another_users_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_cannot_edit_another_users_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_add_airports_to_existing_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L213", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_add_airports_to_existing_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_add_airports_to_existing_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_remove_airports_from_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L238", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_remove_airports_from_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_remove_airports_from_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_delete_own_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L272", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_delete_own_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_delete_own_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_cannot_delete_another_users_list()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L290", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_cannot_delete_another_users_list()", + "id": "tests_feature_userlisttest_userlisttest_test_user_cannot_delete_another_users_list", + "community_name": "Community 9" + }, + { + "label": ".test_user_can_toggle_list_visibility()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L313", + "_origin": "ast", + "community": 9, + "norm_label": ".test_user_can_toggle_list_visibility()", + "id": "tests_feature_userlisttest_userlisttest_test_user_can_toggle_list_visibility", + "community_name": "Community 9" + }, + { + "label": ".test_non_admin_cannot_make_list_public_when_creating()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L336", + "_origin": "ast", + "community": 9, + "norm_label": ".test_non_admin_cannot_make_list_public_when_creating()", + "id": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_creating", + "community_name": "Community 9" + }, + { + "label": ".test_non_admin_cannot_make_list_public_when_editing()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L353", + "_origin": "ast", + "community": 9, + "norm_label": ".test_non_admin_cannot_make_list_public_when_editing()", + "id": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_editing", + "community_name": "Community 9" + }, + { + "label": ".test_admin_can_make_list_public_when_editing()", + "file_type": "code", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L378", + "_origin": "ast", + "community": 9, + "norm_label": ".test_admin_can_make_list_public_when_editing()", + "id": "tests_feature_userlisttest_userlisttest_test_admin_can_make_list_public_when_editing", + "community_name": "Community 9" + }, + { + "label": "WithinDistanceTest.php", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 20, + "norm_label": "withindistancetest.php", + "id": "tests_feature_withindistancetest", + "community_name": "Community 20" + }, + { + "label": "WithinDistanceTest", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L18", + "_origin": "ast", + "community": 34, + "norm_label": "withindistancetest", + "id": "tests_feature_withindistancetest_withindistancetest", + "community_name": "Community 34" + }, + { + "label": ".test_high_latitude_anchor_keeps_same_latitude_neighbors()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L22", + "_origin": "ast", + "community": 34, + "norm_label": ".test_high_latitude_anchor_keeps_same_latitude_neighbors()", + "id": "tests_feature_withindistancetest_withindistancetest_test_high_latitude_anchor_keeps_same_latitude_neighbors", + "community_name": "Community 34" + }, + { + "label": ".test_min_distance_excludes_close_airports()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L38", + "_origin": "ast", + "community": 34, + "norm_label": ".test_min_distance_excludes_close_airports()", + "id": "tests_feature_withindistancetest_withindistancetest_test_min_distance_excludes_close_airports", + "community_name": "Community 34" + }, + { + "label": ".test_antimeridian_anchor_keeps_neighbors_across_the_dateline()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L50", + "_origin": "ast", + "community": 34, + "norm_label": ".test_antimeridian_anchor_keeps_neighbors_across_the_dateline()", + "id": "tests_feature_withindistancetest_withindistancetest_test_antimeridian_anchor_keeps_neighbors_across_the_dateline", + "community_name": "Community 34" + }, + { + "label": ".test_near_polar_anchor_returns_correct_distances()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L62", + "_origin": "ast", + "community": 34, + "norm_label": ".test_near_polar_anchor_returns_correct_distances()", + "id": "tests_feature_withindistancetest_withindistancetest_test_near_polar_anchor_returns_correct_distances", + "community_name": "Community 34" + }, + { + "label": ".test_global_radius_reaches_other_continents()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L74", + "_origin": "ast", + "community": 34, + "norm_label": ".test_global_radius_reaches_other_continents()", + "id": "tests_feature_withindistancetest_withindistancetest_test_global_radius_reaches_other_continents", + "community_name": "Community 34" + }, + { + "label": ".makeAirport()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L84", + "_origin": "ast", + "community": 34, + "norm_label": ".makeairport()", + "id": "tests_feature_withindistancetest_withindistancetest_makeairport", + "community_name": "Community 34" + }, + { + "label": ".icaosWithin()", + "file_type": "code", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L106", + "_origin": "ast", + "community": 34, + "norm_label": ".icaoswithin()", + "id": "tests_feature_withindistancetest_withindistancetest_icaoswithin", + "community_name": "Community 34" + }, + { + "label": "TestCase.php", + "file_type": "code", + "source_file": "tests/TestCase.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "testcase.php", + "id": "tests_testcase", + "community_name": "Community 14" + }, + { + "label": "TestCase", + "file_type": "code", + "source_file": "tests/TestCase.php", + "source_location": "L9", + "_origin": "ast", + "community": 20, + "norm_label": "testcase", + "id": "tests_testcase_testcase", + "community_name": "Community 20" + }, + { + "label": "BaseTestCase", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 20, + "norm_label": "basetestcase", + "id": "basetestcase", + "community_name": "Community 20" + }, + { + "label": "CreatesApplication", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "community": 20, + "norm_label": "createsapplication", + "id": "createsapplication", + "community_name": "Community 20" + }, + { + "label": ".setUp()", + "file_type": "code", + "source_file": "tests/TestCase.php", + "source_location": "L30", + "_origin": "ast", + "community": 15, + "norm_label": ".setup()", + "id": "tests_testcase_testcase_setup", + "community_name": "Community 15" + }, + { + "label": "AirportCallsignHelperTest.php", + "file_type": "code", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 14, + "norm_label": "airportcallsignhelpertest.php", + "id": "tests_unit_airportcallsignhelpertest", + "community_name": "Community 14" + }, + { + "label": "AirportCallsignHelperTest", + "file_type": "code", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L8", + "_origin": "ast", + "community": 2, + "norm_label": "airportcallsignhelpertest", + "id": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest", + "community_name": "Community 2" + }, + { + "label": ".test_long_prefixes_resolve_as_icao()", + "file_type": "code", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L10", + "_origin": "ast", + "community": 2, + "norm_label": ".test_long_prefixes_resolve_as_icao()", + "id": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_long_prefixes_resolve_as_icao", + "community_name": "Community 2" + }, + { + "label": ".test_short_prefixes_use_australian_table_then_american_heuristic()", + "file_type": "code", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L16", + "_origin": "ast", + "community": 2, + "norm_label": ".test_short_prefixes_use_australian_table_then_american_heuristic()", + "id": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_short_prefixes_use_australian_table_then_american_heuristic", + "community_name": "Community 2" + }, + { + "label": ".test_non_airport_positions_are_skipped()", + "file_type": "code", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L22", + "_origin": "ast", + "community": 2, + "norm_label": ".test_non_airport_positions_are_skipped()", + "id": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_non_airport_positions_are_skipped", + "community_name": "Community 2" + }, + { + "label": ".test_unparseable_callsigns_return_null()", + "file_type": "code", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L29", + "_origin": "ast", + "community": 2, + "norm_label": ".test_unparseable_callsigns_return_null()", + "id": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_unparseable_callsigns_return_null", + "community_name": "Community 2" + }, + { + "label": "TafForecastTest.php", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L1", + "_origin": "ast", + "community": 13, + "norm_label": "tafforecasttest.php", + "id": "tests_unit_tafforecasttest", + "community_name": "Community 13" + }, + { + "label": "TafForecastTest", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L8", + "_origin": "ast", + "community": 0, + "norm_label": "tafforecasttest", + "id": "tests_unit_tafforecasttest_tafforecasttest", + "community_name": "Community 0" + }, + { + "label": ".test_wind_methods_read_structured_fields()", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L10", + "_origin": "ast", + "community": 0, + "norm_label": ".test_wind_methods_read_structured_fields()", + "id": "tests_unit_tafforecasttest_tafforecasttest_test_wind_methods_read_structured_fields", + "community_name": "Community 0" + }, + { + "label": ".test_visibility_parses_statute_miles_and_unbounded_suffix()", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L24", + "_origin": "ast", + "community": 0, + "norm_label": ".test_visibility_parses_statute_miles_and_unbounded_suffix()", + "id": "tests_unit_tafforecasttest_tafforecasttest_test_visibility_parses_statute_miles_and_unbounded_suffix", + "community_name": "Community 0" + }, + { + "label": ".test_ceiling_derived_from_sky_condition_layers()", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L41", + "_origin": "ast", + "community": 0, + "norm_label": ".test_ceiling_derived_from_sky_condition_layers()", + "id": "tests_unit_tafforecasttest_tafforecasttest_test_ceiling_derived_from_sky_condition_layers", + "community_name": "Community 0" + }, + { + "label": ".test_ceiling_at_above_compares_the_stored_ceiling()", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L56", + "_origin": "ast", + "community": 0, + "norm_label": ".test_ceiling_at_above_compares_the_stored_ceiling()", + "id": "tests_unit_tafforecasttest_tafforecasttest_test_ceiling_at_above_compares_the_stored_ceiling", + "community_name": "Community 0" + }, + { + "label": ".test_weather_phenomena_match_against_wx_string()", + "file_type": "code", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L63", + "_origin": "ast", + "community": 0, + "norm_label": ".test_weather_phenomena_match_against_wx_string()", + "id": "tests_unit_tafforecasttest_tafforecasttest_test_weather_phenomena_match_against_wx_string", + "community_name": "Community 0" + }, + { + "label": "vite.config.mjs", + "file_type": "code", + "source_file": "vite.config.mjs", + "source_location": "L1", + "_origin": "ast", + "community": 226, + "norm_label": "vite.config.mjs", + "id": "vite_config", + "community_name": "Community 226" + }, + { + "label": "Ko-fi Sponsorship (where2fly)", + "file_type": "document", + "source_file": ".github/FUNDING.yml", + "source_location": "ko_fi", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "ko-fi sponsorship (where2fly)", + "id": "_github_funding_kofi_sponsorship", + "community_name": "Community 12" + }, + { + "label": "Bug Report Issue Template", + "file_type": "document", + "source_file": ".github/ISSUE_TEMPLATE/bug_report.md", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "bug report issue template", + "id": "_github_issue_template_bug_report_bug_report_template", + "community_name": "Community 12" + }, + { + "label": "Issue Template Config (blank issues disabled)", + "file_type": "document", + "source_file": ".github/ISSUE_TEMPLATE/config.yml", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "issue template config (blank issues disabled)", + "id": "_github_issue_template_config_blank_issues_disabled", + "community_name": "Community 12" + }, + { + "label": "Feature Request Issue Template", + "file_type": "document", + "source_file": ".github/ISSUE_TEMPLATE/feature_request.md", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "feature request issue template", + "id": "_github_issue_template_feature_request_feature_request_template", + "community_name": "Community 12" + }, + { + "label": "Setup Dependencies Composite Action (PHP 8.3.2, composer cache, optional Node 22)", + "file_type": "code", + "source_file": ".github/actions/setup-dependencies/action.yaml", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "setup dependencies composite action (php 8.3.2, composer cache, optional node 22)", + "id": "_github_actions_setup_dependencies_action_setup_dependencies", + "community_name": "Community 28" + }, + { + "label": "CI Lint Job (Pint --test)", + "file_type": "code", + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.lint", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "ci lint job (pint --test)", + "id": "_github_workflows_ci_lint_job", + "community_name": "Community 28" + }, + { + "label": "CI PHPUnit Job (MySQL 8 service, where2fly_test DB)", + "file_type": "code", + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.tests", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "ci phpunit job (mysql 8 service, where2fly_test db)", + "id": "_github_workflows_ci_tests_job", + "community_name": "Community 28" + }, + { + "label": "CI Build Container Job (pushes ghcr.io/blt950/where2fly, injects private fonts repo)", + "file_type": "code", + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.build-container", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "ci build container job (pushes ghcr.io/blt950/where2fly, injects private fonts repo)", + "id": "_github_workflows_ci_build_container_job", + "community_name": "Community 28" + }, + { + "label": "Legacy Linting Workflow (disabled, superseded by ci.yaml)", + "file_type": "code", + "source_file": ".github/workflows/linting.yaml", + "source_location": "jobs.lint-formatting", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "legacy linting workflow (disabled, superseded by ci.yaml)", + "id": "_github_workflows_linting_lint_formatting_job", + "community_name": "Community 28" + }, + { + "label": "Legacy Tests Workflow (disabled, superseded by ci.yaml)", + "file_type": "code", + "source_file": ".github/workflows/tests.yaml", + "source_location": "jobs.tests", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "legacy tests workflow (disabled, superseded by ci.yaml)", + "id": "_github_workflows_tests_phpunit_job", + "community_name": "Community 28" + }, + { + "label": "Where2Fly Public API", + "file_type": "document", + "source_file": "API.md", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "where2fly public api", + "id": "api_where2fly_api", + "community_name": "Community 12" + }, + { + "label": "API Attribution Requirement (Powered by Where2Fly link)", + "file_type": "rationale", + "source_file": "API.md", + "source_location": "How to use", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "api attribution requirement (powered by where2fly link)", + "id": "api_attribution_requirement", + "community_name": "Community 12" + }, + { + "label": "GET/POST /api/top Endpoint (top airports, optional whitelist)", + "file_type": "concept", + "source_file": "API.md", + "source_location": "Endpoints", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "get/post /api/top endpoint (top airports, optional whitelist)", + "id": "api_top_endpoint", + "community_name": "Community 12" + }, + { + "label": "POST /api/search Endpoint (departure/arrival, destinations, codeletter, score and airport filters)", + "file_type": "concept", + "source_file": "API.md", + "source_location": "Endpoints", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "post /api/search endpoint (departure/arrival, destinations, codeletter, score and airport filters)", + "id": "api_search_endpoint", + "community_name": "Community 12" + }, + { + "label": "Tri-state Filter Convention (-1 exclude / 0 neutral / 1 must be present)", + "file_type": "rationale", + "source_file": "API.md", + "source_location": "Regarding array* and int*", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "tri-state filter convention (-1 exclude / 0 neutral / 1 must be present)", + "id": "api_tristate_filter_convention", + "community_name": "Community 12" + }, + { + "label": "Score Reason Codes (METAR_WINDY..METAR_THUNDERSTORM, VATSIM_ATC, VATSIM_EVENT, VATSIM_POPULAR)", + "file_type": "concept", + "source_file": "API.md", + "source_location": "Available scores", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "score reason codes (metar_windy..metar_thunderstorm, vatsim_atc, vatsim_event, vatsim_popular)", + "id": "api_score_types", + "community_name": "Community 12" + }, + { + "label": "Aircraft Type Codeletters (GA, GAT, GTP, JS, JM, JML, JL, JXL)", + "file_type": "concept", + "source_file": "API.md", + "source_location": "Available aircraft type codes", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "aircraft type codeletters (ga, gat, gtp, js, jm, jml, jl, jxl)", + "id": "api_aircraft_codeletters", + "community_name": "Community 12" + }, + { + "label": "Where2Fly Application (Laravel 13 + Blade + React map canvas)", + "file_type": "concept", + "source_file": "CLAUDE.md", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "where2fly application (laravel 13 + blade + react map canvas)", + "id": "claude_where2fly_app", + "community_name": "Community 12" + }, + { + "label": "Data Ingestion Pipeline (update:data -> fetch:metars/tafs/vatsim; fetch:bookings; AWC bulk cache files, not per-airport calls)", + "file_type": "concept", + "source_file": "CLAUDE.md", + "source_location": "Architecture: scoring & search", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "data ingestion pipeline (update:data -> fetch:metars/tafs/vatsim; fetch:bookings; awc bulk cache files, not per-airport calls)", + "id": "claude_data_ingestion_pipeline", + "community_name": "Community 12" + }, + { + "label": "Tagged Score Event Model (airport_scores rows = reason + validity window + source; each fetch command owns and rebuilds its sources)", + "file_type": "rationale", + "source_file": "CLAUDE.md", + "source_location": "Architecture: scoring & search", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "tagged score event model (airport_scores rows = reason + validity window + source; each fetch command owns and rebuilds its sources)", + "id": "claude_scoring_event_model", + "community_name": "Community 12" + }, + { + "label": "ETA Matching (AirportScore::coversEta SQL + coversEtaAt PHP twin, kept in sync; overlap rules per source)", + "file_type": "concept", + "source_file": "CLAUDE.md", + "source_location": "Architecture: scoring & search", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "eta matching (airportscore::coverseta sql + coversetaat php twin, kept in sync; overlap rules per source)", + "id": "claude_eta_matching", + "community_name": "Community 12" + }, + { + "label": "Search Flow (SearchController -> Airport query scopes -> bucket shuffle -> filterWithCriteria macro -> resources)", + "file_type": "concept", + "source_file": "CLAUDE.md", + "source_location": "Architecture: scoring & search", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "search flow (searchcontroller -> airport query scopes -> bucket shuffle -> filterwithcriteria macro -> resources)", + "id": "claude_search_flow", + "community_name": "Community 12" + }, + { + "label": "256MB Memory Constraint (update:data composes all fetch commands in one process; never Airport::all() for lookup maps; chunk bulk writes)", + "file_type": "rationale", + "source_file": "CLAUDE.md", + "source_location": "Console commands: hard-won gotchas", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "256mb memory constraint (update:data composes all fetch commands in one process; never airport::all() for lookup maps; chunk bulk writes)", + "id": "claude_memory_constraints", + "community_name": "Community 12" + }, + { + "label": "AWC Cache Parsing Quirks (VRB wind, SPECI valid, OVX sky cover, 6+/10+ visibility, amendments keyed on issue_time)", + "file_type": "rationale", + "source_file": "CLAUDE.md", + "source_location": "Console commands: hard-won gotchas", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "awc cache parsing quirks (vrb wind, speci valid, ovx sky cover, 6+/10+ visibility, amendments keyed on issue_time)", + "id": "claude_awc_cache_quirks", + "community_name": "Community 12" + }, + { + "label": "Testing Against Real MySQL (where2fly_test database, PHPUnit only, no sqlite fallback)", + "file_type": "concept", + "source_file": "CLAUDE.md", + "source_location": "Testing", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "testing against real mysql (where2fly_test database, phpunit only, no sqlite fallback)", + "id": "claude_testing_mysql", + "community_name": "Community 28" + }, + { + "label": "Where2Fly Project (README overview)", + "file_type": "document", + "source_file": "README.md", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "where2fly project (readme overview)", + "id": "readme_where2fly_project", + "community_name": "Community 12" + }, + { + "label": "AGPLv3 License (network use requires source disclosure)", + "file_type": "concept", + "source_file": "README.md", + "source_location": "License", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "agplv3 license (network use requires source disclosure)", + "id": "readme_agpl_license", + "community_name": "Community 12" + }, + { + "label": "Oracle MySQL Client 8.4 Choice (generic tarball over Debian MariaDB client for full MySQL 8.4 protocol compatibility)", + "file_type": "rationale", + "source_file": "README.md", + "source_location": "MySQL Client", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "oracle mysql client 8.4 choice (generic tarball over debian mariadb client for full mysql 8.4 protocol compatibility)", + "id": "readme_mysql_oracle_client", + "community_name": "Community 12" + }, + { + "label": "React Limited to Map Canvas (current hybrid is sub-optimal, causes multiple page renders; end goal is full React)", + "file_type": "rationale", + "source_file": "README.md", + "source_location": "Tech Stack", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "react limited to map canvas (current hybrid is sub-optimal, causes multiple page renders; end goal is full react)", + "id": "readme_react_map_canvas", + "community_name": "Community 12" + }, + { + "label": "Docker Development Setup (docker-compose.dev.yml, migrate, key:generate, schedule:run cron)", + "file_type": "document", + "source_file": "README.md", + "source_location": "Development Setup", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "docker development setup (docker-compose.dev.yml, migrate, key:generate, schedule:run cron)", + "id": "readme_docker_dev_setup", + "community_name": "Community 28" + }, + { + "label": "Airport Database Update Procedure (OurAirports CSV import, drop/re-add spatial index, enrich:airports, ST_SRID coordinates)", + "file_type": "document", + "source_file": "README.md", + "source_location": "Updating Airport Database", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "airport database update procedure (ourairports csv import, drop/re-add spatial index, enrich:airports, st_srid coordinates)", + "id": "readme_airport_database_update", + "community_name": "Community 12" + }, + { + "label": "External Data Sources (OurAirports, Airlabs, metar.vatsim.net, api.met.no TAF, FSAddonCompare, flagicons)", + "file_type": "document", + "source_file": "README.md", + "source_location": "Data Sources", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 12, + "norm_label": "external data sources (ourairports, airlabs, metar.vatsim.net, api.met.no taf, fsaddoncompare, flagicons)", + "id": "readme_data_sources", + "community_name": "Community 12" + }, + { + "label": "Dev Compose Web Service (builds local Dockerfile, bind-mounts repo into container where2fly)", + "file_type": "code", + "source_file": "docker-compose.dev.yml", + "source_location": "services.web", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "dev compose web service (builds local dockerfile, bind-mounts repo into container where2fly)", + "id": "docker_compose_dev_web_service", + "community_name": "Community 28" + }, + { + "label": "Production Compose Web Service (pulls ghcr.io/blt950/where2fly:latest)", + "file_type": "code", + "source_file": "docker-compose.yml", + "source_location": "services.web", + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 28, + "norm_label": "production compose web service (pulls ghcr.io/blt950/where2fly:latest)", + "id": "docker_compose_web_service", + "community_name": "Community 28" + } + ], + "links": [ + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_accountclearunverified", + "target": "app_console_commands_accountclearunverified_accountclearunverified" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_accountclearunverified", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_accountclearunverified", + "target": "command" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_accountclearunverified_accountclearunverified", + "target": "app_console_commands_accountclearunverified_accountclearunverified_handle" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_accountclearunverified_accountclearunverified", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_calcflights", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_calcflights_calcflights", + "target": "command" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L36", + "weight": 1.0, + "source": "app_console_commands_calcflights_calcflights_handle", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_cleanupsceneries", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_cleanupsceneries_cleanupsceneries", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_createapikey", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_createapikey_createapikey", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichairports", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichairports_enrichairports", + "target": "command" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L69", + "weight": 1.0, + "source": "app_console_commands_enrichairports_enrichairports_handle", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights_enrichflights", + "target": "command" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L382", + "weight": 1.0, + "source": "app_console_commands_enrichflights_enrichflights_handle", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichsceneries", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichsceneries_enrichsceneries", + "target": "command" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L49", + "weight": 1.0, + "source": "app_console_commands_enrichsceneries_enrichsceneries_handle", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings", + "target": "command" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L44", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_handle", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchflights", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchflights_fetchflights", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchgithubissues", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchgithubissues_fetchgithubissues", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_reuploadairlines", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_reuploadairlines_reuploadairlines", + "target": "command" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_updatedata", + "target": "command" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_updatedata_updatedata", + "target": "command" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/AccountClearUnverified.php", + "source_location": "L30", + "weight": 1.0, + "source": "app_console_commands_accountclearunverified_accountclearunverified_handle", + "target": "app_models_user_user" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_calcflights", + "target": "app_console_commands_calcflights_calcflights" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_calcflights", + "target": "app_models_airline" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_calcflights_calcflights", + "target": "app_console_commands_calcflights_calcflights_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/CalcFlights.php", + "source_location": "L33", + "weight": 1.0, + "source": "app_console_commands_calcflights_calcflights_handle", + "target": "app_models_airline_airline" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_cleanupsceneries", + "target": "app_console_commands_cleanupsceneries_cleanupsceneries" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_cleanupsceneries", + "target": "app_models_scenerydeveloper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_cleanupsceneries_cleanupsceneries", + "target": "app_console_commands_cleanupsceneries_cleanupsceneries_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/CleanupSceneries.php", + "source_location": "L30", + "weight": 1.0, + "source": "app_console_commands_cleanupsceneries_cleanupsceneries_handle", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_createapikey", + "target": "app_console_commands_createapikey_createapikey" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_createapikey", + "target": "app_models_apikey_apikey" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_createapikey_createapikey", + "target": "app_console_commands_createapikey_createapikey_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/CreateApiKey.php", + "source_location": "L37", + "weight": 1.0, + "source": "app_console_commands_createapikey_createapikey_handle", + "target": "app_models_apikey_apikey" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichairports", + "target": "app_console_commands_enrichairports_enrichairports" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichairports", + "target": "app_models_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichairports_enrichairports", + "target": "app_console_commands_enrichairports_enrichairports_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/EnrichAirports.php", + "source_location": "L37", + "weight": 1.0, + "source": "app_console_commands_enrichairports_enrichairports_handle", + "target": "app_models_airport_airport" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights", + "target": "app_console_commands_enrichflights_enrichflights" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights", + "target": "app_models_aircraft" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights", + "target": "app_models_flight" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights", + "target": "app_models_flightaircraft" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichflights_enrichflights", + "target": "app_console_commands_enrichflights_enrichflights_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L360", + "weight": 1.0, + "source": "app_console_commands_enrichflights_enrichflights_handle", + "target": "app_models_aircraft_aircraft" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L34", + "weight": 1.0, + "source": "app_console_commands_enrichflights_enrichflights_handle", + "target": "app_models_flight_flight" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/EnrichFlights.php", + "source_location": "L375", + "weight": 1.0, + "source": "app_console_commands_enrichflights_enrichflights_handle", + "target": "app_models_flightaircraft_flightaircraft" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichsceneries", + "target": "app_console_commands_enrichsceneries_enrichsceneries" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichsceneries", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichsceneries", + "target": "app_models_scenery" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_enrichsceneries_enrichsceneries", + "target": "app_console_commands_enrichsceneries_enrichsceneries_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L39", + "weight": 1.0, + "source": "app_console_commands_enrichsceneries_enrichsceneries_handle", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/EnrichSceneries.php", + "source_location": "L36", + "weight": 1.0, + "source": "app_console_commands_enrichsceneries_enrichsceneries_handle", + "target": "app_models_scenery_scenery" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings", + "target": "app_console_commands_fetchbookings_fetchbookings" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings", + "target": "app_helpers_airportcallsignhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings", + "target": "app_models_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings", + "target": "app_models_booking" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L34", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings", + "target": "app_console_commands_fetchbookings_fetchbookings_handle" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L106", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings", + "target": "app_console_commands_fetchbookings_fetchbookings_scorebookings" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L96", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_handle", + "target": "app_console_commands_fetchbookings_fetchbookings_scorebookings" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L66", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_handle", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L48", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_handle", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L86", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_handle", + "target": "app_models_booking_booking" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L116", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_scorebookings", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L123", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_scorebookings", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchBookings.php", + "source_location": "L109", + "weight": 1.0, + "source": "app_console_commands_fetchbookings_fetchbookings_scorebookings", + "target": "app_models_booking_booking" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchflights", + "target": "app_console_commands_fetchflights_fetchflights" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchflights", + "target": "app_models_flight" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchflights_fetchflights", + "target": "app_console_commands_fetchflights_fetchflights_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchFlights.php", + "source_location": "L82", + "weight": 1.0, + "source": "app_console_commands_fetchflights_fetchflights_handle", + "target": "app_models_flight_flight" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchgithubissues", + "target": "app_console_commands_fetchgithubissues_fetchgithubissues" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchgithubissues", + "target": "config_cache" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchGithubIssues.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchgithubissues_fetchgithubissues", + "target": "app_console_commands_fetchgithubissues_fetchgithubissues_handle" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "app_console_commands_fetchmetars_fetchmetars" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "app_helpers_aviationweatherhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "app_helpers_weatherscorehelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "app_models_airport_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "app_models_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars", + "target": "app_models_metar_metar" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L41", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars", + "target": "app_console_commands_fetchmetars_fetchmetars_handle" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L149", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars", + "target": "app_console_commands_fetchmetars_fetchmetars_metarscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L127", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars", + "target": "app_console_commands_fetchmetars_fetchmetars_scoremetars" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L117", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_handle", + "target": "app_console_commands_fetchmetars_fetchmetars_scoremetars" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L47", + "weight": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_handle", + "target": "app_helpers_aviationweatherhelper_aviationweatherhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L90", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_handle", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L103", + "weight": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_handle", + "target": "app_models_metar_metar" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L133", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_scoremetars", + "target": "app_console_commands_fetchmetars_fetchmetars_metarscores" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L130", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_scoremetars", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L137", + "weight": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_scoremetars", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L181", + "weight": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_metarscores", + "target": "app_helpers_helpers_rwyidenttoheading" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L159", + "weight": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_metarscores", + "target": "app_helpers_weatherscorehelper_weatherscorehelper" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchMetars.php", + "source_location": "L149", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_console_commands_fetchmetars_fetchmetars_metarscores", + "target": "app_models_airport_airport" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_console_commands_fetchtafs_fetchtafs" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_helpers_aviationweatherhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_helpers_weatherscorehelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_models_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_models_taf" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs", + "target": "app_models_tafforecast" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs", + "target": "app_console_commands_fetchtafs_fetchtafs_handle" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L147", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs", + "target": "app_console_commands_fetchtafs_fetchtafs_parsetafdocuments" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L42", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_console_commands_fetchtafs_fetchtafs_parsetafdocuments" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L41", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_helpers_aviationweatherhelper_aviationweatherhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L110", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_helpers_weatherscorehelper_weatherscorehelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L44", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L69", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L47", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_models_taf_taf" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L125", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_handle", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchTafs.php", + "source_location": "L192", + "weight": 1.0, + "source": "app_console_commands_fetchtafs_fetchtafs_parsetafdocuments", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "app_console_commands_fetchvatsim_fetchvatsim" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "app_helpers_airportcallsignhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "app_models_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "app_models_event" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim", + "target": "controller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L45", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim", + "target": "app_console_commands_fetchvatsim_fetchvatsim_handle" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L140", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim", + "target": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L128", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_handle", + "target": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L93", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_handle", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L54", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_handle", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L111", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_handle", + "target": "app_models_event_event" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L159", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L215", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim", + "target": "app_helpers_helpers_distance" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L143", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/FetchVatsim.php", + "source_location": "L226", + "weight": 1.0, + "source": "app_console_commands_fetchvatsim_fetchvatsim_scorevatsim", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_reuploadairlines", + "target": "app_console_commands_reuploadairlines_reuploadairlines" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_reuploadairlines", + "target": "app_models_airline" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_reuploadairlines_reuploadairlines", + "target": "app_console_commands_reuploadairlines_reuploadairlines_handle" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Console/Commands/ReuploadAirlines.php", + "source_location": "L39", + "weight": 1.0, + "source": "app_console_commands_reuploadairlines_reuploadairlines_handle", + "target": "app_models_airline_airline" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_updatedata", + "target": "app_console_commands_updatedata_updatedata" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Console/Commands/UpdateData.php", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_console_commands_updatedata_updatedata", + "target": "app_console_commands_updatedata_updatedata_handle" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aircrafthelper", + "target": "app_helpers_aircrafthelper_aircrafthelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_helpers_aircrafthelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_helpers_aircrafthelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller", + "target": "app_helpers_aircrafthelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aircrafthelper_aircrafthelper", + "target": "app_helpers_aircrafthelper_aircrafthelper_codes" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aircrafthelper_aircrafthelper", + "target": "app_helpers_aircrafthelper_aircrafthelper_isvalidcode" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AircraftHelper.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aircrafthelper_aircrafthelper", + "target": "app_helpers_aircrafthelper_aircrafthelper_name" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L29", + "weight": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "target": "app_helpers_aircrafthelper_aircrafthelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L94", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_helpers_aircrafthelper_aircrafthelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L33", + "weight": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller_index", + "target": "app_helpers_aircrafthelper_aircrafthelper" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportcallsignhelper", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest", + "target": "app_helpers_airportcallsignhelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportcallsignhelper_airportcallsignhelper", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper_facility" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportcallsignhelper_airportcallsignhelper", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper_resolveicao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportcallsignhelper_airportcallsignhelper", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper_returnamericanicao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportCallsignHelper.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportcallsignhelper_airportcallsignhelper", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper_returnaustralianairport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L12", + "weight": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_long_prefixes_resolve_as_icao", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L24", + "weight": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_non_airport_positions_are_skipped", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L18", + "weight": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_short_prefixes_use_australian_table_then_american_heuristic", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L31", + "weight": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_unparseable_callsigns_return_null", + "target": "app_helpers_airportcallsignhelper_airportcallsignhelper" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportfilterhelper", + "target": "app_helpers_airportfilterhelper_airportfilterhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_mixins_collectionairportfilter", + "target": "app_helpers_airportfilterhelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportfilterhelper_airportfilterhelper", + "target": "app_helpers_airportfilterhelper_airportfilterhelper_hascorrectmetcon" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportfilterhelper_airportfilterhelper", + "target": "app_helpers_airportfilterhelper_airportfilterhelper_hasrequiredairportelevation" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AirportFilterHelper.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_airportfilterhelper_airportfilterhelper", + "target": "app_helpers_airportfilterhelper_airportfilterhelper_hasrequiredtemperature" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L33", + "weight": 1.0, + "source": "app_mixins_collectionairportfilter_collectionairportfilter_filterwithcriteria", + "target": "app_helpers_airportfilterhelper_airportfilterhelper" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aviationweatherhelper", + "target": "app_helpers_aviationweatherhelper_aviationweatherhelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aviationweatherhelper_aviationweatherhelper", + "target": "app_helpers_aviationweatherhelper_aviationweatherhelper_cleanup" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/AviationWeatherHelper.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_aviationweatherhelper_aviationweatherhelper", + "target": "app_helpers_aviationweatherhelper_aviationweatherhelper_downloadcache" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper", + "target": "app_helpers_calculationhelper_php_carbon" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper", + "target": "app_models_airport_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper", + "target": "coordinate" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_helpers_calculationhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_helpers_calculationhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_mixins_collectionairportfilter", + "target": "app_helpers_calculationhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "app_helpers_calculationhelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L79", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_aircraftnmperhour" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L126", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_aircraftnmperhourrange" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_airtimehours" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L150", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_calculatesphericaldestination" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_forecasteta" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_forecastetasql" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L58", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_minimumrequiredrunwaylength" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L101", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper", + "target": "app_helpers_calculationhelper_calculationhelper_timeclimbdescend" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L71", + "weight": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "target": "app_helpers_calculationhelper_calculationhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L180", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_helpers_calculationhelper_calculationhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L20", + "weight": 1.0, + "source": "app_mixins_collectionairportfilter_collectionairportfilter_filterwithcriteria", + "target": "app_helpers_calculationhelper_calculationhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/Airport.php", + "source_location": "L594", + "weight": 1.0, + "source": "app_models_airport_airport_filterrunwaylengths", + "target": "app_helpers_calculationhelper_calculationhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/Airport.php", + "source_location": "L535", + "weight": 1.0, + "source": "app_models_airport_airport_withinbearing", + "target": "app_helpers_calculationhelper_calculationhelper" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L17", + "weight": 1.0, + "context": "return_type", + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper_forecasteta", + "target": "app_helpers_calculationhelper_php_carbon" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L38", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper_forecastetasql", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/CalculationHelper.php", + "source_location": "L150", + "weight": 1.0, + "context": "return_type", + "confidence_score": 1.0, + "source": "app_helpers_calculationhelper_calculationhelper_calculatesphericaldestination", + "target": "coordinate" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "coordinate" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_maphelper", + "target": "app_helpers_maphelper_maphelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_maphelper", + "target": "app_helpers_maphelper_php_collection" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_maphelper", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_helpers_maphelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_helpers_maphelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller", + "target": "app_helpers_maphelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_maphelper_maphelper", + "target": "app_helpers_maphelper_maphelper_generateairportmapdatafromairports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_maphelper_maphelper", + "target": "app_helpers_maphelper_maphelper_getairportsfromuserlists" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L38", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getlistairports", + "target": "app_helpers_maphelper_maphelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L54", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getmapdatafromicao", + "target": "app_helpers_maphelper_maphelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L147", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports", + "target": "app_helpers_maphelper_maphelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L44", + "weight": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller_index", + "target": "app_helpers_maphelper_maphelper" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L15", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_helpers_maphelper_maphelper_generateairportmapdatafromairports", + "target": "app_helpers_maphelper_php_collection" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/MapHelper.php", + "source_location": "L38", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_helpers_maphelper_maphelper_getairportsfromuserlists", + "target": "app_helpers_maphelper_php_collection" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper", + "target": "app_helpers_sceneryhelper_sceneryhelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper", + "target": "app_models_scenerydeveloper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_helpers_sceneryhelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L46", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper", + "target": "app_helpers_sceneryhelper_sceneryhelper_findcheapeststore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L124", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper", + "target": "app_helpers_sceneryhelper_sceneryhelper_getembeddedurl" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L68", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper", + "target": "app_helpers_sceneryhelper_sceneryhelper_preparescenerydata" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L104", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper", + "target": "app_helpers_sceneryhelper_sceneryhelper_sortsceneries" + }, + { + "relation": "calls", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L96", + "weight": 1.0, + "context": "call", + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper_fetchw2fsceneries", + "target": "app_helpers_sceneryhelper_sceneryhelper" + }, + { + "relation": "calls", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L26", + "weight": 1.0, + "context": "call", + "confidence_score": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper_findofficialormarketstore", + "target": "app_helpers_sceneryhelper_sceneryhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L203", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery", + "target": "app_helpers_sceneryhelper_sceneryhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L320", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_handlefsacfailure", + "target": "app_helpers_sceneryhelper_sceneryhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L267", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse", + "target": "app_helpers_sceneryhelper_sceneryhelper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Helpers/SceneryHelper.php", + "source_location": "L85", + "weight": 1.0, + "source": "app_helpers_sceneryhelper_sceneryhelper_fetchw2fsceneries", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_weatherscorehelper", + "target": "app_helpers_weatherscorehelper_weatherscorehelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_weatherscorehelper", + "target": "app_models_metar_metar" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_weatherscorehelper", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar", + "target": "app_helpers_weatherscorehelper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast", + "target": "app_helpers_weatherscorehelper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L33", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_weatherscorehelper_weatherscorehelper", + "target": "app_helpers_weatherscorehelper_weatherscorehelper_reasons" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L33", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_helpers_weatherscorehelper_weatherscorehelper_reasons", + "target": "app_models_metar_metar" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/WeatherScoreHelper.php", + "source_location": "L33", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_helpers_weatherscorehelper_weatherscorehelper_reasons", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/helpers.php", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_helpers", + "target": "app_helpers_helpers_correctheading" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/helpers.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_helpers", + "target": "app_helpers_helpers_distance" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/helpers.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_helpers", + "target": "app_helpers_helpers_getcountryname" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/helpers.php", + "source_location": "L62", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_helpers", + "target": "app_helpers_helpers_getrussianasianregions" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Helpers/helpers.php", + "source_location": "L48", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_helpers_helpers", + "target": "app_helpers_helpers_rwyidenttoheading" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L118", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "target": "app_helpers_helpers_getcountryname" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L17", + "weight": 1.0, + "source": "app_mixins_collectionairportfilter_collectionairportfilter_filterwithcriteria", + "target": "app_helpers_helpers_distance" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/Airport.php", + "source_location": "L314", + "weight": 1.0, + "source": "app_models_airport_airport_incontinent", + "target": "app_helpers_helpers_getrussianasianregions" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/Airport.php", + "source_location": "L345", + "weight": 1.0, + "source": "app_models_airport_airport_notincontinent", + "target": "app_helpers_helpers_getrussianasianregions" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/AirportScore.php", + "source_location": "L264", + "weight": 1.0, + "source": "app_models_airportscore_airportscore_computetopairports", + "target": "app_helpers_helpers_getrussianasianregions" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_airline" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_flight" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_scenerydeveloper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "app_models_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller", + "target": "controller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/api.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_api", + "target": "app_http_controllers_api_mapcontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L216", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_fetchfsacsceneries" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L66", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_getairport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L141", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_getflights" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L34", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_getlistairports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L47", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_getmapdatafromicao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L184", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L317", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_handlefsacfailure" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L226", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_isauthenticated" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller", + "target": "controller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller", + "target": "controller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller", + "target": "controller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scorecontroller_scorecontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "controller" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "controller" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L24", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_isauthenticated", + "target": "app_http_controllers_api_mapcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L66", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "target": "app_http_controllers_api_mapcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L141", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getflights", + "target": "app_http_controllers_api_mapcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L47", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getmapdatafromicao", + "target": "app_http_controllers_api_mapcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L184", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery", + "target": "app_http_controllers_api_mapcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L36", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getlistairports", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L53", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getmapdatafromicao", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L89", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "target": "app_models_airline_airline" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L111", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L88", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "target": "app_models_flight_flight" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L121", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getairport", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L155", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getflights", + "target": "app_models_airline_airline" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L156", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getflights", + "target": "app_models_flight_flight" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L192", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_fetchfsacsceneries" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L199", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_handlefsacfailure" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L196", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_getscenery", + "target": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L254", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L278", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L248", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/MapController.php", + "source_location": "L231", + "weight": 1.0, + "source": "app_http_controllers_api_mapcontroller_mapcontroller_handlesuccessfulfsacresponse", + "target": "app_models_simulator_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_http_controllers_api_searchcontroller_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_http_controllers_api_searchcontroller_searchcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_http_controllers_scorecontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_http_resources_airportresource_airportresource" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_http_resources_suggestedairportresource" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_rules_airportexists" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_rules_validdestinations" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller", + "target": "app_rules_validscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L184", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller", + "target": "app_http_controllers_api_searchcontroller_searchcontroller_prepareairportdata" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller", + "target": "app_http_controllers_api_searchcontroller_searchcontroller_search" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L19", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "target": "app_http_controllers_api_searchcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L168", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "target": "app_http_controllers_api_searchcontroller_searchcontroller_prepareairportdata" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L142", + "weight": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "target": "app_http_controllers_scorecontroller_scorecontroller" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L121", + "weight": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_search", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/SearchController.php", + "source_location": "L191", + "weight": 1.0, + "source": "app_http_controllers_api_searchcontroller_searchcontroller_prepareairportdata", + "target": "app_http_resources_suggestedairportresource_suggestedairportresource" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller", + "target": "app_http_controllers_api_topcontroller_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller", + "target": "app_http_controllers_api_topcontroller_topcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller", + "target": "app_http_resources_airportresource_airportresource" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller", + "target": "app_models_airportscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller", + "target": "app_http_controllers_api_topcontroller_topcontroller_index" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller", + "target": "app_http_controllers_api_topcontroller_topcontroller_indexwhitelist" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L12", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller_index", + "target": "app_http_controllers_api_topcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L23", + "weight": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller_index", + "target": "app_http_resources_airportresource_airportresource" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L22", + "weight": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller_index", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L32", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller_indexwhitelist", + "target": "app_http_controllers_api_topcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L43", + "weight": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller_indexwhitelist", + "target": "app_http_resources_airportresource_airportresource" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/API/TopController.php", + "source_location": "L42", + "weight": 1.0, + "source": "app_http_controllers_api_topcontroller_topcontroller_indexwhitelist", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller", + "target": "app_http_controllers_auth_logincontroller_logincontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller", + "target": "app_http_controllers_auth_logincontroller_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller", + "target": "app_models_user_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_auth_logincontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller", + "target": "app_http_controllers_auth_logincontroller_logincontroller_login" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller", + "target": "app_http_controllers_auth_logincontroller_logincontroller_logout" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L75", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller", + "target": "app_http_controllers_auth_logincontroller_logincontroller_showlogin" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L65", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller", + "target": "app_http_controllers_auth_logincontroller_logincontroller_showregister" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L20", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller_login", + "target": "app_http_controllers_auth_logincontroller_php_request" + }, + { + "relation": "references", + "context": "parameter_type", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller_login", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L67", + "weight": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller_showregister", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/Auth/LoginController.php", + "source_location": "L77", + "weight": 1.0, + "source": "app_http_controllers_auth_logincontroller_logincontroller_showlogin", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Controller.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_controller", + "target": "app_http_controllers_controller_controller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Controller.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_controller", + "target": "authorizesrequests" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/Controller.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_controller_controller", + "target": "authorizesrequests" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "authorizesrequests" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "authorizesrequests" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller", + "target": "app_models_feedbackvote" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller", + "target": "config_cache" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_feedbackcontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L90", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_destroyvote" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L140", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissues" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L110", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissuesandvotes" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L168", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchvotes" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_index" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_show" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L63", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_storevote" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_index", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissuesandvotes" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L31", + "weight": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_index", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_show", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissuesandvotes" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L57", + "weight": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_show", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L70", + "weight": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_storevote", + "target": "app_models_feedbackvote_feedbackvote" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L93", + "weight": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_destroyvote", + "target": "app_models_feedbackvote_feedbackvote" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L113", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissuesandvotes", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissues" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L112", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchissuesandvotes", + "target": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchvotes" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/FeedbackController.php", + "source_location": "L170", + "weight": 1.0, + "source": "app_http_controllers_feedbackcontroller_feedbackcontroller_fetchvotes", + "target": "app_models_feedbackvote_feedbackvote" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_models_scenery_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_models_scenerydeveloper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "app_models_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller", + "target": "config_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_scenerycontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller_create" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L125", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller_destroy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L76", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller_edit" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L136", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller_store" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L93", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller", + "target": "app_http_controllers_scenerycontroller_scenerycontroller_update" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L19", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_create", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L23", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_create", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L21", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_create", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L29", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_create", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L125", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_destroy", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L76", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_edit", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L136", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L35", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_store", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L93", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_update", + "target": "app_http_controllers_scenerycontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L51", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_store", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L58", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_store", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L46", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_store", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L76", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_edit", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L80", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_edit", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L87", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_edit", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L93", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_update", + "target": "app_models_scenery_scenery" + }, + { + "relation": "references", + "context": "parameter_type", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L125", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_destroy", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L142", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L138", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SceneryController.php", + "source_location": "L150", + "weight": 1.0, + "source": "app_http_controllers_scenerycontroller_scenerycontroller_indexairports", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scorecontroller", + "target": "app_http_controllers_scorecontroller_scorecontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validscores", + "target": "app_http_controllers_scorecontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "app_http_controllers_scorecontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scorecontroller_scorecontroller", + "target": "app_http_controllers_scorecontroller_scorecontroller_getvatsimtypes" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/ScoreController.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_scorecontroller_scorecontroller", + "target": "app_http_controllers_scorecontroller_scorecontroller_getweathertypes" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L151", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_http_controllers_scorecontroller_scorecontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_http_controllers_searchcontroller_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_http_controllers_searchcontroller_php_view" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_models_aircraft" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_models_airline" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_models_flight" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_models_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_rules_airportexists" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_rules_flightdirection" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_rules_validaircrafts" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_rules_validairlines" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_rules_validdestinations" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "app_rules_validscores" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/api.php", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_api", + "target": "app_http_controllers_searchcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_searchcontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L51", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L434", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_filterdestinations" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L409", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_getdestinationinputs" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L401", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_getwhitelistsfrominput" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_indexarrivalsearch" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_indexdeparturesearch" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L73", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_indexroutesearch" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L83", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_search" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L386", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_searchedit" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L324", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller", + "target": "app_http_controllers_searchcontroller_searchcontroller_searchroutes" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_indexarrivalsearch", + "target": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L45", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_indexdeparturesearch", + "target": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L51", + "weight": 1.0, + "context": "return_type", + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_http_controllers_searchcontroller_php_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L56", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_http_controllers_searchcontroller_searchcontroller_getdestinationinputs" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L64", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_http_controllers_searchcontroller_searchcontroller_getwhitelistsfrominput" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L54", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_models_aircraft_aircraft" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L53", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_models_airline_airline" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L59", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L67", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_buildsearchview", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L75", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_indexroutesearch", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L83", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_http_controllers_searchcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L136", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_http_controllers_searchcontroller_searchcontroller_filterdestinations" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L197", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L156", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L311", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_search", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L386", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_searchedit", + "target": "app_http_controllers_searchcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L324", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_searchroutes", + "target": "app_http_controllers_searchcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L333", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_searchroutes", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L336", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_searchroutes", + "target": "app_models_flight_flight" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L374", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_searchroutes", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/SearchController.php", + "source_location": "L403", + "weight": 1.0, + "source": "app_http_controllers_searchcontroller_searchcontroller_getwhitelistsfrominput", + "target": "app_models_userlist_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller", + "target": "app_http_controllers_topcontroller_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller", + "target": "app_http_controllers_topcontroller_php_view" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller", + "target": "app_http_controllers_topcontroller_topcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller", + "target": "app_models_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/api.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_api", + "target": "app_http_controllers_topcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_topcontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller", + "target": "app_http_controllers_topcontroller_topcontroller_index" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L25", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller_index", + "target": "app_http_controllers_topcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L25", + "weight": 1.0, + "context": "return_type", + "confidence_score": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller_index", + "target": "app_http_controllers_topcontroller_php_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L37", + "weight": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller_index", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/TopController.php", + "source_location": "L46", + "weight": 1.0, + "source": "app_http_controllers_topcontroller_topcontroller_index", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "app_models_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "app_models_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "config_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller", + "target": "emailverificationrequest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_usercontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L63", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_destroy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L125", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_resetform" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L155", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_resetpassword" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L114", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_resetrequestform" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L137", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_resetsendlink" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_show" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L184", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_showadmin" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_store" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L90", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_verifyemail" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L76", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_verifynotice" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L102", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller", + "target": "app_http_controllers_usercontroller_usercontroller_verifyresendemail" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L27", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_store", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L39", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_store", + "target": "app_models_event_event" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L37", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_store", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L63", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_destroy", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L125", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_resetform", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L155", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_resetpassword", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L137", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_resetsendlink", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L76", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_verifynotice", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L102", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_verifyresendemail", + "target": "app_http_controllers_usercontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L55", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_show", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L90", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_verifyemail", + "target": "emailverificationrequest" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L28", + "weight": 1.0, + "source": "app_providers_appserviceprovider_appserviceprovider_boot", + "target": "app_http_controllers_usercontroller_usercontroller_verifyemail" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L116", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_resetrequestform", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L129", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_resetform", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L172", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_resetpassword", + "target": "app_models_event_event" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L190", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_showadmin", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L188", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_showadmin", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L189", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_showadmin", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserController.php", + "source_location": "L194", + "weight": 1.0, + "source": "app_http_controllers_usercontroller_usercontroller_showadmin", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "app_models_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "app_models_userlist_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller", + "target": "config_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "routes/web.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "routes_web", + "target": "app_http_controllers_userlistcontroller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_create" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L180", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_destroy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L92", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_edit" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_index" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L146", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_resolveairports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L49", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_store" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L193", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_toggle" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L106", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_update" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L25", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_index", + "target": "app_http_controllers_userlistcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_index", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L29", + "weight": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_index", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L37", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_create", + "target": "app_http_controllers_userlistcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L49", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_store", + "target": "app_http_controllers_userlistcontroller_php_request" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L106", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_update", + "target": "app_http_controllers_userlistcontroller_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L39", + "weight": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_create", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L41", + "weight": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_create", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L64", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_store", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_resolveairports" + }, + { + "relation": "references_constant", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L61", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_store", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L95", + "weight": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_edit", + "target": "app_models_simulator_simulator" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L92", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_edit", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L100", + "weight": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_edit", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L122", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_update", + "target": "app_http_controllers_userlistcontroller_userlistcontroller_resolveairports" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L119", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_update", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L153", + "weight": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_resolveairports", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L180", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_destroy", + "target": "app_models_userlist_userlist" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Controllers/UserListController.php", + "source_location": "L193", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_controllers_userlistcontroller_userlistcontroller_toggle", + "target": "app_models_userlist_userlist" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables", + "target": "app_http_middleware_adminvariables_adminvariables" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables", + "target": "app_http_middleware_adminvariables_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables", + "target": "app_http_middleware_adminvariables_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables", + "target": "app_models_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables", + "target": "config_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "bootstrap/app.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "bootstrap_app", + "target": "app_http_middleware_adminvariables" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables_adminvariables", + "target": "app_http_middleware_adminvariables_adminvariables_handle" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables_adminvariables_handle", + "target": "app_http_middleware_adminvariables_php_closure" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_adminvariables_adminvariables_handle", + "target": "app_http_middleware_adminvariables_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Middleware/AdminVariables.php", + "source_location": "L28", + "weight": 1.0, + "source": "app_http_middleware_adminvariables_adminvariables_handle", + "target": "app_models_scenery_scenery" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken", + "target": "app_http_middleware_apitoken_apitoken" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken", + "target": "app_http_middleware_apitoken_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken", + "target": "app_http_middleware_apitoken_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken", + "target": "app_models_apikey_apikey" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken", + "target": "app_models_apilog" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "bootstrap/app.php", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "bootstrap_app", + "target": "app_http_middleware_apitoken" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken_apitoken", + "target": "app_http_middleware_apitoken_apitoken_handle" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken_apitoken_handle", + "target": "app_http_middleware_apitoken_php_closure" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_apitoken_apitoken_handle", + "target": "app_http_middleware_apitoken_php_request" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L30", + "weight": 1.0, + "source": "app_http_middleware_apitoken_apitoken_handle", + "target": "app_models_apikey_apikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Http/Middleware/ApiToken.php", + "source_location": "L47", + "weight": 1.0, + "source": "app_http_middleware_apitoken_apitoken_handle", + "target": "app_models_apilog_apilog" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables", + "target": "app_http_middleware_feedbackvariables_feedbackvariables" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables", + "target": "app_http_middleware_feedbackvariables_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables", + "target": "app_http_middleware_feedbackvariables_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables", + "target": "config_auth" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables", + "target": "config_cache" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables", + "target": "config_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "bootstrap/app.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "bootstrap_app", + "target": "app_http_middleware_feedbackvariables" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables_feedbackvariables", + "target": "app_http_middleware_feedbackvariables_feedbackvariables_handle" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables_feedbackvariables_handle", + "target": "app_http_middleware_feedbackvariables_php_closure" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/FeedbackVariables.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_feedbackvariables_feedbackvariables_handle", + "target": "app_http_middleware_feedbackvariables_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_useractive", + "target": "app_http_middleware_useractive_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_useractive", + "target": "app_http_middleware_useractive_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_useractive", + "target": "app_http_middleware_useractive_useractive" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "bootstrap/app.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "bootstrap_app", + "target": "app_http_middleware_useractive" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_middleware_useractive_useractive", + "target": "app_http_middleware_useractive_useractive_handle" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L18", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_useractive_useractive_handle", + "target": "app_http_middleware_useractive_php_closure" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Middleware/UserActive.php", + "source_location": "L18", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_middleware_useractive_useractive_handle", + "target": "app_http_middleware_useractive_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_airportresource", + "target": "app_http_resources_airportresource_airportresource" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_airportresource", + "target": "app_http_resources_airportresource_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_airportresource", + "target": "jsonresource" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_airportresource_airportresource", + "target": "app_http_resources_airportresource_airportresource_toarray" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_airportresource_airportresource", + "target": "jsonresource" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_suggestedairportresource_suggestedairportresource", + "target": "app_http_resources_airportresource_airportresource" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/AirportResource.php", + "source_location": "L10", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_resources_airportresource_airportresource_toarray", + "target": "app_http_resources_airportresource_php_request" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_suggestedairportresource", + "target": "app_http_resources_suggestedairportresource_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_suggestedairportresource", + "target": "app_http_resources_suggestedairportresource_suggestedairportresource" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_http_resources_suggestedairportresource_suggestedairportresource", + "target": "app_http_resources_suggestedairportresource_suggestedairportresource_toarray" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Http/Resources/SuggestedAirportResource.php", + "source_location": "L9", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_http_resources_suggestedairportresource_suggestedairportresource_toarray", + "target": "app_http_resources_suggestedairportresource_php_request" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_mixins_collectionairportfilter", + "target": "app_mixins_collectionairportfilter_collectionairportfilter" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_providers_appserviceprovider", + "target": "app_mixins_collectionairportfilter" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Mixins/CollectionAirportFilter.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_mixins_collectionairportfilter_collectionairportfilter", + "target": "app_mixins_collectionairportfilter_collectionairportfilter_filterwithcriteria" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft", + "target": "app_models_aircraft_aircraft" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validaircrafts", + "target": "app_models_aircraft" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft_aircraft", + "target": "app_models_aircraft_aircraft_flightaircrafts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft_aircraft", + "target": "app_models_aircraft_aircraft_flights" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft_aircraft", + "target": "app_models_aircraft_aircraft_scenery" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft_aircraft", + "target": "hasfactory" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Aircraft.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_aircraft_aircraft", + "target": "model" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L20", + "weight": 1.0, + "source": "app_rules_validaircrafts_validaircrafts_validate", + "target": "app_models_aircraft_aircraft" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airline.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airline", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airline.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airline_airline", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey_apikey", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiLog.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apilog", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiLog.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apilog_apilog", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking_booking", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller_controller", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event_event", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_feedbackvote", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_feedbackvote_feedbackvote", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft_flightaircraft", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway_runway", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery_scenery", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper_scenerydeveloper", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator_simulator", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf_taf", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist", + "target": "model" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist_userlist", + "target": "model" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airline.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airline", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airline.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airline_airline", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey_apikey", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiLog.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apilog", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiLog.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apilog_apilog", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking_booking", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller_controller", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event_event", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_feedbackvote", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_feedbackvote_feedbackvote", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft_flightaircraft", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway_runway", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery_scenery", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper_scenerydeveloper", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator_simulator", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf_taf", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "hasfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist", + "target": "hasfactory" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist_userlist", + "target": "hasfactory" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airline.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airline", + "target": "app_models_airline_airline" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validairlines", + "target": "app_models_airline" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airline.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airline_airline", + "target": "app_models_airline_airline_flights" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L20", + "weight": 1.0, + "source": "app_rules_validairlines_validairlines_validate", + "target": "app_models_airline_airline" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "app_models_airport_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "app_models_airport_php_builder" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "app_models_airport_php_carbon" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "app_models_airport_php_collection" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport", + "target": "hasspatial" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_airportfactory", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest", + "target": "app_models_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/TestCase.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_testcase", + "target": "app_models_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L267", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_airportopen" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L73", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_arrivalflights" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L141", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_atcbookedfacilities" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L129", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_atcbookingscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L185", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_atcfacilities" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L177", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_atconlinefacilities" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L155", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_atconlinestations" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L48", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_bookings" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L68", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_controllers" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L78", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_departureflights" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L83", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_departureflightsto" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L208", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_displayscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L63", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_events" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L630", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_filterairbases" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L649", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_filterbyscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L680", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_filterroutesandairlines" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L589", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_filterrunwaylengths" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L609", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_filterrunwaylights" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L238", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_hasvatsimscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L253", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_hasvisualcondition" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L228", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_hasweatherscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L300", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_incontinent" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L362", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_incountry" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L401", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_instate" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L287", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_isairportsize" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L248", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_longestrunway" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_metar" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L276", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_noticao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L331", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_notincontinent" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L382", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_notincountry" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L412", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_notinstate" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L93", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_publishedsceneries" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L766", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_returnonlywhitelistedicao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_runways" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L88", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_scenerydevelopers" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L58", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_scores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L113", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_scoresateta" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L783", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_sortbyscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L190", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_sortfacilities" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_taf" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L243", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_vatsimscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L233", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "app_models_airport_airport_weatherscore" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport", + "target": "hasspatial" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L453", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_applydistanceboundingbox", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L504", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_withinbearing", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L423", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_withindistance", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/AirportScore.php", + "source_location": "L285", + "weight": 1.0, + "source": "app_models_airportscore_airportscore_computetopairports", + "target": "app_models_airport_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L23", + "weight": 1.0, + "context": "field", + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L23", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon_construct", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L25", + "weight": 1.0, + "source": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates_up", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L44", + "weight": 1.0, + "source": "database_seeders_testairportseeder_testairportseeder_run", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L216", + "weight": 1.0, + "source": "tests_feature_searchtest_searchtest_test_whitelist_restricts_results_to_whitelisted_airports", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L40", + "weight": 1.0, + "source": "tests_feature_topairportstest_topairportstest_test_aircraft_filter_excludes_airports_with_short_runways", + "target": "app_models_airport_airport" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "context": "parameter_type", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L106", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_icaoswithin", + "target": "app_models_airport_airport" + }, + { + "relation": "references", + "context": "return_type", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L84", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_makeairport", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/TestCase.php", + "source_location": "L39", + "weight": 1.0, + "source": "tests_testcase_testcase_setup", + "target": "app_models_airport_airport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L85", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_departureflightsto", + "target": "app_models_airport_airport_departureflights" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L93", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_publishedsceneries", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L267", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_airportopen", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L453", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_applydistanceboundingbox", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L630", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_filterairbases", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L649", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_filterbyscores", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L680", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_filterroutesandairlines", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L589", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_filterrunwaylengths", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L609", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_filterrunwaylights", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L300", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_incontinent", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L362", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_incountry", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L401", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_instate", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L287", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_isairportsize", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L276", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_noticao", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L331", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_notincontinent", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L382", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_notincountry", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L412", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_notinstate", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L766", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_returnonlywhitelistedicao", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L783", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_sortbyscores", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L504", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_withinbearing", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L423", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_withindistance", + "target": "app_models_airport_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L113", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_scoresateta", + "target": "app_models_airport_php_carbon" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L649", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_filterbyscores", + "target": "app_models_airport_php_carbon" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L783", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_sortbyscores", + "target": "app_models_airport_php_carbon" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L144", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atcbookedfacilities", + "target": "app_models_airport_airport_atcbookingscores" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L143", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atcbookedfacilities", + "target": "app_models_airport_airport_sortfacilities" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L187", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atcfacilities", + "target": "app_models_airport_airport_atcbookedfacilities" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L179", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atconlinefacilities", + "target": "app_models_airport_airport_atconlinestations" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L187", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atcfacilities", + "target": "app_models_airport_airport_atconlinefacilities" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L179", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atconlinefacilities", + "target": "app_models_airport_airport_sortfacilities" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L187", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_atcfacilities", + "target": "app_models_airport_airport_sortfacilities" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L190", + "weight": 1.0, + "context": "return_type", + "confidence_score": 1.0, + "source": "app_models_airport_airport_sortfacilities", + "target": "app_models_airport_php_collection" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Airport.php", + "source_location": "L427", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airport_airport_withindistance", + "target": "app_models_airport_airport_applydistanceboundingbox" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/Models/Airport.php", + "source_location": "L798", + "weight": 1.0, + "source": "app_models_airport_airport_sortbyscores", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore", + "target": "app_models_airportscore_php_builder" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore", + "target": "app_models_airportscore_php_carbon" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore", + "target": "config_cache" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder", + "target": "app_models_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest", + "target": "app_models_airportscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L51", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L109", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_applycoverseta" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L42", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L65", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_coverseta" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L77", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_coversetaat" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L218", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_gettopairports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L213", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_isvatsimscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L208", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_isweatherscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L203", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_loggedonago" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L195", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_onlinefortext" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L160", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_tooltiptext" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L186", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore", + "target": "app_models_airportscore_airportscore_windowtext" + }, + { + "relation": "calls", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L245", + "weight": 1.0, + "context": "call", + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_computetopairports", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L23", + "weight": 1.0, + "context": "field", + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L70", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon_atclines", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L23", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon_construct", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L131", + "weight": 1.0, + "source": "database_seeders_testairportseeder_testairportseeder_run", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references", + "context": "return_type", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_makescore", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L212", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_atc_booking_helpers_expose_facilities_in_order", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L182", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_display_scores_serve_current_status_before_forecasts", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L57", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_exact_sources_match_only_when_window_contains_eta", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L138", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_falls_back_when_no_taf_covers_eta", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L115", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L69", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L199", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_popular_tooltip_shows_the_movement_count", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L92", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_predicted_presence_matches_with_one_hour_overlap", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "references_constant", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L161", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_scores_at_eta_mirrors_the_query_matching", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L43", + "weight": 1.0, + "source": "tests_feature_topairportstest_topairportstest_test_aircraft_filter_excludes_airports_with_short_runways", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L88", + "weight": 1.0, + "source": "tests_feature_topairportstest_topairportstest_test_cached_result_is_served_without_recomputing", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L26", + "weight": 1.0, + "source": "tests_feature_topairportstest_topairportstest_test_top_airports_are_cached_per_variant", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L101", + "weight": 1.0, + "source": "tests_feature_topairportstest_topairportstest_test_whitelist_variant_bypasses_the_cache", + "target": "app_models_airportscore_airportscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L245", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_computetopairports", + "target": "app_models_airportscore_airportscore_coverseta" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L65", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_coverseta", + "target": "app_models_airportscore_php_builder" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L65", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_coverseta", + "target": "app_models_airportscore_php_carbon" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L109", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_applycoverseta", + "target": "app_models_airportscore_php_carbon" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L77", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_coversetaat", + "target": "app_models_airportscore_php_carbon" + }, + { + "relation": "references_constant", + "context": "parameter_type", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L205", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_loggedonago", + "target": "app_models_airportscore_php_carbon" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L195", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_onlinefortext", + "target": "app_models_airportscore_php_carbon" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/AirportScore.php", + "source_location": "L175", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_airportscore_airportscore_tooltiptext", + "target": "app_models_airportscore_airportscore_windowtext" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey", + "target": "app_models_apikey_apikey" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey_apikey", + "target": "app_models_apikey_apikey_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiKey.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apikey_apikey", + "target": "app_models_apikey_apikey_logs" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "app_models_apikey_apikey" + }, + { + "relation": "references", + "context": "return_type", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_createapikey", + "target": "app_models_apikey_apikey" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiLog.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apilog", + "target": "app_models_apilog_apilog" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/ApiLog.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_apilog_apilog", + "target": "app_models_apilog_apilog_key" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking", + "target": "app_models_booking_booking" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking_booking", + "target": "app_models_booking_booking_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Booking.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_booking_booking", + "target": "app_models_booking_booking_casts" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller", + "target": "app_models_controller_controller" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller_controller", + "target": "app_models_controller_controller_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Controller.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_controller_controller", + "target": "app_models_controller_controller_casts" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event", + "target": "app_models_event_event" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event_event", + "target": "app_models_event_event_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Event.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_event_event", + "target": "app_models_event_event_casts" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_feedbackvote", + "target": "app_models_feedbackvote_feedbackvote" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/FeedbackVote.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_feedbackvote_feedbackvote", + "target": "app_models_feedbackvote_feedbackvote_user" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight", + "target": "app_models_flight_flight" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "app_models_flight_flight_aircrafts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "app_models_flight_flight_airline" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "app_models_flight_flight_arrivalairport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "app_models_flight_flight_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Flight.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flight_flight", + "target": "app_models_flight_flight_departureairport" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft", + "target": "app_models_flightaircraft_flightaircraft" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table", + "target": "app_models_flightaircraft" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft_flightaircraft", + "target": "app_models_flightaircraft_flightaircraft_aircraft" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft_flightaircraft", + "target": "app_models_flightaircraft_flightaircraft_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/FlightAircraft.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_flightaircraft_flightaircraft", + "target": "app_models_flightaircraft_flightaircraft_flight" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L17", + "weight": 1.0, + "source": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table_up", + "target": "app_models_flightaircraft_flightaircraft" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar", + "target": "app_models_metar_metar" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L102", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_ceilingatabove" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L117", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_foggy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L122", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_heavyrain" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L127", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_heavysnow" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L34", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_isvisualcondition" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L137", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_rvratbelow" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_sightatabove" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L65", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_sightbelow" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L132", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_thunderstorm" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L86", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_windatabove" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L95", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar", + "target": "app_models_metar_metar_windgusts" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder", + "target": "app_models_metar_metar" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L105", + "weight": 1.0, + "source": "database_seeders_testairportseeder_testairportseeder_run", + "target": "app_models_metar_metar" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L105", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_ceilingatabove", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L119", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_foggy", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L124", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_heavyrain", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L129", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_heavysnow", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L140", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_rvratbelow", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_sightatabove", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L69", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_sightbelow", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L134", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_thunderstorm", + "target": "app_models_metar_metar_metarwithoutremarks" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L36", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_isvisualcondition", + "target": "app_models_metar_metar_ceilingatabove" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/Metar.php", + "source_location": "L36", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_metar_metar_isvisualcondition", + "target": "app_models_metar_metar_sightatabove" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway", + "target": "app_models_runway_runway" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder", + "target": "app_models_runway" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway_runway", + "target": "app_models_runway_runway_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Runway.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_runway_runway", + "target": "app_models_runway_runway_casts" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L64", + "weight": 1.0, + "source": "database_seeders_testairportseeder_testairportseeder_run", + "target": "app_models_runway_runway" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery", + "target": "app_models_scenery_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table", + "target": "app_models_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot", + "target": "app_models_scenery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "app_models_scenery" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery_scenery", + "target": "app_models_scenery_scenery_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery_scenery", + "target": "app_models_scenery_scenery_developer" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery_scenery", + "target": "app_models_scenery_scenery_simulator" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Scenery.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenery_scenery", + "target": "app_models_scenery_scenery_suggestedbyuser" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy", + "target": "app_models_scenery_scenery" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy_scenerypolicy_delete", + "target": "app_models_scenery_scenery" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L13", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy_scenerypolicy_update", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L15", + "weight": 1.0, + "source": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table_up", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L14", + "weight": 1.0, + "source": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot_up", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L151", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_associates_suggested_by_user", + "target": "app_models_scenery_scenery" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L86", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_is_stored_as_unpublished", + "target": "app_models_scenery_scenery" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "app_models_scenerydeveloper" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper_scenerydeveloper", + "target": "app_models_scenerydeveloper_scenerydeveloper_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/SceneryDeveloper.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_scenerydeveloper_scenerydeveloper", + "target": "app_models_scenerydeveloper_scenerydeveloper_sceneries" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L179", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_duplicate_developer_is_reused_for_new_simulator", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L150", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_associates_suggested_by_user", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L83", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_is_stored_as_unpublished", + "target": "app_models_scenerydeveloper_scenerydeveloper" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator", + "target": "app_models_simulator_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot", + "target": "app_models_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "app_models_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "app_models_simulator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest", + "target": "app_models_simulator" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator_simulator", + "target": "app_models_simulator_simulator_lists" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Simulator.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_simulator_simulator", + "target": "app_models_simulator_simulator_sceneries" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L15", + "weight": 1.0, + "source": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot_up", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L246", + "weight": 1.0, + "source": "tests_feature_apitest_apitest_test_list_airports_endpoint_returns_success_for_authenticated_user", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L159", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_duplicate_developer_is_reused_for_new_simulator", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L140", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_associates_suggested_by_user", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L109", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_url", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L73", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_is_stored_as_unpublished", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L52", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_user_can_submit_a_scenery_suggestion", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L381", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_admin_can_make_list_public_when_editing", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L99", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_creating_list_with_unknown_airport_shows_warning", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L115", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_name", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L129", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_color", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L339", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_creating", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L356", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_editing", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L216", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_add_airports_to_existing_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L62", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L81", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list_with_airports", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L275", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_delete_own_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L162", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_edit_own_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L241", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_remove_airports_from_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L316", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_toggle_list_visibility", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L294", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_cannot_delete_another_users_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L189", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_cannot_edit_another_users_list", + "target": "app_models_simulator_simulator" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf", + "target": "app_models_taf_taf" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest", + "target": "app_models_taf" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf_taf", + "target": "app_models_taf_taf_airport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf_taf", + "target": "app_models_taf_taf_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/Taf.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_taf_taf", + "target": "app_models_taf_taf_forecasts" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L27", + "weight": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod", + "target": "app_models_taf_taf" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest", + "target": "app_models_tafforecast" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L97", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_ceilingatabove" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L41", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_ceilingfromskycondition" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L102", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_foggy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L107", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_heavyrain" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L112", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_heavysnow" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L82", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_sightatabove" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L89", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_sightbelow" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_taf" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L117", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_thunderstorm" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L73", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_visibilitymeters" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_windatabove" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L62", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast", + "target": "app_models_tafforecast_tafforecast_windgusts" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "references", + "context": "return_type", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L44", + "weight": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest_test_ceiling_derived_from_sky_condition_layers", + "target": "app_models_tafforecast_tafforecast" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L84", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast_sightatabove", + "target": "app_models_tafforecast_tafforecast_visibilitymeters" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/TafForecast.php", + "source_location": "L91", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_tafforecast_tafforecast_sightbelow", + "target": "app_models_tafforecast_tafforecast_visibilitymeters" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user", + "target": "app_models_user" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user", + "target": "app_models_user_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user", + "target": "canresetpassword" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user", + "target": "mustverifyemail" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user", + "target": "notifiable" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "config/auth.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "config_auth", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest", + "target": "app_models_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest", + "target": "app_models_user" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L42", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "app_models_user_user_casts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L65", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "app_models_user_user_feedbackvotes" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L51", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "app_models_user_user_getairportsfromlists" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L60", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "app_models_user_user_lists" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "authenticatable" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "canresetpassword" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "mustverifyemail" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user", + "target": "notifiable" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy_scenerypolicy_delete", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L13", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy_scenerypolicy_update", + "target": "app_models_user_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L29", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_delete", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L37", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_public", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_update", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L13", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_view", + "target": "app_models_user_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userpolicy", + "target": "app_models_user_user" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L12", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userpolicy_userpolicy_showadmin", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L48", + "weight": 1.0, + "source": "tests_feature_admintest_admintest_test_admin_flag_is_false_for_regular_users", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L55", + "weight": 1.0, + "source": "tests_feature_admintest_admintest_test_admin_flag_is_true_for_admin_users", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L35", + "weight": 1.0, + "source": "tests_feature_admintest_admintest_test_admin_user_can_access_admin_page", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L26", + "weight": 1.0, + "source": "tests_feature_admintest_admintest_test_non_admin_user_cannot_access_admin_page", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L47", + "weight": 1.0, + "source": "tests_feature_apitest_apitest_test_authenticated_check_returns_true_for_logged_in_user", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L245", + "weight": 1.0, + "source": "tests_feature_apitest_apitest_test_list_airports_endpoint_returns_success_for_authenticated_user", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L29", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_authenticated_user_can_view_scenery_create_page", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L158", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_duplicate_developer_is_reused_for_new_simulator", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L38", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_create_page_shows_existing_developers_for_known_icao", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L139", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_associates_suggested_by_user", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L93", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_icao", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L108", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_url", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L72", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_is_stored_as_unpublished", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L124", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_requires_at_least_one_simulator", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L51", + "weight": 1.0, + "source": "tests_feature_scenerytest_scenerytest_test_user_can_submit_a_scenery_suggestion", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L215", + "weight": 1.0, + "source": "tests_feature_searchtest_searchtest_test_whitelist_restricts_results_to_whitelisted_airports", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L301", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_authenticated_user_can_view_account_settings", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L223", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_wrong_password", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L116", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_email", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L98", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_username", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L150", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_is_blocked_for_authenticated_users", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L272", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_delete_own_account", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L185", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_login", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L204", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_login_with_email", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L258", + "weight": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_logout", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L380", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_admin_can_make_list_public_when_editing", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L48", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_authenticated_user_can_view_create_list_page", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L28", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_authenticated_user_can_view_list_index", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L98", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_creating_list_with_unknown_airport_shows_warning", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L114", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_name", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L128", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_color", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L143", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_simulator", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L338", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_creating", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L355", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_editing", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L215", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_add_airports_to_existing_list", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L61", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L80", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list_with_airports", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L274", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_delete_own_list", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L161", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_edit_own_list", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L240", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_remove_airports_from_list", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L315", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_toggle_list_visibility", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L292", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_cannot_delete_another_users_list", + "target": "app_models_user_user" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L187", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_cannot_edit_another_users_list", + "target": "app_models_user_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "config/backup.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "config_backup", + "target": "notifiable" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/Models/User.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_user_user_getairportsfromlists", + "target": "app_models_user_user_lists" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist", + "target": "app_models_userlist_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "app_models_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest", + "target": "app_models_userlist" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest", + "target": "app_models_userlist" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist_userlist", + "target": "app_models_userlist_userlist_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist_userlist", + "target": "app_models_userlist_userlist_simulator" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Models/UserList.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_models_userlist_userlist", + "target": "app_models_userlist_userlist_user" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy", + "target": "app_models_userlist_userlist" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L29", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_delete", + "target": "app_models_userlist_userlist" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L21", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_update", + "target": "app_models_userlist_userlist" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L13", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy_view", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L247", + "weight": 1.0, + "source": "tests_feature_apitest_apitest_test_list_airports_endpoint_returns_success_for_authenticated_user", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L217", + "weight": 1.0, + "source": "tests_feature_searchtest_searchtest_test_whitelist_restricts_results_to_whitelisted_airports", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L382", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_admin_can_make_list_public_when_editing", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L357", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_editing", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L217", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_add_airports_to_existing_list", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L91", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list_with_airports", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L276", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_delete_own_list", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L163", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_edit_own_list", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L242", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_remove_airports_from_list", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L317", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_can_toggle_list_visibility", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L295", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_cannot_delete_another_users_list", + "target": "app_models_userlist_userlist" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L190", + "weight": 1.0, + "source": "tests_feature_userlisttest_userlisttest_test_user_cannot_edit_another_users_list", + "target": "app_models_userlist_userlist" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy", + "target": "app_policies_scenerypolicy_scenerypolicy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy_scenerypolicy", + "target": "app_policies_scenerypolicy_scenerypolicy_delete" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/SceneryPolicy.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_scenerypolicy_scenerypolicy", + "target": "app_policies_scenerypolicy_scenerypolicy_update" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy", + "target": "app_policies_userlistpolicy_userlistpolicy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy", + "target": "app_policies_userlistpolicy_userlistpolicy_delete" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy", + "target": "app_policies_userlistpolicy_userlistpolicy_public" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy", + "target": "app_policies_userlistpolicy_userlistpolicy_update" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserListPolicy.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userlistpolicy_userlistpolicy", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L91", + "weight": 1.0, + "source": "app_view_components_scoreicon_scoreicon_render", + "target": "app_policies_userlistpolicy_userlistpolicy_view" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userpolicy", + "target": "app_policies_userpolicy_userpolicy" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Policies/UserPolicy.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_policies_userpolicy_userpolicy", + "target": "app_policies_userpolicy_userpolicy_showadmin" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_providers_appserviceprovider", + "target": "app_providers_appserviceprovider_appserviceprovider" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_providers_appserviceprovider", + "target": "serviceprovider" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "bootstrap/providers.php", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "bootstrap_providers", + "target": "app_providers_appserviceprovider" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_providers_appserviceprovider_appserviceprovider", + "target": "app_providers_appserviceprovider_appserviceprovider_boot" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_providers_appserviceprovider_appserviceprovider", + "target": "app_providers_appserviceprovider_appserviceprovider_register" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/Providers/AppServiceProvider.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_providers_appserviceprovider_appserviceprovider", + "target": "serviceprovider" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_airportexists", + "target": "app_rules_airportexists_airportexists" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_airportexists", + "target": "app_rules_airportexists_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_airportexists", + "target": "validationrule" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_airportexists_airportexists", + "target": "app_rules_airportexists_airportexists_validate" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_airportexists_airportexists", + "target": "validationrule" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_flightdirection", + "target": "validationrule" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_flightdirection_flightdirection", + "target": "validationrule" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validaircrafts", + "target": "validationrule" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validaircrafts_validaircrafts", + "target": "validationrule" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validairlines", + "target": "validationrule" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validairlines_validairlines", + "target": "validationrule" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validdestinations", + "target": "validationrule" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validdestinations_validdestinations", + "target": "validationrule" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validscores", + "target": "validationrule" + }, + { + "relation": "implements", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validscores_validscores", + "target": "validationrule" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Rules/AirportExists.php", + "source_location": "L17", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_rules_airportexists_airportexists_validate", + "target": "app_rules_airportexists_php_closure" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_flightdirection", + "target": "app_rules_flightdirection_flightdirection" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_flightdirection", + "target": "app_rules_flightdirection_php_closure" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_flightdirection_flightdirection", + "target": "app_rules_flightdirection_flightdirection_validate" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Rules/FlightDirection.php", + "source_location": "L16", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_rules_flightdirection_flightdirection_validate", + "target": "app_rules_flightdirection_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validaircrafts", + "target": "app_rules_validaircrafts_php_closure" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validaircrafts", + "target": "app_rules_validaircrafts_validaircrafts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validaircrafts_validaircrafts", + "target": "app_rules_validaircrafts_validaircrafts_validate" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAircrafts.php", + "source_location": "L17", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_rules_validaircrafts_validaircrafts_validate", + "target": "app_rules_validaircrafts_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validairlines", + "target": "app_rules_validairlines_php_closure" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validairlines", + "target": "app_rules_validairlines_validairlines" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validairlines_validairlines", + "target": "app_rules_validairlines_validairlines_validate" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidAirlines.php", + "source_location": "L17", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_rules_validairlines_validairlines_validate", + "target": "app_rules_validairlines_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validdestinations", + "target": "app_rules_validdestinations_php_closure" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validdestinations", + "target": "app_rules_validdestinations_validdestinations" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validdestinations_validdestinations", + "target": "app_rules_validdestinations_validdestinations_validate" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidDestinations.php", + "source_location": "L17", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_rules_validdestinations_validdestinations_validate", + "target": "app_rules_validdestinations_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validscores", + "target": "app_rules_validscores_php_closure" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validscores", + "target": "app_rules_validscores_validscores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_rules_validscores_validscores", + "target": "app_rules_validscores_validscores_validate" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/Rules/ValidScores.php", + "source_location": "L17", + "weight": 1.0, + "context": "parameter_type", + "confidence_score": 1.0, + "source": "app_rules_validscores_validscores_validate", + "target": "app_rules_validscores_php_closure" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "app_view_components_scoreicon_php_collection" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "app_view_components_scoreicon_php_view" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "app_view_components_scoreicon_scoreicon" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon", + "target": "component" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L21", + "weight": 1.0, + "context": "field", + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_view_components_scoreicon_php_collection" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L61", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_view_components_scoreicon_scoreicon_atclines" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L40", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_view_components_scoreicon_scoreicon_buildtooltiplines" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_view_components_scoreicon_scoreicon_construct" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L89", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "app_view_components_scoreicon_scoreicon_render" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon", + "target": "component" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon_construct", + "target": "app_view_components_scoreicon_scoreicon_buildtooltiplines" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L51", + "weight": 1.0, + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon_buildtooltiplines", + "target": "app_view_components_scoreicon_scoreicon_atclines" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "source_file": "app/View/Components/ScoreIcon.php", + "source_location": "L89", + "weight": 1.0, + "context": "return_type", + "confidence_score": 1.0, + "source": "app_view_components_scoreicon_scoreicon_render", + "target": "app_view_components_scoreicon_php_view" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "bootstrap/app.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "bootstrap_app", + "target": "config_auth" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_autoload" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L45", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_autoload_dev" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L70", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_config" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_description" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L65", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_extra" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_keywords" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_license" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_name" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L78", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_prefer_stable" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_require" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_require_dev" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L50", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_scripts" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer", + "target": "composer_type" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_graham_campbell_markdown" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_guzzlehttp_guzzle" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_laravel_framework" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_laravel_nightwatch" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_laravel_sanctum" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_laravel_tinker" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_laravel_ui" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_league_flysystem_aws_s3_v3" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_matanyadaev_laravel_eloquent_spatial" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_mjaschen_phpgeo" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_php" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_propaganistas_laravel_disposable_email" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_ryangjchandler_laravel_cloudflare_turnstile" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_sentry_sentry_laravel" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_spatie_laravel_backup" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require", + "target": "composer_require_tightenco_ziggy" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_barryvdh_laravel_debugbar" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_fakerphp_faker" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_laravel_pint" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_laravel_sail" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_mockery_mockery" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_nunomaduro_collision" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_phpunit_phpunit" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L33", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_require_dev", + "target": "composer_require_dev_spatie_laravel_ignition" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L41", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload", + "target": "composer_autoload_files" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L36", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload", + "target": "composer_autoload_psr_4" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload_psr_4", + "target": "composer_psr_4_app" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload_psr_4", + "target": "composer_psr_4_database_factories" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload_psr_4", + "target": "composer_psr_4_database_seeders" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L46", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload_dev", + "target": "composer_autoload_dev_psr_4" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L47", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_autoload_dev_psr_4", + "target": "composer_psr_4_tests" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L51", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_scripts", + "target": "composer_scripts_post_autoload_dump" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L61", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_scripts", + "target": "composer_scripts_post_create_project_cmd" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L58", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_scripts", + "target": "composer_scripts_post_root_package_install" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L55", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_scripts", + "target": "composer_scripts_post_update_cmd" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L66", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_extra", + "target": "composer_extra_laravel" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L67", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_extra_laravel", + "target": "composer_laravel_dont_discover" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L74", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_config", + "target": "composer_config_allow_plugins" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L71", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_config", + "target": "composer_config_optimize_autoloader" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L72", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_config", + "target": "composer_config_preferred_install" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L73", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_config", + "target": "composer_config_sort_packages" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "composer.json", + "source_location": "L75", + "weight": 1.0, + "confidence_score": 1.0, + "source": "composer_config_allow_plugins", + "target": "composer_allow_plugins_php_http_discovery" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest", + "target": "config_cache" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "container/entrypoint.sh", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "container_entrypoint", + "target": "container_entrypoint_sh__entry" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "container/install-npm.sh", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "container_install_npm", + "target": "container_install_npm_sh__entry" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_airportfactory", + "target": "database_factories_airportfactory_airportfactory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_airportfactory", + "target": "factory" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_airportfactory_airportfactory", + "target": "database_factories_airportfactory_airportfactory_definition" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "database/factories/AirportFactory.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_airportfactory_airportfactory", + "target": "factory" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory", + "target": "factory" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory_userfactory", + "target": "factory" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory", + "target": "database_factories_userfactory_userfactory" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory_userfactory", + "target": "database_factories_userfactory_userfactory_admin" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory_userfactory", + "target": "database_factories_userfactory_userfactory_definition" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "database/factories/UserFactory.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_factories_userfactory_userfactory", + "target": "database_factories_userfactory_userfactory_unverified" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2014_10_12_000000_create_users_table.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2014_10_12_000000_create_users_table", + "target": "database_migrations_2014_10_12_000000_create_users_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2014_10_12_000000_create_users_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2014_10_12_000000_create_users_table", + "target": "database_migrations_2014_10_12_000000_create_users_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2014_10_12_100000_create_password_resets_table.php", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2014_10_12_100000_create_password_resets_table", + "target": "database_migrations_2014_10_12_100000_create_password_resets_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2014_10_12_100000_create_password_resets_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2014_10_12_100000_create_password_resets_table", + "target": "database_migrations_2014_10_12_100000_create_password_resets_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2019_08_19_000000_create_failed_jobs_table", + "target": "database_migrations_2019_08_19_000000_create_failed_jobs_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2019_08_19_000000_create_failed_jobs_table", + "target": "database_migrations_2019_08_19_000000_create_failed_jobs_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table", + "target": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table", + "target": "database_migrations_2019_12_14_000001_create_personal_access_tokens_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_01_131313_create_airports.php", + "source_location": "L40", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_01_131313_create_airports", + "target": "database_migrations_2022_10_01_131313_create_airports_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_01_131313_create_airports.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_01_131313_create_airports", + "target": "database_migrations_2022_10_01_131313_create_airports_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_01_135505_create_runways.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_01_135505_create_runways", + "target": "database_migrations_2022_10_01_135505_create_runways_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_01_135505_create_runways.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_01_135505_create_runways", + "target": "database_migrations_2022_10_01_135505_create_runways_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_01_142642_create_metars.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_01_142642_create_metars", + "target": "database_migrations_2022_10_01_142642_create_metars_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_01_142642_create_metars.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_01_142642_create_metars", + "target": "database_migrations_2022_10_01_142642_create_metars_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_15_140037_create_airport_points.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_15_140037_create_airport_points", + "target": "database_migrations_2022_10_15_140037_create_airport_points_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_15_140037_create_airport_points.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_15_140037_create_airport_points", + "target": "database_migrations_2022_10_15_140037_create_airport_points_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_16_111541_create_events.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_16_111541_create_events", + "target": "database_migrations_2022_10_16_111541_create_events_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_16_111541_create_events.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_16_111541_create_events", + "target": "database_migrations_2022_10_16_111541_create_events_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_16_111912_create_controllers.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_16_111912_create_controllers", + "target": "database_migrations_2022_10_16_111912_create_controllers_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_16_111912_create_controllers.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_16_111912_create_controllers", + "target": "database_migrations_2022_10_16_111912_create_controllers_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_30_214209_add_data_airport_scores.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_30_214209_add_data_airport_scores", + "target": "database_migrations_2022_10_30_214209_add_data_airport_scores_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_10_30_214209_add_data_airport_scores.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_10_30_214209_add_data_airport_scores", + "target": "database_migrations_2022_10_30_214209_add_data_airport_scores_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_11_01_211600_remove_total_score_column.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_11_01_211600_remove_total_score_column", + "target": "database_migrations_2022_11_01_211600_remove_total_score_column_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2022_11_01_211600_remove_total_score_column.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2022_11_01_211600_remove_total_score_column", + "target": "database_migrations_2022_11_01_211600_remove_total_score_column_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_07_24_075209_create_api_keys_table.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_07_24_075209_create_api_keys_table", + "target": "database_migrations_2023_07_24_075209_create_api_keys_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_07_24_075209_create_api_keys_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_07_24_075209_create_api_keys_table", + "target": "database_migrations_2023_07_24_075209_create_api_keys_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_07_29_103301_add_airbase_airline_boolean.php", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean", + "target": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_07_29_103301_add_airbase_airline_boolean.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean", + "target": "database_migrations_2023_07_29_103301_add_airbase_airline_boolean_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_07_29_124150_create_api_logs_table.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_07_29_124150_create_api_logs_table", + "target": "database_migrations_2023_07_29_124150_create_api_logs_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_07_29_124150_create_api_logs_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_07_29_124150_create_api_logs_table", + "target": "database_migrations_2023_07_29_124150_create_api_logs_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_08_13_093925_create_flights_table.php", + "source_location": "L50", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_08_13_093925_create_flights_table", + "target": "database_migrations_2023_08_13_093925_create_flights_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_08_13_093925_create_flights_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_08_13_093925_create_flights_table", + "target": "database_migrations_2023_08_13_093925_create_flights_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_08_20_100237_create_airlines_table.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_08_20_100237_create_airlines_table", + "target": "database_migrations_2023_08_20_100237_create_airlines_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2023_08_20_100237_create_airlines_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2023_08_20_100237_create_airlines_table", + "target": "database_migrations_2023_08_20_100237_create_airlines_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_13_152706_create_flight_aircrafts_table.php", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table", + "target": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_13_152706_create_flight_aircrafts_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table", + "target": "database_migrations_2024_01_13_152706_create_flight_aircrafts_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_14_104204_move_aircraft_icao.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_14_104204_move_aircraft_icao", + "target": "database_migrations_2024_01_14_104204_move_aircraft_icao_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_14_104204_move_aircraft_icao.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_14_104204_move_aircraft_icao", + "target": "database_migrations_2024_01_14_104204_move_aircraft_icao_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_14_111020_rename_aircraft_icao_column.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column", + "target": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_14_111020_rename_aircraft_icao_column.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column", + "target": "database_migrations_2024_01_14_111020_rename_aircraft_icao_column_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_14_114906_add_airline_flight_counter_column.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column", + "target": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_01_14_114906_add_airline_flight_counter_column.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column", + "target": "database_migrations_2024_01_14_114906_add_airline_flight_counter_column_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_205614_add_aircraft_table.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_205614_add_aircraft_table", + "target": "database_migrations_2024_03_17_205614_add_aircraft_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_205614_add_aircraft_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_205614_add_aircraft_table", + "target": "database_migrations_2024_03_17_205614_add_aircraft_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L33", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table", + "target": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_210345_add_aircraft_to_new_table.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table", + "target": "database_migrations_2024_03_17_210345_add_aircraft_to_new_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table", + "target": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_03_17_211055_change_flights_icao_to_aircraft_table.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table", + "target": "database_migrations_2024_03_17_211055_change_flights_icao_to_aircraft_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L46", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates", + "target": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_07_22_072158_add_geospacial_airport_coordinates.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates", + "target": "database_migrations_2024_07_22_072158_add_geospacial_airport_coordinates_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_16_200001_new_users_fields.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_16_200001_new_users_fields", + "target": "database_migrations_2024_08_16_200001_new_users_fields_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_16_200001_new_users_fields.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_16_200001_new_users_fields", + "target": "database_migrations_2024_08_16_200001_new_users_fields_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_19_194615_create_simulators.php", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_19_194615_create_simulators", + "target": "database_migrations_2024_08_19_194615_create_simulators_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_19_194615_create_simulators.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_19_194615_create_simulators", + "target": "database_migrations_2024_08_19_194615_create_simulators_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_19_195929_create_user_lists.php", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_19_195929_create_user_lists", + "target": "database_migrations_2024_08_19_195929_create_user_lists_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_19_195929_create_user_lists.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_19_195929_create_user_lists", + "target": "database_migrations_2024_08_19_195929_create_user_lists_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_19_201759_create_airport_user_list_pivot.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot", + "target": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_19_201759_create_airport_user_list_pivot.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot", + "target": "database_migrations_2024_08_19_201759_create_airport_user_list_pivot_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_24_170220_create_scenery_table.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_24_170220_create_scenery_table", + "target": "database_migrations_2024_08_24_170220_create_scenery_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_08_24_170220_create_scenery_table.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_08_24_170220_create_scenery_table", + "target": "database_migrations_2024_08_24_170220_create_scenery_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_09_29_110835_create_sceneries_simulators_table.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table", + "target": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_09_29_110835_create_sceneries_simulators_table.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table", + "target": "database_migrations_2024_09_29_110835_create_sceneries_simulators_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table", + "target": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_09_29_111847_convert_scenery_sims_to_pivot_table.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table", + "target": "database_migrations_2024_09_29_111847_convert_scenery_sims_to_pivot_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_11_03_090929_add_hidden_column_to_lists.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists", + "target": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_11_03_090929_add_hidden_column_to_lists.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists", + "target": "database_migrations_2024_11_03_090929_add_hidden_column_to_lists_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_11_17_085152_index_flights_table.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_11_17_085152_index_flights_table", + "target": "database_migrations_2024_11_17_085152_index_flights_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_11_17_085152_index_flights_table.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_11_17_085152_index_flights_table", + "target": "database_migrations_2024_11_17_085152_index_flights_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_11_30_135220_add_msfs2024_support.php", + "source_location": "L42", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_11_30_135220_add_msfs2024_support", + "target": "database_migrations_2024_11_30_135220_add_msfs2024_support_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_11_30_135220_add_msfs2024_support.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_11_30_135220_add_msfs2024_support", + "target": "database_migrations_2024_11_30_135220_add_msfs2024_support_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_12_21_160704_add_temperature_to_metars.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_12_21_160704_add_temperature_to_metars", + "target": "database_migrations_2024_12_21_160704_add_temperature_to_metars_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2024_12_21_160704_add_temperature_to_metars.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2024_12_21_160704_add_temperature_to_metars", + "target": "database_migrations_2024_12_21_160704_add_temperature_to_metars_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_01_31_200732_add_new_scenery_sim_pivots.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots", + "target": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_01_31_200732_add_new_scenery_sim_pivots.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots", + "target": "database_migrations_2025_01_31_200732_add_new_scenery_sim_pivots_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_073332_rename_author_to_developer.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_073332_rename_author_to_developer", + "target": "database_migrations_2025_02_01_073332_rename_author_to_developer_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_073332_rename_author_to_developer.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_073332_rename_author_to_developer", + "target": "database_migrations_2025_02_01_073332_rename_author_to_developer_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085034_pivot_unique.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085034_pivot_unique", + "target": "database_migrations_2025_02_01_085034_pivot_unique_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085034_pivot_unique.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085034_pivot_unique", + "target": "database_migrations_2025_02_01_085034_pivot_unique_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L66", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot", + "target": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085035_transfer_sceneries_to_pivot.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot", + "target": "database_migrations_2025_02_01_085035_transfer_sceneries_to_pivot_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085036_cleanup_scenery_columns.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085036_cleanup_scenery_columns", + "target": "database_migrations_2025_02_01_085036_cleanup_scenery_columns_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_01_085036_cleanup_scenery_columns.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_01_085036_cleanup_scenery_columns", + "target": "database_migrations_2025_02_01_085036_cleanup_scenery_columns_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators", + "target": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_094303_remove_unique_in_scener_simulators.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators", + "target": "database_migrations_2025_02_02_094303_remove_unique_in_scener_simulators_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_094304_rename_sceneries_to_developers.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers", + "target": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_094304_rename_sceneries_to_developers.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers", + "target": "database_migrations_2025_02_02_094304_rename_sceneries_to_developers_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_100140_move_scenery_sims_to_own_model.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model", + "target": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_100140_move_scenery_sims_to_own_model.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model", + "target": "database_migrations_2025_02_02_100140_move_scenery_sims_to_own_model_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_101402_rename_scenery_id_to_developer.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer", + "target": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_101402_rename_scenery_id_to_developer.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer", + "target": "database_migrations_2025_02_02_101402_rename_scenery_id_to_developer_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_111315_add_source_reference_id.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_111315_add_source_reference_id", + "target": "database_migrations_2025_02_02_111315_add_source_reference_id_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_02_02_111315_add_source_reference_id.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_02_02_111315_add_source_reference_id", + "target": "database_migrations_2025_02_02_111315_add_source_reference_id_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_085806_add_w2f_runway_column.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_085806_add_w2f_runway_column", + "target": "database_migrations_2025_04_20_085806_add_w2f_runway_column_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_085806_add_w2f_runway_column.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_085806_add_w2f_runway_column", + "target": "database_migrations_2025_04_20_085806_add_w2f_runway_column_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_091731_index_runways.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_091731_index_runways", + "target": "database_migrations_2025_04_20_091731_index_runways_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_091731_index_runways.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_091731_index_runways", + "target": "database_migrations_2025_04_20_091731_index_runways_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_091732_index_scores.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_091732_index_scores", + "target": "database_migrations_2025_04_20_091732_index_scores_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_091732_index_scores.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_091732_index_scores", + "target": "database_migrations_2025_04_20_091732_index_scores_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_102726_index_flights.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_102726_index_flights", + "target": "database_migrations_2025_04_20_102726_index_flights_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2025_04_20_102726_index_flights.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2025_04_20_102726_index_flights", + "target": "database_migrations_2025_04_20_102726_index_flights_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_03_15_154239_add_endpoint_to_api_logs.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs", + "target": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_03_15_154239_add_endpoint_to_api_logs.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs", + "target": "database_migrations_2026_03_15_154239_add_endpoint_to_api_logs_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_04_05_070653_add_feedback_votes_table.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_04_05_070653_add_feedback_votes_table", + "target": "database_migrations_2026_04_05_070653_add_feedback_votes_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_04_05_070653_add_feedback_votes_table.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_04_05_070653_add_feedback_votes_table", + "target": "database_migrations_2026_04_05_070653_add_feedback_votes_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_04_05_134527_create_cache_table.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_04_05_134527_create_cache_table", + "target": "database_migrations_2026_04_05_134527_create_cache_table_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_04_05_134527_create_cache_table.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_04_05_134527_create_cache_table", + "target": "database_migrations_2026_04_05_134527_create_cache_table_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_04_05_134735_add_feedback_last_read.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_04_05_134735_add_feedback_last_read", + "target": "database_migrations_2026_04_05_134735_add_feedback_last_read_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_04_05_134735_add_feedback_last_read.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_04_05_134735_add_feedback_last_read", + "target": "database_migrations_2026_04_05_134735_add_feedback_last_read_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100000_create_tafs.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100000_create_tafs", + "target": "database_migrations_2026_07_03_100000_create_tafs_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100000_create_tafs.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100000_create_tafs", + "target": "database_migrations_2026_07_03_100000_create_tafs_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100001_create_bookings.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100001_create_bookings", + "target": "database_migrations_2026_07_03_100001_create_bookings_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100001_create_bookings.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100001_create_bookings", + "target": "database_migrations_2026_07_03_100001_create_bookings_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores", + "target": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100002_add_prediction_columns_to_airport_scores.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores", + "target": "database_migrations_2026_07_03_100002_add_prediction_columns_to_airport_scores_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type", + "target": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100003_fix_metars_airport_id_type.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type", + "target": "database_migrations_2026_07_03_100003_fix_metars_airport_id_type_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100004_create_taf_forecasts.php", + "source_location": "L33", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100004_create_taf_forecasts", + "target": "database_migrations_2026_07_03_100004_create_taf_forecasts_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_03_100004_create_taf_forecasts.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_03_100004_create_taf_forecasts", + "target": "database_migrations_2026_07_03_100004_create_taf_forecasts_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php", + "source_location": "L36", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates", + "target": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_120000_add_srid_to_airport_coordinates.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates", + "target": "database_migrations_2026_07_07_120000_add_srid_to_airport_coordinates_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130000_index_airports_icao.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130000_index_airports_icao", + "target": "database_migrations_2026_07_07_130000_index_airports_icao_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130000_index_airports_icao.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130000_index_airports_icao", + "target": "database_migrations_2026_07_07_130000_index_airports_icao_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130001_index_airports_local_code.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130001_index_airports_local_code", + "target": "database_migrations_2026_07_07_130001_index_airports_local_code_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130001_index_airports_local_code.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130001_index_airports_local_code", + "target": "database_migrations_2026_07_07_130001_index_airports_local_code_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130002_index_airport_scores_source_window.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130002_index_airport_scores_source_window", + "target": "database_migrations_2026_07_07_130002_index_airport_scores_source_window_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130002_index_airport_scores_source_window.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130002_index_airport_scores_source_window", + "target": "database_migrations_2026_07_07_130002_index_airport_scores_source_window_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130003_index_taf_forecasts_window.php", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130003_index_taf_forecasts_window", + "target": "database_migrations_2026_07_07_130003_index_taf_forecasts_window_down" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/migrations/2026_07_07_130003_index_taf_forecasts_window.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_migrations_2026_07_07_130003_index_taf_forecasts_window", + "target": "database_migrations_2026_07_07_130003_index_taf_forecasts_window_up" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder", + "target": "database_seeders_testairportseeder_testairportseeder" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder", + "target": "seeder" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/TestCase.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_testcase", + "target": "database_seeders_testairportseeder" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder_testairportseeder", + "target": "database_seeders_testairportseeder_testairportseeder_run" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "database/seeders/TestAirportSeeder.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "database_seeders_testairportseeder_testairportseeder", + "target": "seeder" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package", + "target": "package_dependencies" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package", + "target": "package_devdependencies" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package", + "target": "package_private" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package", + "target": "package_scripts" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_scripts", + "target": "package_scripts_build" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_scripts", + "target": "package_scripts_dev" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_bootstrap" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_elfalem_leaflet_curve" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_joergdietrich_leaflet_terminator" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_laravel_vite_plugin" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_leaflet" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_leaflet_markercluster" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_lodash" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_moment" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_nouislider" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_popperjs_core" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_postcss" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_react" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_react_dom" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_react_leaflet" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_react_leaflet_cluster" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_sass" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L28", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_sortable_tablesort" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_u_elements_u_combobox" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_u_elements_u_datalist" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_u_elements_u_tabs" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_vite" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_dependencies", + "target": "package_dependencies_vitejs_plugin_react" + }, + { + "relation": "imports", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L15", + "weight": 1.0, + "context": "import", + "confidence_score": 1.0, + "source": "package_dependencies_bootstrap", + "target": "resources_js_bootstrap" + }, + { + "relation": "imports", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L21", + "weight": 1.0, + "context": "import", + "confidence_score": 1.0, + "source": "package_dependencies_nouislider", + "target": "resources_js_nouislider" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "package.json", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "package_devdependencies", + "target": "package_devdependencies_types_leaflet" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/app.js", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_app", + "target": "resources_js_bootstrap" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/app.js", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_app", + "target": "resources_js_components_airportcard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/app.js", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_app", + "target": "resources_js_components_map" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/app.js", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_app", + "target": "resources_js_components_popupcontainer" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/app.js", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_app", + "target": "resources_js_components_ui_taf" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/bootstrap.js", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_bootstrap", + "target": "resources_js_bootstrap" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_airportcard_airportcard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_context_cardcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_context_cardcontext_cardcontext" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_context_mapcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_context_mapcontext_mapcontext" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_flightscard" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_flightscard_flightscard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_scenerycard" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_scenerycard_scenerycard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_ui_simbrieflink" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_ui_simbrieflink_simbrieflink" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_ui_taf" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_ui_taf_taf" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_utils_externallinktracker" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_utils_externallinktracker_externallinktracker" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_utils_tooltiprefresh" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard", + "target": "resources_js_components_utils_tooltiprefresh_tooltiprefresh" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/PopupContainer.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_popupcontainer", + "target": "resources_js_components_airportcard" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L91", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard_airportcard", + "target": "resources_js_components_utils_externallinktracker_externallinktracker" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/AirportCard.jsx", + "source_location": "L92", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_airportcard_airportcard", + "target": "resources_js_components_utils_tooltiprefresh_tooltiprefresh" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/PopupContainer.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_popupcontainer", + "target": "resources_js_components_airportcard_airportcard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_flightscard", + "target": "resources_js_components_context_cardcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_flightscard", + "target": "resources_js_components_context_cardcontext_cardcontext" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_flightscard", + "target": "resources_js_components_context_mapcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_flightscard", + "target": "resources_js_components_context_mapcontext_mapcontext" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/FlightsCard.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_flightscard", + "target": "resources_js_components_flightscard_flightscard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_context_mapcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_context_mapcontext_mapcontext" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_getinitmapposition" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L21", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_isdefaultview" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L66", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_map" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapbound" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapbound_mapbound" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapdrawroute" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapdrawroute_mapdrawroute" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L253", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapelement" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapmarkergroup" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapmarkergroup_mapmarkergroup" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mappan" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mappan_mappan" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapsaveview" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapsaveview_mapsaveview" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapterminator" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_mapterminator_mapterminator" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_maptooltipzoom" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_map_maptooltipzoom_maptooltipzoom" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_popupcontainer" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_popupcontainer_popupcontainer" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_utils_clustericon" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map", + "target": "resources_js_components_utils_clustericon_createclustericon" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L239", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_map", + "target": "resources_js_components_map_isdefaultview" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "resources/js/components/utils/ClusterIcon.jsx", + "source_location": "L5", + "weight": 1.0, + "source": "resources_js_components_utils_clustericon_createclustericon", + "target": "resources_js_components_map_isdefaultview" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/Map.jsx", + "source_location": "L215", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_map", + "target": "resources_js_components_map_getinitmapposition" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/PopupContainer.jsx", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_popupcontainer", + "target": "resources_js_components_popupcontainer_popupcontainer" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_context_cardcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_context_cardcontext_cardcontext" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_scenerycard_scenerycard" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_ui_currencydropdown" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_ui_currencydropdown_currencydropdown" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_utils_externallinktracker" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_utils_externallinktracker_externallinktracker" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_utils_tooltiprefresh" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard", + "target": "resources_js_components_utils_tooltiprefresh_tooltiprefresh" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard_scenerycard", + "target": "resources_js_components_utils_externallinktracker_externallinktracker" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/SceneryCard.jsx", + "source_location": "L54", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_scenerycard_scenerycard", + "target": "resources_js_components_utils_tooltiprefresh_tooltiprefresh" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/context/CardContext.js", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_context_cardcontext", + "target": "resources_js_components_context_cardcontext_cardcontext" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/context/MapContext.js", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_context_mapcontext", + "target": "resources_js_components_context_mapcontext_mapcontext" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapDrawRoute.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapdrawroute", + "target": "resources_js_components_context_mapcontext" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarkerGroup.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarkergroup", + "target": "resources_js_components_context_mapcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapDrawRoute.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapdrawroute", + "target": "resources_js_components_context_mapcontext_mapcontext" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarkerGroup.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarkergroup", + "target": "resources_js_components_context_mapcontext_mapcontext" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapBound.jsx", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapbound", + "target": "resources_js_components_map_mapbound_mapbound" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapDrawRoute.jsx", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapdrawroute", + "target": "resources_js_components_map_mapdrawroute_mapdrawroute" + }, + { + "relation": "indirect_call", + "confidence": "INFERRED", + "source_file": "resources/js/components/map/MapMarker.jsx", + "source_location": "L43", + "weight": 1.0, + "context": "argument", + "confidence_score": 0.5, + "source": "resources_js_components_map_mapmarker", + "target": "resources_js_components_map_mapmarker_mapmarker" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarker.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarker", + "target": "resources_js_components_utils_markericon" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarker.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarker", + "target": "resources_js_components_utils_markericon_createmarkericon" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarkerGroup.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarkergroup", + "target": "resources_js_components_map_mapmarker" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarker.jsx", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarker_mapmarker", + "target": "resources_js_components_utils_markericon_createmarkericon" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapMarkerGroup.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapmarkergroup", + "target": "resources_js_components_map_mapmarkergroup_mapmarkergroup" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapPan.jsx", + "source_location": "L4", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mappan", + "target": "resources_js_components_map_mappan_mappan" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapSaveView.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapsaveview", + "target": "resources_js_components_map_mapsaveview_mapsaveview" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapTerminator.jsx", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_mapterminator", + "target": "resources_js_components_map_mapterminator_mapterminator" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapTooltipZoom.jsx", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_maptooltipzoom", + "target": "resources_js_components_map_maptooltipzoom_applyzoomclasses" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/map/MapTooltipZoom.jsx", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_map_maptooltipzoom", + "target": "resources_js_components_map_maptooltipzoom_maptooltipzoom" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/ui/CurrencyDropdown.jsx", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_ui_currencydropdown", + "target": "resources_js_components_ui_currencydropdown_currencydropdown" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/ui/SimbriefLink.jsx", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_ui_simbrieflink", + "target": "resources_js_components_ui_simbrieflink_simbrieflink" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/ui/TAF.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_ui_taf", + "target": "resources_js_components_ui_taf_taf" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/utils/ClusterIcon.jsx", + "source_location": "L1", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_utils_clustericon", + "target": "resources_js_components_utils_clustericon_createclustericon" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/utils/ExternalLinkTracker.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_utils_externallinktracker", + "target": "resources_js_components_utils_externallinktracker_externallinktracker" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/utils/MarkerIcon.jsx", + "source_location": "L3", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_utils_markericon", + "target": "resources_js_components_utils_markericon_createmarkericon" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/components/utils/TooltipRefresh.jsx", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_components_utils_tooltiprefresh", + "target": "resources_js_components_utils_tooltiprefresh_tooltiprefresh" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/combobox.js", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_combobox", + "target": "resources_js_functions_combobox_placeholderconfigs" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L167", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchform", + "target": "resources_js_functions_searchform_contractfilters" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L179", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchform", + "target": "resources_js_functions_searchform_expandfilters" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchform", + "target": "resources_js_functions_searchform_submitformmetrics" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L152", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchform", + "target": "resources_js_functions_searchform_togglefilters" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L163", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchform_togglefilters", + "target": "resources_js_functions_searchform_contractfilters" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchForm.js", + "source_location": "L161", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchform_togglefilters", + "target": "resources_js_functions_searchform_expandfilters" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchResults.js", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchresults", + "target": "resources_js_functions_searchresults_expandallrows" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/searchResults.js", + "source_location": "L36", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_searchresults", + "target": "resources_js_functions_searchresults_syncdetailrows" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "resources/js/functions/taf.js", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_functions_taf", + "target": "resources_js_functions_taf_revealtaf" + }, + { + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "resources/js/nouislider.js", + "source_location": "L2", + "weight": 1.0, + "confidence_score": 1.0, + "source": "resources_js_nouislider", + "target": "resources_js_nouislider" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/account/admin.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_account_admin_blade", + "target": "resources_views_account_admin_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/account/login.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_account_login_blade", + "target": "resources_views_account_login_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/account/register.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_account_register_blade", + "target": "resources_views_account_register_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/account/resetForm.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_account_resetform_blade", + "target": "resources_views_account_resetform_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/account/resetRequest.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_account_resetrequest_blade", + "target": "resources_views_account_resetrequest_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/account/settings.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_account_settings_blade", + "target": "resources_views_account_settings_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/api.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_api_blade", + "target": "resources_views_api_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/changelog.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_changelog_blade", + "target": "resources_views_changelog_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/feedback/index.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_feedback_index_blade", + "target": "resources_views_feedback_index_blade_php_feedback_sidebar" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/feedback/index.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_feedback_index_blade", + "target": "resources_views_feedback_index_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/feedback/show.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_feedback_show_blade", + "target": "resources_views_feedback_show_blade_php_feedback_sidebar" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/feedback/show.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_feedback_show_blade", + "target": "resources_views_feedback_show_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_arrivals_blade", + "target": "resources_views_front_arrivals_blade_php_front_parts_form" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_arrivals_blade", + "target": "resources_views_front_arrivals_blade_php_front_parts_sliders" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_arrivals_blade", + "target": "resources_views_front_arrivals_blade_php_front_parts_tabs" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/arrivals.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_arrivals_blade", + "target": "resources_views_front_arrivals_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_departures_blade", + "target": "resources_views_front_departures_blade_php_front_parts_form" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_departures_blade", + "target": "resources_views_front_departures_blade_php_front_parts_sliders" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_departures_blade", + "target": "resources_views_front_departures_blade_php_front_parts_tabs" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/departures.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_departures_blade", + "target": "resources_views_front_departures_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/routes.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_routes_blade", + "target": "resources_views_front_routes_blade_php_front_parts_tabs" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/front/routes.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_front_routes_blade", + "target": "resources_views_front_routes_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_app_blade", + "target": "layouts_footer" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_app_blade", + "target": "parts_map" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_app_blade", + "target": "resources_views_layouts_app_blade_php_layouts_header" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/app.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_app_blade", + "target": "resources_views_layouts_app_blade_php_layouts_menu" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/appStatic.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_appstatic_blade", + "target": "resources_views_layouts_appstatic_blade_php_layouts_header" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/appStatic.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_appstatic_blade", + "target": "resources_views_layouts_appstatic_blade_php_layouts_menu" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/layouts/header.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_layouts_header_blade", + "target": "layouts_tracking" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/list/create.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_list_create_blade", + "target": "resources_views_list_create_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/list/edit.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_list_edit_blade", + "target": "resources_views_list_edit_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/list/index.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_list_index_blade", + "target": "resources_views_list_index_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/privacy.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_privacy_blade", + "target": "resources_views_privacy_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/scenery.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_scenery_blade", + "target": "resources_views_scenery_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/scenery/create.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_scenery_create_blade", + "target": "resources_views_scenery_create_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/scenery/edit.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_scenery_edit_blade", + "target": "resources_views_scenery_edit_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/search/airports.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_search_airports_blade", + "target": "resources_views_search_airports_blade_php_layouts_legend" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/search/airports.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_search_airports_blade", + "target": "resources_views_search_airports_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/search/routes.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_search_routes_blade", + "target": "resources_views_search_routes_blade_php_layouts_title" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/top.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_top_blade", + "target": "resources_views_top_blade_php_layouts_legend" + }, + { + "relation": "includes", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "resources/views/top.blade.php", + "source_location": null, + "weight": 1.0, + "source": "resources_views_top_blade", + "target": "resources_views_top_blade_php_layouts_title" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/CreatesApplication.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_createsapplication", + "target": "tests_createsapplication_createapplication" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest", + "target": "refreshdatabase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest", + "target": "tests_feature_admintest_admintest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest", + "target": "tests_testcase_testcase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "refreshdatabase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L46", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "tests_feature_admintest_admintest_test_admin_flag_is_false_for_regular_users" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "tests_feature_admintest_admintest_test_admin_flag_is_true_for_admin_users" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L17", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "tests_feature_admintest_admintest_test_admin_page_requires_authentication" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L33", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "tests_feature_admintest_admintest_test_admin_user_can_access_admin_page" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "tests_feature_admintest_admintest_test_non_admin_user_cannot_access_admin_page" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/AdminTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_admintest_admintest", + "target": "tests_testcase_testcase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L13", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "refreshdatabase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest", + "target": "refreshdatabase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "refreshdatabase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "tests_feature_apitest_apitest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L23", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L266", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_airport_endpoint_returns_422_for_nonexistent_airport_id" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L276", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_airport_endpoint_returns_422_when_required_field_is_missing" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L164", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_accepts_valid_scores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L111", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_fails_validation_without_codeletter" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L97", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_is_rejected_with_disabled_token" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L195", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_rejects_negative_distance" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L138", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_rejects_non_array_scores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L151", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_rejects_out_of_range_score_value" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L123", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_rejects_unknown_score_reason" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L87", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_requires_valid_token" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L177", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_restricts_results_to_distance_bounds" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L208", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_returns_error_when_both_arrival_and_departure_given" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L221", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_api_search_returns_error_when_neither_arrival_nor_departure_given" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L37", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_authenticated_check_returns_false_for_guest" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L45", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_authenticated_check_returns_true_for_logged_in_user" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L59", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_get_mapdata_from_known_icao_returns_success" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L67", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_get_mapdata_from_unknown_icao_returns_validation_error" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L75", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_get_mapdata_requires_icao_field" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L236", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_list_airports_endpoint_requires_auth" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L243", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_feature_apitest_apitest_test_list_airports_endpoint_returns_success_for_authenticated_user" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest", + "target": "tests_testcase_testcase" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L166", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_accepts_valid_scores", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L113", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_fails_validation_without_codeletter", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L99", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_is_rejected_with_disabled_token", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L197", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_rejects_negative_distance", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L140", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_rejects_non_array_scores", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L153", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_rejects_out_of_range_score_value", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L125", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_rejects_unknown_score_reason", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L179", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_restricts_results_to_distance_bounds", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L210", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_returns_error_when_both_arrival_and_departure_given", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ApiTest.php", + "source_location": "L223", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_apitest_apitest_test_api_search_returns_error_when_neither_arrival_nor_departure_given", + "target": "tests_feature_apitest_apitest_createapikey" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_responsetest", + "target": "tests_feature_responsetest_responsetest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L5", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_responsetest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L14", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_responsetest_responsetest", + "target": "tests_feature_responsetest_responsetest_test_the_application_returns_a_successful_response" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ResponseTest.php", + "source_location": "L7", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_responsetest_responsetest", + "target": "tests_testcase_testcase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "tests_feature_scenerytest_scenerytest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L27", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_authenticated_user_can_view_scenery_create_page" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L156", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_duplicate_developer_is_reused_for_new_simulator" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L20", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_create_page_requires_authentication" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L36", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_create_page_shows_existing_developers_for_known_icao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L137", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_associates_suggested_by_user" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L91", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_icao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L106", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_fails_with_invalid_url" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L70", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_is_stored_as_unpublished" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L122", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_scenery_suggestion_requires_at_least_one_simulator" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L49", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_feature_scenerytest_scenerytest_test_user_can_submit_a_scenery_suggestion" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SceneryTest.php", + "source_location": "L12", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scenerytest_scenerytest", + "target": "tests_testcase_testcase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L25", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L41", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L208", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_atc_booking_helpers_expose_facilities_in_order" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L177", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_display_scores_serve_current_status_before_forecasts" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L53", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_exact_sources_match_only_when_window_contains_eta" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L135", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_falls_back_when_no_taf_covers_eta" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L111", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L65", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L197", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_popular_tooltip_shows_the_movement_count" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L88", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_predicted_presence_matches_with_one_hour_overlap" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L156", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_test_scores_at_eta_mirrors_the_query_matching" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest", + "target": "tests_testcase_testcase" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L212", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_atc_booking_helpers_expose_facilities_in_order", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L182", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_display_scores_serve_current_status_before_forecasts", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L57", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_exact_sources_match_only_when_window_contains_eta", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L138", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_falls_back_when_no_taf_covers_eta", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L115", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L69", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L199", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_popular_tooltip_shows_the_movement_count", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L92", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_predicted_presence_matches_with_one_hour_overlap", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L161", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_scores_at_eta_mirrors_the_query_matching", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_makescore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L144", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_falls_back_when_no_taf_covers_eta", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L117", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_only_weather_ignores_tafs_and_always_trusts_the_metar", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L163", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_scores_at_eta_mirrors_the_query_matching", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_maketafperiod" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L60", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_exact_sources_match_only_when_window_contains_eta", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L141", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_metar_falls_back_when_no_taf_covers_eta", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L70", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_online_controllers_show_in_now_views_and_predict_two_hours_from_logon", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/ScorePredictionTest.php", + "source_location": "L100", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_scorepredictiontest_scorepredictiontest_test_predicted_presence_matches_with_one_hour_overlap", + "target": "tests_feature_scorepredictiontest_scorepredictiontest_matchedids" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest", + "target": "tests_feature_searchtest_searchtest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L610", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L59", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_arrival_search_page_loads" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L190", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_default_search_returns_at_least_3_results" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L66", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_departure_search_page_loads" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L565", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_airbases_only_returns_airbase_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L521", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_continent_filter_returns_only_matching_continent" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L508", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_country_filter_returns_only_matching_country" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L579", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_exclude_airbases_hides_airbase_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L592", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_flight_direction_south_excludes_northern_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L495", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_large_airports_only_excludes_smaller_types" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L537", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_lighted_runways_only_excludes_unlighted_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L482", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_small_airports_only_returns_small_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L551", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_destination_unlighted_runways_only_returns_unlighted_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L302", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_metcondition_ifr_only_returns_ifr_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L288", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_metcondition_vfr_excludes_ifr_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L73", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_route_search_page_loads" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L375", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_ceiling_only_shows_low_ceiling_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L342", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_crosswind_only_shows_crosswind_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L456", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_foggy_exclusion_hides_scored_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L331", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_gusts_only_shows_gusty_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L386", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_heavy_rain_only_shows_heavy_rain_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L397", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_heavy_snow_only_shows_heavy_snow_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L364", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_rvr_only_shows_rvr_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L353", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_sight_only_shows_reduced_sight_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L408", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_thunderstorm_only_shows_thunderstorm_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L419", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_vatsim_atc_only_shows_atc_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L430", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_vatsim_event_only_shows_event_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L467", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_vatsim_popular_exclusion_hides_scored_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L441", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_vatsim_popular_only_shows_popular_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L320", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_score_windy_only_shows_windy_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L231", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_airtime_is_within_searched_bounds" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L246", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_distance_is_within_searched_bounds" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L159", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_doesnt_show_airport_without_metar" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L125", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_edit_redirects_to_arrival_page_for_departure_direction" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L134", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_edit_redirects_to_departure_page_for_arrival_direction" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L94", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_fails_with_invalid_codeletter" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L112", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_fails_with_invalid_metcondition" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L103", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_fails_with_non_array_scores" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L261", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_fails_with_out_of_range_distance" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L147", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_fails_with_unrealistic_flight_length_and_destinations" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L270", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_foggy_score_filter_returns_only_foggy_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L174", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_only_shows_domestic_when_searching_for_domestic" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L84", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_requires_direction" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L200", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_search_returns_at_most_20_suggestions_ordered_by_score_count" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L213", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_feature_searchtest_searchtest_test_whitelist_restricts_results_to_whitelisted_airports" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest", + "target": "tests_testcase_testcase" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L322", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_windy_only_shows_windy_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L333", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_gusts_only_shows_gusty_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L344", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_crosswind_only_shows_crosswind_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L355", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_sight_only_shows_reduced_sight_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L366", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_rvr_only_shows_rvr_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L377", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_ceiling_only_shows_low_ceiling_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L388", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_heavy_rain_only_shows_heavy_rain_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L399", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_heavy_snow_only_shows_heavy_snow_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L410", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_thunderstorm_only_shows_thunderstorm_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L421", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_vatsim_atc_only_shows_atc_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L432", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_vatsim_event_only_shows_event_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L443", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_vatsim_popular_only_shows_popular_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L458", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_foggy_exclusion_hides_scored_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/SearchTest.php", + "source_location": "L469", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_searchtest_searchtest_test_score_vatsim_popular_exclusion_hides_scored_airports", + "target": "tests_feature_searchtest_searchtest_paramswithscore" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest", + "target": "tests_feature_topairportstest_topairportstest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L35", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_aircraft_filter_excludes_airports_with_short_runways" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L84", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_cached_result_is_served_without_recomputing" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_top_airports_are_cached_per_variant" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L68", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_top_page_aircraft_all_disables_the_filter" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L60", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_top_page_defaults_to_jm_aircraft" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L76", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_top_page_invalid_aircraft_falls_back_to_default" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L15", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_top_page_loads" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L52", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_top_page_loads_with_aircraft_filter" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L97", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_feature_topairportstest_topairportstest_test_whitelist_variant_bypasses_the_cache" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/TopAirportsTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_topairportstest_topairportstest", + "target": "tests_testcase_testcase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L292", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_account_settings_requires_auth" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L299", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_authenticated_user_can_view_account_settings" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L280", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_guest_cannot_access_delete_account_route" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L238", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_nonexistent_username" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L219", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_wrong_password" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L170", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_login_page_loads" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L112", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_email" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L94", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_username" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L77", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_mismatched_passwords" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L60", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_short_password" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L130", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_without_privacy_policy_acceptance" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L146", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_is_blocked_for_authenticated_users" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L32", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_registration_page_loads" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L270", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_user_can_delete_own_account" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L181", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_user_can_login" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L200", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_user_can_login_with_email" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L256", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_user_can_logout" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L43", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_feature_useraccounttest_useraccounttest_test_user_can_register" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest", + "target": "tests_testcase_testcase" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L240", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_nonexistent_username", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L221", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_login_fails_with_wrong_password", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L114", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_email", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L96", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_duplicate_username", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L79", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_mismatched_passwords", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L62", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_with_short_password", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L132", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_fails_without_privacy_policy_acceptance", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L148", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_registration_is_blocked_for_authenticated_users", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L183", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_login", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L202", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_login_with_email", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserAccountTest.php", + "source_location": "L45", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_useraccounttest_useraccounttest_test_user_can_register", + "target": "tests_feature_useraccounttest_useraccounttest_faketurnstile" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest", + "target": "tests_feature_userlisttest_userlisttest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L378", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_admin_can_make_list_public_when_editing" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L46", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_authenticated_user_can_view_create_list_page" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_authenticated_user_can_view_list_index" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L96", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_creating_list_with_unknown_airport_shows_warning" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L39", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_list_create_page_requires_authentication" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L112", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_name" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L126", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_color" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L141", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_list_creation_requires_valid_simulator" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L19", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_list_index_requires_authentication" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L336", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_creating" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L353", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_non_admin_cannot_make_list_public_when_editing" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L213", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_add_airports_to_existing_list" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L59", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L78", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_create_a_list_with_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L272", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_delete_own_list" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L159", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_edit_own_list" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L238", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_remove_airports_from_list" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L313", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_can_toggle_list_visibility" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L290", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_cannot_delete_another_users_list" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L185", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_feature_userlisttest_userlisttest_test_user_cannot_edit_another_users_list" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/UserListTest.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_userlisttest_userlisttest", + "target": "tests_testcase_testcase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest", + "target": "tests_testcase_testcase" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L106", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_icaoswithin" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L84", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_makeairport" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L50", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_test_antimeridian_anchor_keeps_neighbors_across_the_dateline" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L74", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_test_global_radius_reaches_other_continents" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_test_high_latitude_anchor_keeps_same_latitude_neighbors" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L38", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_test_min_distance_excludes_close_airports" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L62", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_feature_withindistancetest_withindistancetest_test_near_polar_anchor_returns_correct_distances" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L18", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest", + "target": "tests_testcase_testcase" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L31", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_high_latitude_anchor_keeps_same_latitude_neighbors", + "target": "tests_feature_withindistancetest_withindistancetest_icaoswithin" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L26", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_high_latitude_anchor_keeps_same_latitude_neighbors", + "target": "tests_feature_withindistancetest_withindistancetest_makeairport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L44", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_min_distance_excludes_close_airports", + "target": "tests_feature_withindistancetest_withindistancetest_icaoswithin" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L40", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_min_distance_excludes_close_airports", + "target": "tests_feature_withindistancetest_withindistancetest_makeairport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L56", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_antimeridian_anchor_keeps_neighbors_across_the_dateline", + "target": "tests_feature_withindistancetest_withindistancetest_icaoswithin" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L52", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_antimeridian_anchor_keeps_neighbors_across_the_dateline", + "target": "tests_feature_withindistancetest_withindistancetest_makeairport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L68", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_near_polar_anchor_returns_correct_distances", + "target": "tests_feature_withindistancetest_withindistancetest_icaoswithin" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L64", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_near_polar_anchor_returns_correct_distances", + "target": "tests_feature_withindistancetest_withindistancetest_makeairport" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L79", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_global_radius_reaches_other_continents", + "target": "tests_feature_withindistancetest_withindistancetest_icaoswithin" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "tests/Feature/WithinDistanceTest.php", + "source_location": "L77", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_feature_withindistancetest_withindistancetest_test_global_radius_reaches_other_continents", + "target": "tests_feature_withindistancetest_withindistancetest_makeairport" + }, + { + "relation": "imports", + "confidence": "EXTRACTED", + "source_file": "tests/TestCase.php", + "source_location": "L7", + "weight": 1.0, + "context": "import", + "confidence_score": 1.0, + "source": "tests_testcase", + "target": "tests_testcase_testcase" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/TestCase.php", + "source_location": "L9", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_testcase_testcase", + "target": "basetestcase" + }, + { + "relation": "mixes_in", + "confidence": "EXTRACTED", + "source_file": "tests/TestCase.php", + "source_location": "L11", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_testcase_testcase", + "target": "createsapplication" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/TestCase.php", + "source_location": "L30", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_testcase_testcase", + "target": "tests_testcase_testcase_setup" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest", + "target": "tests_testcase_testcase" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest", + "target": "tests_testcase_testcase" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L6", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest", + "target": "tests_testcase_testcase" + }, + { + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest", + "target": "tests_testcase_testcase" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest", + "target": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest", + "target": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_long_prefixes_resolve_as_icao" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L22", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest", + "target": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_non_airport_positions_are_skipped" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L16", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest", + "target": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_short_prefixes_use_australian_table_then_american_heuristic" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/AirportCallsignHelperTest.php", + "source_location": "L29", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest", + "target": "tests_unit_airportcallsignhelpertest_airportcallsignhelpertest_test_unparseable_callsigns_return_null" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L8", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest", + "target": "tests_unit_tafforecasttest_tafforecasttest" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L56", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest", + "target": "tests_unit_tafforecasttest_tafforecasttest_test_ceiling_at_above_compares_the_stored_ceiling" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L41", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest", + "target": "tests_unit_tafforecasttest_tafforecasttest_test_ceiling_derived_from_sky_condition_layers" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L24", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest", + "target": "tests_unit_tafforecasttest_tafforecasttest_test_visibility_parses_statute_miles_and_unbounded_suffix" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L63", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest", + "target": "tests_unit_tafforecasttest_tafforecasttest_test_weather_phenomena_match_against_wx_string" + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "tests/Unit/TafForecastTest.php", + "source_location": "L10", + "weight": 1.0, + "confidence_score": 1.0, + "source": "tests_unit_tafforecasttest_tafforecasttest", + "target": "tests_unit_tafforecasttest_tafforecasttest_test_wind_methods_read_structured_fields" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.65, + "source_file": ".github/FUNDING.yml", + "source_location": null, + "weight": 1.0, + "source": "_github_funding_kofi_sponsorship", + "target": "readme_where2fly_project" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.65, + "source_file": ".github/ISSUE_TEMPLATE/bug_report.md", + "source_location": null, + "weight": 1.0, + "source": "_github_issue_template_bug_report_bug_report_template", + "target": "readme_where2fly_project" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.75, + "source_file": ".github/ISSUE_TEMPLATE/config.yml", + "source_location": "blank_issues_enabled: false forces use of templates", + "weight": 1.0, + "source": "_github_issue_template_config_blank_issues_disabled", + "target": "_github_issue_template_bug_report_bug_report_template" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.65, + "source_file": ".github/ISSUE_TEMPLATE/feature_request.md", + "source_location": null, + "weight": 1.0, + "source": "_github_issue_template_feature_request_feature_request_template", + "target": "readme_where2fly_project" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.lint.steps", + "weight": 1.0, + "source": "_github_workflows_ci_lint_job", + "target": "_github_actions_setup_dependencies_action_setup_dependencies" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.tests.steps", + "weight": 1.0, + "source": "_github_workflows_ci_tests_job", + "target": "_github_actions_setup_dependencies_action_setup_dependencies" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/linting.yaml", + "source_location": null, + "weight": 1.0, + "source": "_github_workflows_linting_lint_formatting_job", + "target": "_github_actions_setup_dependencies_action_setup_dependencies" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/tests.yaml", + "source_location": null, + "weight": 1.0, + "source": "_github_workflows_tests_phpunit_job", + "target": "_github_actions_setup_dependencies_action_setup_dependencies" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.tests.needs", + "weight": 1.0, + "source": "_github_workflows_ci_tests_job", + "target": "_github_workflows_ci_lint_job" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/linting.yaml", + "source_location": "on: {} # Superseded by ci.yaml", + "weight": 1.0, + "source": "_github_workflows_linting_lint_formatting_job", + "target": "_github_workflows_ci_lint_job" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/ci.yaml", + "source_location": "jobs.build-container.needs", + "weight": 1.0, + "source": "_github_workflows_ci_build_container_job", + "target": "_github_workflows_ci_tests_job" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/tests.yaml", + "source_location": "on: {} # Superseded by ci.yaml", + "weight": 1.0, + "source": "_github_workflows_tests_phpunit_job", + "target": "_github_workflows_ci_tests_job" + }, + { + "relation": "shares_data_with", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "CLAUDE.md", + "source_location": "DB_DATABASE=where2fly_test in both", + "weight": 1.0, + "source": "claude_testing_mysql", + "target": "_github_workflows_ci_tests_job" + }, + { + "relation": "shares_data_with", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "docker-compose.yml", + "source_location": "services.web.image (ghcr.io/blt950/where2fly)", + "weight": 1.0, + "source": "docker_compose_web_service", + "target": "_github_workflows_ci_build_container_job" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "API.md", + "source_location": "How to use", + "weight": 1.0, + "source": "api_attribution_requirement", + "target": "api_where2fly_api" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "API.md", + "source_location": "Endpoints", + "weight": 1.0, + "source": "api_search_endpoint", + "target": "api_where2fly_api" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "API.md", + "source_location": "Endpoints", + "weight": 1.0, + "source": "api_top_endpoint", + "target": "api_where2fly_api" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "API section links API.md", + "weight": 1.0, + "source": "readme_where2fly_project", + "target": "api_where2fly_api" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "API.md", + "source_location": "scores param accepts these reason codes", + "weight": 1.0, + "source": "api_score_types", + "target": "api_search_endpoint" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "API.md", + "source_location": "scores/destinationRunwayLights/destinationAirbases params use -1/0/1", + "weight": 1.0, + "source": "api_tristate_filter_convention", + "target": "api_search_endpoint" + }, + { + "relation": "implements", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "CLAUDE.md", + "source_location": "SearchController validates the filter payload documented in API.md", + "weight": 1.0, + "source": "claude_search_flow", + "target": "api_search_endpoint" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "API.md", + "source_location": "same reason codes (METAR_RVR, METAR_CROSSWIND, VATSIM_ATC, VATSIM_EVENT, VATSIM_POPULAR) named in both", + "weight": 1.0, + "source": "api_score_types", + "target": "claude_scoring_event_model" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.85, + "source_file": "API.md", + "source_location": "codeletter search param feeds aircraft range/airtime calculation", + "weight": 1.0, + "source": "api_aircraft_codeletters", + "target": "claude_search_flow" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "CLAUDE.md", + "source_location": "Tech stack: MySQL 8.4 (Oracle client, see Dockerfile)", + "weight": 1.0, + "source": "claude_where2fly_app", + "target": "readme_mysql_oracle_client" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "CLAUDE.md", + "source_location": "Frontend: React only for map canvas, stated in both docs", + "weight": 1.0, + "source": "claude_where2fly_app", + "target": "readme_react_map_canvas" + }, + { + "relation": "semantically_similar_to", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "CLAUDE.md", + "source_location": "both describe the same application from different audiences (agent instructions vs public README)", + "weight": 1.0, + "source": "claude_where2fly_app", + "target": "readme_where2fly_project" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "CLAUDE.md", + "source_location": "quirks encoded in FetchMetars/FetchTafs/Taf parsing", + "weight": 1.0, + "source": "claude_awc_cache_quirks", + "target": "claude_data_ingestion_pipeline" + }, + { + "relation": "conceptually_related_to", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "CLAUDE.md", + "source_location": "each fetch command owns its score sources and rebuilds them", + "weight": 1.0, + "source": "claude_data_ingestion_pipeline", + "target": "claude_scoring_event_model" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "CLAUDE.md", + "source_location": "update:data runs all fetch commands in one 256MB process", + "weight": 1.0, + "source": "claude_memory_constraints", + "target": "claude_data_ingestion_pipeline" + }, + { + "relation": "conceptually_related_to", + "confidence": "AMBIGUOUS", + "confidence_score": 0.3, + "source_file": "README.md", + "source_location": "README lists metar.vatsim.net and api.met.no as METAR/TAF sources, but CLAUDE.md says ingestion uses aviationweather.gov bulk cache files - README data sources may be stale", + "weight": 1.0, + "source": "readme_data_sources", + "target": "claude_data_ingestion_pipeline" + }, + { + "relation": "conceptually_related_to", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "CLAUDE.md", + "source_location": "coversEta matches airport_scores validity windows per source", + "weight": 1.0, + "source": "claude_eta_matching", + "target": "claude_scoring_event_model" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "CLAUDE.md", + "source_location": "search binds per-candidate ETA (forecastEtaSql) and narrows scores via scoresAtEta", + "weight": 1.0, + "source": "claude_search_flow", + "target": "claude_eta_matching" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "License", + "weight": 1.0, + "source": "readme_where2fly_project", + "target": "readme_agpl_license" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "Development Setup > Docker", + "weight": 1.0, + "source": "readme_docker_dev_setup", + "target": "docker_compose_dev_web_service" + }, + { + "relation": "references", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "OurAirports CSV download", + "weight": 1.0, + "source": "readme_airport_database_update", + "target": "readme_data_sources" + }, + { + "relation": "conceptually_related_to", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": "docker-compose.dev.yml", + "source_location": "same where2fly service, dev builds locally vs prod pulls image", + "weight": 1.0, + "source": "docker_compose_dev_web_service", + "target": "docker_compose_web_service" + } + ], + "hyperedges": [ + { + "id": "ci_pipeline_flow", + "label": "CI Pipeline: lint -> tests -> container build, all via shared setup-dependencies action", + "nodes": [ + "_github_workflows_ci_lint_job", + "_github_workflows_ci_tests_job", + "_github_workflows_ci_build_container_job", + "_github_actions_setup_dependencies_action_setup_dependencies" + ], + "relation": "form", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": ".github/workflows/ci.yaml" + }, + { + "id": "mysql_test_database_contract", + "label": "Shared where2fly_test MySQL contract between CI services and local test setup", + "nodes": [ + "_github_workflows_ci_tests_job", + "_github_workflows_tests_phpunit_job", + "claude_testing_mysql" + ], + "relation": "participate_in", + "confidence": "INFERRED", + "confidence_score": 0.95, + "source_file": ".github/workflows/ci.yaml" + }, + { + "id": "container_image_lifecycle", + "label": "where2fly container image lifecycle: CI builds and pushes to ghcr.io, prod compose pulls it, dev compose builds locally instead", + "nodes": [ + "_github_workflows_ci_build_container_job", + "docker_compose_web_service", + "docker_compose_dev_web_service" + ], + "relation": "participate_in", + "confidence": "INFERRED", + "confidence_score": 0.85, + "source_file": "docker-compose.yml" + } + ], + "built_at_commit": "7904c0a0424bd970961e4e43ed62f7625953dcb4" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index deb8b292..b43243ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,341 +8,148 @@ "@elfalem/leaflet-curve": "^0.9.2", "@joergdietrich/leaflet.terminator": "^1.1.0", "@popperjs/core": "^2.11.6", - "@u-elements/u-combobox": "^1.0.7", - "@u-elements/u-datalist": "^1.1.0", - "@u-elements/u-tabs": "^0.1.2", - "@vitejs/plugin-react": "^4.3.0", + "@u-elements/u-combobox": "^2.0.5", + "@u-elements/u-datalist": "^2.0.1", + "@u-elements/u-tabs": "^1.0.3", + "@vitejs/plugin-react": "^6.0.0", "bootstrap": "^5.2.0", - "laravel-vite-plugin": "^2.0", + "laravel-vite-plugin": "^3.1.0", "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lodash": "^4.17.19", - "moment": "^2.30.1", "nouislider": "^15.6.1", "postcss": "^8.1.14", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-leaflet": "^4.2.1", - "react-leaflet-cluster": "^2.1.0", - "sass": "1.77.6", + "react": "19.2.7", + "react-dom": "19.2.7", + "react-leaflet": "^5.0.0", + "react-leaflet-cluster": "^4.1.3", + "sass": "^1.77.6", "sortable-tablesort": "^4.0.2", - "vite": "^7.2.1" + "vite": "^8.0.0" }, "devDependencies": { "@types/leaflet": "^1.9.12" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "node_modules/@elfalem/leaflet-curve": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@elfalem/leaflet-curve/-/leaflet-curve-0.9.2.tgz", + "integrity": "sha512-vHhJZvkTHHQsOeEPRnTYpKjmWZ7DEKVJ7rHh1xeksTi/maoxK3dCd6o59LoT3Uk6kNIvmzwrOFMHN3T+WfsbwA==", "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "optionalDependencies": { + "@tweenjs/tween.js": "^17.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "leaflet": "^1.1.0" } }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "node_modules/@joergdietrich/leaflet.terminator": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@joergdietrich/leaflet.terminator/-/leaflet.terminator-1.3.0.tgz", + "integrity": "sha512-3hDDomLkaZwoxCuHa0xADpe98HadD/n5JgoIAOOAWC5/Iosl2d0KqdaB09Mw9H+ZhPrecWB+a1fWuNcMMUYPxQ==", "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "leaflet": "^1.2.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@tybys/wasm-util": "^0.10.3" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "node_modules/@oxc-project/types": { + "version": "0.138.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz", + "integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" + "node": ">= 10.0.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@elfalem/leaflet-curve": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@elfalem/leaflet-curve/-/leaflet-curve-0.9.2.tgz", - "integrity": "sha512-vHhJZvkTHHQsOeEPRnTYpKjmWZ7DEKVJ7rHh1xeksTi/maoxK3dCd6o59LoT3Uk6kNIvmzwrOFMHN3T+WfsbwA==", - "license": "MIT", "optionalDependencies": { - "@tweenjs/tween.js": "^17.2.0" - }, - "peerDependencies": { - "leaflet": "^1.1.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", "cpu": [ "arm64" ], @@ -352,29 +159,17 @@ "android" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", "cpu": [ "arm64" ], @@ -384,13 +179,17 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", "cpu": [ "x64" ], @@ -400,15 +199,19 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, @@ -416,63 +219,91 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", "cpu": [ - "x64" + "arm" + ], + "libc": [ + "glibc" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", "cpu": [ "arm" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", "cpu": [ - "ia32" + "arm64" + ], + "libc": [ + "musl" ], "license": "MIT", "optional": true, @@ -480,15 +311,22 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", "cpu": [ - "loong64" + "x64" + ], + "libc": [ + "glibc" ], "license": "MIT", "optional": true, @@ -496,15 +334,22 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", "cpu": [ - "mips64el" + "x64" + ], + "libc": [ + "musl" ], "license": "MIT", "optional": true, @@ -512,383 +357,181 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", "cpu": [ - "ppc64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", "cpu": [ - "riscv64" + "ia32" ], "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", "cpu": [ - "s390x" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-leaflet/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz", + "integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz", + "integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "darwin" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz", + "integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "darwin" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz", + "integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "freebsd" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz", + "integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==", "cpu": [ - "x64" + "arm" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz", + "integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==", "cpu": [ "arm64" ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@joergdietrich/leaflet.terminator": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@joergdietrich/leaflet.terminator/-/leaflet.terminator-1.3.0.tgz", - "integrity": "sha512-3hDDomLkaZwoxCuHa0xADpe98HadD/n5JgoIAOOAWC5/Iosl2d0KqdaB09Mw9H+ZhPrecWB+a1fWuNcMMUYPxQ==", - "license": "MIT", - "peerDependencies": { - "leaflet": "^1.2.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@react-leaflet/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", - "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", - "license": "Hippocratic-2.1", - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", - "cpu": [ - "arm" - ], "libc": [ "glibc" ], @@ -896,44 +539,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", - "cpu": [ - "arm" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz", + "integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==", "cpu": [ "arm64" ], @@ -944,79 +558,18 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", - "cpu": [ - "loong64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", - "cpu": [ - "loong64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz", + "integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==", "cpu": [ "ppc64" ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", - "cpu": [ - "riscv64" - ], "libc": [ "glibc" ], @@ -1024,28 +577,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", - "cpu": [ - "riscv64" - ], - "libc": [ - "musl" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz", + "integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==", "cpu": [ "s390x" ], @@ -1056,12 +596,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz", + "integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==", "cpu": [ "x64" ], @@ -1072,12 +615,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz", + "integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==", "cpu": [ "x64" ], @@ -1088,25 +634,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", - "cpu": [ - "x64" ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz", + "integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==", "cpu": [ "arm64" ], @@ -1114,51 +650,49 @@ "optional": true, "os": [ "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", - "cpu": [ - "arm64" ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz", + "integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==", "cpu": [ - "ia32" + "wasm32" ], "license": "MIT", "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz", + "integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz", + "integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==", "cpu": [ "x64" ], @@ -1166,7 +700,16 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" }, "node_modules/@tweenjs/tween.js": { "version": "17.6.0", @@ -1175,53 +718,16 @@ "license": "MIT", "optional": true }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/types": "^7.28.2" + "tslib": "^2.4.0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", @@ -1240,78 +746,46 @@ } }, "node_modules/@u-elements/u-combobox": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@u-elements/u-combobox/-/u-combobox-1.0.7.tgz", - "integrity": "sha512-rueG+Wof9ycmbjIW2omS4bLite5BkH87SWfkBrvSjrR1GWn4wgpjnUQ1lORDRalYcPYlgFWy2uGFEqqKPx3Yqw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@u-elements/u-combobox/-/u-combobox-2.1.0.tgz", + "integrity": "sha512-UNiHRS0qubxSSHvDVmKSrDPNavAKBJyzTJ9OyTY3hIMXy9Chiv/qvcGcXaJmB6j47QY7nGEplXE1A1vxY6BdRA==", "license": "MIT" }, "node_modules/@u-elements/u-datalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@u-elements/u-datalist/-/u-datalist-1.1.0.tgz", - "integrity": "sha512-t8H3OddziXmq0YBuXodVWnvRi56WW4sfbJEIO1fx4i39sZ0s/0xjHBsoAsTZkb9mXJEtpgrsH8IkDYP0ZSgSXQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@u-elements/u-datalist/-/u-datalist-2.0.3.tgz", + "integrity": "sha512-1/N53P9CtmpTQQN/S8fQG0JEQqQmpAmAVhuPTskycrn74DJUdi2lKYdyGW7X4tg6ANsi4iGLn5Bv3NLHoCrzIg==", "license": "MIT" }, "node_modules/@u-elements/u-tabs": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@u-elements/u-tabs/-/u-tabs-0.1.2.tgz", - "integrity": "sha512-KVYJFDPZdo+LXrW+mCMPEUen4wXi8VfSMDKWLt2+q6VgYqWBcAIZcaWBRWxIjXFzGfXQSJqD0amnYGaL1RGZ/w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@u-elements/u-tabs/-/u-tabs-1.0.4.tgz", + "integrity": "sha512-F0CoSaiFnUInfTSiftufZARi6bvC0Ucb+aVaVfO65a0GWeIsTjTZupXh313POqN7SkvH4lQ+4+X33uhwBMAiww==", "license": "MIT" }, "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", + "integrity": "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==", "license": "MIT", "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } } }, "node_modules/bootstrap": { @@ -1333,331 +807,390 @@ "@popperjs/core": "^2.11.8" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "readdirp": "^5.0.0" }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "engines": { "node": ">=8" } }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "engines": { + "node": ">=12.0.0" }, - "bin": { - "browserslist": "cli.js" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001790", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", - "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" ], - "license": "CC-BY-4.0" + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", + "optional": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=0.10.0" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/laravel-vite-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-3.1.0.tgz", + "integrity": "sha512-Fzocl+X4eQ9jOi0RwdphYRGkUbPJ3ky1pTAST5Ot18cS2gw6d2vldK2eCrlKDVjtibCjCx5qptYDlA0373n7qg==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "picocolors": "^1.0.0", + "tinyglobby": "^0.2.12", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" }, "engines": { - "node": ">=6.0" + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "fontaine": "^0.5.0", + "vite": "^8.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "fontaine": { "optional": true } } }, - "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", - "license": "ISC" + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" }, - "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "hasInstallScript": true, + "node_modules/leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "peerDependencies": { + "leaflet": "^1.3.1" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/immutable": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", - "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/laravel-vite-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.1.0.tgz", - "integrity": "sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "vite-plugin-full-reload": "^1.1.0" - }, - "bin": { - "clean-orphaned-assets": "bin/clean.js" - }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 12.0.0" }, - "peerDependencies": { - "vite": "^7.0.0" - } - }, - "node_modules/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "license": "BSD-2-Clause" - }, - "node_modules/leaflet.markercluster": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", - "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", - "license": "MIT", - "peerDependencies": { - "leaflet": "^1.3.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lodash": { @@ -1666,46 +1199,10 @@ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "funding": [ { "type": "github", @@ -1720,20 +1217,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "optional": true }, "node_modules/nouislider": { "version": "15.8.1", @@ -1748,21 +1237,21 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "funding": [ { "type": "opencollective", @@ -1779,7 +1268,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -1788,158 +1277,127 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.7" } }, "node_modules/react-leaflet": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", - "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", "license": "Hippocratic-2.1", "dependencies": { - "@react-leaflet/core": "^2.1.0" + "@react-leaflet/core": "^3.0.0" }, "peerDependencies": { "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^19.0.0", + "react-dom": "^19.0.0" } }, "node_modules/react-leaflet-cluster": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-leaflet-cluster/-/react-leaflet-cluster-2.1.0.tgz", - "integrity": "sha512-16X7XQpRThQFC4PH4OpXHimGg19ouWmjxjtpxOeBKpvERSvIRqTx7fvhTwkEPNMFTQ8zTfddz6fRTUmUEQul7g==", - "license": "SEE LICENSE IN ", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/react-leaflet-cluster/-/react-leaflet-cluster-4.1.3.tgz", + "integrity": "sha512-b3ICS7r9Fs5hBWrFPMVnmkCuDewyG3m1GaGzamXY0eryyAXDfQ+ikSkiR/mVethueIIA5MSyLok2/KsZVotspQ==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "leaflet.markercluster": "^1.5.3" }, "peerDependencies": { - "leaflet": "^1.8.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "react-leaflet": "^4.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "@react-leaflet/core": "^3.0.0", + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-leaflet": "^5.0.0" } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "node_modules/rolldown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz", + "integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@oxc-project/types": "=0.138.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm64": "1.1.4", + "@rolldown/binding-darwin-arm64": "1.1.4", + "@rolldown/binding-darwin-x64": "1.1.4", + "@rolldown/binding-freebsd-x64": "1.1.4", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.4", + "@rolldown/binding-linux-arm64-gnu": "1.1.4", + "@rolldown/binding-linux-arm64-musl": "1.1.4", + "@rolldown/binding-linux-ppc64-gnu": "1.1.4", + "@rolldown/binding-linux-s390x-gnu": "1.1.4", + "@rolldown/binding-linux-x64-gnu": "1.1.4", + "@rolldown/binding-linux-x64-musl": "1.1.4", + "@rolldown/binding-openharmony-arm64": "1.1.4", + "@rolldown/binding-wasm32-wasi": "1.1.4", + "@rolldown/binding-win32-arm64-msvc": "1.1.4", + "@rolldown/binding-win32-x64-msvc": "1.1.4" } }, "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", + "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^5.0.0", + "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/sortable-tablesort": { "version": "4.1.7", @@ -1957,9 +1415,9 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -1972,89 +1430,24 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true }, "node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz", + "integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==", "license": "MIT", "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.16", + "rolldown": "~1.1.3", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -2070,9 +1463,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -2085,13 +1479,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { + "optional": true + }, + "jiti": { "optional": true }, - "lightningcss": { + "less": { "optional": true }, "sass": { @@ -2127,40 +1524,17 @@ "picomatch": "^2.3.1" } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "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": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" } } } diff --git a/package.json b/package.json index e06fefe2..84cbdf38 100644 --- a/package.json +++ b/package.json @@ -8,25 +8,24 @@ "@elfalem/leaflet-curve": "^0.9.2", "@joergdietrich/leaflet.terminator": "^1.1.0", "@popperjs/core": "^2.11.6", - "@u-elements/u-combobox": "^1.0.7", - "@u-elements/u-datalist": "^1.1.0", - "@u-elements/u-tabs": "^0.1.2", - "@vitejs/plugin-react": "^4.3.0", + "@u-elements/u-combobox": "^2.0.5", + "@u-elements/u-datalist": "^2.0.1", + "@u-elements/u-tabs": "^1.0.3", + "@vitejs/plugin-react": "^6.0.0", "bootstrap": "^5.2.0", - "laravel-vite-plugin": "^2.0", + "laravel-vite-plugin": "^3.1.0", "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lodash": "^4.17.19", - "moment": "^2.30.1", "nouislider": "^15.6.1", "postcss": "^8.1.14", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-leaflet": "^4.2.1", - "react-leaflet-cluster": "^2.1.0", - "sass": "1.77.6", + "react": "19.2.7", + "react-dom": "19.2.7", + "react-leaflet": "^5.0.0", + "react-leaflet-cluster": "^4.1.3", + "sass": "^1.77.6", "sortable-tablesort": "^4.0.2", - "vite": "^7.2.1" + "vite": "^8.0.0" }, "devDependencies": { "@types/leaflet": "^1.9.12" diff --git a/phpunit.xml b/phpunit.xml index 2ac86a18..bce62282 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,31 +1,28 @@ - - - - ./tests/Unit - - - ./tests/Feature - - - - - ./app - - - - - - - - - - - - - + + + + ./tests/Unit + + + ./tests/Feature + + + + + + + + + + + + + + + + + ./app + + diff --git a/resources/js/components/AirportCard.jsx b/resources/js/components/AirportCard.jsx index 2936facb..a49fcf2c 100644 --- a/resources/js/components/AirportCard.jsx +++ b/resources/js/components/AirportCard.jsx @@ -17,7 +17,14 @@ function AirportCard({ airportId }) { const [showSceneryIdCard, setShowSceneryIdCard] = useState(null); const [departureAirportId, setDepartureAirportId] = useState(null); const [arrivalAirportId, setArrivalAirportId] = useState(null); - const { airports, primaryAirport, focusAirport, reverseDirection, highlightedAircrafts } = useContext(MapContext); + const { airports, primaryAirport, focusAirport, reverseDirection, highlightedAircrafts, setFocusAirport, setShowAirportIdCard } = useContext(MapContext); + + // Closing unmounts the card and its flights/scenery children; focusAirport + // is cleared too so clicking the same marker again reopens the card + const closeCard = () => { + setShowAirportIdCard(null); + setFocusAirport(null); + }; useEffect(() => { window.setShowSceneryIdCard = (data) => { setShowSceneryIdCard(data) } @@ -90,16 +97,19 @@ function AirportCard({ airportId }) {
{data ? ( <> -
- {`Flag -  {data.airport.icao} +
+
+ {`Flag +  {data.airport.icao} +
+

{data.airport.name}

@@ -121,7 +131,7 @@ function AirportCard({ airportId }) {
TAF
- +
{data.airlines && data.airlines.length > 0 && ( @@ -150,17 +160,17 @@ function AirportCard({ airportId }) {
- {(primaryAirport === undefined || primaryAirport === null) && ( <> - + Arrival - + Departure @@ -168,7 +178,7 @@ function AirportCard({ airportId }) { {(primaryAirport !== undefined && primaryAirport !== null) && ( <> - +
+
  • aircraft.icao).join(', ')} - {moment(flight.last_seen_at).fromNow()} + {fromNow(flight.last_seen_at)} ))} diff --git a/resources/js/components/Map.jsx b/resources/js/components/Map.jsx index f1f39c8d..1cd0d26e 100644 --- a/resources/js/components/Map.jsx +++ b/resources/js/components/Map.jsx @@ -1,5 +1,5 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useMemo } from 'react'; import ReactDOM from 'react-dom/client'; import { MapContext } from './context/MapContext'; @@ -13,8 +13,10 @@ import MapBound from './map/MapBound'; import MapDrawRoute from './map/MapDrawRoute'; import MapMarkerGroup from './map/MapMarkerGroup'; import MapPan from './map/MapPan'; +import MapPing from './map/MapPing'; import MapSaveView from './map/MapSaveView'; import MapTerminator from './map/MapTerminator'; +import MapTooltipZoom from './map/MapTooltipZoom'; // Check if the current route is the default view const isDefaultView = () => { @@ -72,6 +74,7 @@ function Map() { const [focusAirport, setFocusAirport] = useState(null); const [highlightedAircrafts, setHighlightedAircrafts] = useState([]); const [mapBounds, setMapBounds] = useState(null); + const [ping, setPing] = useState(null); const [primaryAirport, setPrimaryAirport] = useState(null); const [reverseDirection, setReverseDirection] = useState(null); const [showAirportIdCard, setShowAirportIdCard] = useState(null); @@ -83,6 +86,7 @@ function Map() { window.setCluster = (boolean) => { setCluster(boolean) } window.setDrawRoute = (route) => { setDrawRoute(route) } window.setFocusAirport = (icao) => { setFocusAirport(icao) } + window.pingAirport = (icao) => { setPing({ icao, ts: Date.now() }) } window.setHighlightedAircrafts = (data) => { setHighlightedAircrafts(data) } window.setPrimaryAirport = (airport) => { setPrimaryAirport(airport) } window.setReverseDirection = (boolean) => { setReverseDirection(boolean) } @@ -163,7 +167,10 @@ function Map() { window.dispatchEvent(new CustomEvent('mapFocusAirport', { detail: { focusAirport } })); } - + + } else if (primaryAirport) { + setDrawRoute(null); + setCoordinates(null); } }, [focusAirport]); @@ -182,28 +189,33 @@ function Map() { if(airportsKeys.length > 0){ if (airportsKeys.length >= 1000) { - setClusterRadius(200); + setClusterRadius(60); } else if(airportsKeys.length > 200 && airportsKeys.length < 1000) { - setClusterRadius(80) + setClusterRadius(50); } else { - setClusterRadius(40); + setClusterRadius(30); } } }, [airports]); + // Memoise the context value so unrelated Map state changes (coordinates, + // mapBounds, showAirportIdCard, panning) don't give it a new identity and + // re-render every marker. Only changes to the listed values propagate. + const mapContextValue = useMemo(() => ({ + airports, + setAirports, + focusAirport, + highlightedAircrafts, + primaryAirport, + reverseDirection, + setFocusAirport, + setShowAirportIdCard, + userAuthenticated, + }), [airports, focusAirport, highlightedAircrafts, primaryAirport, reverseDirection, userAuthenticated]); + return ( - + {cluster ? ( - + ) : ( @@ -235,6 +247,8 @@ function Map() { {!drawRoute && } {drawRoute && } + + {showAirportIdCard && } diff --git a/resources/js/components/SceneryCard.jsx b/resources/js/components/SceneryCard.jsx index f57315a5..2c952ce8 100644 --- a/resources/js/components/SceneryCard.jsx +++ b/resources/js/components/SceneryCard.jsx @@ -85,48 +85,51 @@ function SceneryCard({ airportId }) { {Object.keys(data).map((key) => ( {data[key].map((item, index) => ( -
    - -
    -
    - {item.developer} - {(item.fsac && item.ratingAverage > 0) && ( -  {parseFloat(item.ratingAverage).toFixed(1)} - )} + +
    +
    +
    + {item.developer} +
    + + {(item.fsac && item.cheapestPrice.EUR > 0) && ( +

    Starting at {currencies.find(c => c.code === currency).symbol}{parseFloat(item.cheapestPrice[currency]).toFixed(2)}

    + )} + {item.payware > 0 ? ( - Payware + Payware + {(item.fsac && item.ratingAverage > 0) && ( + <> +   + {parseFloat(item.ratingAverage).toFixed(1)} + + )} + ) : ( (item.payware == -1 ? ( - Included + Included in simulator ) : ( Freeware )) )}
    - - {(item.fsac && item.cheapestPrice.EUR > 0) ? ( -
    See all prices - ) : ( - (item.link == 'https://www.flightsimulator.com/') ? ( - Included in the simulator +
    + {(item.fsac ? ( + <> + See prices + + ) : ( - {item.linkDomain} - ) - )} - - {(item.fsac && item.cheapestPrice.EUR > 0) && ( - - Cheapest: {item.cheapestStore} {currencies.find(c => c.code === currency).symbol}{parseFloat(item.cheapestPrice[currency]).toFixed(2)} - - - )} - -
    + (item.payware != -1 && ( + <> + { item.linkDomain } + + + )) + ))} +
    + ))} ))} @@ -138,7 +141,7 @@ function SceneryCard({ airportId }) { Prices are excl. tax. - + Add missing scenery
    diff --git a/resources/js/components/map/MapDrawRoute.jsx b/resources/js/components/map/MapDrawRoute.jsx index c36b7052..2d958674 100644 --- a/resources/js/components/map/MapDrawRoute.jsx +++ b/resources/js/components/map/MapDrawRoute.jsx @@ -88,20 +88,31 @@ const MapDrawRoute = ({ departure, arrival, reverseDirection = false }) => { } // Start drawing the path once map is done moving - map.once('moveend', function () { + const addPathToMap = function () { routePath.current.addTo(map); - }); - + }; + map.once('moveend', addPathToMap); + // Redraw route path with canvas renderer to fix the line becoming dashes - setTimeout(() => { + const redrawTimeout = setTimeout(() => { routePath.current.remove(); - + pathOptions.renderer = L.canvas(); pathOptions.animate = []; - + routePath.current = L.curve(['M', latlng1, 'Q', midpointLatLng, latlng2], pathOptions).addTo(map); - + }, 350 + duration); + + // Remove the path when the route is cleared or redrawn + return () => { + clearTimeout(redrawTimeout); + map.off('moveend', addPathToMap); + if (routePath.current !== null) { + routePath.current.remove(); + routePath.current = null; + } + }; }, [airports, departure, arrival]); const calcMidpointLatLng = (latlng1, latlng2) => { diff --git a/resources/js/components/map/MapMarker.jsx b/resources/js/components/map/MapMarker.jsx index 4b6afe68..e7f9a4de 100644 --- a/resources/js/components/map/MapMarker.jsx +++ b/resources/js/components/map/MapMarker.jsx @@ -1,84 +1,44 @@ -import { useState, useEffect, useContext, useMemo } from 'react'; +import { memo, useMemo } from 'react'; import { Marker, Tooltip } from 'react-leaflet'; import { createMarkerIcon } from '../utils/MarkerIcon'; -import { useMapEvents } from 'react-leaflet'; -import { MapContext } from '../context/MapContext'; -const MapMarker = ({ airport }) => { - const { focusAirport, setFocusAirport, primaryAirport } = useContext(MapContext); +const MapMarker = ({ airport, isFocused, isPrimary, setFocusAirport }) => { - const [zoomLevel, setZoomLevel] = useState(0); - const [showTooltip, setShowTooltip] = useState(true); - const [ignoreZoomFilter, setIgnoreZoomFilter] = useState(false); - const [color, setColor] = useState(airport.color); + const color = isFocused ? '#ddb81c' : airport.color; - // Fetch zoom level - const map = useMapEvents({ - zoomend() { - setZoomLevel(map.getZoom()); - }, - }); - - // When zoomlevel changes, hide/show tooltips based on airport size - useEffect(() => { - if(route().current('search') || route().current() === undefined){ - if(airport.type == 'small_airport'){ - (zoomLevel >= 8) ? setShowTooltip(true) : setShowTooltip(false); - } else if(airport.type == 'medium_airport'){ - (zoomLevel > 5) ? setShowTooltip(true) : setShowTooltip(false); - } else { - setShowTooltip(true); - } - } - }, [zoomLevel]); - - // When focusAirport changes, change color and ignore zoom filter - useEffect(() => { - if(focusAirport === airport.icao){ - setColor('#ddb81c'); - setIgnoreZoomFilter(true); - } else { - setColor(airport.color); - setIgnoreZoomFilter(false); - } - - if(primaryAirport === airport.icao){ - setIgnoreZoomFilter(true); - } - }, [focusAirport]); - - // When you click on an airport, set it as the focus airport const eventHandlers = useMemo(() => ({ - click: (e) => { - setFocusAirport(airport.icao); - } - }), [airport.icao]); + click: () => setFocusAirport(airport.icao), + }), [airport.icao, setFocusAirport]); const icon = useMemo(() => createMarkerIcon(color, airport.type), [color, airport.type]); - return useMemo(() => ( + // The tooltip is always rendered; its visibility per zoom/type is handled + // purely in CSS via classes on the map container (see map.scss + the + // MapTooltipZoom component). This keeps zooming out of React entirely, so + // markers never re-render and the cluster group is never rebuilt on zoom. + const tooltipClass = `airport airport--${airport.type}${(isFocused || isPrimary) ? ' airport--pinned' : ''}`; + + return ( - {(ignoreZoomFilter || showTooltip) && ( - - - {airport.icao} - - - )} + + + {airport.icao} + + - ), [airport.id, airport.lat, airport.lon, icon, eventHandlers, ignoreZoomFilter, showTooltip, color, airport.icao]); + ); }; -export default MapMarker; \ No newline at end of file +// memo: a marker only re-renders when its own props change (color on focus, +// or the airports data). +export default memo(MapMarker); diff --git a/resources/js/components/map/MapMarkerGroup.jsx b/resources/js/components/map/MapMarkerGroup.jsx index 7f4ddcbe..fad369b6 100644 --- a/resources/js/components/map/MapMarkerGroup.jsx +++ b/resources/js/components/map/MapMarkerGroup.jsx @@ -4,14 +4,22 @@ import { MapContext } from '../context/MapContext'; const MapMarkerGroup = () => { - const {airports} = useContext(MapContext); + const { airports, focusAirport, primaryAirport, setFocusAirport } = useContext(MapContext); return ( Object.keys(airports).map(key => { const airport = airports[key]; - return ; + return ( + + ); }) ); }; -export default MapMarkerGroup; \ No newline at end of file +export default MapMarkerGroup; diff --git a/resources/js/components/map/MapPing.jsx b/resources/js/components/map/MapPing.jsx new file mode 100644 index 00000000..33e34888 --- /dev/null +++ b/resources/js/components/map/MapPing.jsx @@ -0,0 +1,35 @@ +import { useContext, useEffect } from 'react'; +import L from 'leaflet'; +import { useMap } from 'react-leaflet'; + +import { MapContext } from '../context/MapContext'; + +// One-shot radar blip at the given airport, triggered via window.pingAirport() +const MapPing = ({ ping }) => { + const map = useMap(); + const { airports } = useContext(MapContext); + + useEffect(() => { + const airport = ping ? airports[ping.icao] : null; + if (!airport) { + return; + } + + const marker = L.marker([airport.lat, airport.lon], { + icon: L.divIcon({ className: 'radar-ping', iconSize: [0, 0] }), + interactive: false, + keyboard: false, + }).addTo(map); + + const timer = setTimeout(() => marker.remove(), 1800); + + return () => { + clearTimeout(timer); + marker.remove(); + }; + }, [ping]); + + return null; +}; + +export default MapPing; diff --git a/resources/js/components/map/MapTooltipZoom.jsx b/resources/js/components/map/MapTooltipZoom.jsx new file mode 100644 index 00000000..5e1558b4 --- /dev/null +++ b/resources/js/components/map/MapTooltipZoom.jsx @@ -0,0 +1,27 @@ +import { useEffect } from 'react'; +import { useMapEvents } from 'react-leaflet'; + +// Toggles tooltip-visibility classes on the map container based on zoom level, imperatively. +const applyZoomClasses = (map) => { + const el = map.getContainer(); + const zoom = map.getZoom(); + + // Zoom/type tooltip filtering only applies on the search / default views. + const filter = route().current('search') || route().current() === undefined; + + el.classList.toggle('tt-filter', !!filter); + el.classList.toggle('tt-show-medium', zoom > 5); + el.classList.toggle('tt-show-small', zoom >= 8); +}; + +const MapTooltipZoom = () => { + const map = useMapEvents({ + zoomend() { applyZoomClasses(map); }, + }); + + useEffect(() => { applyZoomClasses(map); }, []); + + return null; +}; + +export default MapTooltipZoom; diff --git a/resources/js/components/ui/CurrencyDropdown.jsx b/resources/js/components/ui/CurrencyDropdown.jsx index 49f7bf5c..69c430e7 100644 --- a/resources/js/components/ui/CurrencyDropdown.jsx +++ b/resources/js/components/ui/CurrencyDropdown.jsx @@ -2,7 +2,7 @@ function CurrencyDropdown({ currencies, currency, setCurrency }) { return ( <>
    -
      diff --git a/resources/js/components/ui/SimbriefLink.jsx b/resources/js/components/ui/SimbriefLink.jsx index 45568917..ce33ff7e 100644 --- a/resources/js/components/ui/SimbriefLink.jsx +++ b/resources/js/components/ui/SimbriefLink.jsx @@ -4,11 +4,11 @@ const SimbriefLink = ({ direction, primaryIcao, secondaryIcao }) => { return ( <> {primaryIcao !== null ? ( - + SimBrief ) : ( - + SimBrief )} diff --git a/resources/js/components/ui/TAF.jsx b/resources/js/components/ui/TAF.jsx index a73ac7d6..452a1a83 100644 --- a/resources/js/components/ui/TAF.jsx +++ b/resources/js/components/ui/TAF.jsx @@ -1,44 +1,27 @@ -import { useState, useEffect, useRef } from 'react'; +import { useState, useEffect } from 'react'; -function TAF({ icao }) { - const [tafReport, setTafReport] = useState(null); - const tafRef = useRef({}); +function TAF({ taf }) { + const [revealed, setRevealed] = useState(false); - // Reset the tafReport when the ICAO code changes + // Hide the TAF again when the focused airport changes useEffect(() => { - // Load the saved TAF report from the ref or null - setTafReport(tafRef.current[icao] || null); - }, [icao]); + setRevealed(false); + }, [taf]); const handleClick = () => { - fetch('https://api.met.no/weatherapi/tafmetar/1.0/taf.txt?icao=' + icao) - .then(response => { - if (!response.ok) { - throw new Error("HTTP error " + response.status); - } - return response.text() - }) - .then(text => { - if (text === "") { - setTafReport('Not Available'); - tafRef.current[icao] = 'Not Available'; - } else { - var lines = text.match(/[^\r\n]+/g); - setTafReport(lines[lines.length - 1]); - tafRef.current[icao] = lines[lines.length - 1]; - } - }) - .catch(error => { - setTafReport('TAF Fetch failed'); - }); + if (window.umami) { + umami.track('Interactions', { interaction: 'Fetch TAF' }); + } + + setRevealed(true); }; return ( <> - {tafReport ? ( - <>{tafReport} + {revealed ? ( + <>{taf ? taf : 'Not Available'} ) : ( - + )} ); diff --git a/resources/js/components/utils/ClusterIcon.jsx b/resources/js/components/utils/ClusterIcon.jsx index f2514516..ac904b60 100644 --- a/resources/js/components/utils/ClusterIcon.jsx +++ b/resources/js/components/utils/ClusterIcon.jsx @@ -1,15 +1,25 @@ const createClusterIcon = (cluster) => { - - // if url not ends with /top or /search, set style to 'inverted' + + // If url not ends with /top or /search, set style to 'inverted' var style = ''; if (isDefaultView()) { style = 'inverted'; } - - return L.divIcon({ - iconSize: [40, 40], - html: `
      ${cluster.getChildCount()}
      ` + + const count = cluster.getChildCount(); + + // Scale the icon with the number of points it contains. + const minSize = 32; + const maxSize = 60; + const ratio = Math.min(1, Math.max(0, (Math.log(count) - Math.log(2)) / (Math.log(100) - Math.log(2)))); + const size = Math.round(minSize + (maxSize - minSize) * ratio); + const fontSize = Math.max(12, Math.round(size * 0.35)); + + return L.divIcon({ + iconSize: [size, size], + iconAnchor: [size / 2, size / 2], + html: `
      ${count}
      ` }); }; -export { createClusterIcon }; \ No newline at end of file +export { createClusterIcon }; diff --git a/resources/js/components/utils/RelativeTime.js b/resources/js/components/utils/RelativeTime.js new file mode 100644 index 00000000..e982bb3e --- /dev/null +++ b/resources/js/components/utils/RelativeTime.js @@ -0,0 +1,22 @@ +const UNITS = [ + ['year', 31536000], + ['month', 2592000], + ['week', 604800], + ['day', 86400], + ['hour', 3600], + ['minute', 60], + ['second', 1], +]; + +const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' }); + +// "2 days ago" / "last month" style relative time, replaces moment's fromNow() +export default function fromNow(date) { + const seconds = (new Date(date).getTime() - Date.now()) / 1000; + + for (const [unit, secondsInUnit] of UNITS) { + if (Math.abs(seconds) >= secondsInUnit || unit === 'second') { + return rtf.format(Math.round(seconds / secondsInUnit), unit); + } + } +} diff --git a/resources/js/components/utils/TooltipRefresh.jsx b/resources/js/components/utils/TooltipRefresh.jsx index 0bae0bab..b1ef5862 100644 --- a/resources/js/components/utils/TooltipRefresh.jsx +++ b/resources/js/components/utils/TooltipRefresh.jsx @@ -1,11 +1,22 @@ const TooltipRefresh = () => { - const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); - const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl, { - container: 'body' - })); + // React re-renders can remove a tooltip's trigger, orphaning the tip since it + // never gets the mouseleave to close it — sweep tips with no matching trigger. + document.querySelectorAll('body > .tooltip').forEach(tip => { + if (!document.querySelector(`[aria-describedby="${tip.id}"]`)) { + tip.remove(); + } + }); + + // getOrCreateInstance, never new Tooltip(): re-instantiating an element that + // already has one leaves two instances fighting, causing stuck-open tooltips. + document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(tooltipTriggerEl => { + bootstrap.Tooltip.getOrCreateInstance(tooltipTriggerEl, { + container: 'body' + }); + }); }; -export default TooltipRefresh; \ No newline at end of file +export default TooltipRefresh; diff --git a/resources/js/functions/combobox.js b/resources/js/functions/combobox.js index 6cc36316..8b214562 100644 --- a/resources/js/functions/combobox.js +++ b/resources/js/functions/combobox.js @@ -25,49 +25,21 @@ placeholderConfigs.forEach(config => { }); }); -// @TODO Cleanup this hack. The issue is that the u-combobox component doesn't update the underlying select element's options -// to reflect the current chips, which causes issues when the form is submitted. -// This code ensures that the select element's options are always in sync with the visible chips before the form is submitted. -document.addEventListener('submit', (event) => { - const form = event.target; - if(!(form instanceof HTMLFormElement)){ - return; - } - - Array.from(form.querySelectorAll('u-combobox')).forEach((combobox) => { - const select = combobox.querySelector('select[name]'); - if(!select){ - return; - } - - const chips = Array.from(combobox.querySelectorAll('data')); - select.replaceChildren(); - - chips.forEach((chip) => { - const value = (chip.getAttribute('value') || chip.textContent || '').trim(); - const label = (chip.textContent || value).trim(); - - if(value){ - select.appendChild(new Option(label, value, true, true)); - } - }); - - if(combobox.hasAttribute('data-multiple')){ - select.setAttribute('multiple', ''); - } - }); -}, true); - -// Clean input field and close the box upon selection document.querySelectorAll('u-combobox').forEach(element => { const input = element.querySelector('input'); - const datalist = element.querySelector('u-datalist'); + if (!input) return; - if(input){ - element.addEventListener('comboboxafterselect', (event) => { - input.value = null; - input.focus(); - datalist.hidden = true; + // Open the combobox when clicking on the element itself (not just the input) + element.addEventListener('click', (event) => { + if (event.target === element) input.click(); + }); + + // Clear input and close the combobox when an option is selected + element.addEventListener('comboboxafterselect', (event) => { + input.value = null; + input.focus(); + setTimeout(() => { + input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })); }); - } -}) \ No newline at end of file + }); +}); \ No newline at end of file diff --git a/resources/js/functions/searchForm.js b/resources/js/functions/searchForm.js index 3072ebca..c7adfcbb 100644 --- a/resources/js/functions/searchForm.js +++ b/resources/js/functions/searchForm.js @@ -30,6 +30,13 @@ function submitFormMetrics(){ 'destinationAirbases', 'flightDirection' ] + var sliderRanges = { + hours: ['airtimeMin', 'airtimeMax'], + distance: ['distanceMin', 'distanceMax'], + temperature: ['temperatureMin', 'temperatureMax'], + elevation: ['elevationMin', 'elevationMax'], + rwyLength: ['rwyLengthMin', 'rwyLengthMax'], + }; var props = {} var multiselect = {} Array.from(form.elements).forEach(function(element){ @@ -87,10 +94,8 @@ function submitFormMetrics(){ }); }); - if(window.umami){ - umami.track('Search', { props: props }); - - // For multiselects, also track each selected value separately for better filtering in umami. + + if (window.umami) { var multiselectDefaults = { destinations: 'Anywhere', whitelists: 'None', @@ -99,17 +104,26 @@ function submitFormMetrics(){ aircrafts: 'Any', }; - Object.entries(multiselectDefaults).forEach(function([key, fallback]){ + var additions = {}; + Object.entries(multiselectDefaults).forEach(function([key, fallback]) { var values = multiselect[key]; - if(values && values.length > 0){ - values.forEach(function(value){ - umami.track('Search', { ['props.' + key]: value }); - }); + if (values && values.length > 0) { + // Pass as array directly — v3.2.0 supports array event data + additions[key] = values; } else { - umami.track('Search', { ['props.' + key]: fallback }); + additions[key] = fallback; + } + }); + + Object.entries(sliderRanges).forEach(function([key, [minName, maxName]]) { + var min = form.elements[minName]; + var max = form.elements[maxName]; + if (min && max) { + props[key] = min.value + '-' + max.value; } }); + umami.track('Search', { filter: { ...props, ...additions } }); } } @@ -166,9 +180,11 @@ function toggleFilters(goingBack = false){ function contractFilters(){ var filter = document.getElementById('filters'); + var btn = document.getElementById('expandFilters'); filter.classList.add('hide-filters'); - document.getElementById('expandFilters').innerHTML = 'Show more filters'; + btn.innerHTML = 'Show more filters '; + btn.classList.remove('active'); sessionStorage.setItem('filterExpanded', false); filterExpanded = false; @@ -176,9 +192,11 @@ function contractFilters(){ function expandFilters(filter){ var filter = document.getElementById('filters'); + var btn = document.getElementById('expandFilters'); filter.classList.remove('hide-filters'); - document.getElementById('expandFilters').innerHTML = 'Hide filters'; + btn.innerHTML = 'Hide filters '; + btn.classList.add('active'); sessionStorage.setItem('filterExpanded', true); filterExpanded = true; diff --git a/resources/js/functions/searchResults.js b/resources/js/functions/searchResults.js index 9b2f6293..6084147c 100644 --- a/resources/js/functions/searchResults.js +++ b/resources/js/functions/searchResults.js @@ -4,9 +4,24 @@ *** */ +// Expand the rows hidden behind the "Show more" fold +var expanded = false +function expandAllRows() { + if(!expanded && document.querySelector('#showMoreRow')) { + document.querySelectorAll('.showmore-hidden').forEach(function(element) { + element.classList.remove('showmore-hidden'); + }); + document.querySelector('#showMoreRow').remove(); + expanded = true; + } +} + +// Exposed so the map can unfold the results when a below-the-fold airport is clicked +window.expandSearchResults = expandAllRows; + var showMoreBtn = document.querySelector('#showMoreBtn') if(showMoreBtn){ - document.querySelector('#showMoreBtn').addEventListener('click', function() { + showMoreBtn.addEventListener('click', function() { expandAllRows(); }); @@ -16,18 +31,6 @@ if(showMoreBtn){ expandAllRows(); }); }); - - // Function to expand all rows - var expanded = false - function expandAllRows() { - if(!expanded) { - document.querySelectorAll('.showmore-hidden').forEach(function(element) { - element.classList.remove('showmore-hidden'); - }); - document.querySelector('#showMoreRow').remove(); - expanded = true; - } - } } // Sync detail rows with parent rows after sorting diff --git a/resources/js/functions/taf.js b/resources/js/functions/taf.js index f68c5d67..f94ec818 100644 --- a/resources/js/functions/taf.js +++ b/resources/js/functions/taf.js @@ -1,39 +1,26 @@ /* *** - Fetch TAF for Where2Fly + Reveal server-rendered TAF for Where2Fly *** */ var tafButtons = document.querySelectorAll('[data-taf-button="true"]'); tafButtons.forEach(element => { element.addEventListener('click', function() { - fetchTAF(element.getAttribute('data-airport-icao'), element) + revealTAF(element) }); }) -function fetchTAF(icao, element){ +function revealTAF(element){ if(window.umami){ umami.track('Interactions', {interaction: 'Fetch TAF'}); } - fetch('https://api.met.no/weatherapi/tafmetar/1.0/taf.txt?icao='+icao) - .then(response => { - if (!response.ok) { - throw new Error("HTTP error " + response.status); - } - return response.text() - }) - .then(text => { - if(text == ""){ - element.outerHTML = 'Not Available' - } else { - var lines = text.match(/[^\r\n]+/g) - element.outerHTML = lines[lines.length -1] - } - }) - .catch(error => { - element.outerHTML = 'TAF Fetch failed' - }); + var text = element.parentElement.querySelector('[data-taf-text="true"]'); + if (text) { + text.classList.remove('d-none'); + } + element.classList.add('d-none'); -} \ No newline at end of file +} diff --git a/resources/js/functions/tooltip.js b/resources/js/functions/tooltip.js index 6cf493b1..18a5d446 100644 --- a/resources/js/functions/tooltip.js +++ b/resources/js/functions/tooltip.js @@ -6,7 +6,7 @@ document.addEventListener('DOMContentLoaded', function () { const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') - const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl, { + const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => bootstrap.Tooltip.getOrCreateInstance(tooltipTriggerEl, { container: 'body' })) -}, false); \ No newline at end of file +}, false); diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss index c3fa17e9..18f1badf 100644 --- a/resources/sass/_variables.scss +++ b/resources/sass/_variables.scss @@ -1,20 +1,31 @@ -// Body -$body-bg: #f8fafc; -$table-color: black; -$table-bg: #fffdf7; +@use 'sass:color'; + +// Colors +$primary: #ddb81c; +$secondary: #161925; +$tertiary: #2f3549; + +$gray: #6C757D; +$offwhite: #fffdf7; +$bluewhite: #e4f0ff; + +// Table +$body-bg: $tertiary; +$table-color: $bluewhite; +$table-border-color: $secondary; +$table-hover-bg: color.adjust($tertiary, $lightness: -3%); +$table-bg: $tertiary; // Buttons $btn-close-color: #fff; // Typography +$font-family: 'Work Sans', sans-serif; $font-family-sans-serif: 'Work Sans', sans-serif; $font-size-base: 0.875rem; $line-height-base: 1.6; -$primary: #ddb81c; -$secondary: #161925; -$gray: #6C757D; - +// Misc $danger: #870F0C; $info: #487495; $dark: rgba(0,0,0,0.25); @@ -33,6 +44,8 @@ $navbar-nav-link-padding-y: 1rem; $fa-font-path: "../fonts"; +$tooltip-color: $offwhite; +$tooltip-bg: #060606; $tooltip-max-width: 500px; $tooltip-opacity: 1; diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 9f97a162..bbdad70f 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + /* * Fonts */ @@ -77,10 +79,6 @@ h2 { font-weight: normal; } -.font-work-sans{ - font-family: 'Work Sans', sans-serif; -} - header { height: $header-height; background: $secondary; @@ -107,8 +105,8 @@ main, nav.sidebar{ } .title{ - padding: 1.5rem 1rem; - background: #202538; + padding: 1rem; + background: $secondary; h1{ margin: 0; @@ -136,6 +134,23 @@ main, nav.sidebar{ padding: 0; height: 100%; } + + .card-title{ + border: 0; + } + + .card-body{ + color: $bluewhite; + } + + .card-footer{ + color: $bluewhite; + border-top: 1px solid $secondary; + + .author{ + color: color.adjust($tertiary, $lightness: 45%); + } + } } &.nomap{ @@ -149,14 +164,10 @@ main, nav.sidebar{ } } -nav.sidebar p{ - font-family: $font-family-sans-serif; -} - @include media-breakpoint-down(md) { /* Mobile specific styles fixing scroll behavour for browsers to hide UI */ - /* @TODO Find a better solution for this, feel hacky. */ + /* This fights a bit Bootstrap, but it works. */ body.d-flex.h-100 { height: auto !important; min-height: 100dvh; @@ -167,9 +178,10 @@ nav.sidebar p{ min-height: 100dvh; } - body > .d-flex.w-100.h-100.mx-auto.flex-column > .d-flex.flex-row > main.mobile-focus, - body > .d-flex.w-100.h-100.mx-auto.flex-column > .d-flex.flex-row > nav.sidebar.mobile-focus, - body > .d-flex.w-100.h-100.mx-auto.flex-column > .d-flex.flex-row > main:not(.mobile-focus):not(.mobile-nofocus) { + body > .d-flex.w-100.h-100.mx-auto.flex-column > .d-flex.flex-row > :is( + :is(main, nav.sidebar).mobile-focus, + main:not(.mobile-focus, .mobile-nofocus) + ) { height: auto; min-height: calc(100dvh - $header-height); overflow-y: visible; diff --git a/resources/sass/buttons.scss b/resources/sass/buttons.scss index 6fb4009a..239f62a4 100644 --- a/resources/sass/buttons.scss +++ b/resources/sass/buttons.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + button { padding-bottom: 2px; @@ -14,11 +16,11 @@ button { } .btn-primary{ - border: 2px solid darken($primary, 15%); + border: 2px solid color.adjust($primary, $lightness: -15%); font-weight: 500; &:hover{ - border: 2px solid darken($primary, 15%); + border: 2px solid color.adjust($primary, $lightness: -15%); } } @@ -57,20 +59,22 @@ button { &.show{ color: $white; - background: #202538; - border-color: #202538; + background: $tertiary; + border-color: $tertiary; } } } .dropdown{ &-menu{ - background-color: $table-bg; + background: $secondary; } &-item{ + color: $offwhite; + &:hover, &:active, &:focus{ - background-color: #e2e2e2; + background: $offwhite; color: $black; } } diff --git a/resources/sass/cards.scss b/resources/sass/cards.scss index 7c13175a..f2c56778 100644 --- a/resources/sass/cards.scss +++ b/resources/sass/cards.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + .card, .card-title { font-family: $font-family-sans-serif; @@ -34,6 +36,7 @@ .sidebar .card{ &-body{ + color: $bluewhite; background: $table-bg; img{ @@ -49,11 +52,7 @@ &.active{ border-left: 10px solid $primary; - background: white; - - .card-title{ - font-weight: bold; - } + background: color.adjust($tertiary, $lightness: 8%); .upvotes{ border-color: $primary; @@ -61,11 +60,15 @@ } } + &-text.author{ + color: color.adjust($tertiary, $lightness: 45%); + } + &-link{ text-decoration: none; :hover{ - background: #eeeeee; + background: color.adjust($tertiary, $lightness: -8%); } } } diff --git a/resources/sass/components.scss b/resources/sass/components.scss index 01179f60..a2c7939d 100644 --- a/resources/sass/components.scss +++ b/resources/sass/components.scss @@ -1,10 +1,18 @@ +@use 'sass:color'; + +.results-header{ + padding: .75rem 1rem; + background: $tertiary; + border-bottom: 2px solid $secondary; +} + .results-container{ padding: 1rem; margin-bottom: 2rem; - color: black; - background: #fffdf7; - + color: $bluewhite; + background: $tertiary; + display: flex; justify-content: space-between; flex-direction: row; @@ -106,7 +114,9 @@ } .badge{ + font-size: 0.75rem; font-weight: 400; + border-radius: 2px; } .bt{ @@ -117,10 +127,6 @@ background: #00356d; } -img.flag{ - border: 1px solid #efefef; -} - /* * Markdown container */ @@ -171,12 +177,7 @@ img.flag{ } .btn-group{ - .dropdown-menu{ - li .dropdown-item:hover{ - color: black; - background: $primary; - } - + .dropdown-menu{ &.show{ --bs-dropdown-min-width: 0rem; } @@ -189,24 +190,31 @@ img.flag{ } .scenery-row{ + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + + color: inherit; + text-decoration: none; + margin: 0; padding: 0.75rem 1rem 1rem 1rem; - border-bottom: 1px solid $primary; - background: $secondary; - - &:nth-child(odd){ - background: #202538; + border-bottom: 1px solid $secondary; + background: $tertiary; + + &:hover{ + text-decoration: none; + background-color: color.adjust($tertiary, $lightness: -8%); } - + &:first-of-type{ - margin-top: 0; - border-top: 2px solid $primary; + margin-top: -1px; + border-top: 1px solid $primary; } &:last-of-type{ margin-bottom: 0; - border-bottom: none; } .title{ @@ -215,18 +223,12 @@ img.flag{ font-size: 1.25rem; margin-right: 0.5rem; } - - .star{ - color: $primary; - font-size: 1rem; - - .far{ - padding-right: 0.25rem; - } - } - - .badge{ - font-size: .75rem; + } + + .star{ + i.fa-star{ + font-size: 0.7rem; + margin-right: 1px; } } @@ -262,4 +264,33 @@ u-tab { u-tab[aria-selected="true"] { color: black; background: $primary; -} \ No newline at end of file +} + +// Tooltips carry multi-line content (bookings, probabilities) — left-align, not centered +.tooltip-inner { + text-align: left; +} + +.score-icon { + display: inline-block; + + // Uncertain forecast (TEMPO/PROB) — faded to show it's not a firm prediction + &.score-uncertain { + opacity: 0.6; + } + + .probability { + top: -5px; + right: -10px; + font-size: 1rem; + color: $primary; + border-radius: 50%; + } + + .atc{ + top: -1px; + right: -4px; + font-size: .55rem; + color: $bluewhite; + } +} diff --git a/resources/sass/filters.scss b/resources/sass/filters.scss index 3c91731d..68ca1d57 100644 --- a/resources/sass/filters.scss +++ b/resources/sass/filters.scss @@ -1,4 +1,7 @@ #filters{ + + color: $bluewhite; + .btn-group{ border-radius: 2px; @@ -37,7 +40,7 @@ &-check.light:checked + .btn { color: white; - background: var(--bs-btn-active-bg); + background: $tertiary; } &-check.green:checked + .btn { @@ -83,7 +86,7 @@ .button{ background: none; - color: white; + color: $bluewhite; font-weight: 300; padding: 0.5rem 1rem; @@ -92,5 +95,14 @@ &:hover{ border: 1px solid rgba($primary, 1); } + + .expand-chevron { + display: inline-block; + transition: transform 0.2s ease; + } + + &.active .expand-chevron { + transform: rotate(180deg); + } } } \ No newline at end of file diff --git a/resources/sass/forms.scss b/resources/sass/forms.scss index d17c146b..b924a21d 100644 --- a/resources/sass/forms.scss +++ b/resources/sass/forms.scss @@ -1,7 +1,18 @@ +@use 'sass:color'; + .form-control{ height: 42px; - color: black; + color: $offwhite; + border: none; + + &::placeholder{ + color: rgb(200, 200, 200); + } + + &:active, &:focus, &:focus-within, &:focus-visible{ + color: $offwhite; + } // Set font size to 16px on mobile @include media-breakpoint-down(sm) { @@ -9,6 +20,10 @@ } } +label{ + color: $bluewhite; +} + u-combobox{ @include media-breakpoint-down(sm) { font-size: 1rem; @@ -27,6 +42,9 @@ u-combobox{ /* Make checkbox dark checkmark */ .form-check-input{ + + border: 1px solid $tertiary; + &:checked[type=checkbox]{ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); } @@ -63,8 +81,13 @@ u-combobox{ } /* Make slider handles more visible */ -#slider-airtime, #slider-rwy, #slider-elevation, #slider-temperature { +#slider-airtime, #slider-rwy, #slider-elevation, #slider-temperature, #slider-distance { padding: 0 1rem; + background: $tertiary; + + box-shadow: none; + border-radius: 2px; + border: 1px solid color.adjust($secondary, $lightness: 20%); .noUi-connect { background: $secondary; @@ -73,15 +96,21 @@ u-combobox{ .noUi-handle { height: 26px; top: -5px; - border-radius: 3px; + border-radius: 2px; box-shadow: none; + + background: $bluewhite; + border: 1px solid color.adjust($secondary, $lightness: 20%); + + &::before, &::after{ + background: $secondary; + } } } u-combobox { display: flex; flex-wrap: wrap; - gap: .5rem; position: relative; min-height: 42px; @@ -89,13 +118,22 @@ u-combobox { padding: 0.375rem 0.75rem; background-color: var(--bs-body-bg); + &::part(items) { + flex-wrap: wrap; + gap: .5rem; + } + + &:has(data)::part(items) { + margin-inline-end: .5rem; + } + select{ display: none; } data{ - color: black; - background: $gray-400; + color: $bluewhite; + background: $secondary; padding: 0.25rem 0.5rem; &:focus::after{ @@ -110,16 +148,22 @@ u-combobox { } input{ + min-height: 32px; border: none; background-color: var(--bs-body-bg); + color: rgb(200, 200, 200); &::placeholder{ - color: rgb(109, 109, 109); + color: rgb(200, 200, 200); } &:focus{ outline: none; } + + &:active, &:focus, &:focus-within, &:focus-visible{ + color: $offwhite; + } } } @@ -129,11 +173,11 @@ u-option{ &:focus{ outline: none; - background: $gray-400; + background: color.adjust($tertiary, $lightness: -5%); } &:hover{ - background: $gray-400; + background: color.adjust($tertiary, $lightness: -5%); } &::before{ @@ -155,11 +199,11 @@ u-option{ u-datalist { position: absolute; - inset: 100% -1px auto; - border: 1px solid; + inset: 100% 0px auto; + border: 1px solid $tertiary; - color: black; - background: white; + color: $bluewhite; + background: $tertiary; z-index: 100; @@ -172,6 +216,6 @@ u-datalist { .divider{ padding: 0.375rem 0.75rem; - background: $gray-200; + background: $secondary; } } \ No newline at end of file diff --git a/resources/sass/map.scss b/resources/sass/map.scss index ee3febe0..9548effb 100644 --- a/resources/sass/map.scss +++ b/resources/sass/map.scss @@ -33,7 +33,8 @@ .leaflet-tooltip.airport { - font-family: 'Work Sans', sans-serif; + font-family: $font-family-sans-serif; + -webkit-font-smoothing: antialiased; background-color: transparent; border: transparent; box-shadow: none; @@ -47,6 +48,46 @@ } } +// Tooltip visibility by zoom/type, driven by classes set imperatively on the map container (see MapTooltipZoom). +.map.tt-filter { + .leaflet-tooltip.airport--small_airport, + .leaflet-tooltip.airport--medium_airport { + display: none; + } + + &.tt-show-medium .leaflet-tooltip.airport--medium_airport { display: block; } + &.tt-show-small .leaflet-tooltip.airport--small_airport { display: block; } + + // Focused / primary airport always keeps its label, regardless of zoom. + .leaflet-tooltip.airport--pinned { display: block; } +} + +// One-shot radar blip shown when an airport is selected from the sidebar (MapPing) +.radar-ping::before { + content: ''; + position: absolute; + top: -24px; + left: -24px; + width: 48px; + height: 48px; + + border: 2px solid $primary; + border-radius: 50%; + + animation: radar-ping 1.6s ease-out 1 forwards; +} + +@keyframes radar-ping { + from { + transform: scale(0.15); + opacity: 1; + } + to { + transform: scale(1.6); + opacity: 0; + } +} + .leaflet-marker-icon.marker-cluster{ color: black; background: $primary; @@ -55,14 +96,14 @@ width: 40px; height: 40px; - font-family: 'Work Sans', sans-serif; + font-family: $font-family-sans-serif; + -webkit-font-smoothing: antialiased; font-size: 1rem; text-align: center; - align-content: center; &.inverted{ color: white; - background: #202538; + background: $tertiary; } } @@ -93,7 +134,6 @@ } } - /* @TODO See if this can be fixed differently, seems bit hacky way to make pointer events on tablets work when cards are not populated in the container */ &-scroll{ width: 100%; max-height: 100%; @@ -135,7 +175,6 @@ } .hint{ - height: auto; width: 275px; @@ -167,11 +206,21 @@ border-right: 10px solid transparent; border-bottom: 10px solid $gray-500; /* Same color as the background of the div */ } + + &.hint-feedback{ + right: 18.5rem; + border: 1px solid $primary; + + &::after { + border-bottom: 10px solid $primary; /* Same color as the background of the div */ + } + } } + .feedback { height: auto; - width: 275px; + width: 310px; position: absolute; left: calc($sidebar-width + 1rem); diff --git a/resources/sass/navigation.scss b/resources/sass/navigation.scss index 76266944..cd8d46ab 100644 --- a/resources/sass/navigation.scss +++ b/resources/sass/navigation.scss @@ -12,7 +12,7 @@ line-height: 1.2; color: var(--bs-heading-color); - @include media-breakpoint-down(lg){ + @include media-breakpoint-down(xl){ font-size: calc(1.15rem + 1.2vw); } @@ -116,7 +116,7 @@ display: none; } - @include media-breakpoint-down(lg){ + @include media-breakpoint-down(xl){ .navbar-collapse{ position: absolute; top: $header-height; diff --git a/resources/sass/scrollbar.scss b/resources/sass/scrollbar.scss index 6e36f2c0..379ea9fc 100644 --- a/resources/sass/scrollbar.scss +++ b/resources/sass/scrollbar.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + /* * Scrollbar */ @@ -11,11 +13,11 @@ } *::-webkit-scrollbar-track:hover { - background-color: lighten($secondary, 10%); + background-color: color.adjust($secondary, $lightness: 10%); } *::-webkit-scrollbar-track:active { - background-color: lighten($secondary, 10%); + background-color: color.adjust($secondary, $lightness: 10%); } *::-webkit-scrollbar-thumb { @@ -23,9 +25,9 @@ } *::-webkit-scrollbar-thumb:hover { - background-color: darken($primary, 10%); + background-color: color.adjust($primary, $lightness: -10%); } *::-webkit-scrollbar-thumb:active { - background-color: darken($primary, 10%); + background-color: color.adjust($primary, $lightness: -10%); } diff --git a/resources/sass/tables.scss b/resources/sass/tables.scss index cdee689a..6ca38d58 100644 --- a/resources/sass/tables.scss +++ b/resources/sass/tables.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; table{ @@ -22,10 +23,8 @@ table{ tr.pointer { cursor: pointer; - // Set th's under to color if .active is present - &.active th, &.active td{ - background-color: #e2e2e2; + background-color: color.adjust($tertiary, $lightness: -8%); } .expand-chevron { diff --git a/resources/views/account/settings.blade.php b/resources/views/account/settings.blade.php index fd6ebd31..67ee1a91 100644 --- a/resources/views/account/settings.blade.php +++ b/resources/views/account/settings.blade.php @@ -7,11 +7,11 @@

      Reset password

      -

      You may reset you password by performing an account reset. Your data will not be lost.

      +

      You may reset you password by performing an account reset. Your data will not be lost.

      Reset password

      Delete account

      -

      Deleting your account will remove all your data from the system. This action is irreversible.

      +

      Deleting your account will remove all your data from the system. This action is irreversible.

      @csrf diff --git a/resources/views/changelog.blade.php b/resources/views/changelog.blade.php index 66174ac1..1014befa 100644 --- a/resources/views/changelog.blade.php +++ b/resources/views/changelog.blade.php @@ -12,6 +12,28 @@
      +

      v3.0.0

      + 2026-XX-XX +
        +
      • Added predictions by using TAF, controller booking and event data for your search results
      • +
      • Added distance filter to search by nautical miles
      • +
      • Added a fillable circle icon for ATC conditions to show amount of facilities online at a glance
      • +
      • Added refreshed design with darker colors for input fields, results and other color tweaks. Scenery list is also simplified.
      • +
      • Added Navigraph charts link to airport cards
      • +
      • Added a close button to the airport card
      • +
      • Added a ping animation when clicking on an airport on top list, making it easier to find the airport
      • +
      • Added automatic highlight and scroll in sidebar for airports you click on the map
      • +
      • Added aircraft filter on the top list
      • +
      • Added a new order of expanded filters based on usage. The most used filters are now on top
      • +
      • Fixed performance and clustering of maps with many airports.
      • +
      • Fixed options randomly disappearing when editing search
      • +
      • Fixed the menu breaking on tablet screens
      • +
      • Fixed airport ICAO not always displaying on the map when selecting an suggestion
      • +
      • Fixed stuck tooltips not disappearing when clicked on
      • +
      • A lot of changes under the hood for stability and performance. Searches are now up to 4x faster!
      • +
      • API: Added more data rich scores return with predictions
      • +
      +

      v2.8.2

      2026-04-25
        diff --git a/resources/views/components/score-icon.blade.php b/resources/views/components/score-icon.blade.php new file mode 100644 index 00000000..171dc95d --- /dev/null +++ b/resources/views/components/score-icon.blade.php @@ -0,0 +1,22 @@ + + + @if($probabilityBadge) + + @endif + @if($facilityDots->count()) + @if($facilityDots->count() == 1) + + @elseif($facilityDots->count() == 2) + + @elseif($facilityDots->count() == 3) + + @elseif($facilityDots->count() > 3) + + @endif + @endif + diff --git a/resources/views/feedback/show.blade.php b/resources/views/feedback/show.blade.php index 62a1a040..d85cb73f 100644 --- a/resources/views/feedback/show.blade.php +++ b/resources/views/feedback/show.blade.php @@ -59,7 +59,7 @@

        {{ $issue['user']['login'] }}

        -

        {{ \Carbon\Carbon::parse($issue['created_at'])->diffForHumans() }}

        +

        {{ \Carbon\Carbon::parse($issue['created_at'])->diffForHumans() }}

      @@ -78,7 +78,7 @@

      {{ $comment['user']['login'] }}

      -

      {{ \Carbon\Carbon::parse($comment['created_at'])->diffForHumans() }}

      +

      {{ \Carbon\Carbon::parse($comment['created_at'])->diffForHumans() }}

    diff --git a/resources/views/feedback/sidebar.blade.php b/resources/views/feedback/sidebar.blade.php index e2f7b74d..c6c2a8ba 100644 --- a/resources/views/feedback/sidebar.blade.php +++ b/resources/views/feedback/sidebar.blade.php @@ -9,12 +9,12 @@
    @if(isset($userLastReadIssueNumber) && $userLastReadIssueNumber < $issue['number']) - + New! @endif @if(in_array($issue['number'], $userVotes ?? [])) - + Voted @@ -25,7 +25,7 @@

    {{ $issue['user']['login'] }}

    -

    {{ \Carbon\Carbon::parse($issue['created_at'])->diffForHumans() }}

    +

    {{ \Carbon\Carbon::parse($issue['created_at'])->diffForHumans() }}

    diff --git a/resources/views/front/parts/form.blade.php b/resources/views/front/parts/form.blade.php index 6309e493..9191d319 100644 --- a/resources/views/front/parts/form.blade.php +++ b/resources/views/front/parts/form.blade.php @@ -21,7 +21,7 @@ - + @if(old('destinations') !== null) @foreach(old('destinations') as $key) @@ -58,19 +58,14 @@ @error('destinations')
    {{ $message }}
    @enderror -
    +
    @error('codeletter')
    {{ $message }}
    @@ -103,7 +98,7 @@