Skip to content

Commit b5d6c81

Browse files
Merge pull request #78 from laravel/fix-url-defaults-typing
Fix type errors for URL default methods
2 parents d61ac2d + b16509e commit b5d6c81

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
{
22
"type": "module",
33
"scripts": {
4-
"test": "vitest run && npm run lint && npm run test-routes-cached && npm run lint",
4+
"test": "vitest run && npm run lint && npm run test-routes-cached && npm run lint && npm run tsc",
55
"test-routes-cached": "WAYFINDER_CACHE_ROUTES=1 vitest run",
66
"lint": "eslint ./workbench/resources/js --ext .ts,.tsx",
7-
"lint:fix": "eslint ./workbench/resources/js --ext .ts,.tsx --fix"
7+
"lint:fix": "eslint ./workbench/resources/js --ext .ts,.tsx --fix",
8+
"tsc": "tsc --noEmit"
89
},
910
"devDependencies": {
1011
"@eslint/js": "^9.29.0",

resources/js/wayfinder.ts

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

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

14-
let urlDefaults = {};
14+
let urlDefaults: Record<string, unknown> = {};
1515

1616
export type RouteDefinition<TMethod extends Method | Method[]> = {
1717
url: string;
@@ -75,12 +75,19 @@ export const queryParams = (options?: RouteQueryOptions) => {
7575
});
7676

7777
for (const subKey in query[key]) {
78-
if (typeof query[key][subKey] === 'undefined') {
78+
if (typeof query[key][subKey] === "undefined") {
7979
continue;
8080
}
8181

82-
if (['string', 'number', 'boolean'].includes(typeof query[key][subKey])) {
83-
params.set(`${key}[${subKey}]`, getValue(query[key][subKey]));
82+
if (
83+
["string", "number", "boolean"].includes(
84+
typeof query[key][subKey],
85+
)
86+
) {
87+
params.set(
88+
`${key}[${subKey}]`,
89+
getValue(query[key][subKey]),
90+
);
8491
}
8592
}
8693
} else {
@@ -104,19 +111,21 @@ export const addUrlDefault = (
104111
urlDefaults[key] = value;
105112
};
106113

107-
export const applyUrlDefaults = <T>(existing: T): T => {
108-
const existingParams = { ...existing };
114+
export const applyUrlDefaults = <T extends Record<string, unknown> | undefined>(
115+
existing: T,
116+
): T => {
117+
const existingParams = { ...(existing ?? ({} as Record<string, unknown>)) };
109118

110119
for (const key in urlDefaults) {
111120
if (
112121
existingParams[key] === undefined &&
113122
urlDefaults[key] !== undefined
114123
) {
115-
existingParams[key] = urlDefaults[key];
124+
(existingParams as Record<string, unknown>)[key] = urlDefaults[key];
116125
}
117126
}
118127

119-
return existingParams;
128+
return existingParams as T;
120129
};
121130

122131
export const validateParameters = (

tsconfig.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"compilerOptions": {
3+
"target": "ES2022",
4+
"module": "ESNext",
5+
"moduleResolution": "bundler",
6+
"allowSyntheticDefaultImports": true,
7+
"esModuleInterop": true,
8+
"allowJs": true,
9+
"strict": true,
10+
"noImplicitAny": true,
11+
"strictNullChecks": true,
12+
"strictFunctionTypes": true,
13+
"strictBindCallApply": true,
14+
"strictPropertyInitialization": true,
15+
"noImplicitThis": true,
16+
"noImplicitReturns": true,
17+
"noUncheckedIndexedAccess": true,
18+
"skipLibCheck": true,
19+
"forceConsistentCasingInFileNames": true,
20+
"declaration": true,
21+
"outDir": "./dist",
22+
"rootDir": "."
23+
},
24+
"include": [
25+
"workbench/resources/js/**/*.ts",
26+
"resources/js/**/*.ts",
27+
"tests/**/*.ts"
28+
],
29+
"exclude": ["node_modules", "dist"]
30+
}

0 commit comments

Comments
 (0)