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

Disable ESLint rule conflicting with Prettier #55

Merged
merged 5 commits into from
Oct 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,13 @@ module.exports = {
node: true,
jest: true
},
extends: [
'standard'
],
extends: ['standard', 'prettier'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
plugins: [
'@typescript-eslint'
],
plugins: ['@typescript-eslint'],
rules: {},
ignorePatterns: ['**/lib/**/*.js']
}
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
coverage/
packages/*/lib/
package-lock.json
10 changes: 8 additions & 2 deletions examples/metarefresh-plugin.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import { IncomingMessage } from 'http'
import { Follow, Stop } from 'tall'

export async function metaRefreshPlugin (url: URL, response: IncomingMessage, previous: Follow | Stop): Promise<Follow | Stop> {
export async function metaRefreshPlugin(
url: URL,
response: IncomingMessage,
previous: Follow | Stop
): Promise<Follow | Stop> {
let html = ''
for await (const chunk of response) {
html += chunk.toString()
}

// note: this is actually not a great idea, it's best to use something like cheerio to parse HTML
// but for the sake of illustrating how to use plugins this is good enough here...
const metaHttpEquivUrl = html.match(/meta +http-equiv="refresh" +content="\d;url=(http[^"]+)"/)?.[1]
const metaHttpEquivUrl = html.match(
/meta +http-equiv="refresh" +content="\d;url=(http[^"]+)"/
)?.[1]

if (metaHttpEquivUrl) {
return new Follow(new URL(metaHttpEquivUrl))
Expand Down
30 changes: 13 additions & 17 deletions packages/tall/jest.config.cjs → jest.config.cjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
/*
* For a detailed explanation regarding each configuration property and type check, visit:
* https://jestjs.io/docs/en/configuration.html
*/

