diff --git a/integration_test/functions/src/index.ts b/integration_test/functions/src/index.ts index 623b690c7..79449cc7b 100644 --- a/integration_test/functions/src/index.ts +++ b/integration_test/functions/src/index.ts @@ -3,7 +3,7 @@ import { GoogleAuth } from "google-auth-library"; import { Request, Response } from "express"; import * as admin from "firebase-admin"; import * as functions from "firebase-functions"; -import * as fs from "fs"; +import fs from "fs"; import fetch from "node-fetch"; import * as v1 from "./v1"; diff --git a/mocha/setup.ts b/mocha/setup.ts index d1d81c5a6..5a7b64c80 100644 --- a/mocha/setup.ts +++ b/mocha/setup.ts @@ -1,17 +1,6 @@ -import * as chai from "chai"; -import * as chaiAsPromisedModule from "chai-as-promised"; -import * as nockModule from "nock"; - -// Normalize CommonJS exports so ts-node (Node.js 20) and Node.js 22's strip-only loader -// both receive callable modules without relying on esModuleInterop. -type ChaiPlugin = Parameters[0]; -type NockModule = typeof nockModule; - -const chaiAsPromisedExport = chaiAsPromisedModule as ChaiPlugin & { default?: ChaiPlugin }; -const chaiAsPromised = chaiAsPromisedExport.default ?? chaiAsPromisedExport; -const nockExport = nockModule as NockModule & { default?: NockModule }; -const nock = nockExport.default ?? nockExport; +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import nock from "nock"; chai.use(chaiAsPromised); - nock.disableNetConnect(); diff --git a/scripts/bin-test/mocha-setup.ts b/scripts/bin-test/mocha-setup.ts index 1fe5d2f95..c0c8e7185 100644 --- a/scripts/bin-test/mocha-setup.ts +++ b/scripts/bin-test/mocha-setup.ts @@ -1,11 +1,4 @@ -import * as chai from "chai"; -import * as chaiAsPromisedModule from "chai-as-promised"; - -// Match the runtime shim in mocha/setup.ts so bin tests work on Node.js 20 ts-node -// and Node.js 22's strip-only TypeScript loader without enabling esModuleInterop. -type ChaiPlugin = Parameters[0]; - -const chaiAsPromisedExport = chaiAsPromisedModule as ChaiPlugin & { default?: ChaiPlugin }; -const chaiAsPromised = chaiAsPromisedExport.default ?? chaiAsPromisedExport; +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; chai.use(chaiAsPromised); diff --git a/scripts/bin-test/test.ts b/scripts/bin-test/test.ts index cacc0e27c..370c64097 100644 --- a/scripts/bin-test/test.ts +++ b/scripts/bin-test/test.ts @@ -1,7 +1,7 @@ import * as subprocess from "child_process"; import * as path from "path"; import { promisify } from "util"; -import * as fs from "fs/promises"; +import fs from "fs/promises"; import * as os from "os"; import { expect } from "chai"; diff --git a/spec/common/config.spec.ts b/spec/common/config.spec.ts index 004be249a..8dc9fe9da 100644 --- a/spec/common/config.spec.ts +++ b/spec/common/config.spec.ts @@ -21,8 +21,7 @@ // SOFTWARE. import { expect } from "chai"; -import * as fs from "fs"; -import * as process from "process"; +import fs from "fs"; import * as sinon from "sinon"; import { firebaseConfig, resetCache } from "../../src/common/config"; diff --git a/spec/fixtures/mockrequest.ts b/spec/fixtures/mockrequest.ts index c27f8e2cd..28759f94c 100644 --- a/spec/fixtures/mockrequest.ts +++ b/spec/fixtures/mockrequest.ts @@ -1,8 +1,8 @@ import { EventEmitter } from 'node:stream'; -import * as jwt from 'jsonwebtoken'; -import * as jwkToPem from 'jwk-to-pem'; -import * as nock from 'nock'; +import jwt from 'jsonwebtoken'; +import jwkToPem from 'jwk-to-pem'; +import nock from 'nock'; import * as mockJWK from '../fixtures/credential/jwk.json'; import * as mockKey from '../fixtures/credential/key.json'; diff --git a/src/bin/firebase-functions.ts b/src/bin/firebase-functions.ts index 19cee056e..73f1b9caa 100644 --- a/src/bin/firebase-functions.ts +++ b/src/bin/firebase-functions.ts @@ -23,8 +23,8 @@ // SOFTWARE. import * as http from "http"; -import * as express from "express"; -import * as fs from "fs/promises"; +import express from "express"; +import fs from "fs/promises"; import * as path from "path"; import { loadStack } from "../runtime/loader"; import { stackToWire } from "../runtime/manifest"; diff --git a/src/common/config.ts b/src/common/config.ts index ac634f2e7..bf54218ce 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -1,5 +1,5 @@ import { AppOptions } from "firebase-admin/app"; -import { readFileSync } from "fs"; +import fs from "fs"; import * as path from "path"; import * as logger from "../logger"; @@ -29,7 +29,7 @@ export function firebaseConfig(): AppOptions | null { // explicitly state that the user can set the env to a file: // https://firebase.google.com/docs/admin/setup#initialize-without-parameters if (!env.startsWith("{")) { - env = readFileSync(path.join(process.env.PWD, env)).toString("utf8"); + env = fs.readFileSync(path.join(process.env.PWD, env)).toString("utf8"); } cache = JSON.parse(env); diff --git a/src/common/providers/https.ts b/src/common/providers/https.ts index b57f34cb4..46b25e948 100644 --- a/src/common/providers/https.ts +++ b/src/common/providers/https.ts @@ -20,7 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -import * as cors from "cors"; +import cors from "cors"; import * as express from "express"; import { DecodedAppCheckToken } from "firebase-admin/app-check"; diff --git a/src/v2/providers/https.ts b/src/v2/providers/https.ts index ce468611e..eaf56cb94 100644 --- a/src/v2/providers/https.ts +++ b/src/v2/providers/https.ts @@ -25,7 +25,7 @@ * @packageDocumentation */ -import * as cors from "cors"; +import cors from "cors"; import * as express from "express"; import { convertIfPresent, convertInvoker, copyIfPresent } from "../../common/encoding"; import { wrapTraceContext } from "../trace"; diff --git a/tsconfig.release.json b/tsconfig.release.json index e893294f8..e6fd29776 100644 --- a/tsconfig.release.json +++ b/tsconfig.release.json @@ -9,6 +9,7 @@ "stripInternal": true, "target": "es2022", "useDefineForClassFields": false, + "esModuleInterop": true, "typeRoots": ["./node_modules/@types"] }, "files": [