From 7f419103307da7856627c4ca078460234701eb75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Wed, 14 Nov 2018 22:10:44 +0000 Subject: [PATCH] Set up CI with Azure Pipelines (#6495) * Set up CI with Azure Pipelines * Update azure-pipelines.yml * Update azure-pipelines.yml * Update package.json * Adds debug * Tries using bash * Tweaks timeouts * Fixes various things related to the win32 compat * I get the same 22 failed tests with/without the delay. * Fix makeFakeBinary for win32. It needs the ".cmd" extension, otherwise it's ignored. Remove #!/bin/sh and instead add @echo off to clean output Use errorCode 0 so we get output and not a Command failed * Check custom output instead of versions. Running fake binaries there was no way to get local versions of node or yarn. Am I missing something? * Remove quotes from echo (not removed in Windows). Replace ; by /n as the former doesn't actually break statements in Windows batch files. * Some tweaks * Fixes syntax * Fixes tests on Windows * Adds test reporting * Fixes things (?) * Fixes indent * Always run the test result publishing * Fixes yml * Use node scripts to avoid Windows interoperability issues. * Fixes the "must use the same Node as Yarn itself" test * Fixes escaping from within the tests * Removes the accidental .only flag * Fixes a test on Windows * Add support for different drives in Windows. So if code is in D: but temporary folder is in C:, don't try to find a relative path but stay on the absolute one. * No need to getPackageLocation * Add support for environment and arguments by using a custom solution instead of cmd-shim. * Missing escape on path in pnpapi test. * Some cleaning * Runs tests on all three platforms * Fixes write paths * Fixes normalizePath * Disables pkg-tests from CircleCI (moved to Azure) * Increase Windows timeouts and better name Test results (#6680) * Increase timeout in Windows, we're seeing tests failing randomly and others close to default 5 sec. * Distinguish tests published from each job. * Pass name as vmImage is not available * Remove unnecessary detect unfinished tests. * Using strategy var instead of parameter * Use variables instead of strategy * Revert "Disables pkg-tests from CircleCI (moved to Azure)" This reverts commit 8f724620b672910ad738a72dae029f39dd228d21. --- azure-pipelines.yml | 51 ++++ packages/pkg-tests/.gitignore | 1 + packages/pkg-tests/package.json | 3 +- .../pkg-tests-core/sources/utils/exec.js | 2 + .../pkg-tests-core/sources/utils/fs.js | 17 +- .../pkg-tests-core/sources/utils/tests.js | 6 + .../no-deps-scripted-1.0.0/package.json | 6 +- .../no-deps-scripted-1.0.0/scripts/install.js | 3 + .../scripts/postinstall.js | 4 + .../scripts/preinstall.js | 3 + .../pkg-tests/pkg-tests-specs/sources/pnp.js | 19 +- .../pkg-tests-specs/sources/pnpapi-v1.js | 20 +- .../pkg-tests-specs/sources/script.js | 18 +- packages/pkg-tests/yarn.lock | 220 +++++++++++++++++- packages/pkg-tests/yarn.test.js | 4 + scripts/azure-run-tests.yml | 30 +++ src/fetchers/tarball-fetcher.js | 1 + src/util/generate-pnp-map-api.tpl.js | 13 +- src/util/generate-pnp-map.js | 2 +- src/util/portable-script.js | 18 +- 20 files changed, 394 insertions(+), 47 deletions(-) create mode 100644 azure-pipelines.yml create mode 100644 packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/install.js create mode 100644 packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/postinstall.js create mode 100644 packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/preinstall.js create mode 100644 scripts/azure-run-tests.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000000..c625c8a030 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,51 @@ +jobs: + +- job: Windows + pool: 'Hosted VS2017' + + variables: + os_name: Windows + + strategy: + matrix: + node_8_x: + node_version: 8.x + node_10_x: + node_version: 10.x + + steps: + - template: scripts/azure-run-tests.yml + +- job: Linux + pool: + vmImage: 'Ubuntu 16.04' + + variables: + os_name: Linux + + strategy: + matrix: + node_8_x: + node_version: 8.x + node_10_x: + node_version: 10.x + + steps: + - template: scripts/azure-run-tests.yml + +- job: OSX + pool: + vmImage: 'macOS 10.13' + + variables: + os_name: OSX + + strategy: + matrix: + node_8_x: + node_version: 8.x + node_10_x: + node_version: 10.x + + steps: + - template: scripts/azure-run-tests.yml \ No newline at end of file diff --git a/packages/pkg-tests/.gitignore b/packages/pkg-tests/.gitignore index 93cab344de..238b09ea37 100644 --- a/packages/pkg-tests/.gitignore +++ b/packages/pkg-tests/.gitignore @@ -1,2 +1,3 @@ node_modules yarn-error.log +junit.xml \ No newline at end of file diff --git a/packages/pkg-tests/package.json b/packages/pkg-tests/package.json index f3bc9a3682..2b7e1fa77a 100644 --- a/packages/pkg-tests/package.json +++ b/packages/pkg-tests/package.json @@ -11,6 +11,7 @@ "babel-preset-flow": "^6.23.0", "flow-bin": "^0.66.0", "jest": "^23.0.0", + "jest-junit": "^5.2.0", "prettier": "^1.10.2" }, "scripts": { @@ -25,7 +26,7 @@ }, "jest": { "modulePathIgnorePatterns": [ - "[/\\\\]pkg-tests-fixtures[/\\\\]packages[/\\\\]" + "/pkg-tests-fixtures/packages/" ] } } diff --git a/packages/pkg-tests/pkg-tests-core/sources/utils/exec.js b/packages/pkg-tests/pkg-tests-core/sources/utils/exec.js index ad499b4605..244866ac91 100644 --- a/packages/pkg-tests/pkg-tests-core/sources/utils/exec.js +++ b/packages/pkg-tests/pkg-tests-core/sources/utils/exec.js @@ -12,6 +12,8 @@ exports.execFile = function( if (error) { reject(error); } else { + stdout = stdout.replace(/\r\n?/g, `\n`); + stderr = stderr.replace(/\r\n?/g, `\n`); resolve({stdout, stderr}); } }); diff --git a/packages/pkg-tests/pkg-tests-core/sources/utils/fs.js b/packages/pkg-tests/pkg-tests-core/sources/utils/fs.js index a39f4a9058..a15aa9d383 100644 --- a/packages/pkg-tests/pkg-tests-core/sources/utils/fs.js +++ b/packages/pkg-tests/pkg-tests-core/sources/utils/fs.js @@ -11,6 +11,8 @@ const zlib = require('zlib'); const miscUtils = require('./misc'); +const IS_WIN32 = process.platform === `win32`; + exports.walk = function walk( source: string, {filter, relative = false}: {|filter?: Array, relative?: boolean|} = {}, @@ -75,13 +77,13 @@ exports.packToStream = function packToStream( const packStream = tarFs.pack(source, { map: header => { if (true) { - header.name = path.resolve('/', header.name); - header.name = path.relative('/', header.name); + header.name = path.posix.resolve('/', header.name); + header.name = path.posix.relative('/', header.name); } if (virtualPath) { - header.name = path.resolve('/', virtualPath, header.name); - header.name = path.relative('/', header.name); + header.name = path.posix.resolve('/', virtualPath, header.name); + header.name = path.posix.relative('/', header.name); } return header; @@ -186,6 +188,9 @@ exports.makeFakeBinary = async function( target: string, {output = `Fake binary`, exitCode = 1}: {|output: string, exitCode: number|} = {}, ): Promise { - await exports.writeFile(target, `#!/bin/sh\necho "${output}"\nexit ${exitCode}\n`); - await exports.chmod(target, 0o755); + const realTarget = IS_WIN32 ? `${target}.cmd` : target; + const header = IS_WIN32 ? `@echo off\n` : `#!/bin/sh\n`; + + await exports.writeFile(realTarget, `${header}echo ${output}\nexit ${exitCode}\n`); + await exports.chmod(realTarget, 0o755); }; diff --git a/packages/pkg-tests/pkg-tests-core/sources/utils/tests.js b/packages/pkg-tests/pkg-tests-core/sources/utils/tests.js index f1a9e20132..388e74bd38 100644 --- a/packages/pkg-tests/pkg-tests-core/sources/utils/tests.js +++ b/packages/pkg-tests/pkg-tests-core/sources/utils/tests.js @@ -364,3 +364,9 @@ exports.generatePkgDriver = function generatePkgDriver({runDriver}: {|runDriver: return withConfig({}); }; + +exports.testIf = function testIf(condition, ...args) { + if (condition()) { + test(...args); + } +}; diff --git a/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/package.json b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/package.json index 294c8b4d37..8bd8ad90b9 100644 --- a/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/package.json +++ b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/package.json @@ -2,8 +2,8 @@ "name": "no-deps-scripted", "version": "1.0.0", "scripts": { - "preinstall": "echo 'module.exports.push(100);' >> log.js", - "install": "echo 'module.exports.push(200);' >> log.js", - "postinstall": "echo 'module.exports.push(300);' >> log.js; echo 'module.exports = '\"$(node -p 'Math.floor(Math.random() * 512000)')\"';' > rnd.js" + "preinstall": "node scripts/preinstall", + "install": "node scripts/install", + "postinstall": "node scripts/postinstall" } } diff --git a/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/install.js b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/install.js new file mode 100644 index 0000000000..b125c4eb93 --- /dev/null +++ b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/install.js @@ -0,0 +1,3 @@ +const fs = require(`fs`); + +fs.appendFileSync(`${__dirname}/../log.js`, `module.exports.push('install');`); diff --git a/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/postinstall.js b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/postinstall.js new file mode 100644 index 0000000000..b415a0022d --- /dev/null +++ b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/postinstall.js @@ -0,0 +1,4 @@ +const fs = require(`fs`); + +fs.appendFileSync(`${__dirname}/../log.js`, `module.exports.push('postinstall');`); +fs.appendFileSync(`${__dirname}/../rnd.js`, `module.exports = ${Math.floor(Math.random() * 512000)};`); diff --git a/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/preinstall.js b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/preinstall.js new file mode 100644 index 0000000000..b3e152ba1f --- /dev/null +++ b/packages/pkg-tests/pkg-tests-fixtures/packages/no-deps-scripted-1.0.0/scripts/preinstall.js @@ -0,0 +1,3 @@ +const fs = require(`fs`); + +fs.appendFileSync(`${__dirname}/../log.js`, `module.exports.push('preinstall');`); diff --git a/packages/pkg-tests/pkg-tests-specs/sources/pnp.js b/packages/pkg-tests/pkg-tests-specs/sources/pnp.js index cbb75c53d5..8efd0028c1 100644 --- a/packages/pkg-tests/pkg-tests-specs/sources/pnp.js +++ b/packages/pkg-tests/pkg-tests-specs/sources/pnp.js @@ -5,7 +5,7 @@ const {satisfies} = require('semver'); const { fs: {createTemporaryFolder, readFile, readJson, writeFile, writeJson}, - tests: {getPackageDirectoryPath}, + tests: {getPackageDirectoryPath, testIf}, } = require('pkg-tests-core'); module.exports = makeTemporaryEnv => { @@ -312,7 +312,7 @@ module.exports = makeTemporaryEnv => { makeTemporaryEnv( { dependencies: {[`no-deps`]: `1.0.0`}, - scripts: {myScript: `node -p 'require("no-deps/package.json").version'`}, + scripts: {myScript: `node -p "require('no-deps/package.json').version"`}, }, { plugNPlay: true, @@ -574,7 +574,7 @@ module.exports = makeTemporaryEnv => { await writeFile(`${tmp}/folder/index.js`, `module.exports = 42;`); - await expect(source(`require("${tmp}/folder")`)).resolves.toEqual(42); + await expect(source(`require(${JSON.stringify(tmp)} + "/folder")`)).resolves.toEqual(42); }), ); @@ -587,7 +587,7 @@ module.exports = makeTemporaryEnv => { await writeFile(`${tmp}/file.js`, `module.exports = 42;`); - await expect(source(`require("${tmp}/file")`)).resolves.toEqual(42); + await expect(source(`require(${JSON.stringify(tmp)} + "/file")`)).resolves.toEqual(42); }), ); @@ -621,7 +621,7 @@ module.exports = makeTemporaryEnv => { await writeFile(`${tmp}/node_modules/dep/index.js`, `module.exports = 42;`); await writeFile(`${tmp}/index.js`, `require('dep')`); - await source(`require("${tmp}/index.js")`); + await source(`require(${JSON.stringify(tmp)} + "/index.js")`); }), ); @@ -744,7 +744,8 @@ module.exports = makeTemporaryEnv => { ), ); - test( + testIf( + () => process.platform !== 'win32', `it should generate a file that can be used as an executable to resolve a request (valid request)`, makeTemporaryEnv( { @@ -773,7 +774,8 @@ module.exports = makeTemporaryEnv => { ), ); - test( + testIf( + () => process.platform !== `win32`, `it should generate a file that can be used as an executable to resolve a request (builtin request)`, makeTemporaryEnv( { @@ -797,7 +799,8 @@ module.exports = makeTemporaryEnv => { ), ); - test( + testIf( + () => process.platform !== `win32`, `it should generate a file that can be used as an executable to resolve a request (invalid request)`, makeTemporaryEnv( { diff --git a/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js b/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js index 56a6aba36a..29be4c2faf 100644 --- a/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js +++ b/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js @@ -45,9 +45,9 @@ module.exports = makeTemporaryEnv => { makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { await run(`install`); - await expect(source(`require('pnpapi').resolveRequest('pnpapi', '${path}/')`)).resolves.toEqual( - normalize(`${path}/.pnp.js`), - ); + await expect( + source(`require('pnpapi').resolveRequest('pnpapi', ${JSON.stringify(path + '/')})`), + ).resolves.toEqual(normalize(`${path}/.pnp.js`)); }), ); @@ -56,7 +56,9 @@ module.exports = makeTemporaryEnv => { makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { await run(`install`); - await expect(source(`require('pnpapi').resolveRequest('fs', '${path}/')`)).resolves.toEqual(null); + await expect( + source(`require('pnpapi').resolveRequest('fs', ${JSON.stringify(path)} + '/')`), + ).resolves.toEqual(null); }), ); @@ -77,8 +79,10 @@ module.exports = makeTemporaryEnv => { await run(`install`); await expect( - source(`require('pnpapi').resolveRequest('fs', '${path}/', {considerBuiltins: false})`), - ).resolves.toEqual(`${path}/fs/index.js`); + source( + `require('pnpapi').resolveRequest('fs', ${JSON.stringify(path)} + '/', {considerBuiltins: false})`, + ), + ).resolves.toEqual(normalize(`${path}/fs/index.js`)); }, ), ); @@ -91,8 +95,8 @@ module.exports = makeTemporaryEnv => { await run(`install`); await expect( - source(`require('pnpapi').resolveRequest('./foo', '${path}/', {extensions: ['.bar']})`), - ).resolves.toEqual(`${path}/foo.bar`); + source(`require('pnpapi').resolveRequest('./foo', ${JSON.stringify(path)} + '/', {extensions: ['.bar']})`), + ).resolves.toEqual(normalize(`${path}/foo.bar`)); }), ); }); diff --git a/packages/pkg-tests/pkg-tests-specs/sources/script.js b/packages/pkg-tests/pkg-tests-specs/sources/script.js index 999d6c452c..302fed82e1 100644 --- a/packages/pkg-tests/pkg-tests-specs/sources/script.js +++ b/packages/pkg-tests/pkg-tests-specs/sources/script.js @@ -12,22 +12,18 @@ module.exports = (makeTemporaryEnv: PackageDriver) => { test( `it should run scripts using the same Node than the one used by Yarn`, makeTemporaryEnv({scripts: {myScript: `node --version`}}, async ({path, run, source}) => { - await makeFakeBinary(`${path}/bin/node`); + await makeFakeBinary(`${path}/bin/node`, {exitCode: 1}); - await expect(run(`run`, `myScript`)).resolves.toMatchObject({ - stdout: `${process.version}\n`, - }); + await expect(run(`run`, `myScript`)).resolves.toBeTruthy(); }), ); test( `it should run scripts using the same package manager than the one running the scripts`, makeTemporaryEnv({scripts: {myScript: `yarn --version`}}, async ({path, run, source}) => { - await makeFakeBinary(`${path}/bin/yarn`); + await makeFakeBinary(`${path}/bin/yarn`, {exitCode: 1}); - await expect(run(`run`, `myScript`)).resolves.toMatchObject({ - stdout: (await run(`--version`)).stdout, - }); + await expect(run(`run`, `myScript`)).resolves.toBeTruthy(); }), ); @@ -200,7 +196,11 @@ module.exports = (makeTemporaryEnv: PackageDriver) => { makeTemporaryEnv({dependencies: {[`no-deps-scripted`]: `1.0.0`}}, async ({path, run, source}) => { await run(`install`); - await expect(source(`require('no-deps-scripted/log.js')`)).resolves.toEqual([100, 200, 300]); + await expect(source(`require('no-deps-scripted/log.js')`)).resolves.toEqual([ + 'preinstall', + 'install', + 'postinstall', + ]); }), ); }); diff --git a/packages/pkg-tests/yarn.lock b/packages/pkg-tests/yarn.lock index c6cc754672..77bfd7e361 100644 --- a/packages/pkg-tests/yarn.lock +++ b/packages/pkg-tests/yarn.lock @@ -363,6 +363,14 @@ babel-jest@^23.0.1: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.0.1" +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -388,6 +396,11 @@ babel-plugin-jest-hoist@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz#eaa11c964563aea9c21becef2bdf7853f7f3c148" +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" + integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -660,6 +673,14 @@ babel-preset-jest@^23.0.1: babel-plugin-jest-hoist "^23.0.1" babel-plugin-syntax-object-rest-spread "^6.13.0" +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" + integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -689,7 +710,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -703,7 +724,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -808,6 +829,13 @@ browser-resolve@^1.11.2: dependencies: resolve "1.1.7" +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserslist@^2.1.2: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" @@ -1244,6 +1272,18 @@ expect@^23.1.0: jest-message-util "^23.1.0" jest-regex-util "^23.0.0" +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== + dependencies: + ansi-styles "^3.2.0" + jest-diff "^23.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2016,6 +2056,26 @@ jest-config@^23.1.0: jest-validate "^23.0.1" pretty-format "^23.0.1" +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== + dependencies: + babel-core "^6.0.0" + babel-jest "^23.6.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + jest-diff@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.0.1.tgz#3d49137cee12c320a4b4d2b4a6fa6e82d491a16a" @@ -2025,6 +2085,16 @@ jest-diff@^23.0.1: jest-get-type "^22.1.0" pretty-format "^23.0.1" +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + jest-docblock@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.0.1.tgz#deddd18333be5dc2415260a04ef3fce9276b5725" @@ -2038,6 +2108,14 @@ jest-each@^23.1.0: chalk "^2.0.1" pretty-format "^23.0.1" +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== + dependencies: + chalk "^2.0.1" + pretty-format "^23.6.0" + jest-environment-jsdom@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz#85929914e23bed3577dac9755f4106d0697c479c" @@ -2046,6 +2124,15 @@ jest-environment-jsdom@^23.1.0: jest-util "^23.1.0" jsdom "^11.5.1" +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + jest-environment-node@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.1.0.tgz#452c0bf949cfcbbacda1e1762eeed70bc784c7d5" @@ -2053,6 +2140,14 @@ jest-environment-node@^23.1.0: jest-mock "^23.1.0" jest-util "^23.1.0" +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jest-get-type@^22.1.0: version "22.1.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" @@ -2085,6 +2180,35 @@ jest-jasmine2@^23.1.0: jest-util "^23.1.0" pretty-format "^23.0.1" +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== + dependencies: + babel-traverse "^6.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^23.6.0" + is-generator-fn "^1.0.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-junit@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-5.2.0.tgz#980401db7aa69999cf117c6d740a8135c22ae379" + integrity sha512-Mdg0Qpdh1Xm/FA1B/mcLlmEmlr3XzH5pZg7MvcAwZhjHijPRd1z/UwYwkwNHmCV7o4ZOWCf77nLu7ZkhHHrtJg== + dependencies: + jest-config "^23.6.0" + jest-validate "^23.0.1" + mkdirp "^0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.1" + jest-leak-detector@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz#9dba07505ac3495c39d3ec09ac1e564599e861a0" @@ -2099,6 +2223,15 @@ jest-matcher-utils@^23.0.1: jest-get-type "^22.1.0" pretty-format "^23.0.1" +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + jest-message-util@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.1.0.tgz#9a809ba487ecac5ce511d4e698ee3b5ee2461ea9" @@ -2109,14 +2242,35 @@ jest-message-util@^23.1.0: slash "^1.0.0" stack-utils "^1.0.1" +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + jest-mock@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.1.0.tgz#a381c31b121ab1f60c462a2dadb7b86dcccac487" +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= + jest-regex-util@^23.0.0: version "23.0.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.0.0.tgz#dd5c1fde0c46f4371314cf10f7a751a23f4e8f76" +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= + jest-resolve-dependencies@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz#d01a10ddad9152c4cecdf5eac2b88571c4b6a64d" @@ -2132,6 +2286,15 @@ jest-resolve@^23.1.0: chalk "^2.0.1" realpath-native "^1.0.0" +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + jest-runner@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.1.0.tgz#fa20a933fff731a5432b3561e7f6426594fa29b5" @@ -2191,6 +2354,22 @@ jest-snapshot@^23.0.1: natural-compare "^1.4.0" pretty-format "^23.0.1" +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== + dependencies: + babel-types "^6.0.0" + chalk "^2.0.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.6.0" + semver "^5.5.0" + jest-util@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.1.0.tgz#c0251baf34644c6dd2fea78a962f4263ac55772d" @@ -2204,6 +2383,20 @@ jest-util@^23.1.0: slash "^1.0.0" source-map "^0.6.0" +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + jest-validate@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.0.1.tgz#cd9f01a89d26bb885f12a8667715e9c865a5754f" @@ -2213,6 +2406,16 @@ jest-validate@^23.0.1: leven "^2.1.0" pretty-format "^23.0.1" +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" + jest-watcher@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.1.0.tgz#a8d5842e38d9fb4afff823df6abb42a58ae6cdbd" @@ -2859,6 +3062,14 @@ pretty-format@^23.0.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6, private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -3725,6 +3936,11 @@ xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" diff --git a/packages/pkg-tests/yarn.test.js b/packages/pkg-tests/yarn.test.js index 284b57ee61..ca5c274a1c 100644 --- a/packages/pkg-tests/yarn.test.js +++ b/packages/pkg-tests/yarn.test.js @@ -66,6 +66,10 @@ const pkgDriver = generatePkgDriver({ }, }); +if (process.platform === `win32`) { + jest.setTimeout(10000); +} + beforeEach(async () => { await startPackageServer(); await getPackageRegistry(); diff --git a/scripts/azure-run-tests.yml b/scripts/azure-run-tests.yml new file mode 100644 index 0000000000..45e105d047 --- /dev/null +++ b/scripts/azure-run-tests.yml @@ -0,0 +1,30 @@ +steps: + +- task: NodeTool@0 + inputs: + versionSpec: $(node_version) + displayName: 'Install Node.js' + +- bash: | + yarn + yarn run build + ls -lhR bin + ls -lhR lib + displayName: 'Install and build' + +- script: | + cd packages/pkg-tests + yarn + displayName: 'Install the acceptance tests' + +- script: | + cd packages/pkg-tests + yarn jest yarn --reporters=default --reporters=jest-junit + displayName: 'Run the acceptance tests' + +- task: PublishTestResults@2 + inputs: + testResultsFiles: '**/junit.xml' + testRunTitle: $(os_name) Node $(node_version) + displayName: 'Publishing the test results' + condition: always() diff --git a/src/fetchers/tarball-fetcher.js b/src/fetchers/tarball-fetcher.js index 6f492f6773..68c625f59e 100644 --- a/src/fetchers/tarball-fetcher.js +++ b/src/fetchers/tarball-fetcher.js @@ -190,6 +190,7 @@ export default class TarballFetcher extends BaseFetcher { hash: this.hash || hexDigest, }); }); + return {validateStream, extractorStream}; } diff --git a/src/util/generate-pnp-map-api.tpl.js b/src/util/generate-pnp-map-api.tpl.js index 9075adc2ef..b3280459c6 100644 --- a/src/util/generate-pnp-map-api.tpl.js +++ b/src/util/generate-pnp-map-api.tpl.js @@ -34,7 +34,7 @@ const isDirRegExp = /\/$/; const isStrictRegExp = /^\.{0,2}\//; // Splits a require request into its components, or return null if the request is a file path -const pathRegExp = /^(?!\.{0,2}(?:\/|$))((?:@[^\/]+\/)?[^\/]+)\/?(.*|)$/; +const pathRegExp = /^(?![a-zA-Z]:[\\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^\/]+\/)?[^\/]+)\/?(.*|)$/; // Keep a reference around ("module" is a common name in this context, so better rename it to something more significant) const pnpModule = module; @@ -240,9 +240,14 @@ function makeFakeModule(path) { * Normalize path to posix format. */ -// eslint-disable-next-line no-unused-vars function normalizePath(fsPath) { - return process.platform === 'win32' ? fsPath.replace(backwardSlashRegExp, '/') : fsPath; + fsPath = path.normalize(fsPath); + + if (process.platform === 'win32') { + fsPath = fsPath.replace(backwardSlashRegExp, '/'); + } + + return fsPath; } /** @@ -333,7 +338,7 @@ exports.resolveToUnqualified = function resolveToUnqualified(request, issuer, {c // contain multiple levels of dependencies (ie. a yarn.lock inside a subfolder of a yarn.lock). This is // typically solved using workspaces, but not all of them have been converted already. - if (ignorePattern && ignorePattern.test(issuer)) { + if (ignorePattern && ignorePattern.test(normalizePath(issuer))) { const result = callNativeResolution(request, issuer); if (result === false) { diff --git a/src/util/generate-pnp-map.js b/src/util/generate-pnp-map.js index 7956721db9..437aed7303 100644 --- a/src/util/generate-pnp-map.js +++ b/src/util/generate-pnp-map.js @@ -173,7 +173,7 @@ async function getPackageInformationStores( const normalizeDirectoryPath = (fsPath: string) => { let relativePath = normalizePath(path.relative(targetDirectory, resolveOfflineCacheFolder(fsPath))); - if (!relativePath.match(/^\.{0,2}\//)) { + if (!relativePath.match(/^\.{0,2}\//) && !path.isAbsolute(relativePath)) { relativePath = `./${relativePath}`; } diff --git a/src/util/portable-script.js b/src/util/portable-script.js index be901cff00..047fc9155e 100644 --- a/src/util/portable-script.js +++ b/src/util/portable-script.js @@ -36,11 +36,19 @@ async function makePortableProxyScriptUnix( const sourcePath = path.isAbsolute(source) ? source : `$(dirname "$0")/../${source}`; await fs.mkdirp(destination); - await fs.writeFile( - filePath, - `#!/bin/sh\n\n${environment}"${sourcePath}"${prependedArguments} "$@"${appendedArguments}\n`, - ); - await fs.chmod(filePath, 0o755); + + if (process.platform === 'win32') { + await fs.writeFile( + filePath + '.cmd', + `@${environment}"${sourcePath}" ${prependedArguments} ${appendedArguments} %*\r\n`, + ); + } else { + await fs.writeFile( + filePath, + `#!/bin/sh\n\n${environment}"${sourcePath}"${prependedArguments} "$@"${appendedArguments}\n`, + ); + await fs.chmod(filePath, 0o755); + } } export function makePortableProxyScript(