Skip to content

Commit 722e0fc

Browse files
committed
feat: Adds support for providing default URL parameters via the frontend
1 parent 401d643 commit 722e0fc

File tree

7 files changed

+70
-0
lines changed

7 files changed

+70
-0
lines changed

resources/js/wayfinder.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ export type QueryParams = Record<
1111

1212
type Method = "get" | "post" | "put" | "delete" | "patch" | "head";
1313

14+
declare global {
15+
interface Window {
16+
Wayfinder: {
17+
defaultParameters: Record<string, unknown>;
18+
};
19+
}
20+
}
21+
window.Wayfinder = {
22+
defaultParameters: {},
23+
}
24+
1425
export type RouteDefinition<TMethod extends Method | Method[]> = {
1526
url: string;
1627
} & (TMethod extends Method[] ? { methods: TMethod } : { method: TMethod });
@@ -87,6 +98,26 @@ export const queryParams = (options?: RouteQueryOptions) => {
8798
return str.length > 0 ? `?${str}` : "";
8899
};
89100

101+
export const setDefaultParameters = (params: Record<string, unknown>) => {
102+
window.Wayfinder.defaultParameters = params;
103+
};
104+
105+
export const addDefaultParameter = (key: string, value: string | number | boolean) => {
106+
window.Wayfinder.defaultParameters[key] = value;
107+
};
108+
109+
export const applyDefaultParameters = (existing: Record<string, unknown>) => {
110+
const existingParams = { ...existing }
111+
112+
for (const key in window.Wayfinder.defaultParameters) {
113+
if (existingParams[key] === undefined && window.Wayfinder.defaultParameters[key] !== undefined) {
114+
existingParams[key] = window.Wayfinder.defaultParameters[key];
115+
}
116+
}
117+
118+
return existingParams;
119+
};
120+
90121
export const validateParameters = (
91122
args: Record<string, unknown> | undefined,
92123
optional: string[],

resources/method.blade.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
@endforeach
3232
}
3333
}
34+
args = applyDefaultParameters(args)
3435
@endif
3536

3637
@if ($parameters->where('optional')->isNotEmpty())

src/GenerateCommand.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,10 @@ private function appendCommonImports(Collection $routes, string $path, string $n
228228
$imports[] = 'type RouteFormDefinition';
229229
}
230230

231+
if ($routes->contains(fn (Route $route) => $route->parameters()->isNotEmpty())) {
232+
$imports[] = 'applyDefaultParameters';
233+
}
234+
231235
if ($routes->contains(fn (Route $route) => $route->parameters()->contains(fn (Parameter $parameter) => $parameter->optional))) {
232236
$imports[] = 'validateParameters';
233237
}

tests/DefaultParameters.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { expect, test } from "vitest";
2+
import { defaultParametersDomain, dynamicDomain, fixedDomain } from "../workbench/resources/js/actions/App/Http/Controllers/DomainController";
3+
import { setDefaultParameters } from "../resources/js/wayfinder";
4+
5+
test('it can generate urls without default parameters set', () => {
6+
expect(fixedDomain.url({ param: 'foo' })).toBe('//example.test/fixed-domain/foo')
7+
})
8+
9+
test('it can generate urls with default parameters set on frontend', () => {
10+
setDefaultParameters({
11+
domain: 'tim.macdonald',
12+
})
13+
14+
expect(dynamicDomain.url({
15+
param: 'foo',
16+
})).toBe('//tim.macdonald.au/dynamic-domain/foo')
17+
})
18+
19+
test('it can generate urls with default URL parameters set on backend', () => {
20+
expect(defaultParametersDomain.url({
21+
param: 'foo',
22+
})).toBe('//tim.macdonald.au/dynamic-domain/foo')
23+
})

workbench/app/Http/Controllers/DomainController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,9 @@ public function dynamicDomain()
1313
{
1414
//
1515
}
16+
17+
public function defaultParametersDomain()
18+
{
19+
//
20+
}
1621
}

workbench/app/Providers/WorkbenchServiceProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Providers;
44

55
use Illuminate\Support\Facades\Config;
6+
use Illuminate\Support\Facades\URL;
67
use Illuminate\Support\ServiceProvider;
78

89
class WorkbenchServiceProvider extends ServiceProvider
@@ -20,6 +21,10 @@ public function register(): void
2021
'throw' => false,
2122
],
2223
]);
24+
25+
URL::defaults([
26+
'defaultDomain' => 'tim.macdonald',
27+
]);
2328
}
2429

2530
/**

workbench/routes/web.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959

6060
Route::domain('example.test')->get('/fixed-domain/{param}', [DomainController::class, 'fixedDomain']);
6161
Route::domain('{domain}.au')->get('/dynamic-domain/{param}', [DomainController::class, 'dynamicDomain']);
62+
Route::domain('{defaultDomain}.au')->get('/default-parameters-domain/{param}', [DomainController::class, 'defaultParametersDomain']);
6263

6364
Route::get('/nested/controller', [NestedController::class, 'nested']);
6465

0 commit comments

Comments
 (0)