diff --git a/mocha/setup.ts b/mocha/setup.ts index ded201904..d1d81c5a6 100644 --- a/mocha/setup.ts +++ b/mocha/setup.ts @@ -1,6 +1,16 @@ import * as chai from "chai"; -import * as chaiAsPromised from "chai-as-promised"; -import * as nock from "nock"; +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; chai.use(chaiAsPromised); diff --git a/package-lock.json b/package-lock.json index 9c6f62e3e..f865797b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,6 @@ "eslint-plugin-prettier": "^4.0.0", "firebase-admin": "^13.0.0", "genkit": "^1.0.0-rc.4", - "js-yaml": "^3.13.1", "jsdom": "^16.2.1", "jsonwebtoken": "^9.0.0", "jwk-to-pem": "^2.0.5", @@ -60,6 +59,7 @@ "sinon": "^9.2.4", "ts-node": "^10.4.0", "typescript": "^4.3.5", + "yaml": "^2.8.1", "yargs": "^15.3.1" }, "engines": { @@ -8558,6 +8558,19 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", diff --git a/package.json b/package.json index a9ec85b6f..9b1a91b18 100644 --- a/package.json +++ b/package.json @@ -301,7 +301,6 @@ "eslint-plugin-prettier": "^4.0.0", "firebase-admin": "^13.0.0", "genkit": "^1.0.0-rc.4", - "js-yaml": "^3.13.1", "jsdom": "^16.2.1", "jsonwebtoken": "^9.0.0", "jwk-to-pem": "^2.0.5", @@ -317,6 +316,7 @@ "sinon": "^9.2.4", "ts-node": "^10.4.0", "typescript": "^4.3.5", + "yaml": "^2.8.1", "yargs": "^15.3.1" }, "peerDependencies": { diff --git a/scripts/bin-test/mocha-setup.ts b/scripts/bin-test/mocha-setup.ts index 21b3996d1..1fe5d2f95 100644 --- a/scripts/bin-test/mocha-setup.ts +++ b/scripts/bin-test/mocha-setup.ts @@ -1,4 +1,11 @@ import * as chai from "chai"; -import * as chaiAsPromised from "chai-as-promised"; +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; chai.use(chaiAsPromised); diff --git a/scripts/bin-test/test.ts b/scripts/bin-test/test.ts index 616b50fb5..cacc0e27c 100644 --- a/scripts/bin-test/test.ts +++ b/scripts/bin-test/test.ts @@ -5,7 +5,7 @@ import * as fs from "fs/promises"; import * as os from "os"; import { expect } from "chai"; -import * as yaml from "js-yaml"; +import { parse as parseYaml } from "yaml"; import fetch from "node-fetch"; import * as portfinder from "portfinder"; @@ -177,7 +177,7 @@ async function runHttpDiscovery(modulePath: string): Promise { const body = await res.text(); if (res.status === 200) { - const manifest = yaml.load(body) as Record; + const manifest = parseYaml(body) as Record; return { success: true, manifest }; } else { return { success: false, error: body }; diff --git a/spec/common/config.spec.ts b/spec/common/config.spec.ts index 0376c8105..004be249a 100644 --- a/spec/common/config.spec.ts +++ b/spec/common/config.spec.ts @@ -23,23 +23,23 @@ import { expect } from "chai"; import * as fs from "fs"; import * as process from "process"; -import Sinon = require("sinon"); +import * as sinon from "sinon"; import { firebaseConfig, resetCache } from "../../src/common/config"; describe("firebaseConfig()", () => { - let readFileSync: Sinon.SinonStub; - let cwdStub: Sinon.SinonStub; + let readFileSync: sinon.SinonStub; + let cwdStub: sinon.SinonStub; before(() => { - readFileSync = Sinon.stub(fs, "readFileSync"); + readFileSync = sinon.stub(fs, "readFileSync"); readFileSync.throws("Unexpected call"); - cwdStub = Sinon.stub(process, "cwd"); + cwdStub = sinon.stub(process, "cwd"); cwdStub.returns("/srv"); }); after(() => { - Sinon.verifyAndRestore(); + sinon.verifyAndRestore(); }); afterEach(() => { diff --git a/spec/v1/config.spec.ts b/spec/v1/config.spec.ts index 67bd920db..97d7b6faa 100644 --- a/spec/v1/config.spec.ts +++ b/spec/v1/config.spec.ts @@ -23,23 +23,23 @@ import { expect } from "chai"; import * as fs from "fs"; import * as process from "process"; -import Sinon = require("sinon"); +import * as sinon from "sinon"; import { config, resetCache } from "../../src/v1/config"; describe("config()", () => { - let readFileSync: Sinon.SinonStub; - let cwdStub: Sinon.SinonStub; + let readFileSync: sinon.SinonStub; + let cwdStub: sinon.SinonStub; before(() => { - readFileSync = Sinon.stub(fs, "readFileSync"); + readFileSync = sinon.stub(fs, "readFileSync"); readFileSync.throws("Unexpected call"); - cwdStub = Sinon.stub(process, "cwd"); + cwdStub = sinon.stub(process, "cwd"); cwdStub.returns("/srv"); }); after(() => { - Sinon.verifyAndRestore(); + sinon.verifyAndRestore(); }); afterEach(() => {