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

build: add type definitions #26

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
6 changes: 3 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ Accepts.prototype.types = function (types_) {
* ['gzip', 'deflate']
*
* @param {String|Array} encodings...
* @return {String|Array}
* @return {String|Array|Boolean}
* @public
*/

Expand Down Expand Up @@ -152,7 +152,7 @@ Accepts.prototype.encodings = function (encodings_) {
* ['utf-8', 'utf-7', 'iso-8859-1']
*
* @param {String|Array} charsets...
* @return {String|Array}
* @return {String|Array|Boolean}
* @public
*/

Expand Down Expand Up @@ -185,7 +185,7 @@ Accepts.prototype.charsets = function (charsets_) {
* ['es', 'pt', 'en']
*
* @param {String|Array} langs...
* @return {Array|String}
* @return {String|Array|Boolean}
* @public
*/

Expand Down
11 changes: 8 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "accepts",
"description": "Higher-level content negotiation",
"version": "1.3.8",
"types": "types/index.d.ts",
"contributors": [
"Douglas Christopher Wilson <doug@somethingdoug.com>",
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
Expand All @@ -13,6 +14,7 @@
"negotiator": "0.6.3"
},
"devDependencies": {
"@types/node": "18.11.18",
"deep-equal": "1.0.1",
"eslint": "7.32.0",
"eslint-config-standard": "14.1.1",
Expand All @@ -22,12 +24,14 @@
"eslint-plugin-promise": "4.3.1",
"eslint-plugin-standard": "4.1.0",
"mocha": "9.2.0",
"nyc": "15.1.0"
"nyc": "15.1.0",
"tsd": "^0.25.0"
},
"files": [
"LICENSE",
"HISTORY.md",
"index.js"
"index.js",
"types/index.d.ts"
],
"engines": {
"node": ">= 0.6"
Expand All @@ -36,7 +40,8 @@
"lint": "eslint .",
"test": "mocha --reporter spec --check-leaks --bail test/",
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
"test-cov": "nyc --reporter=html --reporter=text npm test"
"test-cov": "nyc --reporter=html --reporter=text npm test",
"test-typescript": "tsd"
},
"keywords": [
"content",
Expand Down
8 changes: 8 additions & 0 deletions test/charset.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ describe('accepts.charsets()', function () {
assert.strictEqual(accept.charsets(['utf-7', 'utf-8']), 'utf-8')
})
})

describe('with an empty array', function () {
it('should return accepted types', function () {
var req = createRequest('utf-8, iso-8859-1;q=0.2, utf-7;q=0.5')
var accept = accepts(req)
assert.ok(deepEqual(accept.charsets(), ['utf-8', 'utf-7', 'iso-8859-1']))
})
})
})

function createRequest (charset) {
Expand Down
9 changes: 9 additions & 0 deletions test/encoding.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,15 @@ describe('accepts.encodings()', function () {
assert.strictEqual(accept.encodings(['compress', 'gzip']), 'gzip')
})
})

describe('with an empty array', function () {
it('should return accepted types', function () {
var req = createRequest('gzip, compress;q=0.2')
var accept = accepts(req)
assert.ok(deepEqual(accept.encodings([]), ['gzip', 'compress', 'identity']))
assert.strictEqual(accept.encodings('gzip', 'compress'), 'gzip')
})
})
})

function createRequest (encoding) {
Expand Down
8 changes: 8 additions & 0 deletions test/language.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ describe('accepts.languages()', function () {
assert.strictEqual(accept.languages(['es', 'en']), 'es')
})
})

describe('with an empty array', function () {
it('should return accepted types', function () {
var req = createRequest('en;q=0.8, es, pt')
var accept = accepts(req)
assert.deepEqual(accept.languages([]), ['es', 'pt', 'en'])
})
})
})

function createRequest (language) {
Expand Down
8 changes: 8 additions & 0 deletions test/type.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,14 @@ describe('accepts.types()', function () {
assert.strictEqual(accept.types('image/png'), false)
})
})

describe('with an empty array', function () {
it('should return all accepted types', function () {
var req = createRequest('application/*;q=0.2, image/jpeg;q=0.8, text/html, text/plain')
var accept = accepts(req)
assert.ok(deepEqual(accept.types([]), ['text/html', 'text/plain', 'image/jpeg', 'application/*']))
})
})
})

