From fca7ee47ae661fd778c63d1b89e1fe4084f1284d Mon Sep 17 00:00:00 2001 From: Alec Lloyd Probert <55991794+graphieros@users.noreply.github.com> Date: Wed, 19 Aug 2026 06:35:06 +0000 Subject: [PATCH 1/6] chore(deps): bump vue-data-ui from 3.23.5 to 3.23.7 (#3189) --- app/components/Package/TrendsChart.vue | 3 ++- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- pnpm-workspace.yaml | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/components/Package/TrendsChart.vue b/app/components/Package/TrendsChart.vue index 35ee116b3d..6612abe79d 100644 --- a/app/components/Package/TrendsChart.vue +++ b/app/components/Package/TrendsChart.vue @@ -2065,7 +2065,8 @@ const copyEmbedUrl = () => copyEmbed(embedUrl.value) background: var(--bg-elevated) !important; } -.vue-ui-pen-and-paper-action { +.vue-ui-pen-and-paper-action, +.vue-ui-pen-and-paper-drag-handle { background: var(--bg-elevated) !important; border: none !important; } diff --git a/package.json b/package.json index 1c71fec998..356acb6c98 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "vite-plugin-pwa": "1.3.0", "vite-plus": "catalog:vite-plus", "vue": "3.5.41", - "vue-data-ui": "3.23.5", + "vue-data-ui": "3.23.7", "vue-router": "5.2.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12bd88d2f9..dfc0c4e3a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -271,8 +271,8 @@ importers: specifier: 3.5.41 version: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) vue-data-ui: - specifier: 3.23.5 - version: 3.23.5(vue@3.5.41) + specifier: 3.23.7 + version: 3.23.7(vue@3.5.41) vue-router: specifier: 5.2.0 version: 5.2.0(@voidzero-dev/vite-plus-core@0.2.9)(@vue/compiler-sfc@3.5.41)(esbuild@0.28.1)(rolldown@1.2.4)(rollup@4.62.2)(vue@3.5.41)(webpack@5.108.4) @@ -10611,8 +10611,8 @@ packages: vue-component-type-helpers@3.3.10: resolution: {integrity: sha512-t7IQivQ3oD4D01b7s7a9AWzHAcr3DGBIa/1jZREsFQJcFgSL92gqUkqNiHTYgzTt7QDuJa0I9wCeDwEtZICoBQ==} - vue-data-ui@3.23.5: - resolution: {integrity: sha512-f0GUjRatJQ305e7OPOW3htV9jEsSzqJ2zGJSQoq0yEAXuQmxF08DsERd5MsdUG2f1tH0YKbRaD/QuXklts2NrA==} + vue-data-ui@3.23.7: + resolution: {integrity: sha512-QPfRd3oMQYHUydbA7m1M+dzmoCLJieLo4DvE2LZVZSFRyl/qt4PKvx+piCipaYfcllViRShHj15q6AoviIrQKA==} peerDependencies: jspdf: '>=3.0.1' vue: 3.5.41 @@ -23055,7 +23055,7 @@ snapshots: vue-component-type-helpers@3.3.10: {} - vue-data-ui@3.23.5(vue@3.5.41): + vue-data-ui@3.23.7(vue@3.5.41): dependencies: vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a80b474537..1cb412088d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -43,7 +43,7 @@ ignoreWorkspaceRootCheck: true minimumReleaseAgeExclude: - '@iconify-json/simple-icons@1.2.93' - - vue-data-ui@3.23.0 || 3.23.1 + - vue-data-ui@3.23.0 || 3.23.1 || 3.23.7 - 'nuxt@4.5.2' - '@nuxt/kit@4.5.2' - '@nuxt/nitro-server@4.5.2' From 1a9fd77449c7f09271ca93213a491018783e1dcf Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 19 Aug 2026 16:22:57 +0000 Subject: [PATCH 2/6] chore: remove star history graph (#3191) --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index 0a67d593b3..4dadb4875b 100644 --- a/README.md +++ b/README.md @@ -196,16 +196,6 @@ Made with ❤️ Published under [MIT License](./LICENSE). -## Star History - - - - - - Star History Chart - - - ## Sponsors From 9f6b209d6f7572f5708eb15b985399829b7f75e9 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 21 Aug 2026 16:13:33 +0000 Subject: [PATCH 3/6] chore(deps): update module-replacements (#3194) --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 356acb6c98..67e0da5bfb 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "hls.js": "1.7.0", "ipaddr.js": "2.5.0", "marked": "18.0.9", - "module-replacements": "3.1.0", + "module-replacements": "3.2.0", "nuxt": "4.5.2", "nuxt-og-image": "6.7.8", "ofetch": "1.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfc0c4e3a4..b8879088d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -208,8 +208,8 @@ importers: specifier: 18.0.9 version: 18.0.9 module-replacements: - specifier: 3.1.0 - version: 3.1.0 + specifier: 3.2.0 + version: 3.2.0 nuxt: specifier: 4.5.2 version: 4.5.2(@babel/plugin-syntax-jsx@7.29.7)(@babel/plugin-syntax-typescript@7.29.7)(@oxc-project/types@0.144.0)(@parcel/watcher@2.5.6)(@rollup/plugin-babel@6.1.0)(@types/node@24.13.3)(@upstash/redis@1.38.2)(@vitejs/devtools-kit@0.4.10)(@voidzero-dev/vite-plus-core@0.2.9)(@vue/compiler-sfc@3.5.41)(better-sqlite3@13.0.3)(cac@6.7.14)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.6.0)(ioredis@5.11.1)(lightningcss@1.33.0)(magicast@0.5.4)(optionator@0.9.4)(oxc-parser@0.144.0)(oxlint@1.77.0)(rolldown@1.2.4)(rollup-plugin-visualizer@7.0.1)(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.48.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vue-tsc@3.3.10)(webpack@5.108.4)(yaml@2.9.0) @@ -8272,8 +8272,8 @@ packages: mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} - module-replacements@3.1.0: - resolution: {integrity: sha512-MSTNGqlp2q0seRlrAA/FK3SUkGnmPeexeKWuCjeJ7HobD2RCjk4f8ry8lJ+nUQFDVBAHSdC4TdjyJSaocnR7Uw==} + module-replacements@3.2.0: + resolution: {integrity: sha512-zaDcWtW+kLmYGWCMWAyQ8Je333BYmsBMB2X6q5MKBCI697l7OawNaC5TQqfgPVxhdXBA1AjumQjPMcHyJe1f2A==} motion-dom@12.42.2: resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} @@ -12199,7 +12199,7 @@ snapshots: '@e18e/eslint-plugin@0.8.0(eslint@10.6.0)(oxlint@1.77.0)': dependencies: empathic: 2.0.1 - module-replacements: 3.1.0 + module-replacements: 3.2.0 semver: 7.8.5 optionalDependencies: eslint: 10.6.0(jiti@2.7.0)(supports-color@10.2.2) @@ -19925,7 +19925,7 @@ snapshots: mocked-exports@0.1.1: {} - module-replacements@3.1.0: {} + module-replacements@3.2.0: {} motion-dom@12.42.2: dependencies: From c6ea92551a9347aab4dd6075e70077831cece60c Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Sat, 22 Aug 2026 12:38:29 +0000 Subject: [PATCH 4/6] chore: enable `minimumReleaseAgeExcludePrune` (#3197) --- pnpm-workspace.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1cb412088d..c5f8cb9209 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -43,13 +43,15 @@ ignoreWorkspaceRootCheck: true minimumReleaseAgeExclude: - '@iconify-json/simple-icons@1.2.93' - - vue-data-ui@3.23.0 || 3.23.1 || 3.23.7 + - vue-data-ui@3.23.7 - 'nuxt@4.5.2' - '@nuxt/kit@4.5.2' - '@nuxt/nitro-server@4.5.2' - '@nuxt/schema@4.5.2' - '@nuxt/vite-builder@4.5.2' +minimumReleaseAgeExcludePrune: true + overrides: '@types/node': 24.13.3 nuxt-og-image: ^6.7.5 From 12d0820246d6a15dcae894ce84fdde1e5417149a Mon Sep 17 00:00:00 2001 From: Alec Lloyd Probert <55991794+graphieros@users.noreply.github.com> Date: Sat, 22 Aug 2026 17:29:18 +0000 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20make=20hit=20areas=20of=20the=20char?= =?UTF-8?q?ts=20zoom=20range=20handles=20more=20accessible=20f=E2=80=A6=20?= =?UTF-8?q?(#3199)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 17 +++++++++++------ pnpm-workspace.yaml | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 67e0da5bfb..349223bf76 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "vite-plugin-pwa": "1.3.0", "vite-plus": "catalog:vite-plus", "vue": "3.5.41", - "vue-data-ui": "3.23.7", + "vue-data-ui": "3.23.14", "vue-router": "5.2.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8879088d4..8406da14b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -271,8 +271,8 @@ importers: specifier: 3.5.41 version: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) vue-data-ui: - specifier: 3.23.7 - version: 3.23.7(vue@3.5.41) + specifier: 3.23.14 + version: 3.23.14(vue@3.5.41) vue-router: specifier: 5.2.0 version: 5.2.0(@voidzero-dev/vite-plus-core@0.2.9)(@vue/compiler-sfc@3.5.41)(esbuild@0.28.1)(rolldown@1.2.4)(rollup@4.62.2)(vue@3.5.41)(webpack@5.108.4) @@ -10611,8 +10611,11 @@ packages: vue-component-type-helpers@3.3.10: resolution: {integrity: sha512-t7IQivQ3oD4D01b7s7a9AWzHAcr3DGBIa/1jZREsFQJcFgSL92gqUkqNiHTYgzTt7QDuJa0I9wCeDwEtZICoBQ==} - vue-data-ui@3.23.7: - resolution: {integrity: sha512-QPfRd3oMQYHUydbA7m1M+dzmoCLJieLo4DvE2LZVZSFRyl/qt4PKvx+piCipaYfcllViRShHj15q6AoviIrQKA==} + vue-component-type-helpers@3.3.11: + resolution: {integrity: sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==} + + vue-data-ui@3.23.14: + resolution: {integrity: sha512-/cosH1iTd+lnyvR+5/kqG6AzLbaZdhJCLhNLWvUp1h0mU2fxOOUI/B9zVV0couixVC4+5PAR5pmWqvoDIbsFyQ==} peerDependencies: jspdf: '>=3.0.1' vue: 3.5.41 @@ -15138,7 +15141,7 @@ snapshots: storybook: 10.5.5(@types/react@19.2.17)(prettier@3.9.6)(react@19.2.8)(vite-plus@0.2.9) type-fest: 2.19.0 vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) - vue-component-type-helpers: 3.3.10 + vue-component-type-helpers: 3.3.11 '@swc/helpers@0.5.23': dependencies: @@ -23055,7 +23058,9 @@ snapshots: vue-component-type-helpers@3.3.10: {} - vue-data-ui@3.23.7(vue@3.5.41): + vue-component-type-helpers@3.3.11: {} + + vue-data-ui@3.23.14(vue@3.5.41): dependencies: vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c5f8cb9209..14ee87126f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -43,12 +43,12 @@ ignoreWorkspaceRootCheck: true minimumReleaseAgeExclude: - '@iconify-json/simple-icons@1.2.93' - - vue-data-ui@3.23.7 - 'nuxt@4.5.2' - '@nuxt/kit@4.5.2' - '@nuxt/nitro-server@4.5.2' - '@nuxt/schema@4.5.2' - '@nuxt/vite-builder@4.5.2' + - vue-data-ui@3.23.14 minimumReleaseAgeExcludePrune: true From 836083bc693c9b076105060db9632a469f6f78f9 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 24 Aug 2026 04:07:10 +0000 Subject: [PATCH 6/6] feat(ui): support sorting with semver in timeline (#3192) Co-authored-by: Anthony Fu (via agent) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- app/components/Package/TimelineChart.vue | 101 ++++++------- app/composables/useSettings.ts | 2 - app/composables/useTimelineStableOnly.ts | 35 +++++ .../[[org]]/[packageName].vue | 140 +++++++++++++----- i18n/locales/en.json | 4 + i18n/schema.json | 12 ++ nuxt.config.ts | 2 +- server/api/registry/timeline/[...pkg].get.ts | 53 ++++++- .../registry/timeline/sizes/[...pkg].get.ts | 24 ++- .../api/registry/timeline/pkg.get.spec.ts | 54 ++++++- 10 files changed, 322 insertions(+), 105 deletions(-) create mode 100644 app/composables/useTimelineStableOnly.ts diff --git a/app/components/Package/TimelineChart.vue b/app/components/Package/TimelineChart.vue index d18377771d..d422b00ba9 100644 --- a/app/components/Package/TimelineChart.vue +++ b/app/components/Package/TimelineChart.vue @@ -33,7 +33,6 @@ import { import type { TimelineVersion, SubEvent } from '~~/server/api/registry/timeline/[...pkg].get' import { drawSmallNpmxLogoAndTaglineWatermark } from '~/composables/useChartWatermark' import { useColors } from '~/composables/useColors' -import { parseStableVersion } from '~/utils/versions' import { downloadFileLink } from '~/utils/download' import { useCopyChartPng } from '~/composables/useCopyChartPng' import { useElementSize, useTimeoutFn } from '@vueuse/core' @@ -111,44 +110,8 @@ const convertedData = computed(() => { return addEvaluationFlags(entries, props.versionSubEvents).toReversed() }) -type StableVersion = { - major: number - minor: number - patch: number -} - -const orderedConvertedData = computed(() => { - if (!settings.value.timelineChart.isOrdered) { - return convertedData.value - } - - // Hide pre-releases and reorder stable versions semantically - return convertedData.value - .map(entry => ({ - entry, - parsedVersion: parseStableVersion(entry.version), - })) - .filter( - ( - item, - ): item is { entry: (typeof convertedData.value)[number]; parsedVersion: StableVersion } => { - return item.parsedVersion !== null - }, - ) - .toSorted((a, b) => { - if (a.parsedVersion.major !== b.parsedVersion.major) { - return a.parsedVersion.major - b.parsedVersion.major - } - if (a.parsedVersion.minor !== b.parsedVersion.minor) { - return a.parsedVersion.minor - b.parsedVersion.minor - } - return a.parsedVersion.patch - b.parsedVersion.patch - }) - .map(item => item.entry) -}) - watch( - orderedConvertedData, + convertedData, async () => { await nextTick() const chart = chartRef.value @@ -158,7 +121,7 @@ watch( { flush: 'post' }, ) -const versions = computed(() => orderedConvertedData.value.map(d => d.version)) +const versions = computed(() => convertedData.value.map(d => d.version)) const activeVersionIndex = computed(() => { if (!activeVersion.value) return -1 @@ -166,7 +129,7 @@ const activeVersionIndex = computed(() => { }) const seriesTotalSize = computed(() => { - const values = orderedConvertedData.value.map(d => d.totalSize) + const values = convertedData.value.map(d => d.totalSize) if (!values.length) { return { values, min: 0, max: 0 } } @@ -178,7 +141,7 @@ const seriesTotalSize = computed(() => { }) const seriesDependencies = computed(() => { - const values = orderedConvertedData.value.map(d => d.dependencyCount) + const values = convertedData.value.map(d => d.dependencyCount) if (!values.length) { return { values, min: 0, max: 0 } } @@ -250,7 +213,7 @@ interface DependencySegment { // significantly sized dependency is a segment, the package itself is a segment, // and the rest is a segment ("Other"). const dependencySegments = computed(() => { - const data = orderedConvertedData.value + const data = convertedData.value const reference = data.at(-1) if (!reference) return [] @@ -338,7 +301,7 @@ const datasets = computed<{ ? undefined : E18E_GRADIENT_COLORS, color: colors.value.fgSubtle, - source: orderedConvertedData.value, + source: convertedData.value, }, ], dependencyCount: [ @@ -351,7 +314,7 @@ const datasets = computed<{ ? undefined : E18E_GRADIENT_COLORS, color: colors.value.fgSubtle, - source: orderedConvertedData.value, + source: convertedData.value, }, ], } @@ -577,7 +540,7 @@ const config = computed(() => { svg: commonConfig.value.callbacks!.svg, altCopy: () => copyAltTextForTimelineChart({ - dataset: orderedConvertedData.value, + dataset: convertedData.value, config: { packageName: packageName.value, metric: activeTab.value, @@ -747,7 +710,7 @@ function getErrorDatapointPlots( const indexSelection = computed(() => { if (props.selectedVersion == null) return null - return orderedConvertedData.value.findIndex(v => v.version === props.selectedVersion) + return convertedData.value.findIndex(v => v.version === props.selectedVersion) }) const stackbarConfig = computed(() => ({ @@ -871,9 +834,20 @@ const stackbarConfig = computed(() => ({ function stackbarTooltipTime(datapoint: VueUiStackbarTooltipDatapoint[]): string | undefined { const absoluteIndex = datapoint[0]?.timeLabel?.absoluteIndex if (absoluteIndex == null) return undefined - return orderedConvertedData.value[absoluteIndex]?.time + return convertedData.value[absoluteIndex]?.time } +// Sort order shared with the page + list via the query string (default: publish time) +const sort = usePermalink<'time' | 'semver'>('sort', 'semver') + +// "Stable only" filter shared with the page + list via the query string. +const stableOnly = useTimelineStableOnly() + +const timelineSortOptions = computed(() => [ + { value: 'time' as const, label: $t('package.timeline.chart.sort_time') }, + { value: 'semver' as const, label: $t('package.timeline.chart.sort_semver') }, +]) + const timelineMetricTabs = computed(() => [ { value: 'totalSize' as const, @@ -900,7 +874,7 @@ const timelineMetricTabs = computed(() => [ :class="{ loading: shouldPauseChartAnimations || loading }" id="timeline-chart" > -
+
-
+
+
+ + +