Skip to content

Commit 302952a

Browse files
committed
fix:feature/1826-warning message moved to proper place, license change checked for the last version
1 parent 34b84c5 commit 302952a

File tree

6 files changed

+95
-67
lines changed

6 files changed

+95
-67
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<script setup lang="ts">
2+
import { useLicenseChanges } from '~/composables/useLicenseChanges'
3+
4+
const props = defineProps<{
5+
license?: string
6+
packageName?: string
7+
resolvedVersion: string | null | undefined
8+
}>()
9+
10+
const licenseChanges = useLicenseChanges(
11+
() => props.packageName,
12+
() => props.resolvedVersion,
13+
)
14+
15+
const changes = computed(() => licenseChanges.data.value?.changes ?? [])
16+
17+
const licenseChangeText = computed(() =>
18+
changes.value
19+
.map(item =>
20+
$t('package.versions.license_change_item', {
21+
from: item.from,
22+
to: item.to,
23+
version: item.version,
24+
}),
25+
)
26+
.join('; '),
27+
)
28+
</script>
29+
30+
<template>
31+
<div
32+
v-if="changes && changes.length > 0"
33+
class="border border-amber-600/40 bg-amber-500/10 rounded-lg mt-1 gap-x-1 py-2 px-3"
34+
:aria-label="$t('package.versions.license_change_help')"
35+
>
36+
<p class="text-md text-amber-800 dark:text-amber-400 flex items-center gap-2">
37+
<span
38+
class="i-lucide:alert-triangle w-4 h-4 flex-shrink-0"
39+
role="img"
40+
:aria-label="$t('package.versions.license_change_help')"
41+
/>
42+
{{ $t('package.versions.license_change_warning') }}
43+
</p>
44+
<p class="text-md text-amber-800 dark:text-amber-400 mt-1">
45+
<i18n-t keypath="package.versions.changed_license" tag="span">
46+
<template #license_change>{{ licenseChangeText }}</template>
47+
</i18n-t>
48+
</p>
49+
</div>
50+
</template>
51+
52+
<style scoped></style>

