shadcn-vue icon indicating copy to clipboard operation
shadcn-vue copied to clipboard

[Bug]: Broken files for `Select` component when installing over CLI

Open miclaus opened this issue 1 year ago • 1 comments
trafficstars

Describe the bug

When installing the Select component as described on the website like so:

npx shadcn-vue@latest add select

I was getting the following errors:

[plugin:vite:vue] Error parsing JavaScript expression: Unexpected token, expected "," (5:1)

/TestProject/resources/js/Components/ui/select/SelectItem.vue:33:13
32 |      v-bind="forwardedProps"
33 |      :class="
34 |  cn(
   |  ^
35 |    'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
36 |    props.class
[plugin:vite:vue] Error parsing JavaScript expression: Unexpected token, expected "," (6:1)

/TestProject/resources/js/Components/ui/select/SelectContent.vue:55:15
53 |      <SelectContent
54 |        v-bind="{ ...forwarded, ...$attrs }"
55 |        :class="cn(
   |                 ^
56 |    'relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
57 |    position === 'popper' &&

I checked out the installed files SelectItem.vue and SelectContent.vue and noticed that there is an extra square bracket ] placed after the cn(...) function call in each file respectively for the :class attribute.


Code for SelectItem.vue when installing the Select component over the CLI
<script setup>
import { computed } from "vue";
import {
  SelectItem,
  SelectItemIndicator,
  SelectItemText,
  useForwardProps,
} from "radix-vue";
import { Check } from "lucide-vue-next";
import { cn } from "@/lib/utils";

const props = defineProps({
  value: { type: String, required: true },
  disabled: { type: Boolean, required: false },
  textValue: { type: String, required: false },
  asChild: { type: Boolean, required: false },
  as: { type: null, required: false },
  class: { type: null, required: false },
});

const delegatedProps = computed(() => {
  const { class: _, ...delegated } = props;

  return delegated;
});

const forwardedProps = useForwardProps(delegatedProps);
</script>

<template>
  <SelectItem
    v-bind="forwardedProps"
    :class="
cn(
  'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
  props.class
)]"
  >
    <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
      <SelectItemIndicator>
        <Check class="h-4 w-4" />
      </SelectItemIndicator>
    </span>

    <SelectItemText>
      <slot />
    </SelectItemText>
  </SelectItem>
</template>
Code for SelectContent.vue when installing the Select component over the CLI
<script setup>
import { computed } from "vue";
import {
  SelectContent,
  SelectPortal,
  SelectViewport,
  useForwardPropsEmits,
} from "radix-vue";
import { SelectScrollDownButton, SelectScrollUpButton } from ".";
import { cn } from "@/lib/utils";

defineOptions({
  inheritAttrs: false,
});

const props = defineProps({
  forceMount: { type: Boolean, required: false },
  position: { type: String, required: false, default: "popper" },
  bodyLock: { type: Boolean, required: false },
  side: { type: null, required: false },
  sideOffset: { type: Number, required: false },
  align: { type: null, required: false },
  alignOffset: { type: Number, required: false },
  avoidCollisions: { type: Boolean, required: false },
  collisionBoundary: { type: null, required: false },
  collisionPadding: { type: [Number, Object], required: false },
  arrowPadding: { type: Number, required: false },
  sticky: { type: String, required: false },
  hideWhenDetached: { type: Boolean, required: false },
  updatePositionStrategy: { type: String, required: false },
  prioritizePosition: { type: Boolean, required: false },
  asChild: { type: Boolean, required: false },
  as: { type: null, required: false },
  class: { type: null, required: false },
});
const emits = defineEmits([
  "closeAutoFocus",
  "escapeKeyDown",
  "pointerDownOutside",
]);

const delegatedProps = computed(() => {
  const { class: _, ...delegated } = props;

  return delegated;
});

const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>

<template>
  <SelectPortal>
    <SelectContent
      v-bind="{ ...forwarded, ...$attrs }"
      :class="cn(
  'relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
  position === 'popper' &&
  'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
  props.class
)]"
    >
      <SelectScrollUpButton />
      <SelectViewport
        :class="
          cn(
            'p-1',
            position === 'popper' &&
              'h-[--radix-select-trigger-height] w-full min-w-[--radix-select-trigger-width]',
          )
        "
      >
        <slot />
      </SelectViewport>
      <SelectScrollDownButton />
    </SelectContent>
  </SelectPortal>
</template>

Weirdly enough the code in the repository / registry seems to be correct, hence there isn't any ] after the cn(...) function call for the :class attribute:

https://github.com/radix-vue/shadcn-vue/blob/d50ea38f4abccdad5db190ad2b1da26815e4c6aa/apps/www/src/lib/registry/default/ui/select/SelectItem.vue#L31

and

https://github.com/radix-vue/shadcn-vue/blob/d50ea38f4abccdad5db190ad2b1da26815e4c6aa/apps/www/src/lib/registry/default/ui/select/SelectContent.vue#L43

System Info

* macOS
* node 20.15.0
* npm 10.7.0
* Safari 17.5
* npmPackages:
  * @vueuse/core: ^10.11.0 => 10.11.0
  * radix-vue: ^1.8.5 => 1.8.5
  * vue: ^3.4.31 => 3.4.31

Contributes

  • [ ] I am willing to submit a PR to fix this issue
  • [ ] I am willing to submit a PR with failing tests

miclaus avatar Jul 06 '24 17:07 miclaus