diff --git a/Makefile b/Makefile index a3972e6..e6e3a35 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ dist/build: ${SOURCE_FILES} ./node_modules/.bin/tsc touch dist/build -browser/oauth2-client.min.js: ${SOURCE_FILES} +browser/oauth2-client.min.js: ${SOURCE_FILES} webpack.config.js mkdir -p browser ./node_modules/.bin/webpack diff --git a/changelog.md b/changelog.md index 1c7241e..9fff210 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,8 @@ Changelog * Dropped support for Node 14 and 16. * Migrated the test suite from Mocha and Chai to node:test and node:assert (@Zen-cronic). +* Full conversion to ESM. + 2.4.2 (2024-09-14) ------------------ diff --git a/package-lock.json b/package-lock.json index aa1b634..7debeef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,278 +96,6 @@ "node": ">=10.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/linux-x64": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", @@ -385,125 +113,6 @@ "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2059,21 +1668,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", diff --git a/package.json b/package.json index b65025b..597c3a1 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "2.4.2", "description": "OAuth2 client for browsers and Node.js. Tiny footprint, PKCE support", "main": "dist/index.js", + "type": "module", "scripts": { "test": "make test", "prepublishOnly": "make build", diff --git a/src/client.ts b/src/client.ts index 80c74cb..74cdcb3 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,4 +1,4 @@ -import { OAuth2Token } from './token'; +import { OAuth2Token } from './token.js'; import { AuthorizationCodeRequest, ClientCredentialsRequest, @@ -10,9 +10,9 @@ import { RevocationRequest, ServerMetadataResponse, TokenResponse, -} from './messages'; -import { OAuth2HttpError } from './error'; -import { OAuth2AuthorizationCodeClient } from './client/authorization-code'; +} from './messages.js'; +import { OAuth2HttpError } from './error.js'; +import { OAuth2AuthorizationCodeClient } from './client/authorization-code.js'; type ClientCredentialsParams = { diff --git a/src/client/authorization-code.ts b/src/client/authorization-code.ts index 5857cfe..b2a7180 100644 --- a/src/client/authorization-code.ts +++ b/src/client/authorization-code.ts @@ -1,7 +1,7 @@ -import { OAuth2Client } from '../client'; -import { OAuth2Token } from '../token'; -import { AuthorizationCodeRequest } from '../messages'; -import { OAuth2Error } from '../error'; +import { OAuth2Client } from '../client.js'; +import { OAuth2Token } from '../token.js'; +import { AuthorizationCodeRequest } from '../messages.js'; +import { OAuth2Error } from '../error.js'; type GetAuthorizeUrlParams = { /** @@ -238,8 +238,8 @@ async function getWebCrypto(): Promise { } // Node // eslint-disable-next-line @typescript-eslint/no-var-requires - const crypto = require('crypto'); - return crypto.webcrypto; + const crypto = await import('crypto'); + return crypto.webcrypto as typeof window.crypto; } diff --git a/src/error.ts b/src/error.ts index a825586..5911c13 100644 --- a/src/error.ts +++ b/src/error.ts @@ -1,4 +1,4 @@ -import { OAuth2ErrorCode } from './messages'; +import { OAuth2ErrorCode } from './messages.js'; /** * An error class for any error the server emits. diff --git a/src/fetch-wrapper.ts b/src/fetch-wrapper.ts index c9a9f40..9b9ebda 100644 --- a/src/fetch-wrapper.ts +++ b/src/fetch-wrapper.ts @@ -1,5 +1,5 @@ -import { OAuth2Token } from './token'; -import { OAuth2Client } from './client'; +import { OAuth2Token } from './token.js'; +import { OAuth2Client } from './client.js'; type FetchMiddleware = (request: Request, next: (request: Request) => Promise) => Promise; diff --git a/src/index.ts b/src/index.ts index 509bdd9..d57612f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ -export { OAuth2Client } from './client'; -export { OAuth2AuthorizationCodeClient, generateCodeVerifier } from './client/authorization-code'; -export { OAuth2Fetch } from './fetch-wrapper'; -export { OAuth2Token } from './token'; -export { OAuth2Error, OAuth2HttpError } from './error'; +export { OAuth2Client } from './client.js'; +export { OAuth2AuthorizationCodeClient, generateCodeVerifier } from './client/authorization-code.js'; +export { OAuth2Fetch } from './fetch-wrapper.js'; +export { OAuth2Error, OAuth2HttpError } from './error.js'; -export { IntrospectionResponse } from './messages'; +export type { IntrospectionResponse } from './messages.js'; +export type { OAuth2Token } from './token.js'; diff --git a/test/authorization-code.ts b/test/authorization-code.ts index ff13dd0..ac3256d 100644 --- a/test/authorization-code.ts +++ b/test/authorization-code.ts @@ -1,6 +1,6 @@ import * as assert from 'node:assert'; -import { testServer } from './test-server'; -import { OAuth2Client } from '../src'; +import { testServer } from './test-server.js'; +import { OAuth2Client } from '../src/index.js'; import { after, describe, it } from 'node:test'; // Example directly taken from https://datatracker.ietf.org/doc/html/rfc7636 diff --git a/test/client-credentials.ts b/test/client-credentials.ts index 3041349..83f6781 100644 --- a/test/client-credentials.ts +++ b/test/client-credentials.ts @@ -1,6 +1,6 @@ import * as assert from 'node:assert'; -import { testServer } from './test-server'; -import { OAuth2Client, OAuth2HttpError } from '../src'; +import { testServer } from './test-server.js'; +import { OAuth2Client, OAuth2HttpError } from '../src/index.js'; import { after, describe, it } from 'node:test'; describe('client-credentials', () => { diff --git a/test/client.ts b/test/client.ts index 0ad62d4..cfebb82 100644 --- a/test/client.ts +++ b/test/client.ts @@ -1,5 +1,5 @@ import * as assert from 'node:assert'; -import { OAuth2Client } from '../src'; +import { OAuth2Client } from '../src/index.js'; import { describe, it } from 'node:test'; describe('tokenResponseToOAuth2Token', () => { diff --git a/test/fetch-wrapper.ts b/test/fetch-wrapper.ts index be40726..7ea7683 100644 --- a/test/fetch-wrapper.ts +++ b/test/fetch-wrapper.ts @@ -1,5 +1,5 @@ import * as assert from 'node:assert'; -import { OAuth2Fetch, OAuth2Client } from '../src'; +import { OAuth2Fetch, OAuth2Client } from '../src/index.js'; import { afterEach, describe, it } from 'node:test'; describe('FetchWrapper', () => { diff --git a/test/password.ts b/test/password.ts index f29afa5..039c8ab 100644 --- a/test/password.ts +++ b/test/password.ts @@ -1,6 +1,6 @@ import * as assert from 'node:assert'; -import { testServer } from './test-server'; -import { OAuth2Client } from '../src'; +import { testServer } from './test-server.js'; +import { OAuth2Client } from '../src/index.js'; import { after, describe, it } from 'node:test'; describe('password', () => { diff --git a/test/pkce.ts b/test/pkce.ts index cb34280..e422213 100644 --- a/test/pkce.ts +++ b/test/pkce.ts @@ -1,6 +1,6 @@ import * as assert from 'node:assert'; -import { generateCodeVerifier } from '../src'; -import { getCodeChallenge } from '../src/client/authorization-code'; +import { generateCodeVerifier } from '../src/index.js'; +import { getCodeChallenge } from '../src/client/authorization-code.js'; import { describe, it } from 'node:test'; describe('generateCodeVerifier', () => { diff --git a/test/refresh.ts b/test/refresh.ts index 713ecfc..2363e90 100644 --- a/test/refresh.ts +++ b/test/refresh.ts @@ -1,5 +1,5 @@ -import { testServer } from './test-server'; -import { OAuth2Client } from '../src'; +import { testServer } from './test-server.js'; +import { OAuth2Client } from '../src/index.js'; import * as assert from 'node:assert'; import { after, describe, it } from 'node:test'; diff --git a/test/revoke.ts b/test/revoke.ts index 02fa46b..b9b999b 100644 --- a/test/revoke.ts +++ b/test/revoke.ts @@ -1,6 +1,6 @@ import * as assert from 'node:assert'; -import { testServer } from './test-server'; -import { OAuth2Client } from '../src'; +import { testServer } from './test-server.js'; +import { OAuth2Client } from '../src/index.js'; import { after, describe, it } from 'node:test'; describe('Token revocation', () => { diff --git a/tsconfig.json b/tsconfig.json index 8a1acff..ad4cb66 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "module": "commonjs", + "module": "esnext", "target": "es2019", "strict": true, diff --git a/webpack.config.js b/webpack.config.js index 8cd27f4..a0c015d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,14 +1,20 @@ -module.exports = [ +export default [ { entry: './src/index', output: { - path: __dirname + '/browser', + path: import.meta.dirname + '/browser', filename: 'oauth2-client.min.js', - library: 'OAuth2Client', - libraryTarget: 'umd' + library: { + type: 'module', + }, + }, + experiments: { + outputModule: true, }, - resolve: { + extensionAlias: { + '.js': ['.ts', '.js'] + }, extensions: ['.web.ts', '.web.js', '.ts', '.js', '.json'], fallback: { 'crypto': false } },