Skip to content

Commit c03d126

Browse files
committed
fix: preserve full license array per packagist version
Signed-off-by: anilb <epipav@gmail.com>
1 parent 25677f0 commit c03d126

4 files changed

Lines changed: 15 additions & 7 deletions

File tree

services/apps/packages_worker/src/packagist/__tests__/normalize.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ describe('buildPackagistVersionRows', () => {
139139
publishedAt: '2024-03-01T00:00:00+00:00',
140140
isLatest: true,
141141
isPrerelease: false,
142-
license: 'MIT',
142+
licenses: ['MIT'],
143143
})
144144
expect(byNumber['2.9.1'].isLatest).toBe(false)
145-
expect(byNumber['1.0.0'].license).toBe('BSD-3-Clause')
145+
expect(byNumber['1.0.0'].licenses).toEqual(['BSD-3-Clause'])
146146
expect(latestVersion).toBe('2.10.0')
147147
expect(firstReleaseAt).toBe('2020-06-01T00:00:00+00:00')
148148
expect(latestReleaseAt).toBe('2024-03-01T00:00:00+00:00')

services/apps/packages_worker/src/packagist/normalize.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ export function buildPackagistVersionRows(versions: PackagistExpandedVersion[]):
146146
publishedAt: v.time ?? null,
147147
isLatest: false, // Will be set below
148148
isPrerelease: isPackagistPrerelease(v.version_normalized ?? v.version),
149-
license: (v.license && v.license.length > 0 ? v.license[0] : null) ?? null,
149+
licenses: v.license && v.license.length > 0 ? v.license : null,
150150
}))
151151

152152
// Find latest: prefer stable over prerelease; within each group use Composer ordering

services/apps/packages_worker/src/packagist/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export interface PackagistVersionRow {
105105
publishedAt: string | null
106106
isLatest: boolean
107107
isPrerelease: boolean
108-
license: string | null
108+
licenses: string[] | null
109109
}
110110

111111
export interface PackagistDependency {

services/libs/data-access-layer/src/packages/versions.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ export interface PackagistVersionInput {
7474
publishedAt: string | null
7575
isLatest: boolean
7676
isPrerelease: boolean
77-
license: string | null
77+
// Composer allows dual/multi-licensed releases (e.g. ["MIT", "Apache-2.0"]) — the
78+
// full array is preserved, unlike the single-SPDX-string npm/pypi license inputs.
79+
licenses: string[] | null
7880
}
7981

8082
export async function upsertPackagistVersions(
@@ -102,7 +104,11 @@ export async function upsertPackagistVersions(
102104
)
103105
SELECT $(packageId)::bigint, 'packagist', p.namespace, p.name, v.num,
104106
v.pub::timestamptz, v.latest, v.pre,
105-
CASE WHEN v.lic IS NULL THEN NULL::text[] ELSE ARRAY[v.lic] END,
107+
-- licenses travels as one JSON-encoded array per row (unnest can't carry a
108+
-- ragged array-of-arrays alongside scalar columns), decoded back here.
109+
CASE WHEN v.lic IS NULL THEN NULL::text[]
110+
ELSE (SELECT array_agg(elem) FROM jsonb_array_elements_text(v.lic::jsonb) AS elem)
111+
END,
106112
NOW(), NOW()
107113
FROM unnest(
108114
$(numbers)::text[],
@@ -135,7 +141,9 @@ export async function upsertPackagistVersions(
135141
publishedAts: versions.map((v) => v.publishedAt),
136142
isLatests: versions.map((v) => v.isLatest),
137143
isPrereleases: versions.map((v) => v.isPrerelease),
138-
licenses: versions.map((v) => v.license),
144+
licenses: versions.map((v) =>
145+
v.licenses && v.licenses.length > 0 ? JSON.stringify(v.licenses) : null,
146+
),
139147
},
140148
)
141149

0 commit comments

Comments
 (0)