Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix nodejs import statement in example #1202

Closed
wants to merge 11 commits into from
Closed
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ module.exports = {
'@typescript-eslint/no-unused-vars': [
1,
{
varsIgnorePattern: '^_',
argsIgnorePattern: '^_',
},
],
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ jobs:
node: [14, 16]
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Setup Node.js
uses: actions/setup-node@v2
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node }}
cache: yarn
Expand All @@ -32,4 +32,4 @@ jobs:
run: yarn build

- name: Integration tests
run: yarn test:integration test/rest-api/basic.test.ts
run: yarn test:integration
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,6 @@ jobs:
env:
GIT_COMMITTER_NAME: kettanaito
GIT_COMMITTER_EMAIL: kettanaito@gmail.com
GITHUB_TOKEN: ${{ secrets.GH_ADMIN_TOKEN }}
GH_TOKE: ${{ secrets.GH_ADMIN_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
4 changes: 2 additions & 2 deletions .github/workflows/smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ jobs:
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Setup Node.js
uses: actions/setup-node@v2
uses: actions/setup-node@v3
with:
node-version: 16.14.0
cache: yarn
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ stats.html
.vscode
msw-*.tgz
.husky/_
.env
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ Here's an example of an actual integration test in Jest that uses [React Testing
import '@testing-library/jest-dom'
import React from 'react'
import { rest } from 'msw'
import { setupServer } from 'msw/node'
import { setupServer } from 'msw/node/lib/index.js'
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import Login from '../src/components/Login'
Expand Down
14 changes: 12 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
"start": "cross-env NODE_ENV=development rollup -c rollup.config.ts -w",
"clean": "rimraf lib {native,node}/lib",
"lint": "eslint \"{cli,config,src,test}/**/*.ts\"",
"build": "yarn clean && yarn lint && cross-env NODE_ENV=production rollup -c rollup.config.ts && yarn test:ts",
"prebuild": "yarn clean && yarn lint",
"build": "cross-env NODE_ENV=production rollup -c rollup.config.ts",
"postbuild": "yarn test:ts",
"test": "yarn test:unit && yarn test:integration",
"test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3",
"test:integration": "jest --config=test/jest.config.js --maxWorkers=1",
"test:smoke": "config/scripts/smoke.sh",
"test:ts": "tsc -p test/typings/tsconfig.json",
"test:ts": "tsc -p test-d.tsconfig.json",
"prepare": "yarn simple-git-hooks init",
"prepack": "yarn build",
"release": "semantic-release",
Expand Down Expand Up @@ -139,6 +141,14 @@
"webpack": "^5.68.0",
"webpack-dev-server": "^3.11.2"
},
"peerDependencies": {
"typescript": "4.2.x"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
},
"resolutions": {
"chokidar": "3.4.1"
},
Expand Down
8 changes: 7 additions & 1 deletion release.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@ module.exports = {
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
'@semantic-release/npm',
[
'@semantic-release/git',
{
message:
'chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}',
},
],
'@semantic-release/github',
'@semantic-release/git',
],
}
8 changes: 4 additions & 4 deletions src/handlers/RequestHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export type DefaultRequestMultipartBody = Record<
string | File | (string | File)[]
>

export type DefaultRequestBody =
export type DefaultBodyType =
| Record<string, any>
| DefaultRequestMultipartBody
| string
Expand All @@ -30,7 +30,7 @@ export type DefaultRequestBody =
| null
| undefined

