diff --git a/.github/workflows/check-test.yaml b/.github/workflows/check-test.yaml index 46bc00f3..91e0c636 100644 --- a/.github/workflows/check-test.yaml +++ b/.github/workflows/check-test.yaml @@ -78,9 +78,8 @@ jobs: # Dependencies are included when installing as npm workspaces will # hoist every package in the repo and it's important that the # dependencies of packages we are planning to test are also prepared - npm ci npm run bootstrap-ci -- --scope @mongodb-js/monorepo-tools --stream --include-dependencies - npm run bootstrap-ci -- --stream --since ${SINCE_REF} --include-dependencies + npm run bootstrap-ci -- --stream --include-dependencies # saslprep source code may have been modified by bootstrapping, # depending on the OS, so undo that change if it has happened @@ -99,9 +98,9 @@ jobs: # We exclude dependents when running eslint and depchecks because # linting and dependency checking is relevant only for packages where # the source code was changed - run: npm run check-ci -- --stream --since ${SINCE_REF} --exclude-dependents + run: npm run check-ci -- --stream shell: bash - name: Run Tests - run: npm run test-ci -- --stream --since ${SINCE_REF} + run: npm run test-ci -- --stream shell: bash diff --git a/package-lock.json b/package-lock.json index 766bf5c6..cc4fbe12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6962,6 +6962,16 @@ "integrity": "sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==", "dev": true }, + "node_modules/@types/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", @@ -10106,9 +10116,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -27169,10 +27180,12 @@ "@mongodb-js/prettier-config-devtools": "^1.0.1", "@mongodb-js/tsconfig-devtools": "^1.0.2", "@types/chai": "^4.2.21", + "@types/cross-spawn": "^6.0.6", "@types/mocha": "^9.1.1", "@types/node": "^17.0.35", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", + "cross-spawn": "^7.0.6", "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^8.4.0", @@ -34809,6 +34822,15 @@ "integrity": "sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==", "dev": true }, + "@types/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/debug": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", @@ -37287,9 +37309,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -44461,10 +44483,12 @@ "@mongodb-js/prettier-config-devtools": "^1.0.1", "@mongodb-js/tsconfig-devtools": "^1.0.2", "@types/chai": "^4.2.21", + "@types/cross-spawn": "^6.0.6", "@types/mocha": "^9.1.1", "@types/node": "^17.0.35", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", + "cross-spawn": "^7.0.6", "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^8.4.0", diff --git a/packages/devtools-proxy-support/src/fetch.spec.ts b/packages/devtools-proxy-support/src/fetch.spec.ts index 588b0ab9..3ac54120 100644 --- a/packages/devtools-proxy-support/src/fetch.spec.ts +++ b/packages/devtools-proxy-support/src/fetch.spec.ts @@ -4,6 +4,11 @@ import { HTTPServerProxyTestSetup } from '../test/helpers'; describe('createFetch', function () { it("consistency check: plain `import('node-fetch')` fails", async function () { + if (process.versions.node >= '20.19.0') { + // 'node 20.19.0 has require(esm) enabled by default' + return this.skip(); + } + let failed = false; try { await import('node-fetch'); diff --git a/packages/devtools-proxy-support/src/proxy-options.spec.ts b/packages/devtools-proxy-support/src/proxy-options.spec.ts index 950a0e5f..24074c1a 100644 --- a/packages/devtools-proxy-support/src/proxy-options.spec.ts +++ b/packages/devtools-proxy-support/src/proxy-options.spec.ts @@ -172,7 +172,12 @@ describe('proxy options handling', function () { let setup: HTTPServerProxyTestSetup; before(async function () { - if (process.platform === 'win32' && process.env.CI) { + // TODO: COMPASS-9232 reenable the test on Linux and, ideally, on Windows, after + // investigating the failures. + if ( + (process.platform === 'win32' || process.platform === 'linux') && + process.env.CI + ) { return this.skip(); } setup = new HTTPServerProxyTestSetup(); diff --git a/packages/download-url/package.json b/packages/download-url/package.json index b3086af1..c0e79f17 100644 --- a/packages/download-url/package.json +++ b/packages/download-url/package.json @@ -5,7 +5,7 @@ "scripts": { "bootstrap": "npm run compile", "prepublishOnly": "npm run compile", - "compile": "tsc -p tsconfig.json && gen-esm-wrapper . ./.esm-wrapper.mjs", + "compile": "tsc -p tsconfig.json && gen-esm-wrapper . ./.esm-wrapper.mjs && prettier --write .esm-wrapper.mjs", "typecheck": "tsc --noEmit", "eslint": "eslint", "prettier": "prettier", diff --git a/packages/mongodb-runner/src/mongocluster.spec.ts b/packages/mongodb-runner/src/mongocluster.spec.ts index 24f7eb47..0b764595 100644 --- a/packages/mongodb-runner/src/mongocluster.spec.ts +++ b/packages/mongodb-runner/src/mongocluster.spec.ts @@ -212,9 +212,15 @@ describe('MongoCluster', function () { }); it('can spawn a 6.x enterprise standalone mongod', async function () { - if (process.platform === 'win32' && process.env.CI) { - return this.skip(); // Github Actions CI runners go OOM when extracting the 6.x enterprise tarball... + if ( + (process.platform === 'win32' || process.platform === 'linux') && + process.env.CI + ) { + // Github Actions CI runners go OOM on Windows when extracting the 6.x enterprise tarball... + // On Ubuntu, 6.x only supports up to 22.04, while CI runs on 24.04. + return this.skip(); } + cluster = await MongoCluster.start({ version: '6.x-enterprise', topology: 'standalone', @@ -229,6 +235,21 @@ describe('MongoCluster', function () { expect(ok).to.equal(1); }); + it('can spawn a 8.x enterprise standalone mongod', async function () { + cluster = await MongoCluster.start({ + version: '8.x-enterprise', + topology: 'standalone', + tmpDir, + }); + expect(cluster.connectionString).to.be.a('string'); + expect(cluster.serverVersion).to.match(/^8\./); + expect(cluster.serverVariant).to.equal('enterprise'); + const { ok } = await cluster.withClient(async (client) => { + return await client.db('admin').command({ ping: 1 }); + }); + expect(ok).to.equal(1); + }); + it('can serialize and deserialize sharded cluster info', async function () { cluster = await MongoCluster.start({ version: '6.x', diff --git a/packages/monorepo-tools/src/utils/fixtures/bump-package-1-breaking.json b/packages/monorepo-tools/src/utils/fixtures/bump-package-1-breaking.json index 62599852..2ba95243 100644 --- a/packages/monorepo-tools/src/utils/fixtures/bump-package-1-breaking.json +++ b/packages/monorepo-tools/src/utils/fixtures/bump-package-1-breaking.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "2.0.0" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "2.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "2.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.1" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "2.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "2.0.0" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/bump-package-1-feat.json b/packages/monorepo-tools/src/utils/fixtures/bump-package-1-feat.json index 909593bd..824637b5 100644 --- a/packages/monorepo-tools/src/utils/fixtures/bump-package-1-feat.json +++ b/packages/monorepo-tools/src/utils/fixtures/bump-package-1-feat.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "1.1.0" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.1.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.1.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.1" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.1.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.1.0" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/bump-package-without-deps.json b/packages/monorepo-tools/src/utils/fixtures/bump-package-without-deps.json index e7e046ab..4b315950 100644 --- a/packages/monorepo-tools/src/utils/fixtures/bump-package-without-deps.json +++ b/packages/monorepo-tools/src/utils/fixtures/bump-package-without-deps.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "1.0.0" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.0" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/last-commit-is-bump.json b/packages/monorepo-tools/src/utils/fixtures/last-commit-is-bump.json index 01ba97a3..edbca46d 100644 --- a/packages/monorepo-tools/src/utils/fixtures/last-commit-is-bump.json +++ b/packages/monorepo-tools/src/utils/fixtures/last-commit-is-bump.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "1.0.0" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.0" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/no-bump-commit.json b/packages/monorepo-tools/src/utils/fixtures/no-bump-commit.json index 137e4fef..b4f3fd64 100644 --- a/packages/monorepo-tools/src/utils/fixtures/no-bump-commit.json +++ b/packages/monorepo-tools/src/utils/fixtures/no-bump-commit.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "1.0.1" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.1" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.1" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.1" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.1" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.1" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/preserve-caret.json b/packages/monorepo-tools/src/utils/fixtures/preserve-caret.json index 7341c757..cfc247d0 100644 --- a/packages/monorepo-tools/src/utils/fixtures/preserve-caret.json +++ b/packages/monorepo-tools/src/utils/fixtures/preserve-caret.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -117,47 +117,6 @@ "package6": "^1.0.1" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.0" - } - }, - "package7": { - "version": "file:packages/package7", - "requires": { - "package6": "^1.0.1" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/preserve-star.json b/packages/monorepo-tools/src/utils/fixtures/preserve-star.json index e3b5b6e3..5e5fc0f6 100644 --- a/packages/monorepo-tools/src/utils/fixtures/preserve-star.json +++ b/packages/monorepo-tools/src/utils/fixtures/preserve-star.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -117,47 +117,6 @@ "package6": "*" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.0" - } - }, - "package7": { - "version": "file:packages/package7", - "requires": { - "package6": "*" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/preserve-tilde.json b/packages/monorepo-tools/src/utils/fixtures/preserve-tilde.json index f61cd98d..b34794b6 100644 --- a/packages/monorepo-tools/src/utils/fixtures/preserve-tilde.json +++ b/packages/monorepo-tools/src/utils/fixtures/preserve-tilde.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -117,47 +117,6 @@ "package6": "~1.0.1" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.0" - } - }, - "package7": { - "version": "file:packages/package7", - "requires": { - "package6": "~1.0.1" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/skip-packages-keep-unskipped.json b/packages/monorepo-tools/src/utils/fixtures/skip-packages-keep-unskipped.json index e7e046ab..4b315950 100644 --- a/packages/monorepo-tools/src/utils/fixtures/skip-packages-keep-unskipped.json +++ b/packages/monorepo-tools/src/utils/fixtures/skip-packages-keep-unskipped.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "1.0.0" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.0" - } - } } } } diff --git a/packages/monorepo-tools/src/utils/fixtures/skip-packages.json b/packages/monorepo-tools/src/utils/fixtures/skip-packages.json index 775b976c..5a63e84d 100644 --- a/packages/monorepo-tools/src/utils/fixtures/skip-packages.json +++ b/packages/monorepo-tools/src/utils/fixtures/skip-packages.json @@ -42,7 +42,7 @@ "lock": { "name": "test-repo", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -107,41 +107,6 @@ "package5": "1.0.1" } } - }, - "dependencies": { - "package1": { - "version": "file:packages/package1" - }, - "package2": { - "version": "file:packages/package2", - "requires": { - "package1": "1.0.0" - } - }, - "package3": { - "version": "file:packages/package3", - "requires": { - "package1": "1.0.0" - } - }, - "package4": { - "version": "file:packages/package4", - "requires": { - "package3": "1.0.0" - } - }, - "package5": { - "version": "file:packages/package5", - "requires": { - "package1": "1.0.0" - } - }, - "package6": { - "version": "file:packages/package6", - "requires": { - "package5": "1.0.1" - } - } } } } diff --git a/packages/node-webpack-startup-snapshot-checker/package.json b/packages/node-webpack-startup-snapshot-checker/package.json index 17dd8325..81e23186 100644 --- a/packages/node-webpack-startup-snapshot-checker/package.json +++ b/packages/node-webpack-startup-snapshot-checker/package.json @@ -57,10 +57,12 @@ "@mongodb-js/prettier-config-devtools": "^1.0.1", "@mongodb-js/tsconfig-devtools": "^1.0.2", "@types/chai": "^4.2.21", + "@types/cross-spawn": "^6.0.6", "@types/mocha": "^9.1.1", "@types/node": "^17.0.35", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", + "cross-spawn": "^7.0.6", "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^8.4.0", diff --git a/packages/node-webpack-startup-snapshot-checker/src/index.spec.ts b/packages/node-webpack-startup-snapshot-checker/src/index.spec.ts index 49c59e22..5e00bc82 100644 --- a/packages/node-webpack-startup-snapshot-checker/src/index.spec.ts +++ b/packages/node-webpack-startup-snapshot-checker/src/index.spec.ts @@ -1,11 +1,36 @@ -/* eslint-disable no-console */ -import { execFile as execFileCallback } from 'child_process'; -import { promisify } from 'util'; +import { spawn } from 'cross-spawn'; import path from 'path'; import { expect } from 'chai'; -const execFile = promisify(execFileCallback); describe('startup snapshot checker', function () { + const execFile = ( + command: string, + args: ReadonlyArray + ): Promise => { + const proc = spawn(command, args); + return new Promise((resolve, reject) => { + proc.stderr.setEncoding('utf8'); + let errBuffer = ''; + proc.stderr.on('data', (data) => { + errBuffer += data; + }); + + proc.once('exit', (code, signal) => { + let err: Error; + if (signal) { + err = new Error(`Failed with signal ${signal}`); + } else if (code !== null && code !== 0) { + err = new Error(`Failed with code ${code}`); + } else { + return resolve(); + } + + err.message += '\n' + errBuffer; + reject(err); + }); + }); + }; + it('can detect when a package is simple enough to be snapshotted', async function () { await execFile('npx', [ 'ts-node', @@ -13,6 +38,7 @@ describe('startup snapshot checker', function () { path.resolve(__dirname, '..', 'test', 'fixtures', 'snapshottable.js'), ]); }); + it('can detect when a package is too complex to be snapshotted', async function () { try { await execFile('npx', [ @@ -20,6 +46,7 @@ describe('startup snapshot checker', function () { path.resolve(__dirname, 'index.ts'), path.resolve(__dirname, '..', 'test', 'fixtures', 'unsnapshottable.js'), ]); + expect.fail('missed exception'); } catch (err) { expect(err).to.match(/Command failed/); diff --git a/packages/saslprep/src/code-points-data.ts b/packages/saslprep/src/code-points-data.ts index 2531a91f..d4ffff23 100644 --- a/packages/saslprep/src/code-points-data.ts +++ b/packages/saslprep/src/code-points-data.ts @@ -2,7 +2,7 @@ import { gunzipSync } from 'zlib'; export default gunzipSync( Buffer.from( - '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', 'base64' ) ); diff --git a/packages/shell-bson-parser/src/index.spec.ts b/packages/shell-bson-parser/src/index.spec.ts index 8ce6acdd..d6fc5ed8 100644 --- a/packages/shell-bson-parser/src/index.spec.ts +++ b/packages/shell-bson-parser/src/index.spec.ts @@ -448,51 +448,162 @@ describe('@mongodb-js/shell-bson-parser', function () { toISOString: (${newDate}).toISOString(), valueOf: (${newDate}.valueOf()), }`; - expect(parse(input, options)).to.deep.equal({ - getDate: new (Date as any)(...args).getDate(), - getDay: new (Date as any)(...args).getDay(), - getFullYear: new (Date as any)(...args).getFullYear(), - getHours: new (Date as any)(...args).getHours(), - getMilliseconds: new (Date as any)(...args).getMilliseconds(), - getMinutes: new (Date as any)(...args).getMinutes(), - getMonth: new (Date as any)(...args).getMonth(), - getSeconds: new (Date as any)(...args).getSeconds(), - getTime: new (Date as any)(...args).getTime(), - getTimezoneOffset: new (Date as any)( - ...args - ).getTimezoneOffset(), - getUTCDate: new (Date as any)(...args).getUTCDate(), - getUTCDay: new (Date as any)(...args).getUTCDay(), - getUTCFullYear: new (Date as any)(...args).getUTCFullYear(), - getUTCHours: new (Date as any)(...args).getUTCHours(), - getUTCMilliseconds: new (Date as any)( - ...args - ).getUTCMilliseconds(), - getUTCMinutes: new (Date as any)(...args).getUTCMinutes(), - getUTCMonth: new (Date as any)(...args).getUTCMonth(), - getUTCSeconds: new (Date as any)(...args).getUTCSeconds(), - getYear: new (Date as any)(...args).getYear(), // getYear is deprecated - setDate: new (Date as any)(...args).setDate(24), - setFullYear: new (Date as any)(...args).setFullYear(2010), - setHours: new (Date as any)(...args).setHours(23), - setMilliseconds: new (Date as any)(...args).setMilliseconds(1), - setMinutes: new (Date as any)(...args).setMinutes(1), - setMonth: new (Date as any)(...args).setMonth(1), - setSeconds: new (Date as any)(...args).setSeconds(59), - setTime: new (Date as any)(...args).setTime(10), - setUTCDate: new (Date as any)(...args).setUTCDate(24), - setUTCFullYear: new (Date as any)(...args).setUTCFullYear(2010), - setUTCHours: new (Date as any)(...args).setUTCHours(23), - setUTCMilliseconds: new (Date as any)( - ...args - ).setUTCMilliseconds(1), - setUTCMinutes: new (Date as any)(...args).setUTCMinutes(1), - setUTCMonth: new (Date as any)(...args).setUTCMonth(1), - setUTCSeconds: new (Date as any)(...args).setUTCSeconds(59), - setYear: new (Date as any)(...args).setYear(96), // setYear is deprecated - toISOString: new (Date as any)(...args).toISOString(), - valueOf: new (Date as any)(...args).valueOf(), - }); + + const actual = parse(input, options); + + // When constructing a date with no arguments, it will be set to the current date, + // which is prone to race conditions for millisecond precision. + const allowedMillisecondDelta = args.length === 0 ? 2 : 0; + + expect(actual.getDate).to.equal( + new (Date as any)(...args).getDate() + ); + expect(actual.getDay).to.equal( + new (Date as any)(...args).getDay() + ); + expect(actual.getFullYear).to.equal( + new (Date as any)(...args).getFullYear() + ); + expect(actual.getHours).to.equal( + new (Date as any)(...args).getHours() + ); + expect(actual.getMilliseconds).to.be.approximately( + new (Date as any)(...args).getMilliseconds(), + allowedMillisecondDelta + ); + expect(actual.getMinutes).to.equal( + new (Date as any)(...args).getMinutes() + ); + expect(actual.getMonth).to.equal( + new (Date as any)(...args).getMonth() + ); + expect(actual.getSeconds).to.equal( + new (Date as any)(...args).getSeconds() + ); + expect(actual.getTime).to.be.approximately( + new (Date as any)(...args).getTime(), + allowedMillisecondDelta + ); + expect(actual.getTimezoneOffset).to.equal( + new (Date as any)(...args).getTimezoneOffset() + ); + expect(actual.getUTCDate).to.equal( + new (Date as any)(...args).getUTCDate() + ); + expect(actual.getUTCDay).to.equal( + new (Date as any)(...args).getUTCDay() + ); + expect(actual.getUTCFullYear).to.equal( + new (Date as any)(...args).getUTCFullYear() + ); + expect(actual.getUTCHours).to.equal( + new (Date as any)(...args).getUTCHours() + ); + expect(actual.getUTCMilliseconds).to.be.approximately( + new (Date as any)(...args).getUTCMilliseconds(), + allowedMillisecondDelta + ); + expect(actual.getUTCMinutes).to.equal( + new (Date as any)(...args).getUTCMinutes() + ); + expect(actual.getUTCMonth).to.equal( + new (Date as any)(...args).getUTCMonth() + ); + expect(actual.getUTCSeconds).to.equal( + new (Date as any)(...args).getUTCSeconds() + ); + expect(actual.getYear).to.equal( + new (Date as any)(...args).getYear() + ); // getYear is deprecated + expect(actual.setDate).to.be.approximately( + new (Date as any)(...args).setDate(24), + allowedMillisecondDelta + ); + expect(actual.setFullYear).to.be.approximately( + new (Date as any)(...args).setFullYear(2010), + allowedMillisecondDelta + ); + expect(actual.setHours).to.be.approximately( + new (Date as any)(...args).setHours(23), + allowedMillisecondDelta + ); + expect(actual.setMilliseconds).to.be.approximately( + new (Date as any)(...args).setMilliseconds(1), + allowedMillisecondDelta + ); + expect(actual.setMinutes).to.be.approximately( + new (Date as any)(...args).setMinutes(1), + allowedMillisecondDelta + ); + expect(actual.setMonth).to.be.approximately( + new (Date as any)(...args).setMonth(1), + allowedMillisecondDelta + ); + expect(actual.setSeconds).to.be.approximately( + new (Date as any)(...args).setSeconds(59), + allowedMillisecondDelta + ); + expect(actual.setTime).to.be.approximately( + new (Date as any)(...args).setTime(10), + allowedMillisecondDelta + ); + expect(actual.setUTCDate).to.be.approximately( + new (Date as any)(...args).setUTCDate(24), + allowedMillisecondDelta + ); + expect(actual.setUTCFullYear).to.be.approximately( + new (Date as any)(...args).setUTCFullYear(2010), + allowedMillisecondDelta + ); + expect(actual.setUTCHours).to.be.approximately( + new (Date as any)(...args).setUTCHours(23), + allowedMillisecondDelta + ); + expect(actual.setUTCMilliseconds).to.be.approximately( + new (Date as any)(...args).setUTCMilliseconds(1), + allowedMillisecondDelta + ); + expect(actual.setUTCMinutes).to.be.approximately( + new (Date as any)(...args).setUTCMinutes(1), + allowedMillisecondDelta + ); + expect(actual.setUTCMonth).to.be.approximately( + new (Date as any)(...args).setUTCMonth(1), + allowedMillisecondDelta + ); + expect(actual.setUTCSeconds).to.be.approximately( + new (Date as any)(...args).setUTCSeconds(59), + allowedMillisecondDelta + ); + expect(actual.setYear).to.be.approximately( + new (Date as any)(...args).setYear(96), + allowedMillisecondDelta + ); // setYear is deprecated + expect(actual.valueOf).to.be.approximately( + new (Date as any)(...args).valueOf(), + allowedMillisecondDelta + ); + + const isoRegex = /^([^.]*\.)([\d]*)(Z)$/; + const actualMatch = isoRegex.exec(actual.toISOString); + const expectedMatch = isoRegex.exec( + new (Date as any)(...args).toISOString() + ); + + expect(actualMatch?.length).to.equal(4); + expect(expectedMatch?.length).to.equal(4); + + // Date group - 1970-01-01T00:00:00. + expect(actualMatch![1]).to.equal(expectedMatch![1]); + + // Millisecond group + expect(Number.parseInt(actualMatch![2])).to.be.approximately( + Number.parseInt(expectedMatch![2]), + allowedMillisecondDelta + ); + + // Z + expect(actualMatch![3]).to.equal(expectedMatch![3]); }); it('should prevent invalid functions', function () {