diff --git a/.gitignore b/.gitignore index ca56b6361a..68af93b92e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ typings/ coverage/ test/typescript/axios.js* sauce_connect.log +test/module/cjs/node_modules/ +test/module/cjs/package-lock.json +backup/ diff --git a/.npmignore b/.npmignore index 09739a34f8..f94390d8c9 100644 --- a/.npmignore +++ b/.npmignore @@ -16,3 +16,4 @@ Gruntfile.js karma.conf.js webpack.*.js sauce_connect.log +backup/ diff --git a/README.md b/README.md index b7260413fc..dde09743ba 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ - [Features](#features) - [Browser Support](#browser-support) - [Installing](#installing) + - [Package manager](#package-manager) + - [CDN](#cdn) - [Example](#example) - [Axios API](#axios-api) - [Request method aliases](#request-method-aliases) @@ -93,6 +95,8 @@ Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 11 ✔ | ## Installing +### Package manager + Using npm: ```bash @@ -117,7 +121,39 @@ Using pnpm: $ pnpm add axios ``` -Using jsDelivr CDN: +Once the package is installed, you can import the library using `import` or `require` approach: + +```js +import axios, {isCancel, AxiosError} from 'axios'; +``` + +You can also use the default export, since the named export is just a re-export from the Axios factory: + +```js +import axios from 'axios'; + +console.log(axios.isCancel('something')); +```` + +If you use `require` for importing, **only default export is available**: + +```js +const axios = require('axios'); + +console.log(axios.isCancel('something')); +``` + +For cases where something went wrong when trying to import a module into a custom or legacy environment, +you can try importing the module package directly: + +```js +const axios = require('axios/dist/browser/axios.cjs'); // browser commonJS bundle (ES2017) +// const axios = require('axios/dist/node/axios.cjs'); // node commonJS bundle (ES2017) +``` + +### CDN + +Using jsDelivr CDN (ES5 UMD browser module): ```html @@ -131,19 +167,11 @@ Using unpkg CDN: ## Example -### note: CommonJS usage -In order to gain the TypeScript typings (for intellisense / autocomplete) while using CommonJS imports with `require()` use the following approach: - -```js -const axios = require('axios').default; - -// axios. will now provide autocomplete and parameter typings -``` - Performing a `GET` request ```js -const axios = require('axios').default; +import axios from 'axios'; +//const axios = require('axios'); // legacy way // Make a request for a user with a given ID axios.get('/user?ID=12345') diff --git a/index.d.ts b/index.d.ts index abc4d93aee..ecd5c85247 100644 --- a/index.d.ts +++ b/index.d.ts @@ -463,6 +463,18 @@ export interface GenericHTMLFormElement { submit(): void; } +export function toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData; + +export function formToJSON(form: GenericFormData|GenericHTMLFormElement): object; + +export function isAxiosError(payload: any): payload is AxiosError; + +export function spread(callback: (...args: T[]) => R): (array: T[]) => R; + +export function isCancel(value: any): value is Cancel; + +export function all(values: Array>): Promise; + export interface AxiosStatic extends AxiosInstance { create(config?: CreateAxiosDefaults): AxiosInstance; Cancel: CancelStatic; @@ -470,12 +482,14 @@ export interface AxiosStatic extends AxiosInstance { Axios: typeof Axios; AxiosError: typeof AxiosError; readonly VERSION: string; - isCancel(value: any): value is Cancel; - all(values: Array>): Promise; - spread(callback: (...args: T[]) => R): (array: T[]) => R; - isAxiosError(payload: any): payload is AxiosError; - toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData; - formToJSON(form: GenericFormData|GenericHTMLFormElement): object; + isCancel: typeof isCancel; + all: typeof all; + spread: typeof spread; + isAxiosError: typeof isAxiosError; + toFormData: typeof toFormData; + formToJSON: typeof formToJSON; + CanceledError: typeof CanceledError; + AxiosHeaders: typeof AxiosHeaders; } declare const axios: AxiosStatic; diff --git a/index.js b/index.js index b5369d7842..f91032c024 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ import axios from './lib/axios.js'; +// This module is intended to unwrap Axios default export as named. // Keep top-level export same with static properties // so that it can keep same with es module or cjs const { @@ -13,11 +14,13 @@ const { Cancel, isAxiosError, spread, - toFormData + toFormData, + AxiosHeaders, + formToJSON } = axios; -export default axios; export { + axios as default, Axios, AxiosError, CanceledError, @@ -28,5 +31,7 @@ export { Cancel, isAxiosError, spread, - toFormData + toFormData, + AxiosHeaders, + formToJSON } diff --git a/lib/axios.js b/lib/axios.js index e79082ceb3..31b75b162b 100644 --- a/lib/axios.js +++ b/lib/axios.js @@ -14,6 +14,7 @@ import toFormData from './helpers/toFormData.js'; import AxiosError from './core/AxiosError.js'; import spread from './helpers/spread.js'; import isAxiosError from './helpers/isAxiosError.js'; +import AxiosHeaders from "./core/AxiosHeaders.js"; /** * Create an instance of Axios @@ -69,8 +70,9 @@ axios.spread = spread; // Expose isAxiosError axios.isAxiosError = isAxiosError; -axios.formToJSON = thing => { - return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing); -}; +axios.AxiosHeaders = AxiosHeaders; + +axios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing); +// this module should only have a default export export default axios diff --git a/package.json b/package.json index 685f3fc86f..61e7b688ed 100644 --- a/package.json +++ b/package.json @@ -6,22 +6,24 @@ "exports": { ".": { "browser": { - "require": "./dist/node/axios.cjs", + "require": "./dist/browser/axios.cjs", "default": "./index.js" }, "default": { "require": "./dist/node/axios.cjs", "default": "./index.js" } - } + }, + "./package.json": "./package.json" }, "type": "module", "types": "index.d.ts", "scripts": { - "test": "npm run test:eslint && npm run test:mocha && npm run test:karma && npm run test:dtslint", + "test": "npm run test:eslint && npm run test:mocha && npm run test:karma && npm run test:exports && npm run test:dtslint", "test:eslint": "node bin/ssl_hotfix.js eslint lib/**/*.js", "test:dtslint": "node bin/ssl_hotfix.js dtslint", "test:mocha": "node bin/ssl_hotfix.js mocha test/unit/**/*.js --timeout 30000 --exit", + "test:exports": "node bin/ssl_hotfix.js mocha test/module/test.js --timeout 30000 --exit", "test:karma": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: karma start karma.conf.cjs --single-run", "test:karma:server": "node bin/ssl_hotfix.js cross-env karma start karma.conf.cjs", "start": "node ./sandbox/server.js", @@ -131,4 +133,4 @@ "Ben Carp (https://github.com/carpben)", "Daniel Lopretto (https://github.com/timemachine3030)" ] -} \ No newline at end of file +} diff --git a/rollup.config.js b/rollup.config.js index 9fd12d1bac..31cc7bebce 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -5,20 +5,28 @@ import json from '@rollup/plugin-json'; import { babel } from '@rollup/plugin-babel'; import autoExternal from 'rollup-plugin-auto-external'; import bundleSize from 'rollup-plugin-bundle-size' +import path from 'path'; const lib = require("./package.json"); const outputFileName = 'axios'; const name = "axios"; -const input = './lib/axios.js'; +const namedInput = './index.js'; +const defaultInput = './lib/axios.js'; const buildConfig = ({es5, browser = true, minifiedVersion = true, ...config}) => { + const {file} = config.output; + const ext = path.extname(file); + const basename = path.basename(file, ext); + const extArr = ext.split('.'); + extArr.shift(); + const build = ({minified}) => ({ - input, + input: namedInput, ...config, output: { ...config.output, - file: `${config.output.file}.${minified ? "min.js" : "js"}` + file: `${path.dirname(file)}/${basename}.${(minified ? ['min', ...extArr] : extArr).join('.')}` }, plugins: [ json(), @@ -50,10 +58,24 @@ export default async () => { const banner = `// Axios v${lib.version} Copyright (c) ${year} ${lib.author} and contributors`; return [ + // browser ESM bundle for CDN ...buildConfig({ + input: namedInput, + output: { + file: `dist/esm/${outputFileName}.js`, + format: "esm", + preferConst: true, + exports: "named", + banner + } + }), + + // Browser UMD bundle for CDN + ...buildConfig({ + input: defaultInput, es5: true, output: { - file: `dist/${outputFileName}`, + file: `dist/${outputFileName}.js`, name, format: "umd", exports: "default", @@ -61,18 +83,23 @@ export default async () => { } }), + // Browser CJS bundle ...buildConfig({ + input: defaultInput, + es5: false, + minifiedVersion: false, output: { - file: `dist/esm/${outputFileName}`, - format: "esm", - preferConst: true, - exports: "named", + file: `dist/browser/${name}.cjs`, + name, + format: "cjs", + exports: "default", banner } }), - // Node.js commonjs build + + // Node.js commonjs bundle { - input, + input: defaultInput, output: { file: `dist/node/${name}.cjs`, format: "cjs", diff --git a/test/module/cjs/index.js b/test/module/cjs/index.js new file mode 100644 index 0000000000..7eb5dc034e --- /dev/null +++ b/test/module/cjs/index.js @@ -0,0 +1,11 @@ +const axios = require('axios'); +const assert = require('assert'); + +const {CanceledError, AxiosError, AxiosHeaders} = axios; + +assert.strictEqual(typeof axios, 'function'); +assert.strictEqual(typeof CanceledError, 'function'); +assert.strictEqual(typeof AxiosError, 'function'); +assert.strictEqual(typeof AxiosHeaders, 'function'); + +console.log('CommonJS importing test passed'); diff --git a/test/module/cjs/package.json b/test/module/cjs/package.json new file mode 100644 index 0000000000..1b198f46f7 --- /dev/null +++ b/test/module/cjs/package.json @@ -0,0 +1,15 @@ +{ + "name": "cjs-entrypoint-test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "npm i --no-save --no-package-lock && node index.js" + }, + "keywords": [], + "author": "", + "license": "MIT", + "dependencies": { + "axios": "file:../../.." + } +} diff --git a/test/module/esm/index.js b/test/module/esm/index.js new file mode 100644 index 0000000000..89d85bc1c6 --- /dev/null +++ b/test/module/esm/index.js @@ -0,0 +1,13 @@ +import assert from 'assert'; +import axios, {CanceledError, AxiosError, AxiosHeaders} from 'axios'; + +assert.strictEqual(typeof axios, 'function'); +assert.strictEqual(typeof CanceledError, 'function'); +assert.strictEqual(typeof AxiosError, 'function'); +assert.strictEqual(typeof AxiosHeaders, 'function'); + +assert.strictEqual(axios.CanceledError, CanceledError); +assert.strictEqual(axios.AxiosError, AxiosError); +assert.strictEqual(axios.AxiosHeaders, AxiosHeaders); + +console.log('ESM importing test passed'); diff --git a/test/module/esm/package.json b/test/module/esm/package.json new file mode 100644 index 0000000000..162715065a --- /dev/null +++ b/test/module/esm/package.json @@ -0,0 +1,16 @@ +{ + "name": "esm-entrypoint-test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "npm i --no-save --no-package-lock && node index.js" + }, + "keywords": [], + "author": "", + "license": "MIT", + "dependencies": { + "axios": "file:../../.." + } +} diff --git a/test/module/test.js b/test/module/test.js new file mode 100644 index 0000000000..59c2ff8d8d --- /dev/null +++ b/test/module/test.js @@ -0,0 +1,106 @@ +import assert from 'assert'; +import * as axios from '../../index.js'; +import axiosFactory from '../../lib/axios.js'; +import utils from "../../lib/utils.js"; +import {fileURLToPath} from 'url'; +import path from 'path'; +import util from "util"; +import cp from "child_process"; +import fs from 'fs-extra'; + +const BACKUP_PATH = './backup/'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const exec = util.promisify(cp.exec); + +const {Axios} = axiosFactory; +const ignoreList = []; + +const instance = axiosFactory.create({}); + +const remove = async (file) => { + console.log(`✓ Remove entry '${file}'...`); + try { + await fs.remove(file); + } catch (err) { + console.warn(err); + } +} + +describe('module', function () { + + before(async ()=> { + console.log('✓ Creating build backup...'); + await fs.copy('./dist/', BACKUP_PATH); + console.log('✓ Exec build script...'); + await exec('npm run build'); + console.log('✓ Running tests...'); + }); + + after(async () => { + console.log('✓ Restore build from the backup...'); + await fs.copy(BACKUP_PATH, './dist/'); + await remove(BACKUP_PATH); + }); + + it('should have consistent ESM export', function () { + const namedExport = {}; + const factoryExport = {}; + + Object.entries(axiosFactory).forEach(([key, value]) => { + if(!utils.hasOwnProp(Axios, key) && !(key in instance) && ignoreList.indexOf(key) === -1) { + factoryExport[key] = value; + } + }); + + Object.entries(axios).forEach(([key, value]) => { + key!=='default' && ignoreList.indexOf(key) === -1 && (namedExport[key] = value); + }); + + assert.deepStrictEqual(namedExport, factoryExport); + }); + + describe('CommonJS', ()=> { + const pkgPath = path.join(__dirname, './cjs'); + + after(async ()=> { + await remove(path.join(pkgPath, './node_modules')); + }); + + it('should be able to be loaded with require', async function () { + this.timeout(30000); + + await exec(`npm test --prefix ${pkgPath}`); + }); + }); + + describe('ESM', ()=> { + const pkgPath = path.join(__dirname, './esm'); + + after(async ()=> { + await remove(path.join(pkgPath, './node_modules')); + }); + + it('should be able to be loaded with import', async function () { + this.timeout(30000); + + await exec(`npm test --prefix ${pkgPath}`); + }); + }); + + describe('TS', ()=> { + const pkgPath = path.join(__dirname, './ts'); + + after(async ()=> { + await remove(path.join(pkgPath, './node_modules')); + }); + + it('should be able to be loaded with import', async function () { + this.timeout(30000); + + await exec(`npm test --prefix ${pkgPath}`, {}); + }); + }); + +}); diff --git a/test/module/ts/index.ts b/test/module/ts/index.ts new file mode 100644 index 0000000000..ce88fb5e6c --- /dev/null +++ b/test/module/ts/index.ts @@ -0,0 +1,24 @@ +import assert from 'assert'; +import axios, {CanceledError, AxiosError, AxiosHeaders, formToJSON, spread, isAxiosError, isCancel, all, toFormData} from 'axios'; + +assert.strictEqual(typeof axios, 'function'); + +assert.strictEqual(typeof CanceledError, 'function'); +assert.strictEqual(typeof AxiosError, 'function'); +assert.strictEqual(typeof AxiosHeaders, 'function'); +assert.strictEqual(typeof formToJSON, 'function'); +assert.strictEqual(typeof spread, 'function'); +assert.strictEqual(typeof isAxiosError, 'function'); +assert.strictEqual(typeof isCancel, 'function'); +assert.strictEqual(typeof all, 'function'); +assert.strictEqual(typeof toFormData, 'function'); + +assert.strictEqual(typeof axios.CanceledError, 'function'); +assert.strictEqual(typeof axios.AxiosError, 'function'); +assert.strictEqual(typeof axios.AxiosHeaders, 'function'); +assert.strictEqual(typeof axios.formToJSON, 'function'); +assert.strictEqual(typeof axios.spread, 'function'); +assert.strictEqual(typeof axios.isAxiosError, 'function'); +assert.strictEqual(typeof axios.isCancel, 'function'); +assert.strictEqual(typeof axios.all, 'function'); +assert.strictEqual(typeof axios.toFormData, 'function'); diff --git a/test/module/ts/package.json b/test/module/ts/package.json new file mode 100644 index 0000000000..23c39f3d46 --- /dev/null +++ b/test/module/ts/package.json @@ -0,0 +1,20 @@ +{ + "name": "ts-entrypoint-test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "npm i --no-save --no-package-lock && npm run build && node index.js", + "build": "tsc" + }, + "keywords": [], + "author": "", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.3", + "axios": "file:../../.." + }, + "devDependencies": { + "typescript": "^4.8.4" + } +} diff --git a/test/module/ts/tsconfig.json b/test/module/ts/tsconfig.json new file mode 100644 index 0000000000..ac1c5dbca9 --- /dev/null +++ b/test/module/ts/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/test/specs/instance.spec.js b/test/specs/instance.spec.js index 594a371eba..9306e344e5 100644 --- a/test/specs/instance.spec.js +++ b/test/specs/instance.spec.js @@ -26,7 +26,8 @@ describe('instance', function () { 'VERSION', 'default', 'toFormData', - 'formToJSON' + 'formToJSON', + 'AxiosHeaders' ].indexOf(prop) > -1) { continue; } diff --git a/test/typescript/axios.ts b/test/typescript/axios.ts index 617993eb43..01d32915f8 100644 --- a/test/typescript/axios.ts +++ b/test/typescript/axios.ts @@ -6,7 +6,13 @@ import axios, { AxiosAdapter, Cancel, CancelTokenSource, - Canceler, AxiosProgressEvent, ParamsSerializerOptions + Canceler, AxiosProgressEvent, ParamsSerializerOptions, + toFormData, + formToJSON, + all, + isCancel, + isAxiosError, + spread } from 'axios'; const config: AxiosRequestConfig = { @@ -354,11 +360,28 @@ const promises = [ const promise: Promise = axios.all(promises); +// axios.all named export + +(() => { + const promises = [ + Promise.resolve(1), + Promise.resolve(2) + ]; + + const promise: Promise = all(promises); +})(); + // axios.spread const fn1 = (a: number, b: number, c: number) => `${a}-${b}-${c}`; const fn2: (arr: number[]) => string = axios.spread(fn1); +// axios.spread named export +(() => { + const fn1 = (a: number, b: number, c: number) => `${a}-${b}-${c}`; + const fn2: (arr: number[]) => string = spread(fn1); +})(); + // Promises axios.get('/user') @@ -396,6 +419,12 @@ axios.get('/user', { const cancel: Cancel = thrown; console.log(cancel.message); } + + // named export + if (isCancel(thrown)) { + const cancel: Cancel = thrown; + console.log(cancel.message); + } }); source.cancel('Operation has been canceled.'); @@ -407,12 +436,28 @@ axios.get('/user') if (axios.isAxiosError(error)) { const axiosError: AxiosError = error; } + + // named export + + if (isAxiosError(error)) { + const axiosError: AxiosError = error; + } }); // FormData axios.toFormData({x: 1}, new FormData()); +// named export +toFormData({x: 1}, new FormData()); + +// formToJSON + +axios.toFormData(new FormData()); + +// named export +formToJSON(new FormData()); + // AbortSignal axios.get('/user', {signal: new AbortController().signal}); diff --git a/tslint.json b/tslint.json index 3ec44a760a..685d309ab5 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,11 @@ -{ +{ "extends": "dtslint/dtslint.json", "rules": { "no-unnecessary-generics": false + }, + "linterOptions": { + "exclude": [ + "test/module/**" + ] } }