export interface MockedRequest<Body = DefaultRequestBody> {
export interface MockedRequest<Body extends DefaultBodyType = DefaultBodyType> {
id: string
url: URL
method: Request['method']
Expand Down Expand Up @@ -77,9 +77,9 @@ export type AsyncResponseResolverReturnType<ReturnType> =
>

export type ResponseResolver<
RequestType = MockedRequest,
RequestType extends MockedRequest = MockedRequest,
ContextType = typeof defaultContext,
BodyType = any,
BodyType extends DefaultBodyType = any,
> = (
req: RequestType,
res: ResponseComposition<BodyType>,
Expand Down
18 changes: 18 additions & 0 deletions src/handlers/RestHandler.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { RestHandler, RESTMethods } from './RestHandler'

/**
* Path parameter inference.
*/
new RestHandler(RESTMethods.GET, '/user/:id', (req) => {
req.params.id.trim()
})

new RestHandler(RESTMethods.POST, '/user/:id', (req) => {
// @ts-expect-error Property "foo" doesn't exist in path params.
req.params.foo
})

new RestHandler(RESTMethods.PUT, '/:service/user/:id/message/:id', (req) => {
req.params.service.trim()
req.params.id.map
})
50 changes: 32 additions & 18 deletions src/handlers/RestHandler.test.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
/**
* @jest-environment jsdom
*/
import { RestHandler, RestRequest, RestContext } from './RestHandler'
import {
RestHandler,
RestRequest,
RestContext,
RESTMethods,
} from './RestHandler'
import { createMockedRequest } from '../../test/support/utils'
import { response } from '../response'
import { context } from '..'
import { ResponseResolver } from './RequestHandler'

const resolver: ResponseResolver<
RestRequest<{ userId: string }>,
RestContext
> = (req, res, ctx) => {
return res(ctx.json({ userId: req.params.userId }))
const resolver: ResponseResolver<RestRequest, RestContext> = (
req,
res,
ctx,
) => {
return res(
ctx.json({
userId: req.params.userId,
}),
)
}

const generatorResolver: ResponseResolver<
Expand All @@ -28,7 +38,7 @@ const generatorResolver: ResponseResolver<

describe('info', () => {
test('exposes request handler information', () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
expect(handler.info.header).toEqual('GET /user/:userId')
expect(handler.info.method).toEqual('GET')
expect(handler.info.path).toEqual('/user/:userId')
Expand All @@ -37,7 +47,7 @@ describe('info', () => {

describe('parse', () => {
test('parses a URL given a matching request', () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
const request = createMockedRequest({
url: new URL('/user/abc-123', location.href),
})
Expand All @@ -51,7 +61,7 @@ describe('parse', () => {
})

test('parses a URL and ignores the request method', () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
const request = createMockedRequest({
method: 'POST',
url: new URL('/user/def-456', location.href),
Expand All @@ -66,7 +76,7 @@ describe('parse', () => {
})

test('returns negative match result given a non-matching request', () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
const request = createMockedRequest({
url: new URL('/login', location.href),
})
Expand All @@ -80,7 +90,7 @@ describe('parse', () => {

describe('predicate', () => {
test('returns true given a matching request', () => {
const handler = new RestHandler('POST', '/login', resolver)
const handler = new RestHandler(RESTMethods.POST, '/login', resolver)
const request = createMockedRequest({
method: 'POST',
url: new URL('/login', location.href),
Expand Down Expand Up @@ -109,7 +119,7 @@ describe('predicate', () => {
})

test('returns false given a non-matching request', () => {
const handler = new RestHandler('POST', '/login', resolver)
const handler = new RestHandler(RESTMethods.POST, '/login', resolver)
const request = createMockedRequest({
url: new URL('/user/abc-123', location.href),
})
Expand All @@ -120,7 +130,7 @@ describe('predicate', () => {

describe('test', () => {
test('returns true given a matching request', () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
const firstTest = handler.test(
createMockedRequest({
url: new URL('/user/abc-123', location.href),
Expand All @@ -137,7 +147,7 @@ describe('test', () => {
})

test('returns false given a non-matching request', () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
const firstTest = handler.test(
createMockedRequest({
url: new URL('/login', location.href),
Expand All @@ -162,7 +172,7 @@ describe('test', () => {

describe('run', () => {
test('returns a mocked response given a matching request', async () => {
const handler = new RestHandler('GET', '/user/:userId', resolver)
const handler = new RestHandler(RESTMethods.GET, '/user/:userId', resolver)
const request = createMockedRequest({
url: new URL('/user/abc-123', location.href),
})
Expand All @@ -187,7 +197,7 @@ describe('run', () => {
})

test('returns null given a non-matching request', async () => {
const handler = new RestHandler('POST', '/login', resolver)
const handler = new RestHandler(RESTMethods.POST, '/login', resolver)
const result = await handler.run(
createMockedRequest({
method: 'GET',
Expand All @@ -199,7 +209,7 @@ describe('run', () => {
})

test('returns an empty object as "req.params" given request with no URL parameters', async () => {
const handler = new RestHandler('GET', '/users', resolver)
const handler = new RestHandler(RESTMethods.GET, '/users', resolver)
const result = await handler.run(
createMockedRequest({
url: new URL('/users', location.href),
Expand All @@ -212,7 +222,11 @@ describe('run', () => {

describe('run with generator', () => {
test('Resolver runs until generator completes', async () => {
const handler = new RestHandler('GET', '/users', generatorResolver)
const handler = new RestHandler(
RESTMethods.GET,
'/users',
generatorResolver,
)
const run = async () => {
const result = await handler.run(
createMockedRequest({
Expand Down