diff --git a/lib/datasource/packagist.js b/lib/datasource/packagist.js index 5855c20d8f906fd3d4a38deaff7a497fe3c1e038..5e41c4981f7c6f5b210b9f2df2ba578c2c5a1cde 100644 --- a/lib/datasource/packagist.js +++ b/lib/datasource/packagist.js @@ -187,6 +187,8 @@ async function getPkgReleases(purl, config = {}) { for (const regUrl of config.registryUrls) { if (regUrl.type === 'composer') { regUrls.push(regUrl.url); + } else if (regUrl.type === 'package') { + logger.info({ regUrl }, 'Skipping package repository entry'); } else if (regUrl['packagist.org'] !== false) { logger.info({ regUrl }, 'Unsupported Packagist registry URL'); } diff --git a/lib/manager/composer/extract.js b/lib/manager/composer/extract.js index c26c80c26e77b362d2056455111905c4633e143e..3649c1a480d27b3293b2402c5d1616b4db706e87 100644 --- a/lib/manager/composer/extract.js +++ b/lib/manager/composer/extract.js @@ -1,3 +1,4 @@ +const is = require('@sindresorhus/is'); const semverComposer = require('../../versioning')('semverComposer'); module.exports = { @@ -58,7 +59,23 @@ async function extractDependencies(content, fileName) { } const res = { deps, composerLock }; if (packageJson.repositories) { - res.registryUrls = packageJson.repositories; + if (is.array(packageJson.repositories)) { + res.registryUrls = packageJson.repositories; + } else if (is.object(packageJson.repositories)) { + try { + res.registryUrls = []; + for (const repository of Object.values(packageJson.repositories)) { + res.registryUrls.push(repository); + } + } catch (err) /* istanbul ignore next */ { + logger.info({ err }, 'Error extracting composer repositories'); + } + } /* istanbul ignore next */ else { + logger.info( + { repositories: packageJson.repositories }, + 'Unknown composer repositories' + ); + } } return res; } diff --git a/test/_fixtures/composer/composer3.json b/test/_fixtures/composer/composer3.json new file mode 100644 index 0000000000000000000000000000000000000000..3afd092fb99034925b5114619c96f29ec566b64f --- /dev/null +++ b/test/_fixtures/composer/composer3.json @@ -0,0 +1,66 @@ +{ + "name": "asha23/arlo-timber-framework", + "type": "project", + "license": "MIT", + "description": "A Composer Framework to help you get WordPress with Timber up and running in around a minute", + "authors": [{ + "name": "Ash Whiting", + "email": "ash_whiting@hotmail.com" + }], + "keywords": [ + "Arlo", "wordpress framework", "base theme", "wordpress", "composer", "vagrant", "wp" + ], + "repositories": { + "wp-packagist": { + "type": "composer", + "url": "https://wpackagist.org" + }, + "theme": { + "type": "package", + "package": { + "name": "asha23/wp-seed-timber", + "type": "wordpress-theme", + "version": "1.2.6", + "dist": { + "type": "zip", + "url": "https://github.com/asha23/wp-seed-timber/archive/v1.2.6.zip" + } + } + }, + "wp-sync-db": { + "type": "package", + "package": { + "name": "wp-sync-db/wp-sync-db", + "type": "wordpress-plugin", + "version": "1.5", + "dist": { + "type": "zip", + "url": "https://github.com/corysimmons/wp-sync-db/archive/1.6.zip" + } + } + } + }, + "require": { + "php": ">=5.5", + "composer/installers": "~1.0.12", + "johnpbloch/wordpress": "*", + "vlucas/phpdotenv": "^2.0.1", + "oscarotero/env": "^1.0", + "wpackagist-plugin/tinymce-advanced": "*", + "wpackagist-plugin/acf-content-analysis-for-yoast-seo": "*", + "wpackagist-plugin/duplicate-post": "*", + "wpackagist-plugin/simple-image-sizes": "*", + "wpackagist-plugin/wordpress-seo": "*", + "wpackagist-plugin/timber-library": "*", + "wp-sync-db/wp-sync-db": "*", + "asha23/wp-seed-timber": "*" + }, + "extra": { + "installer-paths": { + "web/content/plugins/{$name}/": ["type:wordpress-plugin"], + "web/content/themes/{$name}/": ["type:wordpress-theme"] + }, + "wordpress-install-dir": "web/wp", + "content-install-dir": "web/content" + } +} diff --git a/test/datasource/packagist.spec.js b/test/datasource/packagist.spec.js index ed3f5b22cf7ccc050bdedf3feb0d25ee200ca769..72cda449222f7130ec7aed3e1e7c691deb28a3c4 100644 --- a/test/datasource/packagist.spec.js +++ b/test/datasource/packagist.spec.js @@ -29,6 +29,18 @@ describe('datasource/packagist', () => { { type: 'unknown', }, + { + type: 'package', + package: { + name: 'abc/def', + type: 'wordpress-theme', + version: '1.2.6', + dist: { + type: 'zip', + url: 'https://github.com/abc/def/archive/v1.2.6.zip', + }, + }, + }, { 'packagist.org': false, }, diff --git a/test/manager/composer/__snapshots__/extract.spec.js.snap b/test/manager/composer/__snapshots__/extract.spec.js.snap index 3dda6c64e3d20998bed5522c5e94094d065abce6..7586de6823c919661c15db436a47deaf7e11417b 100644 --- a/test/manager/composer/__snapshots__/extract.spec.js.snap +++ b/test/manager/composer/__snapshots__/extract.spec.js.snap @@ -500,6 +500,145 @@ Object { } `; +exports[`lib/manager/composer/extract extractDependencies() extracts object registryUrls 1`] = ` +Object { + "composerLock": false, + "deps": Array [ + Object { + "currentValue": ">=5.5", + "depName": "php", + "depType": "require", + "purl": "pkg:packagist/php", + "skipReason": "unsupported", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "~1.0.12", + "depName": "composer/installers", + "depType": "require", + "purl": "pkg:packagist/composer/installers", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "johnpbloch/wordpress", + "depType": "require", + "purl": "pkg:packagist/johnpbloch/wordpress", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "^2.0.1", + "depName": "vlucas/phpdotenv", + "depType": "require", + "purl": "pkg:packagist/vlucas/phpdotenv", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "^1.0", + "depName": "oscarotero/env", + "depType": "require", + "purl": "pkg:packagist/oscarotero/env", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wpackagist-plugin/tinymce-advanced", + "depType": "require", + "purl": "pkg:packagist/wpackagist-plugin/tinymce-advanced", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wpackagist-plugin/acf-content-analysis-for-yoast-seo", + "depType": "require", + "purl": "pkg:packagist/wpackagist-plugin/acf-content-analysis-for-yoast-seo", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wpackagist-plugin/duplicate-post", + "depType": "require", + "purl": "pkg:packagist/wpackagist-plugin/duplicate-post", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wpackagist-plugin/simple-image-sizes", + "depType": "require", + "purl": "pkg:packagist/wpackagist-plugin/simple-image-sizes", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wpackagist-plugin/wordpress-seo", + "depType": "require", + "purl": "pkg:packagist/wpackagist-plugin/wordpress-seo", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wpackagist-plugin/timber-library", + "depType": "require", + "purl": "pkg:packagist/wpackagist-plugin/timber-library", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "wp-sync-db/wp-sync-db", + "depType": "require", + "purl": "pkg:packagist/wp-sync-db/wp-sync-db", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + Object { + "currentValue": "*", + "depName": "asha23/wp-seed-timber", + "depType": "require", + "purl": "pkg:packagist/asha23/wp-seed-timber", + "skipReason": "any-version", + "versionScheme": "semverComposer", + }, + ], + "registryUrls": Array [ + Object { + "type": "composer", + "url": "https://wpackagist.org", + }, + Object { + "package": Object { + "dist": Object { + "type": "zip", + "url": "https://github.com/asha23/wp-seed-timber/archive/v1.2.6.zip", + }, + "name": "asha23/wp-seed-timber", + "type": "wordpress-theme", + "version": "1.2.6", + }, + "type": "package", + }, + Object { + "package": Object { + "dist": Object { + "type": "zip", + "url": "https://github.com/corysimmons/wp-sync-db/archive/1.6.zip", + }, + "name": "wp-sync-db/wp-sync-db", + "type": "wordpress-plugin", + "version": "1.5", + }, + "type": "package", + }, + ], +} +`; + exports[`lib/manager/composer/extract extractDependencies() extracts registryUrls 1`] = ` Object { "composerLock": false, diff --git a/test/manager/composer/extract.spec.js b/test/manager/composer/extract.spec.js index 88985ff3ee99d83b29c85416a6fdacbea67aab46..915b513cb1af69fce00b4949957ef6dd933a7e6c 100644 --- a/test/manager/composer/extract.spec.js +++ b/test/manager/composer/extract.spec.js @@ -11,6 +11,10 @@ const requirements2 = fs.readFileSync( 'test/_fixtures/composer/composer2.json', 'utf8' ); +const requirements3 = fs.readFileSync( + 'test/_fixtures/composer/composer3.json', + 'utf8' +); describe('lib/manager/composer/extract', () => { describe('extractDependencies()', () => { @@ -33,6 +37,11 @@ describe('lib/manager/composer/extract', () => { expect(res).toMatchSnapshot(); expect(res.registryUrls).toHaveLength(1); }); + it('extracts object registryUrls', async () => { + const res = await extractDependencies(requirements3, packageFile); + expect(res).toMatchSnapshot(); + expect(res.registryUrls).toHaveLength(3); + }); it('extracts dependencies with lock file', async () => { platform.getFile.mockReturnValueOnce('some content'); const res = await extractDependencies(requirements1, packageFile);