diff --git a/package-lock.json b/package-lock.json index 75db4bb660..d15b01cca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,9 +27,11 @@ "markdownlint-cli2": "0.13.0", "minimatch": "^9.0.3", "mocha": "^11.0.0", + "npm-package-arg": "^13.0.0", "prettier": "2.8.8", "process": "0.11.10", "semver": "^7.6.0", + "test-all-versions": "^6.0.0", "ts-node": "10.9.2", "typescript": "5.0.4", "util": "0.12.5" @@ -7755,6 +7757,22 @@ } } }, + "node_modules/@lerna/create/node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@lerna/create/node_modules/rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -8382,6 +8400,22 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, + "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@npmcli/fs": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", @@ -20022,6 +20056,22 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/init-package-json/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -22806,6 +22856,22 @@ } } }, + "node_modules/lerna/node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/lerna/node_modules/rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -22903,6 +22969,22 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/libnpmaccess/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/libnpmpublish": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz", @@ -22937,6 +23019,22 @@ "node": ">=8" } }, + "node_modules/libnpmpublish/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/light-my-request": { "version": "5.14.0", "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.14.0.tgz", @@ -25513,18 +25611,62 @@ } }, "node_modules/npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", "dev": true, + "license": "ISC", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", + "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm-package-arg/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-package-versions": { @@ -25560,6 +25702,22 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm-registry-fetch": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", @@ -25628,6 +25786,22 @@ "node": ">= 0.6" } }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -26570,6 +26744,22 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/pad-right": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", @@ -43292,6 +43482,18 @@ "whatwg-url": "^5.0.0" } }, + "npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, "rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -43760,6 +43962,18 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true + }, + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } } } }, @@ -55651,6 +55865,20 @@ "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^5.0.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + } } }, "inquirer": { @@ -57706,6 +57934,18 @@ "whatwg-url": "^5.0.0" } }, + "npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, "rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -57829,6 +58069,20 @@ "requires": { "npm-package-arg": "^11.0.2", "npm-registry-fetch": "^17.0.1" + }, + "dependencies": { + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + } } }, "libnpmpublish": { @@ -57852,6 +58106,18 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "dev": true + }, + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } } } }, @@ -59893,15 +60159,44 @@ "dev": true }, "npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", "dev": true, "requires": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", + "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "dev": true, + "requires": { + "lru-cache": "^11.1.0" + } + }, + "lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true + }, + "proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true + }, + "validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "dev": true + } } }, "npm-package-versions": { @@ -59929,6 +60224,20 @@ "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^11.0.0", "semver": "^7.3.5" + }, + "dependencies": { + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + } } }, "npm-registry-fetch": { @@ -59984,6 +60293,18 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true + }, + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } } } }, @@ -60689,6 +61010,20 @@ "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" + }, + "dependencies": { + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + } } }, "pad-right": { diff --git a/package.json b/package.json index f80f605033..aff042e681 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "test:ci:affected": "nx affected -t test", "test:browser": "nx run-many -t test:browser", "test:browser:ci:affected": "nx affected -t test:browser", - "test-all-versions": "npm run --if-present test-all-versions --workspaces", - "test-all-versions:ci:affected": "npm run list:affected | tail -n +5 | xargs -I {} -t npm run --if-present test-all-versions -w {}", + "test-all-versions": "nx run-many -t test-all-versions", + "test-all-versions:ci:affected": "nx affected -t test-all-versions", "test-merge-coverage:ci:affected": "nx affected -t test-merge-coverage", "test-services:start": "docker compose -f ./test/docker-compose.yaml up -d --wait", "test-services:stop": "docker compose -f ./test/docker-compose.yaml down", @@ -63,9 +63,11 @@ "markdownlint-cli2": "0.13.0", "minimatch": "^9.0.3", "mocha": "^11.0.0", + "npm-package-arg": "^13.0.0", "prettier": "2.8.8", "process": "0.11.10", "semver": "^7.6.0", + "test-all-versions": "^6.0.0", "ts-node": "10.9.2", "typescript": "5.0.4", "util": "0.12.5" diff --git a/packages/instrumentation-amqplib/package.json b/packages/instrumentation-amqplib/package.json index b54bdf866c..d7b5c96517 100644 --- a/packages/instrumentation-amqplib/package.json +++ b/packages/instrumentation-amqplib/package.json @@ -40,7 +40,7 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/**/*.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start rabbitmq", diff --git a/packages/instrumentation-aws-sdk/package.json b/packages/instrumentation-aws-sdk/package.json index 9c962d6929..cd205457e7 100644 --- a/packages/instrumentation-aws-sdk/package.json +++ b/packages/instrumentation-aws-sdk/package.json @@ -40,7 +40,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-bunyan/package.json b/packages/instrumentation-bunyan/package.json index 781d71d5cf..d7345e2433 100644 --- a/packages/instrumentation-bunyan/package.json +++ b/packages/instrumentation-bunyan/package.json @@ -18,7 +18,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-cucumber/package.json b/packages/instrumentation-cucumber/package.json index 2e2e037cfc..b9f365ce82 100644 --- a/packages/instrumentation-cucumber/package.json +++ b/packages/instrumentation-cucumber/package.json @@ -11,7 +11,7 @@ }, "scripts": { "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "tdd": "npm run test -- --watch-extensions ts --watch", "clean": "rimraf build/*", diff --git a/packages/instrumentation-dataloader/package.json b/packages/instrumentation-dataloader/package.json index 53db1960fe..08b35d4074 100644 --- a/packages/instrumentation-dataloader/package.json +++ b/packages/instrumentation-dataloader/package.json @@ -18,7 +18,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-express/package.json b/packages/instrumentation-express/package.json index 40e359c9ae..69d45f0811 100644 --- a/packages/instrumentation-express/package.json +++ b/packages/instrumentation-express/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "yarn test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-fastify/.tav.yml b/packages/instrumentation-fastify/.tav.yml index 608eb2dbf8..a6622a0fb8 100644 --- a/packages/instrumentation-fastify/.tav.yml +++ b/packages/instrumentation-fastify/.tav.yml @@ -3,6 +3,7 @@ include: "^4.0.0" mode: max-7 commands: npm run test + peerDependencies: "@fastify/express@3.0.0" - versions: include: ">=5 <6" mode: max-7 diff --git a/packages/instrumentation-fastify/package.json b/packages/instrumentation-fastify/package.json index a58d15322b..0157e3549b 100644 --- a/packages/instrumentation-fastify/package.json +++ b/packages/instrumentation-fastify/package.json @@ -18,7 +18,7 @@ "lint:readme": "node ../../scripts/lint-readme.js", "prepublishOnly": "npm run compile", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-graphql/package.json b/packages/instrumentation-graphql/package.json index 6b4574b997..bc69a9bb66 100644 --- a/packages/instrumentation-graphql/package.json +++ b/packages/instrumentation-graphql/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-hapi/package.json b/packages/instrumentation-hapi/package.json index 99011b6344..3ba3249149 100644 --- a/packages/instrumentation-hapi/package.json +++ b/packages/instrumentation-hapi/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-ioredis/package.json b/packages/instrumentation-ioredis/package.json index a10249a933..dfffe1e8d4 100644 --- a/packages/instrumentation-ioredis/package.json +++ b/packages/instrumentation-ioredis/package.json @@ -18,7 +18,7 @@ "lint:readme": "node ../../scripts/lint-readme.js", "prepublishOnly": "npm run compile", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "tdd": "npm run test -- --watch-extensions ts --watch", "test:debug": "cross-env RUN_REDIS_TESTS=true mocha --inspect-brk --no-timeouts 'test/**/*.test.ts'", diff --git a/packages/instrumentation-kafkajs/package.json b/packages/instrumentation-kafkajs/package.json index c29c9a010a..52864032b1 100644 --- a/packages/instrumentation-kafkajs/package.json +++ b/packages/instrumentation-kafkajs/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require @opentelemetry/contrib-test-utils 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-koa/package.json b/packages/instrumentation-koa/package.json index 527378b68c..1940ff79e8 100644 --- a/packages/instrumentation-koa/package.json +++ b/packages/instrumentation-koa/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-lru-memoizer/package.json b/packages/instrumentation-lru-memoizer/package.json index 65542de94c..498f20c70b 100644 --- a/packages/instrumentation-lru-memoizer/package.json +++ b/packages/instrumentation-lru-memoizer/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-mongodb/package.json b/packages/instrumentation-mongodb/package.json index 15926e036b..e5b9b9335b 100644 --- a/packages/instrumentation-mongodb/package.json +++ b/packages/instrumentation-mongodb/package.json @@ -24,7 +24,7 @@ "test-v4": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/mongodb-v4-v5-v6.metrics.test.ts' 'test/**/mongodb-v4.test.ts'", "test-v5-v6": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/mongodb-v4-v5-v6.metrics.test.ts' 'test/**/mongodb-v5-v6.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start mongodb", diff --git a/packages/instrumentation-mongoose/package.json b/packages/instrumentation-mongoose/package.json index 999506ae3f..9201184979 100644 --- a/packages/instrumentation-mongoose/package.json +++ b/packages/instrumentation-mongoose/package.json @@ -22,7 +22,7 @@ "test-v5-v6": "nyc mocha --require '@opentelemetry/contrib-test-utils' 'test/mongoose-common.test.ts' 'test/**/mongoose-v5-v6.test.ts'", "test-v7-v8": "nyc mocha --require '@opentelemetry/contrib-test-utils' 'test/mongoose-common.test.ts' 'test/**/mongoose-v7-v8.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start mongodb", diff --git a/packages/instrumentation-mysql2/package.json b/packages/instrumentation-mysql2/package.json index 68319b9dbd..8402b1cc84 100644 --- a/packages/instrumentation-mysql2/package.json +++ b/packages/instrumentation-mysql2/package.json @@ -19,7 +19,7 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start mysql", diff --git a/packages/instrumentation-nestjs-core/package.json b/packages/instrumentation-nestjs-core/package.json index c2e1317266..ab46754c88 100644 --- a/packages/instrumentation-nestjs-core/package.json +++ b/packages/instrumentation-nestjs-core/package.json @@ -20,7 +20,7 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "test": "npm run test-required-node-version && nyc --no-clean mocha --timeout 5000 'test/**/*.test.ts' || echo 'Node version is not supported for testing'", "test-required-node-version": "node -e \"process.exit(parseInt(process.versions.node.split('.')[0], 10) >= 15 ? 0 : 1)\"", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-openai/package.json b/packages/instrumentation-openai/package.json index ccc0625e60..87189c9671 100644 --- a/packages/instrumentation-openai/package.json +++ b/packages/instrumentation-openai/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-oracledb/package.json b/packages/instrumentation-oracledb/package.json index 3f0dfe223f..a837265a99 100644 --- a/packages/instrumentation-oracledb/package.json +++ b/packages/instrumentation-oracledb/package.json @@ -22,7 +22,7 @@ "test": "nyc --no-clean mocha 'test/**/*.test.ts'", "test:debug": "mocha --inspect-brk --no-timeouts 'test/**/*.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start oracledb", diff --git a/packages/instrumentation-pg/package.json b/packages/instrumentation-pg/package.json index 850a5e3636..72f53cae6b 100644 --- a/packages/instrumentation-pg/package.json +++ b/packages/instrumentation-pg/package.json @@ -21,7 +21,7 @@ "test": "nyc --no-clean mocha 'test/**/*.test.ts'", "test:debug": "mocha --inspect-brk --no-timeouts 'test/**/*.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start postgres", diff --git a/packages/instrumentation-pino/package.json b/packages/instrumentation-pino/package.json index 708226840c..e0af348b39 100644 --- a/packages/instrumentation-pino/package.json +++ b/packages/instrumentation-pino/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-redis/package.json b/packages/instrumentation-redis/package.json index 5e4e0ff7b3..b9597e500e 100644 --- a/packages/instrumentation-redis/package.json +++ b/packages/instrumentation-redis/package.json @@ -22,7 +22,7 @@ "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/v4-v5/*.test.ts' 'test/*.test.ts'", "test:debug": "cross-env RUN_REDIS_TESTS=true mocha --inspect-brk --no-timeouts 'test/**/*.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start redis", diff --git a/packages/instrumentation-restify/package.json b/packages/instrumentation-restify/package.json index 60a81eca37..e3152a41c2 100644 --- a/packages/instrumentation-restify/package.json +++ b/packages/instrumentation-restify/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm test -- --watch-extensions ts --watch", "test": "SKIP_TEST_IF_NODE_NEWER_THAN=23 nyc --no-clean mocha --require '../../scripts/skip-test-if.js' 'test/**/*.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-socket.io/package.json b/packages/instrumentation-socket.io/package.json index e8025974fa..1e48a89ecf 100644 --- a/packages/instrumentation-socket.io/package.json +++ b/packages/instrumentation-socket.io/package.json @@ -19,7 +19,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/packages/instrumentation-tedious/package.json b/packages/instrumentation-tedious/package.json index 49d0472e29..53618ab827 100644 --- a/packages/instrumentation-tedious/package.json +++ b/packages/instrumentation-tedious/package.json @@ -19,7 +19,7 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", "test:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm test", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-all-versions:with-services-env": "cross-env NODE_OPTIONS='-r dotenv/config' DOTENV_CONFIG_PATH=../../test/test-services.env npm run test-all-versions", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "test-services:start": "cd ../.. && npm run test-services:start mssql", diff --git a/packages/instrumentation-typeorm/.gitignore b/packages/instrumentation-typeorm/.gitignore new file mode 100644 index 0000000000..58949fd6d6 --- /dev/null +++ b/packages/instrumentation-typeorm/.gitignore @@ -0,0 +1 @@ +connection2.db diff --git a/packages/instrumentation-typeorm/package.json b/packages/instrumentation-typeorm/package.json index 5f71f902ae..bdd95d16dc 100644 --- a/packages/instrumentation-typeorm/package.json +++ b/packages/instrumentation-typeorm/package.json @@ -21,7 +21,7 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha --require '@opentelemetry/contrib-test-utils' 'test/**/*.test.ts'", "test:debug": "mocha --inspect-brk --no-timeouts 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-undici/package.json b/packages/instrumentation-undici/package.json index 46ed017318..22fdaba56c 100644 --- a/packages/instrumentation-undici/package.json +++ b/packages/instrumentation-undici/package.json @@ -18,7 +18,7 @@ "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc --no-clean mocha test/**/*.test.ts", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js", "watch": "tsc -w" diff --git a/packages/instrumentation-undici/test/utils/assertSpan.ts b/packages/instrumentation-undici/test/utils/assertSpan.ts index c5d584dd46..666333aa24 100644 --- a/packages/instrumentation-undici/test/utils/assertSpan.ts +++ b/packages/instrumentation-undici/test/utils/assertSpan.ts @@ -101,7 +101,7 @@ export const assertSpan = ( assert.strictEqual(span.events.length, 0, 'span contains no events'); } - // Error message changes between version se we will + // Error message changes between version so we will // only assert its presence if (validations.forceStatus) { assert.equal( diff --git a/packages/instrumentation-winston/package.json b/packages/instrumentation-winston/package.json index 30c940ef05..3d23e6d178 100644 --- a/packages/instrumentation-winston/package.json +++ b/packages/instrumentation-winston/package.json @@ -18,7 +18,7 @@ "lint:readme": "node ../../scripts/lint-readme.js", "prepublishOnly": "npm run compile", "test": "nyc --no-clean mocha 'test/**/*.test.ts'", - "test-all-versions": "tav", + "test-all-versions": "../../test-all-versions.js", "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", "version:update": "node ../../scripts/version-update.js" }, diff --git a/test-all-versions.js b/test-all-versions.js new file mode 100755 index 0000000000..33384fc0a9 --- /dev/null +++ b/test-all-versions.js @@ -0,0 +1,645 @@ +#!/usr/bin/env node +'use strict'; + +const { exec, execSync } = require('child_process'); +const fs = require('fs'); +const os = require('os'); +const util = require('util'); +const https = require('https'); +const isCI = require('is-ci'); +const yaml = require('js-yaml'); +const once = require('once'); +const merge = require('deepmerge'); +const pkgVersions = require('npm-package-versions'); +const parseEnvString = require('parse-env-string'); +const semver = require('semver'); +const afterAll = require('after-all-results'); +const resolve = require('resolve'); +const importFresh = require('import-fresh'); +const install = require('spawn-npm-install'); +const differ = require('ansi-diff-stream'); +const cliSpinners = require('cli-spinners'); +const which = require('which'); +const path = require('path'); +const npa = require('npm-package-arg'); +const argv = require('minimist')(process.argv.slice(2)); + +const npm5plus = semver.gte( + execSync('npm -v', { encoding: 'utf-8' }).trim(), + '5.0.0' +); + +// in case npm ever gets installed as a dependency, make sure we always access +// it from it's original location +const npmCmd = which.sync(process.platform === 'win32' ? 'npm.cmd' : 'npm'); + +process.env.PATH = + 'node_modules' + require('path').sep + '.bin:' + process.env.PATH; + +if (argv.help || argv.h) { + console.log('Usage: tav [options] [ [args...]]'); + console.log(); + console.log('Options:'); + console.log(' -h, --help show this help'); + console.log(' -v, --version show the tav version and exit'); + console.log( + " -q, --quiet don't output stdout from tests unless an error occurs" + ); + console.log( + ' --registry= use a custom registry (e.g. --registry=https://registry.example.com)' + ); + console.log(' --verbose output a lot of information while running'); + console.log(' --dry-run do a dry-run (no tests will be executed)'); + console.log( + ' --compat output just module version compatibility - no errors' + ); + console.log( + ' --ci only run on CI servers when using .tav.yml file' + ); + process.exit(); +} else if (argv.version || argv.v) { + console.log('tav ' + require('./package.json').version); + process.exit(); +} + +const tests = argv._.length === 0 ? getConfFromFile() : getConfFromArgs(); + +let log, verbose, spinner, logSymbols, diff; +if (argv.compat) { + logSymbols = require('log-symbols'); + // "hack" to make the spinner spin more + log = verbose = function () { + spinner && spinner(); + }; + diff = differ(); + diff.pipe(process.stdout); +} else { + verbose = argv.verbose ? console.log.bind(console) : function () {}; + log = console.log.bind(console); +} + +runTests(); + +function getConfFromFile() { + return normalizeConf(loadYaml()); +} + +function getConfFromArgs() { + return normalizeConf({ + [argv._.shift()]: { + // module name + versions: argv._.shift(), // module semver + commands: argv._.join(' '), // test command + }, + }); +} + +function loadYaml() { + return yaml.load(fs.readFileSync('.tav.yml').toString()); +} + +function normalizeConf(conf) { + const whitelist = process.env.TAV?.split(','); + + return flatten( + Object.keys(conf) + .filter(function (name) { + // Only run selected test if TAV environment variable is used + return whitelist ? whitelist.indexOf(name) !== -1 : true; + }) + .map(function (name) { + const moduleConf = conf[name]; + const normalized = { name, env: moduleConf.jobs && moduleConf.env }; + normalized.jobs = moduleConf.jobs || toArray(moduleConf); + return normalized; + }) + .map(function ({ name, env: globalEnv, jobs }) { + return flatten( + jobs + .filter( + job => !job.node || semver.satisfies(process.version, job.node) + ) + .map(job => { + if (!job.versions) + throw new Error(`Missing "versions" property for ${name}`); + + job.name = name; + job.commands = toArray(job.commands); + job.peerDependencies = toArray(job.peerDependencies); + + return mergeEnvMatrix(globalEnv, job.env).map(env => { + job.env = parseEnvString(env); + return merge({}, job); + }); + }) + ); + }) + ); +} + +function mergeEnvMatrix(globalEnv, localEnv) { + globalEnv = toArray(globalEnv); + if (globalEnv.length === 0) globalEnv.push(''); + localEnv = toArray(localEnv); + if (localEnv.length === 0) localEnv.push(''); + + const env = []; + + for (const e1 of globalEnv) { + for (const e2 of localEnv) { + env.push(e1 + ' ' + e2); + } + } + + return env; +} + +function runTests(err) { + if (argv.ci && !isCI) return; + if (err || tests.length === 0) return done(err); + test(tests.pop(), runTests); +} + +function test(opts, cb) { + verbose('-- preparing test', opts); + + if (argv.compat) console.log('Testing compatibility with %s:', opts.name); + + pkgVersions( + opts.name, + // argv.registry || opts.registry, + function (err, versions) { + if (err) return cb(err); + + verbose( + '-- %d available package versions:', + versions.length, + versions.join(', ') + ); + verbose( + '-- applying version filter to available packages:', + opts.versions + ); + + filterVersions(opts, versions, (err, versions) => { + if (err) return cb(err); + + verbose( + '-- %d package versions matching filter:', + versions.length, + versions.join(', ') + ); + + if (versions.length === 0) { + cb( + new Error( + `No versions of ${opts.name} matching filter: ${opts.versions}` + ) + ); + return; + } + + run(); + + function run(err) { + if (err || versions.length === 0) return cb(err); + const version = versions.pop(); + if (argv.compat) spinner = getSpinner(version)(); + testVersion(opts, version, function (err) { + if (argv.compat) { + spinner.done(!err); + run(); + } else { + run(err); + } + }); + } + }); + } + ); +} + +function testVersion(test, version, cb) { + let cmdIndex = 0; + + preinstall(function (err) { + if (err) return cb(err); + const packages = [...test.peerDependencies, `${test.name}@${version}`]; + ensurePackages(packages, test.registry, runNextCmd); + }); + + function runNextCmd(err) { + if (err || cmdIndex === test.commands.length) return cb(err); + + pretest(function (err) { + if (err) return cb(err); + + testCmd( + test.name, + version, + test.commands[cmdIndex++], + test.env, + function (code) { + if (code !== 0) { + const err = new Error(`Test exited with code ${code}`); + err.exitCode = code; + return cb(err); + } + posttest(runNextCmd); + } + ); + }); + } + + function preinstall(cb) { + if (!test.preinstall) return process.nextTick(cb); + log('-- running preinstall "%s" for %s', test.preinstall, test.name); + execute(test.preinstall, test.name, cb); + } + + function pretest(cb) { + if (!test.pretest) return process.nextTick(cb); + log('-- running pretest "%s" for %s', test.pretest, test.name); + execute(test.pretest, test.name, cb); + } + + function posttest(cb) { + if (!test.posttest) return process.nextTick(cb); + log('-- running posttest "%s" for %s', test.posttest, test.name); + execute(test.posttest, test.name, cb); + } +} + +function testCmd(name, version, cmd, env, cb) { + log('-- running test "%s" with %s (env: %O)', cmd, name, env); + const opts = { env: Object.assign({}, env, process.env) }; + execute(cmd, name + '@' + version, opts, cb); +} + +function execute(cmd, name, opts, cb) { + if (typeof opts === 'function') return execute(cmd, name, null, opts); + + if (argv['dry-run']) { + // Dry-run. + setImmediate(cb, 0); + return; + } + + let stdout = ''; + const cp = exec(cmd, opts); + cp.on('close', function (code) { + if (code !== 0) { + log('-- detected failing command, flushing stdout...'); + log(stdout); + } + cb(code); + }); + cp.on('error', function (err) { + console.error('-- error running "%s" with %s', cmd, name); + console.error(err.stack); + cb(err.code || 1); + }); + if (argv.compat) { + // "hack" to make the spinner move + cp.stdout.on('data', spinner); + cp.stderr.on('data', spinner); + } else { + if (!argv.quiet && !argv.q) { + cp.stdout.pipe(process.stdout); + } else { + // store output in case we needed if an error occurs + cp.stdout.on('data', function (chunk) { + stdout += chunk; + }); + } + cp.stderr.pipe(process.stderr); + } +} + +function ensurePackages(packages, registry, cb) { + log('-- required packages %j', packages); + + if (npm5plus) { + // npm5 will uninstall everything that's not in the local package.json and + // not in the install string. This might make tests fail. So if we detect + // npm5, we just force install everything all the time. + attemptInstall(packages, registry, cb); + return; + } + + const next = afterAll(function (_, packages) { + packages = packages.filter(function (pkg) { + return !!pkg; + }); + if (packages.length > 0) attemptInstall(packages, registry, cb); + else cb(); + }); + + packages.forEach(function (dependency) { + const done = next(); + const parts = dependency.split('@'); + const name = parts[0]; + const version = parts[1]; + + verbose('-- resolving %s/package.json in %s', name, process.cwd()); + + resolve( + name + '/package.json', + { basedir: process.cwd() }, + function (err, pkg) { + const installedVersion = err ? null : importFresh(pkg).version; + + verbose('-- installed version:', installedVersion); + + if (installedVersion && semver.satisfies(installedVersion, version)) { + log('-- reusing already installed %s', dependency); + done(); + return; + } + + done(null, dependency); + } + ); + }); +} +const walkUp = function* (p) { + for (p = path.resolve(p); p; ) { + yield p; + const parent = path.dirname(p); + if (parent === p) { + break; + } else { + p = parent; + } + } +}; +function fileExistsSync(path) { + try { + const stats = fs.statSync(path); + return stats.isFile(); + } catch (_err) { + return false; + } +} +function findPackagePathSync(cwd) { + for (const p of walkUp(cwd)) { + const packagePath = path.resolve(p, 'package.json'); + const hasPackageJson = fileExistsSync(packagePath); + if (hasPackageJson) { + return packagePath; + } + } + return null; +} + +function attemptInstall(packages, registry, cb, attempts = 1) { + log('-- installing %j', packages); + if (argv['dry-run']) { + // Dry-run. + setImmediate(cb, 0); + return; + } + + const packagePath = path.dirname(findPackagePathSync(process.cwd())); + const installPath = path.join( + packagePath, + 'node_modules', + '.tav', + packages[packages.length - 1] + ); + /** @type {(err?: Error) => void} */ + const done = once(function (err) { + clearTimeout(timeout); + + if (!err) { + for (const pkg of packages) { + const parsed = npa(pkg); + + if (parsed.scope) { + // ensure the deep scope path exists + fs.mkdirSync(path.join(packagePath, 'node_modules', parsed.scope), { + recursive: true, + }); + } + + fs.rmSync(path.join(packagePath, 'node_modules', parsed.name), { + recursive: true, + force: true, + }); + fs.symlinkSync( + path.join(installPath, 'node_modules', parsed.name), + path.join(packagePath, 'node_modules', parsed.name) + ); + } + return cb(); + } + + if (++attempts <= 10) { + fs.rmSync(installPath, { + recursive: true, + force: true, + }); + console.warn( + '-- error installing %j (%s) - retrying (%d/10)...', + packages, + err.message, + attempts + ); + attemptInstall(packages, registry, cb, attempts); + } else { + console.error('-- error installing %j - aborting!', packages); + console.error(err.stack); + cb(err.code || 1); + } + }); + + // create a package directory + fs.mkdirSync(installPath, { recursive: true }); + fs.writeFileSync( + path.join(installPath, 'package.json'), + JSON.stringify({ name: 'tav' }, null, 2) + ); + + // make sure legacy_peer_deps option is unset + process.env.npm_config_legacy_peer_deps = undefined; + + const opts = { + command: npmCmd, + 'install-strategy': 'linked', + cwd: installPath, + }; + if (argv.verbose) opts.stdio = 'inherit'; + if (argv.registry || registry) opts.registry = argv.registry || registry; + + // npm on Travis have a tendency to hang every once in a while + // (https://twitter.com/wa7son/status/1006859826549477378). We'll use a + // timeout to abort and retry the install in case it hasn't finished within 2 + // minutes. + const timeout = setTimeout(function () { + done(new Error('npm install took too long')); + }, 2 * 60 * 1000); + + install(packages, opts, done).on('error', done); +} + +function getSpinner(str) { + const frames = cliSpinners.dots.frames; + let i = 0; + const spin = function () { + if (spin.isDone) return spin; + diff.write(util.format('%s %s', frames[i++ % frames.length], str)); + return spin; + }; + spin.done = function (success) { + diff.write( + util.format('%s %s', success ? logSymbols.success : logSymbols.error, str) + ); + diff.reset(); + spin.isDone = true; + process.stdout.write(os.EOL); + }; + return spin; +} + +function done(err) { + if (err) { + console.error('-- fatal: ' + err.message); + process.exit(err.exitCode || 1); + } + log('-- ok'); +} + +function toArray(obj) { + return Array.isArray(obj) ? obj : obj == null ? [] : [obj]; +} + +function flatten(arr) { + return Array.prototype.concat.apply([], arr); +} + +function filterVersions(opts, versions, cb) { + const includeVersions = opts.versions.include ?? opts.versions; + const excludeVersions = opts.versions.exclude; + const mode = opts.versions.mode; + + versions = versions.filter(function (version) { + return ( + semver.satisfies(version, includeVersions) && + !semver.satisfies(version, excludeVersions) + ); + }); + + switch (mode) { + case undefined: + case 'all': + return cb(null, versions); + case 'latest-majors': + return cb(null, getLatestMajors(versions)); + case 'latest-minors': + return cb(null, getLatestMinors(versions)); + default: { + const result = mode.match( + /^max-(?\d+)(-(?evenly|random|latest|popular))?$/ + ); + if (!result) return cb(new Error(`Unknown mode: ${mode}`)); + const max = parseInt(result.groups.max, 10); + if (max < 2) return cb(new Error('max-{N}: N has to be larger than 2')); + if (max >= versions.length - 2) return cb(null, versions); + switch (result.groups.algo ?? 'evenly') { + case 'evenly': + return cb(null, getMaxEvenly(versions, max)); + case 'random': + return cb(null, getMaxRandom(versions, max)); + case 'latest': + return cb(null, versions.slice(max * -1)); + case 'popular': + return getMaxPopular(opts.name, versions, max, cb); + } + } + } +} + +/** + * From a given ordered list of versions returns the first, num in between and last. Example + * - input: ['5.0.0', '5.0.1', '5.1.0', '5.2.0', '5.3.0', '5.4.0', '5.5.0', '5.6.0', '5.7.0', '5.8.0', '5.8.1', '5.9.0'] + * - input: num = 5 + * - output: ['5.0.0', '5.1.0', '5.3.0', '5.5.0', '5.7.0', '5.8.1', '5.9.0'] + * first ^^^^^^^^^ 3 version in between ^^^^^^^^^^^^ last + */ +function getMaxEvenly(versions, max) { + const spacing = (versions.length - 2) / (max - 2); + const indicies = new Set([0, versions.length - 1]); + for (let n = 1; n <= max - 2; n++) { + indicies.add(Math.floor(spacing * n) - 1); + } + return versions.filter((_, index) => indicies.has(index)); +} + +function getMaxRandom(versions, max) { + const indicies = new Set(); + while (indicies.size < max) { + indicies.add(Math.floor(Math.random() * versions.length)); + } + return versions.filter((_, index) => indicies.has(index)); +} + +/** + * Get the most popular versions of a package from the npm registry. Popularity is + * based on the number of downloads in the last week. + * + * @param {string} name - The name of the package to get the popular versions for + * @param {string[]} versions - The versions to filter + * @param {number} max - The maximum number of versions to return + * @param {function(Error?, string[]): void} cb - The callback to call with the result + */ +function getMaxPopular(name, versions, max, cb) { + https.get(`https://api.npmjs.org/versions/${name}/last-week`, res => { + const buffers = []; + const done = once(cb); + + res.on('error', done); + res.on('data', chunk => buffers.push(chunk)); + res.on('end', () => { + const downloads = Object.entries( + JSON.parse(Buffer.concat(buffers).toString()).downloads + ); + done( + null, + downloads + .filter(a => versions.includes(a[0])) + .sort((a, b) => b[1] - a[1]) + .slice(0, max) + .map(a => a[0]) + ); + }); + }); +} + +function getLatestMajors(versions) { + return versions + .map(semver.parse) + .sort(semver.rcompare) + .reduce((result, version) => { + const smallestSeenMajor = result[0]?.major ?? Number.MAX_SAFE_INTEGER; + if (version.major < smallestSeenMajor) result.unshift(version); + return result; + }, []) + .map(v => v.raw); +} + +function getLatestMinors(versions) { + return versions + .map(semver.parse) + .sort(semver.rcompare) + .reduce((result, version) => { + const smallestSeenMajor = result[0]?.major ?? Number.MAX_SAFE_INTEGER; + const smallestSeenMinor = result[0]?.minor ?? Number.MAX_SAFE_INTEGER; + if ( + version.major < smallestSeenMajor || + version.minor < smallestSeenMinor + ) + result.unshift(version); + return result; + }, []) + .map(v => v.raw); +}