diff --git a/package.json b/package.json index db27c21d..a4ae6188 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "release": "4c release --conventional-commits", "tdd": "jest --watch", "test": "yarn lint && yarn test:ts && yarn testonly -- --coverage", - "test:ts": "dtslint --expectOnly types && yarn tsc --noEmit", + "test:ts": "dtslint --expectOnly types && yarn tsc --noEmit && yarn tsc --noEmit -p test", "testonly": "jest --runInBand --verbose", "docs": "yarn --cwd www start" }, diff --git a/src/typeUtils.ts b/src/typeUtils.ts index b0da5dd7..66170644 100644 --- a/src/typeUtils.ts +++ b/src/typeUtils.ts @@ -39,11 +39,11 @@ type Omit = Pick>; // RESOLVE_MATCH: '@@found/RESOLVE_MATCH'; // }; -export type Params = Record; +export type Params = Record; export type ParamsDescriptor = Record< string, - string | number | boolean | Record + string | number | boolean | Record | undefined >; // These need to be interfaces to avoid circular reference issues. diff --git a/test/Matcher.test.js b/test/Matcher.test.ts similarity index 91% rename from test/Matcher.test.js rename to test/Matcher.test.ts index d66ec5af..94c97763 100644 --- a/test/Matcher.test.js +++ b/test/Matcher.test.ts @@ -1,4 +1,9 @@ import Matcher from '../src/Matcher'; +import { + type IsActiveOptions, + type LocationDescriptorObject, + Match, +} from '../src/typeUtils'; describe('Matcher', () => { describe('route hierarchies', () => { @@ -32,11 +37,11 @@ describe('Matcher', () => { ['nested matching', '/foo/bar', [0, 1]], ['route fallthrough', '/foo/baz', [2]], ].forEach(([scenario, pathname, expectedRouteIndices]) => { - describe(scenario, () => { + describe(scenario as string, () => { it('should be supported', () => { expect( matcher.match({ - pathname, + pathname: pathname as string, }), ).toMatchObject({ routeIndices: expectedRouteIndices, @@ -215,11 +220,14 @@ describe('Matcher', () => { }, ]); - expect( - matcher.match({ - pathname: '/a', - }), - ).toEqual({ + const missingMatch = matcher.match({ pathname: '/a' }); + + if (missingMatch != null && 0 in missingMatch.params) { + const param: string | undefined = missingMatch.params[0]; + expect(param).toBeUndefined(); + } + + expect(missingMatch).toEqual({ routeIndices: [0, 0], routeParams: [{ foo: 'a' }, { 0: undefined }], params: { @@ -265,7 +273,7 @@ describe('Matcher', () => { it(`should match ${scenario}`, () => { expect( matcher.match({ - pathname, + pathname: pathname as string, }), ).toMatchObject({ routeIndices: expectedRouteIndices, @@ -350,7 +358,7 @@ describe('Matcher', () => { }); describe('#joinPaths', () => { - const matcher = new Matcher(); + const matcher = new Matcher([]); [ ['no extra slashes', '/foo', 'bar'], @@ -359,6 +367,7 @@ describe('Matcher', () => { ['slashes everywhere', '/foo/', '/bar'], ].forEach(([scenario, basePath, path]) => { it(`should support ${scenario}`, () => { + // @ts-ignore expect(matcher.joinPaths(basePath, path)).toBe('/foo/bar'); }); }); @@ -415,7 +424,11 @@ describe('Matcher', () => { ].forEach(([scenario, matchLocation, location, options]) => { it(`should be active on ${scenario}`, () => { expect( - matcher.isActive({ location: matchLocation }, location, options), + matcher.isActive( + { location: matchLocation } as any as Match, + location as LocationDescriptorObject, + options as IsActiveOptions, + ), ).toBe(true); }); }); @@ -459,7 +472,11 @@ describe('Matcher', () => { ].forEach(([scenario, matchLocation, location, options]) => { it(`should not be active on ${scenario}`, () => { expect( - matcher.isActive({ location: matchLocation }, location, options), + matcher.isActive( + { location: matchLocation } as any as Match, + location as LocationDescriptorObject, + options as IsActiveOptions, + ), ).toBe(false); }); }); diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 00000000..e516b7fa --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["**/*.ts"] +}