app/components/LicenseDisplay.vue

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,11 @@
11
<script setup lang="ts">
22
import { parseLicenseExpression } from '#shared/utils/spdx'
33
4-
import { useLicenseChanges } from '~/composables/useLicenseChanges'
5-
64
const props = defineProps<{
75
license: string
8-
packageName?: string
96
}>()
107
118
const tokens = computed(() => parseLicenseExpression(props.license))
12-
const licenseChanges = useLicenseChanges(() => props.packageName)
13-
14-
const changes = computed(() => licenseChanges.data.value?.changes ?? [])
15-
16-
const licenseChangeText = computed(() =>
17-
changes.value
18-
.map(item =>
19-
$t('package.versions.license_change_item', {
20-
from: item.from,
21-
to: item.to,
22-
version: item.version,
23-
}),
24-
)
25-
.join('; '),
26-
)
279
2810
const hasAnyValidLicense = computed(() => tokens.value.some(t => t.type === 'license' && t.url))
2911
</script>
@@ -50,31 +32,4 @@ const hasAnyValidLicense = computed(() => tokens.value.some(t => t.type === 'lic
5032
aria-hidden="true"
5133
/>
5234
</span>
53-
<div
54-
v-if="changes.length > 0"
55-
class="border border-amber-600/40 bg-amber-500/10 rounded-lg inline-flex justify-start items-center mt-1 gap-x-1 py-[2px] px-[3px]"
56-
>
57-
<p class="text-md text-amber-800 dark:text-amber-400">
58-
{{ $t('package.versions.license_change_warning') }}
59-
</p>
60-
<TooltipApp interactive position="top">
61-
<span
62-
tabindex="0"
63-
class="block cursor-help shrink-0 -m-2 p-2 -me-1 focus-visible:outline-2 focus-visible:outline-accent/70 rounded"
64-
>
65-
<span
66-
class="block i-lucide:info w-3.5 h-3.5 text-fg-subtle"
67-
role="img"
68-
:aria-label="$t('package.versions.license_change_help')"
69-
/>
70-
</span>
71-
<template #content>
72-
<p class="text-xs text-fg-muted">
73-
<i18n-t keypath="package.versions.changed_license" tag="span">
74-
<template #license_change>{{ licenseChangeText }}</template>
75-
</i18n-t>
76-
</p>
77-
</template>
78-
</TooltipApp>
79-
</div>
8035
</template>

app/composables/useLicenseChanges.ts

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,26 @@ interface NpmRegistryResponse {
2626
/**
2727
* Composable to detect license changes across all versions of a package
2828
*/
29-
export function useLicenseChanges(packageName: MaybeRefOrGetter<string | null | undefined>) {
29+
export function useLicenseChanges(
30+
packageName: MaybeRefOrGetter<string | null | undefined>,
31+
resolvedVersion: MaybeRefOrGetter<string | null | undefined> = () => undefined,
32+
) {
3033
return useAsyncData<LicenseChangesResult>(
31-
() => `license-changes:${toValue(packageName)}`,
34+
() => {
35+
const name = toValue(packageName)
36+
const version = toValue(resolvedVersion) ?? 'latest'
37+
return `license-changes:${name}:${version}`
38+
},
3239
async () => {
3340
const name = toValue(packageName)
41+
const resolvedVer = toValue(resolvedVersion)
3442
if (!name) return { changes: [] }
3543

3644
// Fetch full package metadata from npm registry
3745
const url = `https://registry.npmjs.org/${name}`
3846
const data = await $fetch<NpmRegistryResponse>(url)
3947

4048
const changes: LicenseChange[] = []
41-
let prevLicense: string | undefined = undefined
4249

4350
// `data.versions` is an object with version keys
4451
const versions = Object.values(data.versions) as NpmRegistryVersion[]
@@ -52,23 +59,30 @@ export function useLicenseChanges(packageName: MaybeRefOrGetter<string | null |
5259
return dateA - dateB
5360
})
5461

55-
// Detect license changes
56-
for (const version of versions) {
57-
const license = (version.license as string) ?? 'UNKNOWN'
58-
if (prevLicense && license !== prevLicense) {
59-
changes.push({
60-
from: prevLicense,
61-
to: license,
62-
version: version.version as string,
63-
})
62+
// When resolvedVer is not provided, check changes across all versions
63+
const targetVersion = resolvedVer ?? versions[versions.length - 1]?.version
64+
65+
if (targetVersion) {
66+
const resolvedIndex = versions.findIndex(v => v.version === targetVersion)
67+
68+
if (resolvedIndex > 0) {
69+
const currentLicense = (versions[resolvedIndex]?.license as string) ?? 'UNKNOWN'
70+
const previousLicense = (versions[resolvedIndex - 1]?.license as string) ?? 'UNKNOWN'
71+
72+
if (currentLicense !== previousLicense) {
73+
changes.push({
74+
from: previousLicense,
75+
to: currentLicense,
76+
version: (versions[resolvedIndex]?.version as string) || 'UNKNOWN',
77+
})
78+
}
6479
}
65-
prevLicense = license
6680
}
6781
return { changes }
6882
},
6983
{
7084
default: () => ({ changes: [] }),
71-
watch: [() => toValue(packageName)],
85+
watch: [() => toValue(packageName), () => toValue(resolvedVersion)],
7286
},
7387
)
7488
}

app/pages/package/[[org]]/[name].vue

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,15 @@ const versionUrlPattern = computed(
459459
() => `/package/${pkg.value?.name || packageName.value}/v/{version}`,
460460
)
461461
462+
//delete
463+
watch(
464+
resolvedVersion,
465+
newV => {
466+
console.log('#1 resolvedVersion ', newV)
467+
},
468+
{ immediate: true },
469+
)
470+
462471
const dependencyCount = computed(() => getDependencyCount(displayVersion.value))
463472
464473
const numberFormatter = useNumberFormatter()
@@ -582,11 +591,7 @@ const showSkeleton = shallowRef(false)
582591
{{ $t('package.stats.license') }}
583592
</dt>
584593
<dd class="font-mono text-sm text-fg">
585-
<LicenseDisplay
586-
v-if="pkg.license"
587-
:license="pkg.license"
588-
:package-name="pkg.name"
589-
/>
594+
<LicenseDisplay v-if="pkg.license" :license="pkg.license" />
590595
<span v-else>{{ $t('package.license.none') }}</span>
591596
</dd>
592597
</div>
@@ -887,6 +892,8 @@ const showSkeleton = shallowRef(false)
887892
</section>
888893

889894
<div class="space-y-6" :class="$style.areaVulns">
895+
<!-- license change warning -->
896+
<LicenseChangeWarning :packageName="pkg.name" :resolvedVersion="resolvedVersion" />
890897
<!-- Bad package warning -->
891898
<PackageReplacement v-if="moduleReplacement" :replacement="moduleReplacement" />
892899
<!-- Size / dependency increase notice -->

i18n/locales/en.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,8 @@
435435
"license_change_help": "License Change Details",
436436
"license_change_item": "from {from} to {to} at version {version}",
437437
"filter_tooltip": "Filter versions using a {link}. For example, ^3.0.0 shows all 3.x versions.",
438-
"changed_license": "The license was changed: {license_change}",
439-
"license_change_warning": "change!",
438+
"changed_license": "The license was changed {license_change}",
439+
"license_change_warning": "License change!",
440440
"filter_tooltip_link": "semver range",
441441
"no_matches": "No versions match this range",
442442
"copy_alt": {

i18n/locales/tr-TR.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@
390390
"license_change_item": "{version} sürümünde {from}'den {to}'ya",
391391
"filter_tooltip": "Sürümleri {link} kullanarak filtreleyin. Örneğin, ^3.0.0 tüm 3.x sürümlerini gösterir.",
392392
"changed_license": "Lisans değişikliği gerçekleşti: {license_change}",
393-
"license_change_warning": "değişiklik!",
393+
"license_change_warning": "Lisans değişikliği!",
394394
"filter_tooltip_link": "semver aralığı",
395395
"no_matches": "Bu aralığa uygun sürüm yok",
396396
"copy_alt": {

0 commit comments

Comments
 (0)