Skip to content

Commit 245cb32

Browse files
committed
feat: add license changes
1 parent 97e094a commit 245cb32

File tree

5 files changed

+55
-6
lines changed

5 files changed

+55
-6
lines changed

app/composables/npm/usePackage.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,19 @@ export function transformPackument(
8686
const trustLevel = getTrustLevel(version)
8787
const hasProvenance = trustLevel !== 'none'
8888

89+
// Normalize license: some versions use { type: "MIT" } instead of "MIT"
90+
let versionLicense = version.license
91+
if (versionLicense && typeof versionLicense === 'object' && 'type' in versionLicense) {
92+
versionLicense = (versionLicense as { type: string }).type
93+
}
94+
8995
filteredVersions[v] = {
9096
hasProvenance,
9197
trustLevel,
9298
version: version.version,
9399
deprecated: version.deprecated,
94100
tags: version.tags as string[],
101+
license: typeof versionLicense === 'string' ? versionLicense : undefined,
95102
}
96103
}
97104
}

app/pages/package-timeline/[[org]]/[packageName].vue

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,27 @@ const sizeEvents = computed(() => {
147147
return events
148148
})
149149
150+
// Detect license changes between consecutive versions
151+
const licenseChanges = computed(() => {
152+
const changes = new Map<string, { from: string; to: string }>()
153+
const entries = timelineEntries.value
154+
155+
for (let i = 0; i < entries.length - 1; i++) {
156+
const current = pkg.value?.versions[entries[i]!.version]
157+
const previous = pkg.value?.versions[entries[i + 1]!.version]
158+
if (!current || !previous) continue
159+
160+
const currentLicense = current.license ?? 'Unknown'
161+
const previousLicense = previous.license ?? 'Unknown'
162+
163+
if (currentLicense !== previousLicense) {
164+
changes.set(entries[i]!.version, { from: previousLicense, to: currentLicense })
165+
}
166+
}
167+
168+
return changes
169+
})
170+
150171
const bytesFormatter = useBytesFormatter()
151172
152173
useSeoMeta({
@@ -190,12 +211,12 @@ useSeoMeta({
190211
aria-hidden="true"
191212
/>
192213
</span>
193-
<div
194-
class="border rounded-lg px-3 py-2 text-sm"
214+
<p
215+
class="text-sm"
195216
:class="
196217
sizeEvents.get(entry.version)!.direction === 'decrease'
197-
? 'border-green-600/40 bg-green-500/10 text-green-800 dark:text-green-400'
198-
: 'border-amber-600/40 bg-amber-500/10 text-amber-800 dark:text-amber-400'
218+
? 'text-green-700 dark:text-green-400'
219+
: 'text-amber-700 dark:text-amber-400'
199220
"
200221
>
201222
<template v-if="sizeEvents.get(entry.version)!.sizeThresholdExceeded">
@@ -234,7 +255,23 @@ useSeoMeta({
234255
})
235256
}}
236257
</template>
237-
</div>
258+
</p>
259+
</div>
260+
<!-- License change -->
261+
<div v-if="licenseChanges.has(entry.version)" class="mb-4 -ms-6 ps-6 relative">
262+
<span
263+
class="absolute -start-2 flex items-center justify-center w-4 h-4 rounded-full border bg-amber-500 border-amber-600"
264+
>
265+
<span class="w-2.5 h-2.5 text-white i-lucide:scale" aria-hidden="true" />
266+
</span>
267+
<p class="text-sm text-amber-700 dark:text-amber-400">
268+
{{
269+
$t('package.timeline.license_change', {
270+
from: licenseChanges.get(entry.version)!.from,
271+
to: licenseChanges.get(entry.version)!.to,
272+
})
273+
}}
274+
</p>
238275
</div>
239276
<!-- Dot -->
240277
<span

i18n/locales/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,8 @@
426426
"size_increase": "Install size increased by {percent}% ({size})",
427427
"size_decrease": "Install size decreased by {percent}% ({size})",
428428
"dep_increase": "{count} dependencies added",
429-
"dep_decrease": "{count} dependencies removed"
429+
"dep_decrease": "{count} dependencies removed",
430+
"license_change": "License changed from {from} to {to}"
430431
},
431432
"dependencies": {
432433
"title": "Dependency ({count}) | Dependencies ({count})",

i18n/schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,6 +1284,9 @@
12841284
},
12851285
"dep_decrease": {
12861286
"type": "string"
1287+
},
1288+
"license_change": {
1289+
"type": "string"
12871290
}
12881291
},
12891292
"additionalProperties": false

shared/types/npm-registry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export type PublishTrustLevel = 'none' | 'trustedPublisher' | 'provenance'
4747
export type SlimVersion = Pick<SlimPackumentVersion, 'version' | 'deprecated' | 'tags'> & {
4848
hasProvenance?: boolean
4949
trustLevel?: PublishTrustLevel
50+
license?: string
5051
}
5152

5253
/**

0 commit comments

Comments
 (0)