UNPKG

@vuecs/link

Version:

A package containing a link component.

1 lines 13.6 kB
{"version":3,"file":"index.mjs","sources":["../src/utils.ts","../src/component.ts","../src/index.ts"],"sourcesContent":["export function isObject(input: unknown) : input is Record<string, any> {\n return typeof input === 'object' &&\n input !== null &&\n !Array.isArray(input);\n}\n","import type {\n DefineComponent, PropType, VNodeProps, VNodeTypes,\n} from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n resolveDynamicComponent,\n toRef,\n} from 'vue';\nimport type { LinkQuery } from './types';\nimport { isObject } from './utils';\n\nexport const VCLink = defineComponent({\n props: {\n active: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n href: {\n type: String,\n default: undefined,\n },\n prefetch: {\n type: Boolean,\n default: true,\n },\n target: {\n type: String,\n default: '_self',\n },\n to: {\n type: [String, Object] as PropType<string | Record<string, any>>,\n default: undefined,\n },\n query: {\n type: Object as PropType<LinkQuery>,\n },\n },\n emits: ['click', 'clicked'],\n setup(props, { emit, slots }) {\n const query = toRef(props, 'query');\n\n const routerLink = resolveDynamicComponent('RouterLink');\n const nuxtLink = resolveDynamicComponent('NuxtLink');\n\n const computedTag = computed(() => {\n const hasRouter = typeof routerLink !== 'string';\n\n if (!hasRouter || props.disabled || !props.to) {\n return 'a';\n }\n\n if (typeof nuxtLink !== 'string') {\n return 'nuxt-link';\n }\n\n return 'router-link';\n });\n\n const extendLinkWithQuery = (link: string, query: Record<string, any>) => {\n const keys = Object.keys(query);\n if (keys.length === 0) {\n return link;\n }\n\n let searchParams : URLSearchParams;\n if (link.includes('?')) {\n const url = new URL(link, 'http://localhost:3000');\n for (let i = 0; i < keys.length; i++) {\n url.searchParams.set(keys[i], query[keys[i]]);\n }\n\n searchParams = url.searchParams;\n\n [link] = link.split('?');\n } else {\n searchParams = new URLSearchParams(query);\n }\n\n return `${link}?${searchParams.toString()}`;\n };\n\n const isRouterLink = computed(() => computedTag.value !== 'a');\n\n const computedHref = computed(() => {\n if (props.href) {\n if (\n props.query &&\n query.value\n ) {\n return extendLinkWithQuery(props.href, query.value);\n }\n\n return props.href;\n }\n\n if (isRouterLink.value) {\n return null;\n }\n\n return '#';\n });\n\n const computedProps = computed(() => {\n if (!isRouterLink.value) {\n return {};\n }\n\n let to : Record<string, any> | string | undefined;\n\n if (\n props.query &&\n query.value\n ) {\n if (typeof props.to === 'string') {\n to = extendLinkWithQuery(props.to, query.value);\n } else if (isObject(props.to)) {\n to = {\n ...props.to,\n query: {\n ...query.value,\n ...(props.to.query ? { ...props.to.query } : {}),\n },\n };\n }\n } else {\n to = props.to;\n }\n\n return {\n ...(to ? { to } : {}),\n ...(typeof props.prefetch !== 'undefined' ? { prefetch: props.prefetch } : {}),\n };\n });\n\n const computedAttrs = computed(() => ({\n ...(props.href ? { href: props.href } : {}),\n ...(isRouterLink.value ? {} : {\n target: props.target,\n }),\n }));\n\n const buildVNodeProps = () => {\n const onClick = (event: Record<string, any>) => {\n const isEvent: boolean = typeof event.preventDefault !== 'undefined' &&\n typeof event.stopPropagation !== 'undefined' &&\n typeof event.stopImmediatePropagation !== 'undefined';\n\n if (isEvent && props.disabled) {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n } else {\n if (isRouterLink.value) {\n emit('click', event);\n }\n\n emit('clicked', event);\n }\n\n if (\n isEvent &&\n !isRouterLink.value &&\n computedHref.value === '#'\n ) {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n };\n\n const vNodeProps: VNodeProps & Record<string, any> = {\n class: {\n active: props.active,\n disabled: props.disabled,\n },\n ...computedAttrs.value,\n ...computedProps.value,\n onClick,\n };\n\n return vNodeProps;\n };\n\n let component : string | VNodeTypes;\n\n switch (computedTag.value) {\n case 'router-link':\n component = routerLink;\n break;\n case 'nuxt-link':\n component = nuxtLink;\n break;\n default:\n component = 'a';\n }\n\n if (typeof component === 'string') {\n return () => h(\n component as string,\n buildVNodeProps(),\n [\n (typeof slots.default === 'function' ? slots.default() : []),\n ],\n );\n }\n\n return () => h(\n component as DefineComponent,\n buildVNodeProps(),\n {\n default: () => (typeof slots.default === 'function' ? slots.default() : []),\n },\n );\n },\n});\n","import type { App, Plugin } from 'vue';\n\nimport './vue';\n\n// Import vue components\nimport {\n VCLink,\n} from './component';\nimport type { Options } from './types';\n\nexport * from './component';\nexport * from './types';\n\nexport function install(instance: App, options?: Options) : void {\n instance.component('VCLink', VCLink);\n}\n\nexport default {\n install,\n} satisfies Plugin<Options | undefined>;\n"],"names":["isObject","input","Array","isArray","VCLink","defineComponent","props","active","type","Boolean","default","disabled","href","String","undefined","prefetch","target","to","Object","query","emits","setup","emit","slots","toRef","routerLink","resolveDynamicComponent","nuxtLink","computedTag","computed","hasRouter","extendLinkWithQuery","link","keys","length","searchParams","includes","url","URL","i","set","split","URLSearchParams","toString","isRouterLink","value","computedHref","computedProps","computedAttrs","buildVNodeProps","onClick","event","isEvent","preventDefault","stopPropagation","stopImmediatePropagation","vNodeProps","class","component","h","install","instance","options"],"mappings":"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"}