diff --git a/lib/datasource/packagist/__snapshots__/index.spec.ts.snap b/lib/datasource/packagist/__snapshots__/index.spec.ts.snap index 5cae6de70ce742ad483b2ff7a73b5e9512fb80ad..fa9942fe84446c6489eb82f35e2b7dca97d482c2 100644 --- a/lib/datasource/packagist/__snapshots__/index.spec.ts.snap +++ b/lib/datasource/packagist/__snapshots__/index.spec.ts.snap @@ -374,7 +374,47 @@ Object { } `; -exports[`datasource/packagist getReleases supports providers packages 1`] = ` +exports[`datasource/packagist getReleases supports provider-includes 1`] = ` +Object { + "homepage": "https://wordpress.org/plugins/1beyt/", + "name": "wpackagist-plugin/1beyt", + "releases": Array [ + Object { + "gitRef": "1.0", + "releaseTimestamp": undefined, + "version": "1.0", + }, + Object { + "gitRef": "1.1", + "releaseTimestamp": undefined, + "version": "1.1", + }, + Object { + "gitRef": "1.4", + "releaseTimestamp": undefined, + "version": "1.4", + }, + Object { + "gitRef": "1.5", + "releaseTimestamp": undefined, + "version": "1.5", + }, + Object { + "gitRef": "1.5.1", + "releaseTimestamp": undefined, + "version": "1.5.1", + }, + Object { + "gitRef": "dev-trunk", + "releaseTimestamp": "2018-09-03 21:31:30", + "version": "dev-trunk", + }, + ], + "sourceUrl": "https://plugins.svn.wordpress.org/1beyt/", +} +`; + +exports[`datasource/packagist getReleases supports providers 1`] = ` Object { "homepage": "https://wordpress.org/plugins/1beyt/", "name": "wpackagist-plugin/1beyt", diff --git a/lib/datasource/packagist/index.spec.ts b/lib/datasource/packagist/index.spec.ts index b560d8a3c4624c1613ee732ac34da5e7b9a3c26a..355f976d845f7c1b565d0997fb30af2ff9aabd72 100644 --- a/lib/datasource/packagist/index.spec.ts +++ b/lib/datasource/packagist/index.spec.ts @@ -130,7 +130,7 @@ describe('datasource/packagist', () => { expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); }); - it('supports providers packages', async () => { + it('supports provider-includes', async () => { const packagesJson = { packages: [], 'providers-url': '/p/%package%$%hash%.json', @@ -169,7 +169,7 @@ describe('datasource/packagist', () => { expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); }); - it('handles providers packages miss', async () => { + it('handles provider-includes miss', async () => { const packagesJson = { packages: [], 'providers-url': '/p/%package%$%hash%.json', @@ -207,6 +207,61 @@ describe('datasource/packagist', () => { }); expect(res).toBeNull(); }); + it('supports providers', async () => { + const packagesJson = { + packages: [], + 'providers-url': '/p/%package%$%hash%.json', + providers: { + 'wpackagist-plugin/1337-rss-feed-made-for-sharing': { + sha256: + 'e9b6c98c63f99e59440863a044cc80dd9cddbf5c426b05003dba98983b5757de', + }, + 'wpackagist-plugin/1beyt': { + sha256: + 'b574a802b5bf20a58c0f027e73aea2a75d23a6f654afc298a8dc467331be316a', + }, + }, + }; + got.mockReturnValueOnce({ + body: packagesJson, + }); + got.mockReturnValueOnce({ + body: JSON.parse(beytJson), + }); + const res = await packagist.getReleases({ + ...config, + lookupName: 'wpackagist-plugin/1beyt', + }); + expect(res).toMatchSnapshot(); + expect(res).not.toBeNull(); + }); + it('handles providers miss', async () => { + const packagesJson = { + packages: [], + 'providers-url': '/p/%package%$%hash%.json', + providers: { + 'wpackagist-plugin/1337-rss-feed-made-for-sharing': { + sha256: + 'e9b6c98c63f99e59440863a044cc80dd9cddbf5c426b05003dba98983b5757de', + }, + 'wpackagist-plugin/1beyt': { + sha256: + 'b574a802b5bf20a58c0f027e73aea2a75d23a6f654afc298a8dc467331be316a', + }, + }, + }; + got.mockReturnValueOnce({ + body: packagesJson, + }); + got.mockReturnValueOnce({ + body: JSON.parse(beytJson), + }); + const res = await packagist.getReleases({ + ...config, + lookupName: 'some/other', + }); + expect(res).toBeNull(); + }); it('processes real versioned data', async () => { got.mockReturnValueOnce({ body: JSON.parse(mailchimpJson), diff --git a/lib/datasource/packagist/index.ts b/lib/datasource/packagist/index.ts index 843ed725b53a1778ca266c2cec33a912afcc3858..80fd6929d2f1c0d48b72a15eb523942108d605d3 100644 --- a/lib/datasource/packagist/index.ts +++ b/lib/datasource/packagist/index.ts @@ -29,6 +29,7 @@ interface PackageMeta { includes?: Record<string, { sha256: string }>; packages: Record<string, RegistryFile>; 'provider-includes': Record<string, { sha256: string }>; + providers: Record<string, { sha256: string }>; 'providers-url'?: string; } @@ -38,6 +39,7 @@ interface RegistryFile { } interface RegistryMeta { files?: RegistryFile[]; + providerPackages: Record<string, string>; providersUrl?: string; includesFiles?: RegistryFile[]; packages?: Record<string, RegistryFile>; @@ -48,7 +50,9 @@ async function getRegistryMeta(regUrl: string): Promise<RegistryMeta | null> { const url = URL.resolve(regUrl.replace(/\/?$/, '/'), 'packages.json'); const opts = getHostOpts(url); const res = (await http.getJson<PackageMeta>(url, opts)).body; - const meta: RegistryMeta = {}; + const meta: RegistryMeta = { + providerPackages: {}, + }; meta.packages = res.packages; if (res.includes) { meta.includesFiles = []; @@ -60,8 +64,10 @@ async function getRegistryMeta(regUrl: string): Promise<RegistryMeta | null> { meta.includesFiles.push(file); } } - if (res['providers-url'] && res['provider-includes']) { + if (res['providers-url']) { meta.providersUrl = res['providers-url']; + } + if (res['provider-includes']) { meta.files = []; for (const [key, val] of Object.entries(res['provider-includes'])) { const file = { @@ -71,6 +77,11 @@ async function getRegistryMeta(regUrl: string): Promise<RegistryMeta | null> { meta.files.push(file); } } + if (res.providers) { + for (const [key, val] of Object.entries(res.providers)) { + meta.providerPackages[key] = val.sha256; + } + } return meta; } catch (err) { if (err.code === 'ETIMEDOUT') { @@ -176,8 +187,13 @@ async function getAllPackages(regUrl: string): Promise<AllPackages | null> { global.repoCache[`packagist-${regUrl}`] = null; return null; } - const { packages, providersUrl, files, includesFiles } = registryMeta; - const providerPackages: Record<string, string> = {}; + const { + packages, + providersUrl, + files, + includesFiles, + providerPackages, + } = registryMeta; if (files) { const queue = files.map((file) => (): Promise<PackagistFile> => getPackagistFile(regUrl, file)