module.exports = {
displayName: 'tall',
const sharedConfig = {
// All imported modules in your tests should be mocked automatically
// automock: false,

Expand All @@ -21,7 +15,7 @@ module.exports = {
// collectCoverage: false,

// An array of glob patterns indicating a set of files for which coverage information should be collected
collectCoverageFrom: ['src/index.ts'],
collectCoverageFrom: ['packages/**/src/*.ts'],

// The directory where Jest should output its coverage files
coverageDirectory: 'coverage',
Expand All @@ -35,12 +29,7 @@ module.exports = {
coverageProvider: 'v8',

// A list of reporter names that Jest uses when writing coverage reports
coverageReporters: [
'json',
'text',
'lcov',
'clover'
],
coverageReporters: ['json', 'text', 'lcov', 'clover'],

// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: undefined,
Expand Down Expand Up @@ -118,9 +107,7 @@ module.exports = {
// rootDir: undefined,

// A list of paths to directories that Jest should use to search for files in
roots: [
'src'
],
// roots: ['src'],

// Allows you to use a custom runner instead of Jest's default test runner
// runner: 'jest-runner-tsc',
Expand Down Expand Up @@ -193,3 +180,12 @@ module.exports = {
// Whether to use watchman for file crawling
// watchman: true,
}

module.exports = {
projects: [
{
displayName: 'tall',
...sharedConfig
}
]
}
42 changes: 42 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
"packages/*"
],
"scripts": {
"test": "npm test --workspaces",
"format": "prettier --write ./**/*.{cjs,js,ts,json}",
"test:format": "prettier --list-different ./**/*.{cjs,js,ts,json}",
"test:lint": "eslint .",
"test:unit": "jest --coverage --verbose",
"test": "npm run test:format && npm run test:lint && npm run test:unit",
"build": "npm run build --if-present --workspaces",
"build:test": "npm run build:test --if-present --workspaces"
},
Expand All @@ -29,12 +33,14 @@
"@typescript-eslint/parser": "^5.12.0",
"codecov": "^3.8.1",
"eslint": "^8.25.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-n": "^15.3.0",
"eslint-plugin-promise": "^6.0.1",
"jest": "^29.1.2",
"nock": "^13.0.6",
"prettier": "^2.7.1",
"ts-jest": "^29.0.3",
"ts-node": "^10.5.0",
"typescript": "^4.5.5"
Expand Down
5 changes: 1 addition & 4 deletions packages/tall/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,7 @@
"build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && echo '{\"type\":\"commonjs\"}' > lib/cjs/package.json",
"build:test": "node test/commonjs.cjs && node test/esm.js",
"prepublish": "npm run build",
"prepare": "npm run build",
"test:lint": "eslint .",
"test:unit": "jest --coverage --verbose",
"test": "npm run test:lint && npm run test:unit"
"prepare": "npm run build"
},
"repository": {
"type": "git",
Expand Down
57 changes: 28 additions & 29 deletions packages/tall/src/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { IncomingMessage } from 'http'
import nock from 'nock'
import { Follow, locationHeaderPlugin, Stop, tall } from '.'
import { Follow, locationHeaderPlugin, Stop, tall } from './'

beforeEach(() => {
nock.cleanAll()
Expand All @@ -11,10 +11,7 @@ test('it should unshorten a link using https', async () => {
.get('/a-link')
.times(1)
.reply(301, 'Moved', { location: 'https://dest.pizza/a-link' })
nock('https://dest.pizza')
.get('/a-link')
.times(1)
.reply(200, 'OK')
nock('https://dest.pizza').get('/a-link').times(1).reply(200, 'OK')

const url = await tall('https://example.com/a-link')

Expand All @@ -26,10 +23,7 @@ test('it should unshorten a link using http', async () => {
.get('/a-link')
.times(1)
.reply(301, 'Moved', { location: 'http://dest.pizza/a-link' })
nock('http://dest.pizza')
.get('/a-link')
.times(1)
.reply(200, 'OK')
nock('http://dest.pizza').get('/a-link').times(1).reply(200, 'OK')

const url = await tall('http://example.com/a-link')

Expand All @@ -51,7 +45,9 @@ test('it should fail if the request times out', async () => {
.delay(1000)
.reply(200, 'OK')

await expect(() => tall('http://example.com/a-link', { timeout: 1 })).rejects.toThrow()
await expect(() =>
tall('http://example.com/a-link', { timeout: 1 })
).rejects.toThrow()
})

test('it should not fail if the request is within the timeout', async () => {
Expand All @@ -60,21 +56,15 @@ test('it should not fail if the request is within the timeout', async () => {
.times(1)
.delay(1)
.reply(301, 'Moved', { location: 'http://dest.pizza/a-link' })
nock('http://dest.pizza')
.get('/a-link')
.times(1)
.reply(200, 'OK')
nock('http://dest.pizza').get('/a-link').times(1).reply(200, 'OK')

const url = await tall('http://example.com/a-link', { timeout: 1000 })

expect(url).toBe('http://dest.pizza/a-link')
})

test('it should return the original url if no redirect', async () => {
nock('https://example.com')
.get('/test')
.times(1)
.reply(200, 'OK')
nock('https://example.com').get('/test').times(1).reply(200, 'OK')

const url = await tall('https://example.com/test')

Expand Down Expand Up @@ -133,10 +123,9 @@ test('it should allow to use a different method', async () => {
})

test('it should support redirects containing querystring parameters (see #17 and #19)', async () => {
nock('http://bit.ly')
.head('/fkWS88')
.times(1)
.reply(301, 'Moved', { location: 'http://news.ycombinator.com/item?id=2025354' })
nock('http://bit.ly').head('/fkWS88').times(1).reply(301, 'Moved', {
location: 'http://news.ycombinator.com/item?id=2025354'
})

nock('http://news.ycombinator.com')
.head('/item')
Expand All @@ -150,10 +139,9 @@ test('it should support redirects containing querystring parameters (see #17 and
})

test('The plugin chains behaves as expected', async () => {
nock('http://bit.ly')
.head('/fkWS88')
.times(1)
.reply(301, 'Moved', { location: 'http://news.ycombinator.com/item?id=2025354' })
nock('http://bit.ly').head('/fkWS88').times(1).reply(301, 'Moved', {
location: 'http://news.ycombinator.com/item?id=2025354'
})

nock('http://news.ycombinator.com')
.head('/item')
Expand All @@ -163,17 +151,28 @@ test('The plugin chains behaves as expected', async () => {

const pluginTrace: string[] = []

const plugin1 = async function plugin1 (url: URL, response: IncomingMessage, previous: Follow | Stop): Promise<Follow | Stop> {
const plugin1 = async function plugin1(
url: URL,
response: IncomingMessage,
previous: Follow | Stop
): Promise<Follow | Stop> {
pluginTrace.push(`plugin 1 ${url.toString()}`)
return previous
}

const plugin2 = async function plugin1 (url: URL, response: IncomingMessage, previous: Follow | Stop): Promise<Follow | Stop> {
const plugin2 = async function plugin1(
url: URL,
response: IncomingMessage,
previous: Follow | Stop
): Promise<Follow | Stop> {
pluginTrace.push(`plugin 2 ${url.toString()}`)
return previous
}

const url = await tall('http://bit.ly/fkWS88', { method: 'HEAD', plugins: [locationHeaderPlugin, plugin1, plugin2] })
const url = await tall('http://bit.ly/fkWS88', {
method: 'HEAD',
plugins: [locationHeaderPlugin, plugin1, plugin2]
})

expect(url).toBe('http://news.ycombinator.com/item?id=2025354')
expect(pluginTrace).toEqual([
Expand Down
Loading