@@ -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
8082export 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