[READ-ONLY] a fast, modern browser for the npm registry

fix(a11y): add wcag-aa color contrast (#1170)

Co-authored-by: Daniel Roe <daniel@roe.dev>

authored by

Joaquín Sánchez
Daniel Roe
and committed by
GitHub
5b126986 be007fee

+492 -516
+1 -1
app/components/Compare/ReplacementSuggestion.vue
··· 25 25 class="flex items-start gap-2 px-3 py-2 rounded-lg text-sm" 26 26 :class=" 27 27 variant === 'nodep' 28 - ? 'bg-amber-500/10 border border-amber-600/30 text-amber-700 dark:text-amber-400' 28 + ? 'bg-amber-500/10 border border-amber-600/30 text-amber-800 dark:text-amber-400' 29 29 : 'bg-blue-500/10 border border-blue-600/30 text-blue-700 dark:text-blue-400' 30 30 " 31 31 >
+1 -1
app/components/DependencyPathPopup.vue
··· 68 68 <!-- Path badge button --> 69 69 <button 70 70 type="button" 71 - class="path-badge font-mono text-3xs px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/30 text-amber-700 dark:text-amber-400 transition-all duration-200 ease-out whitespace-nowrap flex items-center gap-1 hover:bg-amber-500/20 hover:border-amber-500/50" 71 + class="path-badge font-mono text-3xs px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/30 text-amber-800 dark:text-amber-400 transition-all duration-200 ease-out whitespace-nowrap flex items-center gap-1 hover:bg-amber-500/20 hover:border-amber-500/50" 72 72 :aria-expanded="isOpen" 73 73 @click.stop="togglePopup" 74 74 >
+1 -1
app/components/Package/Dependencies.vue
··· 117 117 <LinkBase 118 118 v-if="getDeprecatedDepInfo(dep)" 119 119 :to="packageRoute(dep, getDeprecatedDepInfo(dep)!.version)" 120 - class="shrink-0 text-purple-500" 120 + class="shrink-0 text-purple-700 dark:text-purple-500" 121 121 :title="getDeprecatedDepInfo(dep)!.message" 122 122 classicon="i-carbon:warning-hex" 123 123 >
+8 -8
app/components/Package/MetricsBadges.vue
··· 63 63 variant="button-secondary" 64 64 size="small" 65 65 :to="typesHref" 66 - classicon="i-carbon-checkmark" 66 + classicon="i-carbon:checkmark" 67 67 > 68 68 {{ $t('package.metrics.types_label') }} 69 69 </LinkBase> ··· 73 73 :tabindex="0" 74 74 :classicon=" 75 75 isLoading 76 - ? 'i-carbon-circle-dash motion-safe:animate-spin' 76 + ? 'i-carbon:circle-dash motion-safe:animate-spin' 77 77 : hasTypes 78 - ? 'i-carbon-checkmark' 79 - : 'i-carbon-close' 78 + ? 'i-carbon:checkmark' 79 + : 'i-carbon:close' 80 80 " 81 81 > 82 82 {{ $t('package.metrics.types_label') }} ··· 95 95 :variant="hasEsm && !isLoading ? 'default' : 'ghost'" 96 96 :classicon=" 97 97 isLoading 98 - ? 'i-carbon-circle-dash motion-safe:animate-spin' 98 + ? 'i-carbon:circle-dash motion-safe:animate-spin' 99 99 : hasEsm 100 - ? 'i-carbon-checkmark' 101 - : 'i-carbon-close' 100 + ? 'i-carbon:checkmark' 101 + : 'i-carbon:close' 102 102 " 103 103 > 104 104 ESM ··· 113 113 tabindex="0" 114 114 :variant="isLoading ? 'ghost' : 'default'" 115 115 :classicon=" 116 - isLoading ? 'i-carbon-circle-dash motion-safe:animate-spin' : 'i-carbon-checkmark' 116 + isLoading ? 'i-carbon:circle-dash motion-safe:animate-spin' : 'i-carbon:checkmark' 117 117 " 118 118 > 119 119 CJS
+1 -1
app/components/Package/Replacement.vue
··· 18 18 19 19 <template> 20 20 <div 21 - class="border border-amber-600/40 bg-amber-500/10 rounded-lg px-3 py-2 text-base text-amber-700 dark:text-amber-400" 21 + class="border border-amber-600/40 bg-amber-500/10 rounded-lg px-3 py-2 text-base text-amber-800 dark:text-amber-400" 22 22 > 23 23 <h2 class="font-medium mb-1 flex items-center gap-2"> 24 24 <span class="i-carbon-idea w-4 h-4" aria-hidden="true" />
+18 -6
app/components/Package/Versions.vue
··· 359 359 block 360 360 class="text-sm" 361 361 :class=" 362 - row.primaryVersion.deprecated ? 'text-red-400 hover:text-red-300' : undefined 362 + row.primaryVersion.deprecated 363 + ? 'text-red-800 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' 364 + : undefined 363 365 " 364 366 :title=" 365 367 row.primaryVersion.deprecated ··· 415 417 :to="versionRoute(v.version)" 416 418 block 417 419 class="text-xs" 418 - :class="v.deprecated ? 'text-red-400 hover:text-red-300' : undefined" 420 + :class=" 421 + v.deprecated 422 + ? 'text-red-800 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' 423 + : undefined 424 + " 419 425 :title=" 420 426 v.deprecated 421 427 ? $t('package.versions.deprecated_title', { version: v.version }) ··· 514 520 block 515 521 class="text-xs" 516 522 :class=" 517 - row.primaryVersion.deprecated ? 'text-red-400 hover:text-red-300' : undefined 523 + row.primaryVersion.deprecated 524 + ? 'text-red-800 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' 525 + : undefined 518 526 " 519 527 :title=" 520 528 row.primaryVersion.deprecated ··· 588 596 class="text-xs" 589 597 :class=" 590 598 group.versions[0]?.deprecated 591 - ? 'text-red-400 hover:text-red-300' 599 + ? 'text-red-800 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' 592 600 : undefined 593 601 " 594 602 :title=" ··· 649 657 class="text-xs ms-6" 650 658 :class=" 651 659 group.versions[0]?.deprecated 652 - ? 'text-red-400 hover:text-red-300' 660 + ? 'text-red-800 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' 653 661 : undefined 654 662 " 655 663 :title=" ··· 707 715 :to="versionRoute(v.version)" 708 716 block 709 717 class="text-xs" 710 - :class="v.deprecated ? 'text-red-400 hover:text-red-300' : undefined" 718 + :class=" 719 + v.deprecated 720 + ? 'text-red-800 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300' 721 + : undefined 722 + " 711 723 :title=" 712 724 v.deprecated 713 725 ? $t('package.versions.deprecated_title', { version: v.version })
+2 -2
app/components/Package/VulnerabilityTree.vue
··· 21 21 ) 22 22 23 23 // Banner - amber for better light mode contrast 24 - const bannerColor = 'border-amber-600/40 bg-amber-500/10 text-amber-700 dark:text-amber-400' 24 + const bannerColor = 'border-amber-600/40 bg-amber-500/10 text-amber-800 dark:text-amber-400' 25 25 26 26 const severityLabels = computed(() => ({ 27 27 critical: $t('package.vulnerabilities.severity.critical'), ··· 100 100 </span> 101 101 </span> 102 102 <span class="flex items-center gap-2 shrink-0"> 103 - <span class="text-xs opacity-80 hidden sm:inline">{{ summaryText }}</span> 103 + <span class="text-xs op-90 dark:op-80 hidden sm:inline">{{ summaryText }}</span> 104 104 <span 105 105 class="i-carbon:chevron-down w-4 h-4 transition-transform duration-200" 106 106 :class="{ 'rotate-180': isExpanded }"
+2 -2
app/components/Tag/Static.vue
··· 13 13 <template> 14 14 <component 15 15 :is="as" 16 - class="bg-bg-muted text-fg-muted inline-flex gap-x-1 items-center justify-center font-mono border border-transparent rounded-md text-xs px-2 py-0.5" 17 - :class="{ 'opacity-40': variant === 'ghost' }" 16 + class="bg-bg-muted text-fg-muted inline-flex gap-x-1 items-center justify-center font-mono border border-gray-400 dark:border-gray-500 rounded-md text-xs px-2 py-0.5" 17 + :class="{ 'opacity-80 border-dashed': variant === 'ghost' }" 18 18 > 19 19 <span v-if="classicon" class="size-[1em]" :class="classicon" aria-hidden="true" /> 20 20 <slot />
-1
app/pages/index.vue
··· 71 71 > 72 72 {{ $t('tagline') }} 73 73 </p> 74 - 75 74 <search 76 75 class="w-full max-w-xl motion-safe:animate-slide-up motion-safe:animate-fill-both" 77 76 style="animation-delay: 0.2s"
+2 -2
app/pages/package/[[org]]/[name].vue
··· 803 803 804 804 <div 805 805 v-if="deprecationNotice" 806 - class="border border-red-400 bg-red-400/10 rounded-lg px-3 py-2 text-base text-red-400" 806 + class="border border-red-700 dark:border-red-400 bg-red-400/10 rounded-lg px-3 py-2 text-base text-red-700 dark:text-red-400" 807 807 > 808 808 <h2 class="font-medium mb-2"> 809 809 {{ ··· 954 954 /> 955 955 </span> 956 956 <span v-else-if="vulnTreeStatus === 'success'"> 957 - <span v-if="hasVulnerabilities" class="text-amber-500"> 957 + <span v-if="hasVulnerabilities" class="text-amber-700 dark:text-amber-500"> 958 958 {{ numberFormatter.format(vulnCount) }} 959 959 </span> 960 960 <span v-else class="inline-flex items-center gap-1 text-fg-muted">
+5 -4
app/utils/npm/outdated-dependencies.ts
··· 71 71 if (!info) return 'text-fg-subtle' 72 72 // Green for up-to-date (e.g. "latest" constraint) 73 73 if (info.majorsBehind === 0 && info.minorsBehind === 0 && info.resolved === info.latest) { 74 - return 'text-green-500 cursor-help' 74 + return 'text-green-700 dark:text-green-500 cursor-help' 75 75 } 76 76 // Red for major versions behind 77 - if (info.majorsBehind > 0) return 'text-red-500 cursor-help' 77 + if (info.majorsBehind > 0) return 'text-red-700 dark:text-red-500 cursor-help' 78 + // if (info.majorsBehind > 0) return 'text-#db0000 dark:text-red-500 cursor-help' 78 79 // Orange for minor versions behind 79 - if (info.minorsBehind > 0) return 'text-orange-500 cursor-help' 80 + if (info.minorsBehind > 0) return 'text-orange-700 dark:text-orange-500 cursor-help' 80 81 // Yellow for patch versions behind 81 - return 'text-yellow-500 cursor-help' 82 + return 'text-yellow-700 dark:text-yellow-500 cursor-help' 82 83 }
+25 -1
server/utils/shiki.ts
··· 1 + import type { ThemeRegistration } from 'shiki' 1 2 import { createHighlighterCore, type HighlighterCore } from 'shiki/core' 2 3 import { createJavaScriptRegexEngine } from 'shiki/engine/javascript' 3 4 4 5 let highlighter: HighlighterCore | null = null 5 6 7 + function replaceThemeColors( 8 + theme: ThemeRegistration, 9 + replacements: Record<string, string>, 10 + ): ThemeRegistration { 11 + let themeString = JSON.stringify(theme) 12 + for (const [oldColor, newColor] of Object.entries(replacements)) { 13 + themeString = themeString.replaceAll(oldColor, newColor) 14 + themeString = themeString.replaceAll(oldColor.toLowerCase(), newColor) 15 + themeString = themeString.replaceAll(oldColor.toUpperCase(), newColor) 16 + } 17 + return JSON.parse(themeString) 18 + } 19 + 6 20 export async function getShikiHighlighter(): Promise<HighlighterCore> { 7 21 if (!highlighter) { 8 22 highlighter = await createHighlighterCore({ 9 - themes: [import('@shikijs/themes/github-dark'), import('@shikijs/themes/github-light')], 23 + themes: [ 24 + import('@shikijs/themes/github-dark'), 25 + import('@shikijs/themes/github-light').then(t => 26 + replaceThemeColors(t.default ?? t, { 27 + '#22863A': '#227436', // green 28 + '#E36209': '#BA4D02', // orange 29 + '#D73A49': '#CD3443', // red 30 + '#B31D28': '#AC222F', // red 31 + }), 32 + ), 33 + ], 10 34 langs: [ 11 35 // Core web languages 12 36 import('@shikijs/langs/javascript'),
+9 -8
shared/utils/severity.ts
··· 7 7 * Color classes for severity levels (banner style) 8 8 */ 9 9 export const SEVERITY_COLORS: Record<OsvSeverityLevel, string> = { 10 - critical: 'text-red-500 bg-red-500/10 border-red-500/50', 11 - high: 'text-red-400 bg-red-500/10 border-red-500/30', 12 - moderate: 'text-orange-400 bg-orange-500/10 border-orange-500/30', 13 - low: 'text-yellow-400 bg-yellow-500/10 border-yellow-500/30', 10 + critical: 'text-red-700 dark:text-red-500 bg-red-800/10 dark:bg-red-500/10 border-red-500/50', 11 + high: 'text-red-800 dark:text-red-400 bg-red-800/10 dark:bg-red-500/10 border-red-500/30', 12 + moderate: 13 + 'text-orange-800 dark:text-orange-400 bg-orange-600/10 dark:bg-orange-500/10 border-orange-500/30', 14 + low: 'text-yellow-700 dark:text-yellow-400 bg-yellow-500/10 border-yellow-500/30', 14 15 unknown: 'text-fg-muted bg-bg-subtle border-border', 15 16 } 16 17 ··· 18 19 * Color classes for inline severity indicators 19 20 */ 20 21 export const SEVERITY_TEXT_COLORS: Record<OsvSeverityLevel, string> = { 21 - critical: 'text-red-500', 22 - high: 'text-orange-500', 23 - moderate: 'text-yellow-500', 24 - low: 'text-blue-500', 22 + critical: 'text-red-700 dark:text-red-500', 23 + high: 'text-orange-700 dark:text-orange-500', 24 + moderate: 'text-yellow-700 dark:text-yellow-500', 25 + low: 'text-blue-700 dark:text-blue-500', 25 26 unknown: 'text-fg-subtle', 26 27 } 27 28
+416 -477
test/fixtures/npm-registry/packuments/nuxt.json
··· 1 1 { 2 2 "_id": "nuxt", 3 - "_rev": "455-ca2dac9b7cf868285d6533786451a3bb", 3 + "_rev": "461-18ff7c0b277b33499c7e2becf455937d", 4 4 "name": "nuxt", 5 5 "description": "Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.", 6 6 "dist-tags": { ··· 8 8 "2x": "2.18.1", 9 9 "alpha": "4.0.0-alpha.4", 10 10 "rc": "4.0.0-rc.0", 11 - "3x": "3.21.0", 12 - "latest": "4.3.0" 11 + "latest": "4.3.1", 12 + "3x": "3.21.1" 13 13 }, 14 14 "versions": { 15 - "3.21.0": { 15 + "4.3.1": { 16 16 "name": "nuxt", 17 - "version": "3.21.0", 17 + "version": "4.3.1", 18 18 "repository": { 19 19 "type": "git", 20 20 "url": "git+https://github.com/nuxt/nuxt.git", ··· 43 43 "./kit": "./kit.js", 44 44 "./meta": "./meta.js", 45 45 "./app": "./dist/app/index.js", 46 - "./app/defaults": "./dist/app/defaults.js", 47 46 "./package.json": "./package.json" 48 47 }, 49 48 "imports": { 50 49 "#app": "./dist/app/index.js", 51 50 "#app/nuxt": "./dist/app/nuxt.js", 52 - "#unhead/composables": "./dist/head/runtime/composables/v4.js" 51 + "#unhead/composables": "./dist/head/runtime/composables.js" 53 52 }, 54 53 "dependencies": { 55 54 "@dxup/nuxt": "^0.3.2", 56 - "@nuxt/cli": "^3.32.0", 55 + "@nuxt/cli": "^3.33.0", 57 56 "@nuxt/devtools": "^3.1.1", 58 - "@nuxt/telemetry": "^2.6.6", 59 - "@unhead/vue": "^2.1.2", 57 + "@nuxt/telemetry": "^2.7.0", 58 + "@unhead/vue": "^2.1.3", 60 59 "@vue/shared": "^3.5.27", 61 60 "c12": "^3.3.3", 62 61 "chokidar": "^5.0.0", ··· 79 78 "magic-string": "^0.30.21", 80 79 "mlly": "^1.8.0", 81 80 "nanotar": "^0.2.0", 82 - "nypm": "^0.6.2", 81 + "nypm": "^0.6.5", 83 82 "ofetch": "^1.5.1", 84 83 "ohash": "^2.0.11", 85 - "on-change": "^6.0.1", 86 - "oxc-minify": "^0.110.0", 87 - "oxc-parser": "^0.110.0", 88 - "oxc-transform": "^0.110.0", 84 + "on-change": "^6.0.2", 85 + "oxc-minify": "^0.112.0", 86 + "oxc-parser": "^0.112.0", 87 + "oxc-transform": "^0.112.0", 89 88 "oxc-walker": "^0.7.0", 90 89 "pathe": "^2.0.3", 91 - "perfect-debounce": "^2.0.0", 90 + "perfect-debounce": "^2.1.0", 92 91 "pkg-types": "^2.3.0", 93 92 "rou3": "^0.7.12", 94 93 "scule": "^1.3.0", 95 - "semver": "^7.7.3", 94 + "semver": "^7.7.4", 96 95 "std-env": "^3.10.0", 97 96 "tinyglobby": "^0.2.15", 98 97 "ufo": "^1.6.3", ··· 100 99 "uncrypto": "^0.1.3", 101 100 "unctx": "^2.5.0", 102 101 "unimport": "^5.6.0", 103 - "unplugin": "^2.3.11", 102 + "unplugin": "^3.0.0", 104 103 "unplugin-vue-router": "^0.19.2", 105 104 "untyped": "^2.0.0", 106 105 "vue": "^3.5.27", 107 106 "vue-router": "^4.6.4", 108 - "@nuxt/kit": "3.21.0", 109 - "@nuxt/schema": "3.21.0", 110 - "@nuxt/vite-builder": "3.21.0", 111 - "@nuxt/nitro-server": "3.21.0" 107 + "@nuxt/kit": "4.3.1", 108 + "@nuxt/schema": "4.3.1", 109 + "@nuxt/vite-builder": "4.3.1", 110 + "@nuxt/nitro-server": "4.3.1" 112 111 }, 113 112 "devDependencies": { 114 113 "@nuxt/scripts": "0.13.2", 115 - "@parcel/watcher": "2.5.4", 114 + "@parcel/watcher": "2.5.6", 116 115 "@types/estree": "1.0.8", 117 - "@vitejs/plugin-vue": "6.0.3", 118 - "@vitejs/plugin-vue-jsx": "5.1.3", 116 + "@vitejs/plugin-vue": "6.0.4", 117 + "@vitejs/plugin-vue-jsx": "5.1.4", 119 118 "@vue/compiler-sfc": "3.5.27", 120 119 "unbuild": "3.6.1", 121 120 "vite": "7.3.1", 122 - "vitest": "3.2.4", 121 + "vitest": "4.0.18", 123 122 "vue-bundle-renderer": "2.2.0", 124 123 "vue-sfc-transformer": "0.1.17" 125 124 }, 126 125 "peerDependencies": { 127 126 "@parcel/watcher": "^2.1.0", 128 - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0" 127 + "@types/node": ">=18.12.0" 129 128 }, 130 129 "peerDependenciesMeta": { 131 130 "@parcel/watcher": { ··· 142 141 "build:stub": "unbuild --stub", 143 142 "test:attw": "attw --pack" 144 143 }, 145 - "readmeFilename": "README.md", 146 - "_id": "nuxt@3.21.0", 144 + "_id": "nuxt@4.3.1", 147 145 "bugs": { 148 146 "url": "https://github.com/nuxt/nuxt/issues" 149 147 }, 150 - "_integrity": "sha512-K3vX68M0lXbqzvehWb+y6/YqAF+m7MEQQ3mtbcm34ynzB6OpFOJoZV9scBzFd5LehLoYl55CSNpY5vsupyJw7Q==", 151 - "_resolved": "/tmp/20a8f983693ef4840f79a2362a6ff072/nuxt-3.21.0.tgz", 152 - "_from": "file:nuxt-3.21.0.tgz", 153 - "_nodeVersion": "25.4.0", 154 - "_npmVersion": "11.7.0", 148 + "_integrity": "sha512-bl+0rFcT5Ax16aiWFBFPyWcsTob19NTZaDL5P6t0MQdK63AtgS6fN6fwvwdbXtnTk6/YdCzlmuLzXhSM22h0OA==", 149 + "_resolved": "/tmp/9ecd482ad657a700f878d1b78a7b85df/nuxt-4.3.1.tgz", 150 + "_from": "file:nuxt-4.3.1.tgz", 151 + "_nodeVersion": "25.6.0", 152 + "_npmVersion": "11.8.0", 155 153 "dist": { 156 - "integrity": "sha512-K3vX68M0lXbqzvehWb+y6/YqAF+m7MEQQ3mtbcm34ynzB6OpFOJoZV9scBzFd5LehLoYl55CSNpY5vsupyJw7Q==", 157 - "shasum": "efc0d9fc4978b8f4e3fb136ba974ac9d9b8076f6", 158 - "tarball": "https://registry.npmjs.org/nuxt/-/nuxt-3.21.0.tgz", 159 - "fileCount": 243, 160 - "unpackedSize": 796813, 154 + "integrity": "sha512-bl+0rFcT5Ax16aiWFBFPyWcsTob19NTZaDL5P6t0MQdK63AtgS6fN6fwvwdbXtnTk6/YdCzlmuLzXhSM22h0OA==", 155 + "shasum": "f6fefbec9b838e3c3908181b9444d1daedfe7fdb", 156 + "tarball": "https://registry.npmjs.org/nuxt/-/nuxt-4.3.1.tgz", 157 + "fileCount": 235, 158 + "unpackedSize": 716166, 161 159 "attestations": { 162 - "url": "https://registry.npmjs.org/-/npm/v1/attestations/nuxt@3.21.0", 160 + "url": "https://registry.npmjs.org/-/npm/v1/attestations/nuxt@4.3.1", 163 161 "provenance": { 164 162 "predicateType": "https://slsa.dev/provenance/v1" 165 163 } ··· 167 165 "signatures": [ 168 166 { 169 167 "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U", 170 - "sig": "MEUCIHGulqw/n1Qd/TPuT0iHIMZ4BSHTcYXRhnvHDCiT2SKGAiEA81L0um9YDGQ7yeva98leEi93U1UTasu7LEAscOyDjuw=" 168 + "sig": "MEUCIQCSK+w8e6K9B2yI7e1y0MS02D/ODGxjXFUfiilK+WmJdQIgFXhNavhDgpULLztDxw8sn5ARieqftakflL0LlTZTfVM=" 171 169 } 172 170 ] 173 171 }, ··· 188 186 ], 189 187 "_npmOperationalInternal": { 190 188 "host": "s3://npm-registry-packages-npm-production", 191 - "tmp": "tmp/nuxt_3.21.0_1769123090302_0.32709756823214" 189 + "tmp": "tmp/nuxt_4.3.1_1770482496555_0.5369930512778691" 192 190 }, 193 191 "_hasShrinkwrap": false 192 + }, 193 + "3.21.1": { 194 + "name": "nuxt", 195 + "version": "3.21.1", 196 + "license": "MIT", 197 + "_id": "nuxt@3.21.1", 198 + "maintainers": [ 199 + { 200 + "name": "nuxtbot", 201 + "email": "user2@example.com" 202 + } 203 + ], 204 + "homepage": "https://nuxt.com", 205 + "bugs": { 206 + "url": "https://github.com/nuxt/nuxt/issues" 207 + }, 208 + "bin": { 209 + "nuxi": "bin/nuxt.mjs", 210 + "nuxt": "bin/nuxt.mjs" 211 + }, 212 + "dist": { 213 + "shasum": "8e8f6cb2c0d2f263cd53d9c0698495b63472a00b", 214 + "tarball": "https://registry.npmjs.org/nuxt/-/nuxt-3.21.1.tgz", 215 + "fileCount": 243, 216 + "integrity": "sha512-lrrQY2+nN7BhoaBOgWMks0xtKz4qjpczVmM0Uk7tCVQDQTs14eR/YDkjhMM1vCLfzlspW0lBHmJFcGvNUXiT7g==", 217 + "signatures": [ 218 + { 219 + "sig": "MEUCIQCnROCZIseb2C3OtMjmZQzpmwBI9A3T3QILgYhkmFYtSQIgV+kuKosAADi3W2N4yPLR823EmcxAfTuPd+2NoW+nV7Y=", 220 + "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U" 221 + } 222 + ], 223 + "attestations": { 224 + "url": "https://registry.npmjs.org/-/npm/v1/attestations/nuxt@3.21.1", 225 + "provenance": { 226 + "predicateType": "https://slsa.dev/provenance/v1" 227 + } 228 + }, 229 + "unpackedSize": 802293 230 + }, 231 + "type": "module", 232 + "_from": "file:nuxt-3.21.1.tgz", 233 + "types": "./types.d.ts", 234 + "engines": { 235 + "node": "^20.19.0 || >=22.12.0" 236 + }, 237 + "exports": { 238 + ".": { 239 + "types": "./types.d.mts", 240 + "import": "./dist/index.mjs" 241 + }, 242 + "./app": "./dist/app/index.js", 243 + "./kit": "./kit.js", 244 + "./meta": "./meta.js", 245 + "./config": { 246 + "types": "./config.d.ts", 247 + "import": "./config.js", 248 + "require": "./config.cjs" 249 + }, 250 + "./schema": "./schema.js", 251 + "./app/defaults": "./dist/app/defaults.js", 252 + "./package.json": "./package.json" 253 + }, 254 + "imports": { 255 + "#app": "./dist/app/index.js", 256 + "#app/nuxt": "./dist/app/nuxt.js", 257 + "#unhead/composables": "./dist/head/runtime/composables/v4.js" 258 + }, 259 + "scripts": { 260 + "test:attw": "attw --pack", 261 + "build:stub": "unbuild --stub" 262 + }, 263 + "_npmUser": { 264 + "name": "GitHub Actions", 265 + "email": "user1@example.com", 266 + "trustedPublisher": { 267 + "id": "github", 268 + "oidcConfigId": "oidc:d0585aa6-1a29-450d-8bf8-c3440b4bcc0f" 269 + } 270 + }, 271 + "_resolved": "/tmp/7ea460d51aa7dbc32862a6026dea1073/nuxt-3.21.1.tgz", 272 + "_integrity": "sha512-lrrQY2+nN7BhoaBOgWMks0xtKz4qjpczVmM0Uk7tCVQDQTs14eR/YDkjhMM1vCLfzlspW0lBHmJFcGvNUXiT7g==", 273 + "repository": { 274 + "url": "git+https://github.com/nuxt/nuxt.git", 275 + "type": "git", 276 + "directory": "packages/nuxt" 277 + }, 278 + "_npmVersion": "11.8.0", 279 + "description": "Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.", 280 + "directories": {}, 281 + "_nodeVersion": "25.6.0", 282 + "dependencies": { 283 + "h3": "^1.15.5", 284 + "c12": "^3.3.3", 285 + "ufo": "^1.6.3", 286 + "vue": "^3.5.27", 287 + "defu": "^6.1.4", 288 + "errx": "^0.1.0", 289 + "jiti": "^2.6.1", 290 + "mlly": "^1.8.0", 291 + "nypm": "^0.6.5", 292 + "rou3": "^0.7.12", 293 + "destr": "^2.0.5", 294 + "klona": "^2.0.6", 295 + "ohash": "^2.0.11", 296 + "pathe": "^2.0.3", 297 + "scule": "^1.3.0", 298 + "unctx": "^2.5.0", 299 + "ignore": "^7.0.5", 300 + "ofetch": "^1.5.1", 301 + "semver": "^7.7.4", 302 + "compatx": "^0.2.0", 303 + "consola": "^3.4.2", 304 + "devalue": "^5.6.2", 305 + "exsolve": "^1.0.8", 306 + "impound": "^1.0.0", 307 + "nanotar": "^0.2.0", 308 + "std-env": "^3.10.0", 309 + "untyped": "^2.0.0", 310 + "chokidar": "^5.0.0", 311 + "hookable": "^5.5.3", 312 + "knitwork": "^1.3.0", 313 + "uncrypto": "^0.1.3", 314 + "unimport": "^5.6.0", 315 + "unplugin": "^3.0.0", 316 + "@nuxt/cli": "^3.33.0", 317 + "@nuxt/kit": "3.21.1", 318 + "cookie-es": "^2.0.0", 319 + "on-change": "^6.0.2", 320 + "pkg-types": "^2.3.0", 321 + "ultrahtml": "^1.6.0", 322 + "@dxup/nuxt": "^0.3.2", 323 + "oxc-minify": "^0.112.0", 324 + "oxc-parser": "^0.112.0", 325 + "oxc-walker": "^0.7.0", 326 + "tinyglobby": "^0.2.15", 327 + "vue-router": "^4.6.4", 328 + "@unhead/vue": "^2.1.3", 329 + "@vue/shared": "^3.5.27", 330 + "@nuxt/schema": "3.21.1", 331 + "magic-string": "^0.30.21", 332 + "oxc-transform": "^0.112.0", 333 + "@nuxt/devtools": "^3.1.1", 334 + "@nuxt/telemetry": "^2.7.0", 335 + "perfect-debounce": "^2.1.0", 336 + "@nuxt/nitro-server": "3.21.1", 337 + "@nuxt/vite-builder": "3.21.1", 338 + "unplugin-vue-router": "^0.19.2", 339 + "escape-string-regexp": "^5.0.0" 340 + }, 341 + "_hasShrinkwrap": false, 342 + "readmeFilename": "README.md", 343 + "devDependencies": { 344 + "vite": "7.3.1", 345 + "vitest": "4.0.18", 346 + "unbuild": "3.6.1", 347 + "@nuxt/scripts": "0.13.2", 348 + "@types/estree": "1.0.8", 349 + "@parcel/watcher": "2.5.6", 350 + "@vue/compiler-sfc": "3.5.27", 351 + "@vitejs/plugin-vue": "6.0.4", 352 + "vue-bundle-renderer": "2.2.0", 353 + "vue-sfc-transformer": "0.1.17", 354 + "@vitejs/plugin-vue-jsx": "5.1.4" 355 + }, 356 + "peerDependencies": { 357 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 358 + "@parcel/watcher": "^2.1.0" 359 + }, 360 + "peerDependenciesMeta": { 361 + "@types/node": { 362 + "optional": true 363 + }, 364 + "@parcel/watcher": { 365 + "optional": true 366 + } 367 + }, 368 + "_npmOperationalInternal": { 369 + "tmp": "tmp/nuxt_3.21.1_1770482170169_0.647453693478977", 370 + "host": "s3://npm-registry-packages-npm-production" 371 + } 372 + }, 373 + "3.21.0": { 374 + "name": "nuxt", 375 + "version": "3.21.0", 376 + "license": "MIT", 377 + "_id": "nuxt@3.21.0", 378 + "maintainers": [ 379 + { 380 + "name": "nuxtbot", 381 + "email": "user2@example.com" 382 + } 383 + ], 384 + "homepage": "https://nuxt.com", 385 + "bugs": { 386 + "url": "https://github.com/nuxt/nuxt/issues" 387 + }, 388 + "bin": { 389 + "nuxi": "bin/nuxt.mjs", 390 + "nuxt": "bin/nuxt.mjs" 391 + }, 392 + "dist": { 393 + "shasum": "efc0d9fc4978b8f4e3fb136ba974ac9d9b8076f6", 394 + "tarball": "https://registry.npmjs.org/nuxt/-/nuxt-3.21.0.tgz", 395 + "fileCount": 243, 396 + "integrity": "sha512-K3vX68M0lXbqzvehWb+y6/YqAF+m7MEQQ3mtbcm34ynzB6OpFOJoZV9scBzFd5LehLoYl55CSNpY5vsupyJw7Q==", 397 + "signatures": [ 398 + { 399 + "sig": "MEUCIHGulqw/n1Qd/TPuT0iHIMZ4BSHTcYXRhnvHDCiT2SKGAiEA81L0um9YDGQ7yeva98leEi93U1UTasu7LEAscOyDjuw=", 400 + "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U" 401 + } 402 + ], 403 + "attestations": { 404 + "url": "https://registry.npmjs.org/-/npm/v1/attestations/nuxt@3.21.0", 405 + "provenance": { 406 + "predicateType": "https://slsa.dev/provenance/v1" 407 + } 408 + }, 409 + "unpackedSize": 796813 410 + }, 411 + "type": "module", 412 + "_from": "file:nuxt-3.21.0.tgz", 413 + "types": "./types.d.ts", 414 + "engines": { 415 + "node": "^20.19.0 || >=22.12.0" 416 + }, 417 + "exports": { 418 + ".": { 419 + "types": "./types.d.mts", 420 + "import": "./dist/index.mjs" 421 + }, 422 + "./app": "./dist/app/index.js", 423 + "./kit": "./kit.js", 424 + "./meta": "./meta.js", 425 + "./config": { 426 + "types": "./config.d.ts", 427 + "import": "./config.js", 428 + "require": "./config.cjs" 429 + }, 430 + "./schema": "./schema.js", 431 + "./app/defaults": "./dist/app/defaults.js", 432 + "./package.json": "./package.json" 433 + }, 434 + "imports": { 435 + "#app": "./dist/app/index.js", 436 + "#app/nuxt": "./dist/app/nuxt.js", 437 + "#unhead/composables": "./dist/head/runtime/composables/v4.js" 438 + }, 439 + "scripts": { 440 + "test:attw": "attw --pack", 441 + "build:stub": "unbuild --stub" 442 + }, 443 + "_npmUser": { 444 + "name": "GitHub Actions", 445 + "email": "user1@example.com", 446 + "trustedPublisher": { 447 + "id": "github", 448 + "oidcConfigId": "oidc:d0585aa6-1a29-450d-8bf8-c3440b4bcc0f" 449 + } 450 + }, 451 + "_resolved": "/tmp/20a8f983693ef4840f79a2362a6ff072/nuxt-3.21.0.tgz", 452 + "_integrity": "sha512-K3vX68M0lXbqzvehWb+y6/YqAF+m7MEQQ3mtbcm34ynzB6OpFOJoZV9scBzFd5LehLoYl55CSNpY5vsupyJw7Q==", 453 + "repository": { 454 + "url": "git+https://github.com/nuxt/nuxt.git", 455 + "type": "git", 456 + "directory": "packages/nuxt" 457 + }, 458 + "_npmVersion": "11.7.0", 459 + "description": "Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.", 460 + "directories": {}, 461 + "_nodeVersion": "25.4.0", 462 + "dependencies": { 463 + "h3": "^1.15.5", 464 + "c12": "^3.3.3", 465 + "ufo": "^1.6.3", 466 + "vue": "^3.5.27", 467 + "defu": "^6.1.4", 468 + "errx": "^0.1.0", 469 + "jiti": "^2.6.1", 470 + "mlly": "^1.8.0", 471 + "nypm": "^0.6.2", 472 + "rou3": "^0.7.12", 473 + "destr": "^2.0.5", 474 + "klona": "^2.0.6", 475 + "ohash": "^2.0.11", 476 + "pathe": "^2.0.3", 477 + "scule": "^1.3.0", 478 + "unctx": "^2.5.0", 479 + "ignore": "^7.0.5", 480 + "ofetch": "^1.5.1", 481 + "semver": "^7.7.3", 482 + "compatx": "^0.2.0", 483 + "consola": "^3.4.2", 484 + "devalue": "^5.6.2", 485 + "exsolve": "^1.0.8", 486 + "impound": "^1.0.0", 487 + "nanotar": "^0.2.0", 488 + "std-env": "^3.10.0", 489 + "untyped": "^2.0.0", 490 + "chokidar": "^5.0.0", 491 + "hookable": "^5.5.3", 492 + "knitwork": "^1.3.0", 493 + "uncrypto": "^0.1.3", 494 + "unimport": "^5.6.0", 495 + "unplugin": "^2.3.11", 496 + "@nuxt/cli": "^3.32.0", 497 + "@nuxt/kit": "3.21.0", 498 + "cookie-es": "^2.0.0", 499 + "on-change": "^6.0.1", 500 + "pkg-types": "^2.3.0", 501 + "ultrahtml": "^1.6.0", 502 + "@dxup/nuxt": "^0.3.2", 503 + "oxc-minify": "^0.110.0", 504 + "oxc-parser": "^0.110.0", 505 + "oxc-walker": "^0.7.0", 506 + "tinyglobby": "^0.2.15", 507 + "vue-router": "^4.6.4", 508 + "@unhead/vue": "^2.1.2", 509 + "@vue/shared": "^3.5.27", 510 + "@nuxt/schema": "3.21.0", 511 + "magic-string": "^0.30.21", 512 + "oxc-transform": "^0.110.0", 513 + "@nuxt/devtools": "^3.1.1", 514 + "@nuxt/telemetry": "^2.6.6", 515 + "perfect-debounce": "^2.0.0", 516 + "@nuxt/nitro-server": "3.21.0", 517 + "@nuxt/vite-builder": "3.21.0", 518 + "unplugin-vue-router": "^0.19.2", 519 + "escape-string-regexp": "^5.0.0" 520 + }, 521 + "_hasShrinkwrap": false, 522 + "readmeFilename": "README.md", 523 + "devDependencies": { 524 + "vite": "7.3.1", 525 + "vitest": "3.2.4", 526 + "unbuild": "3.6.1", 527 + "@nuxt/scripts": "0.13.2", 528 + "@types/estree": "1.0.8", 529 + "@parcel/watcher": "2.5.4", 530 + "@vue/compiler-sfc": "3.5.27", 531 + "@vitejs/plugin-vue": "6.0.3", 532 + "vue-bundle-renderer": "2.2.0", 533 + "vue-sfc-transformer": "0.1.17", 534 + "@vitejs/plugin-vue-jsx": "5.1.3" 535 + }, 536 + "peerDependencies": { 537 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 538 + "@parcel/watcher": "^2.1.0" 539 + }, 540 + "peerDependenciesMeta": { 541 + "@types/node": { 542 + "optional": true 543 + }, 544 + "@parcel/watcher": { 545 + "optional": true 546 + } 547 + }, 548 + "_npmOperationalInternal": { 549 + "tmp": "tmp/nuxt_3.21.0_1769123090302_0.32709756823214", 550 + "host": "s3://npm-registry-packages-npm-production" 551 + } 194 552 }, 195 553 "4.3.0": { 196 554 "name": "nuxt", ··· 1549 1907 "host": "s3://npm-registry-packages-npm-production" 1550 1908 } 1551 1909 }, 1552 - "4.1.3": { 1553 - "name": "nuxt", 1554 - "version": "4.1.3", 1555 - "license": "MIT", 1556 - "_id": "nuxt@4.1.3", 1557 - "maintainers": [ 1558 - { 1559 - "name": "nuxtbot", 1560 - "email": "user2@example.com" 1561 - }, 1562 - { 1563 - "name": "atinux", 1564 - "email": "user3@example.com" 1565 - }, 1566 - { 1567 - "name": "danielroe", 1568 - "email": "user4@example.com" 1569 - } 1570 - ], 1571 - "homepage": "https://nuxt.com", 1572 - "bugs": { 1573 - "url": "https://github.com/nuxt/nuxt/issues" 1574 - }, 1575 - "bin": { 1576 - "nuxi": "bin/nuxt.mjs", 1577 - "nuxt": "bin/nuxt.mjs" 1578 - }, 1579 - "dist": { 1580 - "shasum": "1b55e2bbe9d55a605b12e160daec3d88229bf8dd", 1581 - "tarball": "https://registry.npmjs.org/nuxt/-/nuxt-4.1.3.tgz", 1582 - "fileCount": 272, 1583 - "integrity": "sha512-FPl+4HNIOTRYWQXtsZe5KJAr/eddFesuXABvcSTnFLYckIfnxcistwmbtPlkJhkW6vr/Jdhef5QqqYYkBsowGg==", 1584 - "signatures": [ 1585 - { 1586 - "sig": "MEUCIHG5xwn2b+JofcKfUZ7+doQWu732QRzvXv4VSCb5vFy3AiEAgsWabR8qZNptgDTv3hh8KIdd9GjkZfEB56qQOYNve7w=", 1587 - "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U" 1588 - } 1589 - ], 1590 - "attestations": { 1591 - "url": "https://registry.npmjs.org/-/npm/v1/attestations/nuxt@4.1.3", 1592 - "provenance": { 1593 - "predicateType": "https://slsa.dev/provenance/v1" 1594 - } 1595 - }, 1596 - "unpackedSize": 769824 1597 - }, 1598 - "type": "module", 1599 - "_from": "file:nuxt-4.1.3.tgz", 1600 - "types": "./types.d.ts", 1601 - "engines": { 1602 - "node": "^20.19.0 || >=22.12.0" 1603 - }, 1604 - "exports": { 1605 - ".": { 1606 - "types": "./types.d.mts", 1607 - "import": "./dist/index.mjs" 1608 - }, 1609 - "./app": { 1610 - "types": "./dist/app/index.d.ts", 1611 - "import": "./dist/app/index.js" 1612 - }, 1613 - "./kit": { 1614 - "types": "./kit.d.ts", 1615 - "import": "./kit.js" 1616 - }, 1617 - "./config": { 1618 - "types": "./config.d.ts", 1619 - "import": "./config.js", 1620 - "require": "./config.cjs" 1621 - }, 1622 - "./schema": { 1623 - "types": "./schema.d.ts", 1624 - "import": "./schema.js" 1625 - }, 1626 - "./package.json": "./package.json" 1627 - }, 1628 - "imports": { 1629 - "#app": { 1630 - "types": "./dist/app/index.d.ts", 1631 - "import": "./dist/app/index.js" 1632 - }, 1633 - "#app/nuxt": { 1634 - "types": "./dist/app/nuxt.d.ts", 1635 - "import": "./dist/app/nuxt.js" 1636 - }, 1637 - "#unhead/composables": { 1638 - "types": "./dist/head/runtime/composables.d.ts", 1639 - "import": "./dist/head/runtime/composables.js" 1640 - } 1641 - }, 1642 - "scripts": { 1643 - "test:attw": "attw --pack" 1644 - }, 1645 - "_npmUser": { 1646 - "name": "GitHub Actions", 1647 - "email": "user1@example.com", 1648 - "trustedPublisher": { 1649 - "id": "github", 1650 - "oidcConfigId": "oidc:d0585aa6-1a29-450d-8bf8-c3440b4bcc0f" 1651 - } 1652 - }, 1653 - "_resolved": "/tmp/b70a93ef69c58d681f42490eb7029543/nuxt-4.1.3.tgz", 1654 - "_integrity": "sha512-FPl+4HNIOTRYWQXtsZe5KJAr/eddFesuXABvcSTnFLYckIfnxcistwmbtPlkJhkW6vr/Jdhef5QqqYYkBsowGg==", 1655 - "repository": { 1656 - "url": "git+https://github.com/nuxt/nuxt.git", 1657 - "type": "git", 1658 - "directory": "packages/nuxt" 1659 - }, 1660 - "_npmVersion": "11.6.0", 1661 - "description": "Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.", 1662 - "directories": {}, 1663 - "_nodeVersion": "24.9.0", 1664 - "dependencies": { 1665 - "h3": "^1.15.4", 1666 - "c12": "^3.3.0", 1667 - "ufo": "^1.6.1", 1668 - "vue": "^3.5.22", 1669 - "defu": "^6.1.4", 1670 - "errx": "^0.1.0", 1671 - "jiti": "^2.6.1", 1672 - "mlly": "^1.8.0", 1673 - "nypm": "^0.6.2", 1674 - "destr": "^2.0.5", 1675 - "klona": "^2.0.6", 1676 - "ohash": "^2.0.11", 1677 - "pathe": "^2.0.3", 1678 - "scule": "^1.3.0", 1679 - "unctx": "^2.4.1", 1680 - "ignore": "^7.0.5", 1681 - "ofetch": "^1.4.1", 1682 - "radix3": "^1.1.2", 1683 - "semver": "^7.7.2", 1684 - "compatx": "^0.2.0", 1685 - "consola": "^3.4.2", 1686 - "devalue": "^5.3.2", 1687 - "esbuild": "^0.25.10", 1688 - "exsolve": "^1.0.7", 1689 - "impound": "^1.0.0", 1690 - "nanotar": "^0.2.0", 1691 - "std-env": "^3.9.0", 1692 - "untyped": "^2.0.0", 1693 - "chokidar": "^4.0.3", 1694 - "hookable": "^5.5.3", 1695 - "knitwork": "^1.2.0", 1696 - "uncrypto": "^0.1.3", 1697 - "unimport": "^5.4.1", 1698 - "unplugin": "^2.3.10", 1699 - "@nuxt/cli": "^3.29.0", 1700 - "@nuxt/kit": "4.1.3", 1701 - "cookie-es": "^2.0.0", 1702 - "nitropack": "^2.12.6", 1703 - "on-change": "^6.0.0", 1704 - "pkg-types": "^2.3.0", 1705 - "ultrahtml": "^1.6.0", 1706 - "unstorage": "^1.17.1", 1707 - "oxc-minify": "^0.94.0", 1708 - "oxc-parser": "^0.94.0", 1709 - "oxc-walker": "^0.5.2", 1710 - "tinyglobby": "^0.2.15", 1711 - "vue-router": "^4.5.1", 1712 - "@unhead/vue": "^2.0.14", 1713 - "@vue/shared": "^3.5.22", 1714 - "@nuxt/schema": "4.1.3", 1715 - "magic-string": "^0.30.19", 1716 - "@nuxt/devalue": "^2.0.2", 1717 - "estree-walker": "^3.0.3", 1718 - "oxc-transform": "^0.94.0", 1719 - "@nuxt/devtools": "^2.6.5", 1720 - "mocked-exports": "^0.1.1", 1721 - "@nuxt/telemetry": "^2.6.6", 1722 - "perfect-debounce": "^2.0.0", 1723 - "vue-devtools-stub": "^0.1.0", 1724 - "@nuxt/vite-builder": "4.1.3", 1725 - "unplugin-vue-router": "^0.15.0", 1726 - "vue-bundle-renderer": "^2.2.0", 1727 - "escape-string-regexp": "^5.0.0" 1728 - }, 1729 - "_hasShrinkwrap": false, 1730 - "devDependencies": { 1731 - "vite": "7.1.9", 1732 - "vitest": "3.2.4", 1733 - "unbuild": "3.6.1", 1734 - "@nuxt/scripts": "0.12.1", 1735 - "@types/estree": "1.0.8", 1736 - "@parcel/watcher": "2.5.1", 1737 - "@vue/compiler-sfc": "3.5.22", 1738 - "@vitejs/plugin-vue": "6.0.1", 1739 - "vue-sfc-transformer": "0.1.17", 1740 - "@vitejs/plugin-vue-jsx": "5.1.1" 1741 - }, 1742 - "peerDependencies": { 1743 - "@types/node": ">=18.12.0", 1744 - "@parcel/watcher": "^2.1.0" 1745 - }, 1746 - "peerDependenciesMeta": { 1747 - "@types/node": { 1748 - "optional": true 1749 - }, 1750 - "@parcel/watcher": { 1751 - "optional": true 1752 - } 1753 - }, 1754 - "_npmOperationalInternal": { 1755 - "tmp": "tmp/nuxt_4.1.3_1759766791655_0.39979724702758235", 1756 - "host": "s3://npm-registry-packages-npm-production" 1757 - } 1758 - }, 1759 - "3.19.3": { 1760 - "name": "nuxt", 1761 - "version": "3.19.3", 1762 - "license": "MIT", 1763 - "_id": "nuxt@3.19.3", 1764 - "maintainers": [ 1765 - { 1766 - "name": "nuxtbot", 1767 - "email": "user2@example.com" 1768 - }, 1769 - { 1770 - "name": "atinux", 1771 - "email": "user3@example.com" 1772 - }, 1773 - { 1774 - "name": "danielroe", 1775 - "email": "user4@example.com" 1776 - } 1777 - ], 1778 - "homepage": "https://nuxt.com", 1779 - "bugs": { 1780 - "url": "https://github.com/nuxt/nuxt/issues" 1781 - }, 1782 - "bin": { 1783 - "nuxi": "bin/nuxt.mjs", 1784 - "nuxt": "bin/nuxt.mjs" 1785 - }, 1786 - "dist": { 1787 - "shasum": "0cfee281c2bcfd81f5785a1935e4a25b77ccb1fd", 1788 - "tarball": "https://registry.npmjs.org/nuxt/-/nuxt-3.19.3.tgz", 1789 - "fileCount": 269, 1790 - "integrity": "sha512-J5vfkt69gamnl81iDgeSi1tZ0ADEesKfZizPfKxY10dMdjuelAo9WYItFmFGWZ9j1+uXtFJ+PLzqGmXfPLBsuw==", 1791 - "signatures": [ 1792 - { 1793 - "sig": "MEQCIGHYKSDvkzCygXoJGzlXxqn8vnIx5dYJfuDGpvmqdDpkAiBuvrrZWKHz46YRxhO8B8iMw6uHg3M1oqOKsaken+RX2Q==", 1794 - "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U" 1795 - } 1796 - ], 1797 - "attestations": { 1798 - "url": "https://registry.npmjs.org/-/npm/v1/attestations/nuxt@3.19.3", 1799 - "provenance": { 1800 - "predicateType": "https://slsa.dev/provenance/v1" 1801 - } 1802 - }, 1803 - "unpackedSize": 842486 1804 - }, 1805 - "type": "module", 1806 - "_from": "file:nuxt-3.19.3.tgz", 1807 - "types": "./types.d.ts", 1808 - "engines": { 1809 - "node": "^20.19.0 || >=22.12.0" 1810 - }, 1811 - "exports": { 1812 - ".": { 1813 - "types": "./types.d.mts", 1814 - "import": "./dist/index.mjs" 1815 - }, 1816 - "./app": { 1817 - "types": "./dist/app/index.d.ts", 1818 - "import": "./dist/app/index.js" 1819 - }, 1820 - "./kit": { 1821 - "types": "./kit.d.ts", 1822 - "import": "./kit.js" 1823 - }, 1824 - "./config": { 1825 - "types": "./config.d.ts", 1826 - "import": "./config.js", 1827 - "require": "./config.cjs" 1828 - }, 1829 - "./schema": { 1830 - "types": "./schema.d.ts", 1831 - "import": "./schema.js" 1832 - }, 1833 - "./app/defaults": { 1834 - "types": "./dist/app/defaults.d.ts", 1835 - "import": "./dist/app/defaults.js" 1836 - }, 1837 - "./package.json": "./package.json" 1838 - }, 1839 - "imports": { 1840 - "#app": { 1841 - "types": "./dist/app/index.d.ts", 1842 - "import": "./dist/app/index.js" 1843 - }, 1844 - "#app/nuxt": { 1845 - "types": "./dist/app/nuxt.d.ts", 1846 - "import": "./dist/app/nuxt.js" 1847 - }, 1848 - "#unhead/composables": { 1849 - "types": "./dist/head/runtime/composables/v4.d.ts", 1850 - "import": "./dist/head/runtime/composables/v4.js" 1851 - } 1852 - }, 1853 - "scripts": { 1854 - "test:attw": "attw --pack" 1855 - }, 1856 - "_npmUser": { 1857 - "name": "GitHub Actions", 1858 - "email": "user1@example.com", 1859 - "trustedPublisher": { 1860 - "id": "github", 1861 - "oidcConfigId": "oidc:d0585aa6-1a29-450d-8bf8-c3440b4bcc0f" 1862 - } 1863 - }, 1864 - "_resolved": "/tmp/1e3e5e103f2d8dbd41d30686d8369d3a/nuxt-3.19.3.tgz", 1865 - "_integrity": "sha512-J5vfkt69gamnl81iDgeSi1tZ0ADEesKfZizPfKxY10dMdjuelAo9WYItFmFGWZ9j1+uXtFJ+PLzqGmXfPLBsuw==", 1866 - "repository": { 1867 - "url": "git+https://github.com/nuxt/nuxt.git", 1868 - "type": "git", 1869 - "directory": "packages/nuxt" 1870 - }, 1871 - "_npmVersion": "11.6.0", 1872 - "description": "Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.", 1873 - "directories": {}, 1874 - "_nodeVersion": "24.9.0", 1875 - "dependencies": { 1876 - "h3": "^1.15.4", 1877 - "c12": "^3.3.0", 1878 - "ufo": "^1.6.1", 1879 - "vue": "^3.5.22", 1880 - "defu": "^6.1.4", 1881 - "errx": "^0.1.0", 1882 - "jiti": "^2.6.1", 1883 - "mlly": "^1.8.0", 1884 - "nypm": "^0.6.2", 1885 - "destr": "^2.0.5", 1886 - "klona": "^2.0.6", 1887 - "ohash": "^2.0.11", 1888 - "pathe": "^2.0.3", 1889 - "scule": "^1.3.0", 1890 - "unctx": "^2.4.1", 1891 - "ignore": "^7.0.5", 1892 - "ofetch": "^1.4.1", 1893 - "radix3": "^1.1.2", 1894 - "semver": "^7.7.2", 1895 - "compatx": "^0.2.0", 1896 - "consola": "^3.4.2", 1897 - "devalue": "^5.3.2", 1898 - "esbuild": "^0.25.10", 1899 - "exsolve": "^1.0.7", 1900 - "impound": "^1.0.0", 1901 - "nanotar": "^0.2.0", 1902 - "std-env": "^3.9.0", 1903 - "untyped": "^2.0.0", 1904 - "chokidar": "^4.0.3", 1905 - "hookable": "^5.5.3", 1906 - "knitwork": "^1.2.0", 1907 - "uncrypto": "^0.1.3", 1908 - "unimport": "^5.4.1", 1909 - "unplugin": "^2.3.10", 1910 - "@nuxt/cli": "^3.29.0", 1911 - "@nuxt/kit": "3.19.3", 1912 - "cookie-es": "^2.0.0", 1913 - "nitropack": "^2.12.6", 1914 - "on-change": "^6.0.0", 1915 - "pkg-types": "^2.3.0", 1916 - "ultrahtml": "^1.6.0", 1917 - "unstorage": "^1.17.1", 1918 - "oxc-minify": "^0.94.0", 1919 - "oxc-parser": "^0.94.0", 1920 - "oxc-walker": "^0.5.2", 1921 - "tinyglobby": "^0.2.15", 1922 - "vue-router": "^4.5.1", 1923 - "@unhead/vue": "^2.0.14", 1924 - "@vue/shared": "^3.5.22", 1925 - "@nuxt/schema": "3.19.3", 1926 - "magic-string": "^0.30.19", 1927 - "@nuxt/devalue": "^2.0.2", 1928 - "estree-walker": "^3.0.3", 1929 - "oxc-transform": "^0.94.0", 1930 - "@nuxt/devtools": "^2.6.5", 1931 - "mocked-exports": "^0.1.1", 1932 - "@nuxt/telemetry": "^2.6.6", 1933 - "perfect-debounce": "^2.0.0", 1934 - "vue-devtools-stub": "^0.1.0", 1935 - "@nuxt/vite-builder": "3.19.3", 1936 - "unplugin-vue-router": "^0.15.0", 1937 - "vue-bundle-renderer": "^2.2.0", 1938 - "escape-string-regexp": "^5.0.0" 1939 - }, 1940 - "_hasShrinkwrap": false, 1941 - "readmeFilename": "README.md", 1942 - "devDependencies": { 1943 - "vite": "7.1.9", 1944 - "vitest": "3.2.4", 1945 - "unbuild": "3.6.1", 1946 - "@nuxt/scripts": "0.12.1", 1947 - "@types/estree": "1.0.8", 1948 - "@parcel/watcher": "2.5.1", 1949 - "@vue/compiler-sfc": "3.5.22", 1950 - "@vitejs/plugin-vue": "6.0.1", 1951 - "vue-sfc-transformer": "0.1.17", 1952 - "@vitejs/plugin-vue-jsx": "5.1.1" 1953 - }, 1954 - "peerDependencies": { 1955 - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1956 - "@parcel/watcher": "^2.1.0" 1957 - }, 1958 - "peerDependenciesMeta": { 1959 - "@types/node": { 1960 - "optional": true 1961 - }, 1962 - "@parcel/watcher": { 1963 - "optional": true 1964 - } 1965 - }, 1966 - "_npmOperationalInternal": { 1967 - "tmp": "tmp/nuxt_3.19.3_1759765893347_0.35567231323311943", 1968 - "host": "s3://npm-registry-packages-npm-production" 1969 - } 1970 - }, 1971 1910 "1.4.5": { 1972 1911 "name": "nuxt", 1973 1912 "version": "1.4.5", ··· 2045 1984 }, 2046 1985 "_npmUser": { 2047 1986 "name": "pi0", 2048 - "email": "user5@example.com" 1987 + "email": "user4@example.com" 2049 1988 }, 2050 1989 "collective": { 2051 1990 "url": "https://opencollective.com/nuxtjs", ··· 2206 2145 }, 2207 2146 "_npmUser": { 2208 2147 "name": "danielroe", 2209 - "email": "user4@example.com" 2148 + "email": "user5@example.com" 2210 2149 }, 2211 2150 "collective": { 2212 2151 "url": "https://opencollective.com/nuxtjs", ··· 2254 2193 "maintainers": [ 2255 2194 { 2256 2195 "name": "pi0", 2257 - "email": "user5@example.com" 2196 + "email": "user4@example.com" 2258 2197 }, 2259 2198 { 2260 2199 "name": "atinux", ··· 2262 2201 }, 2263 2202 { 2264 2203 "name": "danielroe", 2265 - "email": "user4@example.com" 2204 + "email": "user5@example.com" 2266 2205 }, 2267 2206 { 2268 2207 "name": "antfu", ··· 2342 2281 "actor": { 2343 2282 "name": "danielroe", 2344 2283 "type": "user", 2345 - "email": "user4@example.com" 2284 + "email": "user5@example.com" 2346 2285 }, 2347 - "email": "user4@example.com" 2286 + "email": "user5@example.com" 2348 2287 }, 2349 2288 "_resolved": "/private/var/folders/6z/46zhtr8n22zg8nh3bp7cq7c40000gn/T/417e8c8484037480b9304d4af956fc91/nuxt-4.0.0-alpha.4.tgz", 2350 2289 "_integrity": "sha512-7iqrEonNhJhQbiAotARMtiRIeyMVgVcYQN4ZOqrVV2R+Xmol62vUPOQxlJ98ogCNgPDLZAtCgA1jUvsO8r16TA==", ··· 2462 2401 "maintainers": [ 2463 2402 { 2464 2403 "name": "pi0", 2465 - "email": "user5@example.com" 2404 + "email": "user4@example.com" 2466 2405 }, 2467 2406 { 2468 2407 "name": "atinux", ··· 2470 2409 }, 2471 2410 { 2472 2411 "name": "danielroe", 2473 - "email": "user4@example.com" 2412 + "email": "user5@example.com" 2474 2413 }, 2475 2414 { 2476 2415 "name": "antfu", ··· 2550 2489 "actor": { 2551 2490 "name": "danielroe", 2552 2491 "type": "user", 2553 - "email": "user4@example.com" 2492 + "email": "user5@example.com" 2554 2493 }, 2555 - "email": "user4@example.com" 2494 + "email": "user5@example.com" 2556 2495 }, 2557 2496 "_resolved": "/private/var/folders/6z/46zhtr8n22zg8nh3bp7cq7c40000gn/T/4eedfae9c351fc33ba4cbeb15d4f6708/nuxt-4.0.0-rc.0.tgz", 2558 2497 "_integrity": "sha512-0DLesgb0B5ruSkWMk0Ykh9nPR3TFzBQqWn05gfUx6B5KzJe9v+au9uVDRMMvEFy0gxq/9+w7co4VgsEJDaSqaw==", ··· 2664 2603 } 2665 2604 }, 2666 2605 "time": { 2667 - "modified": "2026-01-22T23:04:50.858Z", 2606 + "modified": "2026-02-07T16:41:37.159Z", 2668 2607 "created": "2016-10-26T11:41:36.169Z", 2608 + "4.3.1": "2026-02-07T16:41:36.800Z", 2609 + "3.21.1": "2026-02-07T16:36:10.454Z", 2669 2610 "3.21.0": "2026-01-22T23:04:50.573Z", 2670 2611 "4.3.0": "2026-01-22T23:02:15.086Z", 2671 2612 "4.2.2": "2025-12-09T17:19:31.667Z", ··· 2674 2615 "3.20.1": "2025-11-06T23:53:43.885Z", 2675 2616 "3.20.0": "2025-10-28T11:02:04.225Z", 2676 2617 "4.2.0": "2025-10-25T05:57:26.265Z", 2677 - "4.1.3": "2025-10-06T16:06:31.908Z", 2678 - "3.19.3": "2025-10-06T15:51:33.588Z", 2679 2618 "1.4.5": "2018-11-27T17:49:50.250Z", 2680 2619 "2.18.1": "2024-06-28T11:35:15.434Z", 2681 2620 "4.0.0-alpha.4": "2025-06-27T13:38:04.826Z", ··· 2690 2629 "license": "MIT", 2691 2630 "homepage": "https://nuxt.com", 2692 2631 "repository": { 2693 - "url": "git+https://github.com/nuxt/nuxt.git", 2694 2632 "type": "git", 2633 + "url": "git+https://github.com/nuxt/nuxt.git", 2695 2634 "directory": "packages/nuxt" 2696 2635 }, 2697 2636 "bugs": { 2698 2637 "url": "https://github.com/nuxt/nuxt/issues" 2699 2638 }, 2700 - "readme": "", 2701 - "readmeFilename": "" 2639 + "readme": "[![Nuxt banner](https://github.com/nuxt/nuxt/blob/main/.github/assets/banner.svg)](https://nuxt.com)\n\n# Nuxt\n\n<p>\n <a href=\"https://www.npmjs.com/package/nuxt\"><img src=\"https://img.shields.io/npm/v/nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D\" alt=\"Version\"></a>\n <a href=\"https://www.npmjs.com/package/nuxt\"><img src=\"https://img.shields.io/npm/dm/nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D\" alt=\"Downloads\"></a>\n <a href=\"https://github.com/nuxt/nuxt/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/nuxt/nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D\" alt=\"License\"></a>\n <a href=\"https://nuxt.com/modules\"><img src=\"https://img.shields.io/badge/dynamic/json?url=https://nuxt.com/api/v1/modules&query=$.stats.modules&label=Modules&style=flat&colorA=18181B&colorB=28CF8D\" alt=\"Modules\"></a>\n <a href=\"https://nuxt.com\"><img src=\"https://img.shields.io/badge/Nuxt%20Docs-18181B?logo=nuxt\" alt=\"Website\"></a>\n <a href=\"https://chat.nuxt.dev\"><img src=\"https://img.shields.io/badge/Nuxt%20Discord-18181B?logo=discord\" alt=\"Discord\"></a>\n <a href=\"https://securityscorecards.dev/\"><img src=\"https://api.securityscorecards.dev/projects/github.com/nuxt/nuxt/badge\" alt=\"Nuxt openssf scorecard score\"></a>\n <a href=\"https://deepwiki.com/nuxt/nuxt\"><img src=\"https://deepwiki.com/badge.svg\" alt=\"Ask DeepWiki\"></a>\n</p>\n\nNuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.\n\nIt provides a number of features that make it easy to build fast, SEO-friendly, and scalable web applications, including:\n- Server-side rendering, static site generation, hybrid rendering and edge-side rendering\n- Automatic routing with code-splitting and pre-fetching\n- Data fetching and state management\n- Search engine optimization and defining meta tags\n- Auto imports of components, composables and utils\n- TypeScript with zero configuration\n- Go full-stack with our server/ directory\n- Extensible with [300+ modules](https://nuxt.com/modules)\n- Deployment to a variety of [hosting platforms](https://nuxt.com/deploy)\n- ...[and much more](https://nuxt.com) 🚀\n\n### Table of Contents\n\n- 🚀 [Getting Started](#getting-started)\n- 💻 [Vue Development](#vue-development)\n- 📖 [Documentation](#documentation)\n- 🧩 [Modules](#modules)\n- ❤️ [Contribute](#contribute)\n- 🏠 [Local Development](#local-development)\n- 🛟 [Professional Support](#professional-support)\n- 🔗 [Follow Us](#follow-us)\n- ⚖️ [License](#license)\n\n---\n\n## <a name=\"getting-started\">🚀 Getting Started</a>\n\nUse the following command to create a new starter project. This will create a starter project with all the necessary files and dependencies:\n\n```bash\nnpm create nuxt@latest <my-project>\n```\n\n> [!TIP]\n> Discover also [nuxt.new](https://nuxt.new): Open a Nuxt starter on CodeSandbox, StackBlitz or locally to get up and running in a few seconds.\n\n## <a name=\"vue-development\">💻 Vue Development</a>\n\nSimple, intuitive and powerful, Nuxt lets you write Vue components in a way that makes sense. Every repetitive task is automated, so you can focus on writing your full-stack Vue application with confidence.\n\nExample of an `app.vue`:\n\n```vue\n<script setup lang=\"ts\">\nuseSeoMeta({\n title: 'Meet Nuxt',\n description: 'The Intuitive Vue Framework.',\n})\n</script>\n\n<template>\n <div id=\"app\">\n <AppHeader />\n <NuxtPage />\n <AppFooter />\n </div>\n</template>\n\n<style scoped>\n#app {\n background-color: #020420;\n color: #00DC82;\n}\n</style>\n```\n\n## <a name=\"documentation\">📖 Documentation</a>\n\nWe highly recommend you take a look at the [Nuxt documentation](https://nuxt.com/docs) to level up. It’s a great resource for learning more about the framework. It covers everything from getting started to advanced topics.\n\n## <a name=\"modules\">🧩 Modules</a>\n\nDiscover our [list of modules](https://nuxt.com/modules) to supercharge your Nuxt project, created by the Nuxt team and community.\n\n## <a name=\"contribute\">❤️ Contribute</a>\n\nWe invite you to contribute and help improve Nuxt 💚\n\nHere are a few ways you can get involved:\n- **Reporting Bugs:** If you come across any bugs or issues, please check out the [reporting bugs guide](https://nuxt.com/docs/4.x/community/reporting-bugs) to learn how to submit a bug report.\n- **Suggestions:** Have ideas to enhance Nuxt? We'd love to hear them! Check out the [contribution guide](https://nuxt.com/docs/4.x/community/contribution) to share your suggestions.\n- **Questions:** If you have questions or need assistance, the [getting help guide](https://nuxt.com/docs/4.x/community/getting-help) provides resources to help you out.\n\n## <a name=\"local-development\">🏠 Local Development</a>\n\nFollow the docs to [Set Up Your Local Development Environment](https://nuxt.com/docs/4.x/community/framework-contribution#setup) to contribute to the framework and documentation.\n\n## <a name=\"professional-support\">🛟 Professional Support</a>\n\n- Technical audit & consulting: [Nuxt Experts](https://nuxt.com/enterprise/support)\n- Custom development & more: [Nuxt Agencies Partners](https://nuxt.com/enterprise/agencies)\n\n## <a name=\"follow-us\">🔗 Follow Us</a>\n\n<p valign=\"center\">\n <a href=\"https://go.nuxt.com/discord\"><img width=\"20\" src=\"https://github.com/nuxt/nuxt/blob/main/.github/assets/discord.svg\" alt=\"Discord\"></a>&nbsp;&nbsp;<a href=\"https://go.nuxt.com/x\"><img width=\"20\" src=\"https://github.com/nuxt/nuxt/blob/main/.github/assets/twitter.svg\" alt=\"Twitter\"></a>&nbsp;&nbsp;<a href=\"https://go.nuxt.com/github\"><img width=\"20\" src=\"https://github.com/nuxt/nuxt/blob/main/.github/assets/github.svg\" alt=\"GitHub\"></a>&nbsp;&nbsp;<a href=\"https://go.nuxt.com/bluesky\"><img width=\"20\" src=\"https://github.com/nuxt/nuxt/blob/main/.github/assets/bluesky.svg\" alt=\"Bluesky\"></a>\n</p>\n\n## <a name=\"license\">⚖️ License</a>\n\n[MIT](https://github.com/nuxt/nuxt/blob/main/LICENSE)\n", 2640 + "readmeFilename": "README.md" 2702 2641 }
+1 -1
test/nuxt/components/PackageVersions.spec.ts
··· 215 215 .findAll('a') 216 216 .filter(a => !a.attributes('href')?.startsWith('#') && a.attributes('target') !== '_blank') 217 217 expect(versionLinks.length).toBeGreaterThan(0) 218 - expect(versionLinks[0]?.classes()).toContain('text-red-400') 218 + expect(versionLinks[0]?.classes()).toContain('text-red-800') 219 219 }) 220 220 221 221 it('shows deprecated version in title attribute', async () => {