diff --git a/packages/node-modules-inspector/src/app/components/display/PackageSpec.vue b/packages/node-modules-inspector/src/app/components/display/PackageSpec.vue
index 250bbc33..bec69079 100644
--- a/packages/node-modules-inspector/src/app/components/display/PackageSpec.vue
+++ b/packages/node-modules-inspector/src/app/components/display/PackageSpec.vue
@@ -4,13 +4,13 @@ import DisplayVersion from '@antfu/design/components/Display/DisplayVersion.vue'
import { computed } from 'vue'
import { getDeprecatedInfo, getVulnerability } from '../../state/payload'
import DisplayPackageName from './PackageName.vue'
-import DisplayProvenanceBadge from './ProvenanceBadge.vue'
+import DisplaySupplyChainBadge from './SupplyChainBadge.vue'
const props = defineProps<{
pkg: PackageNode
versionSize?: 'small' | 'normal'
versionPrefix?: string
- showProvenance?: boolean
+ showSupplyChain?: boolean
}>()
const deprecation = computed(() => getDeprecatedInfo(props.pkg))
@@ -48,7 +48,7 @@ const vulnerability = computed(() => getVulnerability(props.pkg))
'text-sm': 'small' === versionSize,
}"
/>
-
+
diff --git a/packages/node-modules-inspector/src/app/components/display/ProvenanceBadge.vue b/packages/node-modules-inspector/src/app/components/display/ProvenanceBadge.vue
deleted file mode 100644
index 3cb87fe6..00000000
--- a/packages/node-modules-inspector/src/app/components/display/ProvenanceBadge.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
diff --git a/packages/node-modules-inspector/src/app/components/display/SupplyChainBadge.vue b/packages/node-modules-inspector/src/app/components/display/SupplyChainBadge.vue
new file mode 100644
index 00000000..1630523c
--- /dev/null
+++ b/packages/node-modules-inspector/src/app/components/display/SupplyChainBadge.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
diff --git a/packages/node-modules-inspector/src/app/components/grid/Item.vue b/packages/node-modules-inspector/src/app/components/grid/Item.vue
index 29bb9815..584bd800 100644
--- a/packages/node-modules-inspector/src/app/components/grid/Item.vue
+++ b/packages/node-modules-inspector/src/app/components/grid/Item.vue
@@ -25,7 +25,7 @@ defineProps<{
@click="selectedNode = pkg === selectedNode ? undefined : pkg"
>
diff --git a/packages/node-modules-inspector/src/app/components/panel/PackageDetails.vue b/packages/node-modules-inspector/src/app/components/panel/PackageDetails.vue
index 29dd7305..6b5691f2 100644
--- a/packages/node-modules-inspector/src/app/components/panel/PackageDetails.vue
+++ b/packages/node-modules-inspector/src/app/components/panel/PackageDetails.vue
@@ -18,7 +18,7 @@ import IntegrationsPublintCounts from '../integrations/PublintCounts.vue'
import TreeDependencies from '../tree/Dependencies.vue'
import UiPercentageFileCategories from '../ui/PercentageFileCategories.vue'
import UiPercentageModuleType from '../ui/PercentageModuleType.vue'
-import UiPercentageProvenance from '../ui/PercentageProvenance.vue'
+import UiPercentageSupplyChain from '../ui/PercentageSupplyChain.vue'
import PanelMaintainerActionTypePill from './MaintainerActionTypePill.vue'
import PanelPackageDetailsInfo from './PackageDetailsInfo.vue'
@@ -466,9 +466,9 @@ const thirdPartyServices = computed(() => {
:flat="settings.deepDependenciesTree"
/>
- Dependency Provenance
+ Dependency Supply Chain
-
diff --git a/packages/node-modules-inspector/src/app/components/panel/PackageDetailsInfo.vue b/packages/node-modules-inspector/src/app/components/panel/PackageDetailsInfo.vue
index dcaa98ea..3c54ef3e 100644
--- a/packages/node-modules-inspector/src/app/components/panel/PackageDetailsInfo.vue
+++ b/packages/node-modules-inspector/src/app/components/panel/PackageDetailsInfo.vue
@@ -8,15 +8,15 @@ import { NuxtLink } from '#components'
import { getBackend } from '../../backends'
import { selectedNode } from '../../state/current'
import { filters } from '../../state/filters'
-import { getDeprecatedInfo, getNpmMeta, getNpmMetaLatest, getPublishTime, payloads } from '../../state/payload'
+import { getDeprecatedInfo, getNpmMetaLatest, getPublishTime, payloads } from '../../state/payload'
import { settings } from '../../state/settings'
import DisplayAuthors from '../display/Authors.vue'
import DisplayDateBadge from '../display/DateBadge.vue'
import DisplayModuleType from '../display/ModuleType'
import DisplayNodeVersionRange from '../display/NodeVersionRange.vue'
import DisplayPackageName from '../display/PackageName.vue'
-import DisplayProvenanceBadge from '../display/ProvenanceBadge.vue'
import DisplaySourceTypeBadge from '../display/SourceTypeBadge.vue'
+import DisplaySupplyChainBadge from '../display/SupplyChainBadge.vue'
import DisplayVersionWithUpdates from '../display/VersionWithUpdates.vue'
import PanelPackageFunding from './PackageFunding.vue'
@@ -27,7 +27,6 @@ const props = defineProps<{
const backend = getBackend()
const router = useRouter()
-const meta = computed(() => getNpmMeta(props.pkg))
const latestMeta = computed(() => getNpmMetaLatest(props.pkg))
const deprecation = computed(() => getDeprecatedInfo(props.pkg))
const resolved = computed(() => props.pkg.resolved)
@@ -55,12 +54,11 @@ function showDuplicatedGraph(pkgs: PackageNode[]) {
-
+
diff --git a/packages/node-modules-inspector/src/app/components/panel/Settings.vue b/packages/node-modules-inspector/src/app/components/panel/Settings.vue
index 9cf27333..5b78099b 100644
--- a/packages/node-modules-inspector/src/app/components/panel/Settings.vue
+++ b/packages/node-modules-inspector/src/app/components/panel/Settings.vue
@@ -36,9 +36,9 @@ const showConfigDialog = ref(false)
-
+
diff --git a/packages/node-modules-inspector/src/app/components/tree/Item.vue b/packages/node-modules-inspector/src/app/components/tree/Item.vue
index 7b3d8255..2c10cd78 100644
--- a/packages/node-modules-inspector/src/app/components/tree/Item.vue
+++ b/packages/node-modules-inspector/src/app/components/tree/Item.vue
@@ -29,7 +29,7 @@ withDefaults(
-
+
diff --git a/packages/node-modules-inspector/src/app/components/ui/PercentageProvenance.vue b/packages/node-modules-inspector/src/app/components/ui/PercentageProvenance.vue
deleted file mode 100644
index 77f0144e..00000000
--- a/packages/node-modules-inspector/src/app/components/ui/PercentageProvenance.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
diff --git a/packages/node-modules-inspector/src/app/components/ui/PercentageSupplyChain.vue b/packages/node-modules-inspector/src/app/components/ui/PercentageSupplyChain.vue
new file mode 100644
index 00000000..dd5a8749
--- /dev/null
+++ b/packages/node-modules-inspector/src/app/components/ui/PercentageSupplyChain.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
diff --git a/packages/node-modules-inspector/src/app/pages/grid/[...grid].vue b/packages/node-modules-inspector/src/app/pages/grid/[...grid].vue
index 672c6c70..3b031aac 100644
--- a/packages/node-modules-inspector/src/app/pages/grid/[...grid].vue
+++ b/packages/node-modules-inspector/src/app/pages/grid/[...grid].vue
@@ -11,9 +11,10 @@ import DisplayModuleType from '../../components/display/ModuleType'
import GridExpand from '../../components/grid/Expand.vue'
import { getNpmMeta, payloads } from '../../state/payload'
import { getModuleType } from '../../utils/module-type'
+import { getSupplyChainScore, SUPPLY_CHAIN_SIGNALS } from '../../utils/supply-chain'
const params = useRoute().params as Record
-const tab = computed<'depth' | 'clusters' | 'module-type' | 'authors' | 'licenses' | 'provenance'>(() => params.grid?.[0] as any || 'depth')
+const tab = computed<'depth' | 'clusters' | 'module-type' | 'authors' | 'licenses' | 'supply-chain'>(() => params.grid?.[0] as any || 'depth')
const location = window.location
@@ -21,6 +22,7 @@ const MAX_DEPTH = 5
interface Group {
name: string
+ description?: string
cluster?: string
module?: PackageModuleType
author?: ParsedAuthor
@@ -110,26 +112,24 @@ const groups = computed(() => {
expanded: false,
}))
}
- else if (tab.value === 'provenance') {
- const map = new Map<'Trusted Publisher' | 'Provenance' | 'None', PackageNode[]>([
- ['Trusted Publisher', []],
- ['Provenance', []],
- ['None', []],
- ])
- for (const pkg of payloads.filtered.packages) {
- const meta = getNpmMeta(pkg)
- const provenance = meta?.provenance === 'trustedPublisher'
- ? 'Trusted Publisher'
- : meta?.provenance === true ? 'Provenance' : 'None'
- map.get(provenance)!.push(pkg)
- }
+ else if (tab.value === 'supply-chain') {
+ // Grouped by how many of the three signals a package has, best first. Only
+ // the top and bottom groups are a single combination, so the others are
+ // named by count and spelled out in the tooltip.
+ const map = new Map([[3, []], [2, []], [1, []], [0, []]])
+ for (const pkg of payloads.filtered.packages)
+ map.get(getSupplyChainScore(getNpmMeta(pkg)))!.push(pkg)
return [...map.entries()]
- .map(([provenance, packages]) => ({
- name: provenance,
- provenance,
+ .map(([score, packages]) => ({
+ name: score === 3
+ ? `All ${SUPPLY_CHAIN_SIGNALS.length} Signals`
+ : score === 0 ? 'No Signals' : `${score} of ${SUPPLY_CHAIN_SIGNALS.length} Signals`,
+ description: score === 3
+ ? SUPPLY_CHAIN_SIGNALS.join(' + ')
+ : `${score === 0 ? 'None' : `Any ${score}`} of: ${SUPPLY_CHAIN_SIGNALS.join(', ')}`,
packages,
- expanded: provenance !== 'None',
+ expanded: score > 0,
}))
}
else {
@@ -187,9 +187,9 @@ const groups = computed(() => {
License
-
-
- Provenance
+
+
+ Supply Chain
@@ -204,7 +204,7 @@ const groups = computed
(() => {
- {{ group.name }}
+ {{ group.name }}