11<script setup lang="ts">
2- import type { ModuleReplacement } from ' module-replacements'
2+ import type { ModuleReplacement , ModuleReplacementMapping } from ' module-replacements'
3+ import { resolveDocUrl } from ' module-replacements'
4+ import { getReplacementDescription , getReplacementNodeVersion } from ' ~/utils/module-replacements'
35
46const props = defineProps <{
7+ mapping: ModuleReplacementMapping
58 replacement: ModuleReplacement
69}>()
710
8- const mdnUrl = computed (() => {
9- if (props .replacement .type !== ' native' || ! props .replacement .mdnPath ) return null
10- return ` https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/${props .replacement .mdnPath } `
11- })
11+ const externalUrl = computed (() => resolveDocUrl (props .mapping .url ?? props .replacement .url ))
1212
13- const docPath = computed (() => {
14- if (props .replacement .type !== ' documented' || ! props .replacement .docPath ) return null
15- return ` https://e18e.dev/docs/replacements/${props .replacement .docPath }.html `
16- })
13+ const nodeVersion = computed (() => getReplacementNodeVersion (props .replacement ))
14+
15+ const replacementDescription = useMarkdown (() => ({
16+ text: getReplacementDescription (props .replacement ),
17+ }))
1718 </script >
1819
1920<template >
2021 <div
2122 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"
23+ data-testid =" replacement-card"
2224 >
2325 <h2 class =" font-medium mb-1 flex items-center gap-2" >
2426 <span class =" i-lucide:lightbulb w-4 h-4" aria-hidden =" true" />
2527 {{ $t('package.replacement.title') }}
2628 </h2 >
27- <p class = " text-sm m-0 " >
29+ <p >
2830 <i18n-t
29- v-if =" replacement.type === 'native'"
31+ v-if =" nodeVersion && replacement.type === 'native'"
3032 keypath =" package.replacement.native"
3133 scope =" global"
3234 >
3335 <template #replacement >
34- {{ replacement.replacement }}
36+ <span v-if =" replacementDescription" v-html =" replacementDescription" />
37+ <span v-else
38+ ><code >{{ replacement.id }}</code ></span
39+ >
3540 </template >
3641 <template #nodeVersion >
37- {{ replacement. nodeVersion }}
42+ {{ nodeVersion }}
3843 </template >
3944 </i18n-t >
4045 <i18n-t
41- v-else-if =" replacement.type === 'simple '"
42- keypath =" package.replacement.simple "
46+ v-else-if =" replacement.type === 'native '"
47+ keypath =" package.replacement.native_no_version "
4348 scope =" global"
4449 >
45- <template #community >
46- <a
47- href =" https://e18e.dev/docs/replacements/"
48- target =" _blank"
49- rel =" noopener noreferrer"
50- class =" inline-flex items-center gap-1 ms-1 underline underline-offset-4 decoration-amber-600/60 dark:decoration-amber-400/50 hover:decoration-fg transition-colors"
51- >
52- {{ $t('package.replacement.community') }}
53- <span class =" i-lucide:external-link w-3 h-3" aria-hidden =" true" />
54- </a >
55- </template >
5650 <template #replacement >
57- {{ replacement.replacement }}
51+ <span v-if =" replacementDescription" v-html =" replacementDescription" />
52+ <span v-else
53+ ><code >{{ replacement.id }}</code ></span
54+ >
5855 </template >
5956 </i18n-t >
6057 <i18n-t
6158 v-else-if =" replacement.type === 'documented'"
6259 keypath =" package.replacement.documented"
6360 scope =" global"
6461 >
62+ <template #replacement >
63+ <code >{{ replacement.replacementModule }}</code >
64+ </template >
6565 <template #community >
6666 <a
6767 href =" https://e18e.dev/docs/replacements/"
@@ -74,22 +74,18 @@ const docPath = computed(() => {
7474 </a >
7575 </template >
7676 </i18n-t >
77+ <template v-else-if =" replacement .type === ' removal' " >
78+ <span v-html =" replacementDescription" />
79+ </template >
80+ <template v-else-if =" replacement .type === ' simple' " >
81+ <span v-html =" replacementDescription" />
82+ </template >
7783 <template v-else >
7884 {{ $t('package.replacement.none') }}
7985 </template >
8086 <a
81- v-if =" mdnUrl"
82- :href =" mdnUrl"
83- target =" _blank"
84- rel =" noopener noreferrer"
85- class =" inline-flex items-center gap-1 ms-1 underline underline-offset-4 decoration-amber-600/60 dark:decoration-amber-400/50 hover:decoration-fg transition-colors"
86- >
87- {{ $t('package.replacement.mdn') }}
88- <span class =" i-lucide:external-link w-3 h-3" aria-hidden =" true" />
89- </a >
90- <a
91- v-if =" docPath"
92- :href =" docPath"
87+ v-if =" externalUrl"
88+ :href =" externalUrl"
9389 target =" _blank"
9490 rel =" noopener noreferrer"
9591 class =" inline-flex items-center gap-1 ms-1 underline underline-offset-4 decoration-amber-600/60 dark:decoration-amber-400/50 hover:decoration-fg transition-colors"
@@ -98,5 +94,11 @@ const docPath = computed(() => {
9894 <span class =" i-lucide:external-link w-3 h-3" aria-hidden =" true" />
9995 </a >
10096 </p >
97+ <div v-if =" replacement.type === 'simple' && replacement.example" >
98+ <strong class =" block mb-1.5" >{{ $t('package.replacement.example') }}</strong >
99+ <pre
100+ class =" bg-amber-800/10 dark:bg-amber-950/30 p-2 rounded border border-amber-700/20 overflow-x-auto text-xs font-mono leading-relaxed"
101+ ><code >{{ replacement.example }}</code ></pre >
102+ </div >
101103 </div >
102104</template >
0 commit comments