{"version":3,"file":"index.cjs","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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"}