function createRequest (type) {
Expand Down
94 changes: 94 additions & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/// <reference types="node" />

import { IncomingMessage } from "http";

declare namespace accepts {
interface Accepts {
/**
* Return the first accepted charset. If nothing in `charsets` is accepted, then `false` is returned.
* If no charsets are supplied, all accepted charsets are returned, in the order of the client's preference
* (most preferred first).
*/
charset(): string[];
charset(charsets: string[]): string | string[] | false;
charset(...charsets: string[]): string | false;

/**
* Return the first accepted charset. If nothing in `charsets` is accepted, then `false` is returned.
* If no charsets are supplied, all accepted charsets are returned, in the order of the client's preference
* (most preferred first).
*/
charsets(): string[];
charsets(charsets: string[]): string | string[] | false;
charsets(...charsets: string[]): string | false;

/**
* Return the first accepted encoding. If nothing in `encodings` is accepted, then `false` is returned.
* If no encodings are supplied, all accepted encodings are returned, in the order of the client's preference
* (most preferred first).
*/
encoding(): string[];
encoding(encodings: string[]): string | string[] | false;
encoding(...encodings: string[]): string | false;

/**
* Return the first accepted encoding. If nothing in `encodings` is accepted, then `false` is returned.
* If no encodings are supplied, all accepted encodings are returned, in the order of the client's preference
* (most preferred first).
*/
encodings(): string[];
encodings(encodings: string[]): string | string[] | false;
encodings(...encodings: string[]): string | false;

/**
* Return the first accepted language. If nothing in `languages` is accepted, then `false` is returned.
* If no languaes are supplied, all accepted languages are returned, in the order of the client's preference
* (most preferred first).
*/
language(): string[];
language(languages: string[]): string | string[] | false;
language(...languages: string[]): string | false;

/**
* Return the first accepted language. If nothing in `languages` is accepted, then `false` is returned.
* If no languaes are supplied, all accepted languages are returned, in the order of the client's preference
* (most preferred first).
*/
languages(): string[];
languages(languages: string[]): string | string[] | false;
languages(...languages: string[]): string | false;

/**
* Return the first accepted language. If nothing in `languages` is accepted, then `false` is returned.
* If no languaes are supplied, all accepted languages are returned, in the order of the client's preference
* (most preferred first).
*/
lang(): string[];
lang(languages: string[]): string | string[] | false;
lang(...languages: string[]): string | false;

/**
* Return the first accepted language. If nothing in `languages` is accepted, then `false` is returned.
* If no languaes are supplied, all accepted languages are returned, in the order of the client's preference
* (most preferred first).
*/
langs(): string[];
langs(languages: string[]): string | string[] | false;
langs(...languages: string[]): string | false;

/**
* Return the first accepted type (and it is returned as the same text as what appears in the `types` array). If nothing in `types` is accepted, then `false` is returned.
* If no types are supplied, return the entire set of acceptable types.
*
* The `types` array can contain full MIME types or file extensions. Any value that is not a full MIME types is passed to `require('mime-types').lookup`.
*/
type(types: string[]): string | string[] | false;
type(...types: string[]): string | false;
types(types: string[]): string | string[] | false;
types(...types: string[]): string | false;
}
}

declare function accepts(req: IncomingMessage): accepts.Accepts;

export = accepts;
29 changes: 29 additions & 0 deletions types/index.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import accepts from "..";

const req: any = {};

const accept = accepts(req);

const charsets = accept.charsets();
const charsetFromEmpty = accept.charset();
const charsetFromEmptyArray = accept.charset([]);
const charsetFromParams = accept.charset("json", "text");
const charsetFromArray = accept.charset(["json", "txt"]);

const encodings = accept.encodings();
const encodingFromEmpty = accept.encoding();
const encodingFromEmptyArray = accept.encoding([]);
const encodingFromParams = accept.encoding("json", "text");
const encodingFromArray = accept.encoding(["json", "text"]);

const languages = accept.languages();
const languageFromEmpty = accept.language();
const languageFromEmptyArray = accept.language([]);
const languageFromParams = accept.language("json", "text");
const languageFromArray = accept.language(["json", "text"]);

const types = accept.types();
const typeFromEmpty = accept.type();
const typeFromEmptyArray = accept.type([]);
const typeFromParams = accept.type("json", "text");
const typeFromArray = accept.type(["json", "text"]);
Loading