-
Notifications
You must be signed in to change notification settings - Fork 296
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: Nuxt module throwing error due to parsing error (#267)
* chore: add carousel * chore: add oxc-parser * feat: use oxc-parser to get ExportNamedDeclaration node * chore: add todo
- Loading branch information
Showing
12 changed files
with
769 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
packages/module/playground/components/ui/carousel/Carousel.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
<script setup lang="ts"> | ||
import emblaCarouselVue from 'embla-carousel-vue' | ||
import { useProvideCarousel } from './useCarousel' | ||
import type { CarouselEmits, CarouselProps, WithClassAsProps } from './interface' | ||
import { cn } from '@/lib/utils' | ||
const props = withDefaults(defineProps<CarouselProps & WithClassAsProps>(), { | ||
orientation: 'horizontal', | ||
}) | ||
const emits = defineEmits<CarouselEmits>() | ||
const carouselArgs = useProvideCarousel(props, emits) | ||
defineExpose(carouselArgs) | ||
function onKeyDown(event: KeyboardEvent) { | ||
const prevKey = props.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft' | ||
const nextKey = props.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight' | ||
if (event.key === prevKey) { | ||
event.preventDefault() | ||
carouselArgs.scrollPrev() | ||
return | ||
} | ||
if (event.key === nextKey) { | ||
event.preventDefault() | ||
carouselArgs.scrollNext() | ||
} | ||
} | ||
</script> | ||
|
||
<template> | ||
<div | ||
:class="cn('relative', props.class)" | ||
role="region" | ||
aria-roledescription="carousel" | ||
tabindex="0" | ||
@keydown="onKeyDown" | ||
> | ||
<slot v-bind="carouselArgs" /> | ||
</div> | ||
</template> |
29 changes: 29 additions & 0 deletions
29
packages/module/playground/components/ui/carousel/CarouselContent.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<script setup lang="ts"> | ||
import type { WithClassAsProps } from './interface' | ||
import { useCarousel } from './useCarousel' | ||
import { cn } from '@/lib/utils' | ||
defineOptions({ | ||
inheritAttrs: false, | ||
}) | ||
const props = defineProps<WithClassAsProps>() | ||
const { carouselRef, orientation } = useCarousel() | ||
</script> | ||
|
||
<template> | ||
<div ref="carouselRef" class="overflow-hidden"> | ||
<div | ||
:class=" | ||
cn( | ||
'flex', | ||
orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col', | ||
props.class, | ||
)" | ||
v-bind="$attrs" | ||
> | ||
<slot /> | ||
</div> | ||
</div> | ||
</template> |
23 changes: 23 additions & 0 deletions
23
packages/module/playground/components/ui/carousel/CarouselItem.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
<script setup lang="ts"> | ||
import type { WithClassAsProps } from './interface' | ||
import { useCarousel } from './useCarousel' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<WithClassAsProps>() | ||
const { orientation } = useCarousel() | ||
</script> | ||
|
||
<template> | ||
<div | ||
role="group" | ||
aria-roledescription="slide" | ||
:class="cn( | ||
'min-w-0 shrink-0 grow-0 basis-full', | ||
orientation === 'horizontal' ? 'pl-4' : 'pt-4', | ||
props.class, | ||
)" | ||
> | ||
<slot /> | ||
</div> | ||
</template> |
30 changes: 30 additions & 0 deletions
30
packages/module/playground/components/ui/carousel/CarouselNext.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<script setup lang="ts"> | ||
import { ChevronRight } from 'lucide-vue-next' | ||
import { useCarousel } from './useCarousel' | ||
import type { WithClassAsProps } from './interface' | ||
import { cn } from '@/lib/utils' | ||
import { Button } from '@/components/ui/button' | ||
const props = defineProps<WithClassAsProps>() | ||
const { orientation, canScrollNext, scrollNext } = useCarousel() | ||
</script> | ||
|
||
<template> | ||
<Button | ||
:disabled="!canScrollNext" | ||
:class="cn( | ||
'absolute h-10 w-10 rounded-full p-0', | ||
orientation === 'horizontal' | ||
? '-right-12 top-1/2 -translate-y-1/2' | ||
: '-bottom-12 left-1/2 -translate-x-1/2 rotate-90', | ||
props.class, | ||
)" | ||
variant="outline" | ||
@click="scrollNext" | ||
> | ||
<slot> | ||
<ChevronRight class="h-4 w-4 text-current" /> | ||
</slot> | ||
</Button> | ||
</template> |
30 changes: 30 additions & 0 deletions
30
packages/module/playground/components/ui/carousel/CarouselPrevious.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<script setup lang="ts"> | ||
import { ChevronLeft } from 'lucide-vue-next' | ||
import { useCarousel } from './useCarousel' | ||
import type { WithClassAsProps } from './interface' | ||
import { cn } from '@/lib/utils' | ||
import { Button } from '@/components/ui/button' | ||
const props = defineProps<WithClassAsProps>() | ||
const { orientation, canScrollPrev, scrollPrev } = useCarousel() | ||
</script> | ||
|
||
<template> | ||
<Button | ||
:disabled="!canScrollPrev" | ||
:class="cn( | ||
'absolute h-10 w-10 rounded-full p-0', | ||
orientation === 'horizontal' | ||
? '-left-12 top-1/2 -translate-y-1/2' | ||
: '-top-12 left-1/2 -translate-x-1/2 rotate-90', | ||
props.class, | ||
)" | ||
variant="outline" | ||
@click="scrollPrev" | ||
> | ||
<slot> | ||
<ChevronLeft class="h-4 w-4 text-current" /> | ||
</slot> | ||
</Button> | ||
</template> |
10 changes: 10 additions & 0 deletions
10
packages/module/playground/components/ui/carousel/index.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
export { default as Carousel } from './Carousel.vue' | ||
export { default as CarouselContent } from './CarouselContent.vue' | ||
export { default as CarouselItem } from './CarouselItem.vue' | ||
export { default as CarouselPrevious } from './CarouselPrevious.vue' | ||
export { default as CarouselNext } from './CarouselNext.vue' | ||
export { useCarousel } from './useCarousel' | ||
|
||
export type { | ||
EmblaCarouselType as CarouselApi, | ||
} from 'embla-carousel' |
20 changes: 20 additions & 0 deletions
20
packages/module/playground/components/ui/carousel/interface.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import type { | ||
EmblaCarouselType as CarouselApi, | ||
EmblaOptionsType as CarouselOptions, | ||
EmblaPluginType as CarouselPlugin, | ||
} from 'embla-carousel' | ||
import type { HTMLAttributes, Ref } from 'vue' | ||
|
||
export interface CarouselProps { | ||
opts?: CarouselOptions | Ref<CarouselOptions> | ||
plugins?: CarouselPlugin[] | Ref<CarouselPlugin[]> | ||
orientation?: 'horizontal' | 'vertical' | ||
} | ||
|
||
export interface CarouselEmits { | ||
(e: 'init-api', payload: CarouselApi): void | ||
} | ||
|
||
export interface WithClassAsProps { | ||
class?: HTMLAttributes['class'] | ||
} |
57 changes: 57 additions & 0 deletions
57
packages/module/playground/components/ui/carousel/useCarousel.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
import { createInjectionState } from '@vueuse/core' | ||
import emblaCarouselVue from 'embla-carousel-vue' | ||
import { onMounted, ref } from 'vue' | ||
import type { | ||
EmblaCarouselType as CarouselApi, | ||
} from 'embla-carousel' | ||
import type { CarouselEmits, CarouselProps } from './interface' | ||
|
||
const [useProvideCarousel, useInjectCarousel] = createInjectionState( | ||
({ | ||
opts, orientation, plugins, | ||
}: CarouselProps, emits: CarouselEmits) => { | ||
const [emblaNode, emblaApi] = emblaCarouselVue({ | ||
...opts, | ||
axis: orientation === 'horizontal' ? 'x' : 'y', | ||
}, plugins) | ||
|
||
function scrollPrev() { | ||
emblaApi.value?.scrollPrev() | ||
} | ||
function scrollNext() { | ||
emblaApi.value?.scrollNext() | ||
} | ||
|
||
const canScrollNext = ref(true) | ||
const canScrollPrev = ref(true) | ||
|
||
function onSelect(api: CarouselApi) { | ||
canScrollNext.value = api.canScrollNext() | ||
canScrollPrev.value = api.canScrollPrev() | ||
} | ||
|
||
onMounted(() => { | ||
if (!emblaApi.value) | ||
return | ||
|
||
emblaApi.value?.on('init', onSelect) | ||
emblaApi.value?.on('reInit', onSelect) | ||
emblaApi.value?.on('select', onSelect) | ||
|
||
emits('init-api', emblaApi.value) | ||
}) | ||
|
||
return { carouselRef: emblaNode, carouselApi: emblaApi, canScrollPrev, canScrollNext, scrollPrev, scrollNext, orientation } | ||
}, | ||
) | ||
|
||
function useCarousel() { | ||
const carouselState = useInjectCarousel() | ||
|
||
if (!carouselState) | ||
throw new Error('useCarousel must be used within a <Carousel />') | ||
|
||
return carouselState | ||
} | ||
|
||
export { useCarousel, useProvideCarousel } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.