@vibecms/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/engine/index.d.mts +4 -0
  2. package/dist/engine/index.d.ts +4 -0
  3. package/dist/engine/index.js +1226 -0
  4. package/dist/engine/index.js.map +1 -0
  5. package/dist/engine/index.mjs +1184 -0
  6. package/dist/engine/index.mjs.map +1 -0
  7. package/dist/hooks/index.d.mts +27 -0
  8. package/dist/hooks/index.d.ts +27 -0
  9. package/dist/hooks/index.js +75 -0
  10. package/dist/hooks/index.js.map +1 -0
  11. package/dist/hooks/index.mjs +47 -0
  12. package/dist/hooks/index.mjs.map +1 -0
  13. package/dist/index-C3P1J_of.d.ts +339 -0
  14. package/dist/index-CO4uwTdH.d.mts +339 -0
  15. package/dist/index.css +2326 -0
  16. package/dist/index.css.map +1 -0
  17. package/dist/index.d.mts +412 -0
  18. package/dist/index.d.ts +412 -0
  19. package/dist/index.js +3715 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/index.mjs +3587 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/storage/index.d.mts +32 -0
  24. package/dist/storage/index.d.ts +32 -0
  25. package/dist/storage/index.js +103 -0
  26. package/dist/storage/index.js.map +1 -0
  27. package/dist/storage/index.mjs +75 -0
  28. package/dist/storage/index.mjs.map +1 -0
  29. package/dist/types-BkDsDmQJ.d.mts +83 -0
  30. package/dist/types-BkDsDmQJ.d.ts +83 -0
  31. package/dist/ui/index.d.mts +127 -0
  32. package/dist/ui/index.d.ts +127 -0
  33. package/dist/ui/index.js +1119 -0
  34. package/dist/ui/index.js.map +1 -0
  35. package/dist/ui/index.mjs +1030 -0
  36. package/dist/ui/index.mjs.map +1 -0
  37. package/dist/vite-plugin.d.mts +8 -0
  38. package/dist/vite-plugin.d.ts +8 -0
  39. package/dist/vite-plugin.js +193 -0
  40. package/dist/vite-plugin.js.map +1 -0
  41. package/dist/vite-plugin.mjs +165 -0
  42. package/dist/vite-plugin.mjs.map +1 -0
  43. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/button.tsx","../../src/lib/utils.ts","../../src/ui/command.tsx","../../src/ui/dialog.tsx","../../src/ui/input-group.tsx","../../src/ui/input.tsx","../../src/ui/textarea.tsx","../../src/ui/label.tsx","../../src/ui/popover.tsx","../../src/ui/scroll-area.tsx","../../src/ui/sheet.tsx","../../src/ui/switch.tsx","../../src/ui/tooltip.tsx","../../src/ui/SeoHead.tsx","../../src/ui/AuthorCard.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n ButtonPrimitive.Props & VariantProps<typeof buttonVariants>\n>(({ className, variant, size, ...props }, ref) => {\n return (\n <ButtonPrimitive\n ref={ref}\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\n\nimport { cn } from \"../lib/utils\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"./input-group\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden rounded-xl! bg-white p-1 text-neutral-900\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: Omit<React.ComponentProps<typeof Dialog>, \"children\"> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n children: React.ReactNode\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n \"top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0 shadow-2xl border border-neutral-200 bg-white\",\n className\n )}\n showCloseButton={showCloseButton}\n >\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-neutral-500 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 border-none\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1 pb-0\">\n <InputGroup className=\"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-neutral-900 **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-neutral-500\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-neutral-100 data-selected:text-neutral-900 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-neutral-900\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({ ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nconst DialogTrigger = React.forwardRef<\n HTMLButtonElement | HTMLElement,\n DialogPrimitive.Trigger.Props\n>(({ ...props }, ref) => {\n return (\n <DialogPrimitive.Trigger\n ref={ref as React.ForwardedRef<HTMLButtonElement>}\n data-slot=\"dialog-trigger\"\n {...props}\n />\n )\n})\nDialogTrigger.displayName = \"DialogTrigger\"\n\nfunction DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nconst DialogClose = React.forwardRef<\n HTMLButtonElement,\n DialogPrimitive.Close.Props\n>(({ ...props }, ref) => {\n return (\n <DialogPrimitive.Close\n ref={ref}\n data-slot=\"dialog-close\"\n {...props}\n />\n )\n})\nDialogClose.displayName = \"DialogClose\"\n\nconst DialogOverlay = React.forwardRef<\n HTMLDivElement,\n DialogPrimitive.Backdrop.Props\n>(({ className, ...props }, ref) => {\n return (\n <DialogPrimitive.Backdrop\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n})\nDialogOverlay.displayName = \"DialogOverlay\"\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: DialogPrimitive.Popup.Props & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Popup\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-white p-4 text-sm text-neutral-900 ring-1 ring-neutral-200 shadow-xl duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 right-2\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close render={<Button variant=\"outline\" />}>\n Close\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nconst InputGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n }\n)\nInputGroup.displayName = \"InputGroup\"\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nconst InputGroupAddon = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>\n>(({ className, align = \"inline-start\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n})\nInputGroupAddon.displayName = \"InputGroupAddon\"\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\n\nimport { cn } from \"../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <InputPrimitive\n ref={ref}\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst Label = React.forwardRef<HTMLLabelElement, React.ComponentProps<\"label\">>(\n ({ className, ...props }, ref) => {\n return (\n <label\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nconst PopoverTrigger = React.forwardRef<\n HTMLButtonElement | HTMLElement,\n PopoverPrimitive.Trigger.Props\n>(({ ...props }, ref) => {\n return (\n <PopoverPrimitive.Trigger\n ref={ref as React.ForwardedRef<HTMLButtonElement>}\n data-slot=\"popover-trigger\"\n {...props}\n />\n )\n})\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nconst PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverPrimitive.Popup.Props &\n Pick<\n PopoverPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >\n>(\n (\n {\n className,\n align = \"center\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n ...props\n },\n ref\n ) => {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n ref={ref}\n data-slot=\"popover-content\"\n className={cn(\n \"z-[9999] flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-white border border-neutral-200 p-2.5 text-sm text-neutral-900 shadow-xl ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n )\n }\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nconst PopoverHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-0.5 text-sm\", className)}\n {...props}\n />\n )\n})\nPopoverHeader.displayName = \"PopoverHeader\"\n\nconst PopoverTitle = React.forwardRef<\n HTMLHeadingElement,\n PopoverPrimitive.Title.Props\n>(({ className, ...props }, ref) => {\n return (\n <PopoverPrimitive.Title\n ref={ref}\n data-slot=\"popover-title\"\n className={cn(\"font-heading font-medium\", className)}\n {...props}\n />\n )\n})\nPopoverTitle.displayName = \"PopoverTitle\"\n\nconst PopoverDescription = React.forwardRef<\n HTMLParagraphElement,\n PopoverPrimitive.Description.Props\n>(({ className, ...props }, ref) => {\n return (\n <PopoverPrimitive.Description\n ref={ref}\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n )\n})\nPopoverDescription.displayName = \"PopoverDescription\"\n\nexport {\n Popover,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\"\n\nimport { cn } from \"../lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n HTMLDivElement,\n ScrollAreaPrimitive.Root.Props\n>(({ className, children, ...props }, ref) => {\n return (\n <ScrollAreaPrimitive.Root\n ref={ref}\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n})\nScrollArea.displayName = \"ScrollArea\"\n\nconst ScrollBar = React.forwardRef<\n HTMLDivElement,\n ScrollAreaPrimitive.Scrollbar.Props\n>(({ className, orientation = \"vertical\", ...props }, ref) => {\n return (\n <ScrollAreaPrimitive.Scrollbar\n ref={ref}\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.Scrollbar>\n )\n})\nScrollBar.displayName = \"ScrollBar\"\n\nexport { ScrollArea, ScrollBar }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Sheet({ ...props }: SheetPrimitive.Root.Props) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nconst SheetTrigger = React.forwardRef<\n HTMLButtonElement | HTMLElement,\n SheetPrimitive.Trigger.Props\n>(({ ...props }, ref) => {\n return (\n <SheetPrimitive.Trigger\n ref={ref as React.ForwardedRef<HTMLButtonElement>}\n data-slot=\"sheet-trigger\"\n {...props}\n />\n )\n})\nSheetTrigger.displayName = \"SheetTrigger\"\n\nconst SheetClose = React.forwardRef<\n HTMLButtonElement,\n SheetPrimitive.Close.Props\n>(({ ...props }, ref) => {\n return (\n <SheetPrimitive.Close\n ref={ref}\n data-slot=\"sheet-close\"\n {...props}\n />\n )\n})\nSheetClose.displayName = \"SheetClose\"\n\nfunction SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nconst SheetOverlay = React.forwardRef<\n HTMLDivElement,\n SheetPrimitive.Backdrop.Props\n>(({ className, ...props }, ref) => {\n return (\n <SheetPrimitive.Backdrop\n ref={ref}\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n {...props}\n />\n )\n})\nSheetOverlay.displayName = \"SheetOverlay\"\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: SheetPrimitive.Popup.Props & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close\n data-slot=\"sheet-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Popup>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"font-heading text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\n\nimport { cn } from \"../lib/utils\"\n\nconst Switch = React.forwardRef<\n HTMLButtonElement,\n SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n }\n>(({ className, size = \"default\", ...props }, ref) => {\n return (\n <SwitchPrimitive.Root\n ref={ref}\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n})\nSwitch.displayName = \"Switch\"\n\nexport { Switch }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction TooltipProvider({ ...props }: TooltipPrimitive.Provider.Props) {\n return <TooltipPrimitive.Provider {...props} />\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nconst TooltipTrigger = React.forwardRef<\n HTMLButtonElement | HTMLElement,\n TooltipPrimitive.Trigger.Props\n>(({ ...props }, ref) => {\n return (\n <TooltipPrimitive.Trigger\n ref={ref as React.ForwardedRef<HTMLButtonElement>}\n data-slot=\"tooltip-trigger\"\n render={(triggerProps) => (\n <span {...triggerProps} className=\"contents\" />\n )}\n {...props}\n />\n )\n})\nTooltipTrigger.displayName = \"TooltipTrigger\"\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n side = \"top\",\n align = \"center\",\n alignOffset = 0,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<TooltipPrimitive.Positioner.Props, \"side\" | \"sideOffset\" | \"align\" | \"alignOffset\">) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner \n sideOffset={sideOffset} \n side={side} \n align={align} \n alignOffset={alignOffset}\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-[9999] overflow-hidden rounded-md bg-zinc-900 border border-white/10 px-3 py-1.5 text-xs text-white animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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 shadow-xl\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React from 'react';\n\nexport interface SeoData {\n seoTitle?: string;\n seoDescription?: string;\n ogImage?: string;\n keywords?: string;\n}\n\nexport function SeoHead({ data, fallbackSiteName }: { data?: SeoData; fallbackSiteName?: string }) {\n if (!data) return null;\n const title = data.seoTitle || fallbackSiteName || 'VibeCMS Site';\n \n return (\n <>\n <title>{title}</title>\n {data.seoDescription && <meta name=\"description\" content={data.seoDescription} />}\n {data.keywords && <meta name=\"keywords\" content={data.keywords} />}\n {data.ogImage && <meta property=\"og:image\" content={data.ogImage} />}\n <meta property=\"og:title\" content={title} />\n {data.seoDescription && <meta property=\"og:description\" content={data.seoDescription} />}\n </>\n );\n}\n","import React from 'react';\n\nexport interface TeamMemberData {\n name: string;\n role: string;\n bio?: string;\n headshot?: string;\n socialLinks?: Array<{ platform: string; url: string }>;\n}\n\nexport function AuthorCard({ author }: { author?: TeamMemberData }) {\n if (!author) return null;\n\n return (\n <div className=\"flex items-center gap-4 p-4 border rounded-lg bg-neutral-50 border-neutral-200\">\n {author.headshot && (\n <img \n src={author.headshot} \n alt={author.name} \n className=\"w-16 h-16 rounded-full object-cover\"\n />\n )}\n <div>\n <h4 className=\"font-semibold text-lg text-neutral-900\">{author.name}</h4>\n <p className=\"text-sm text-neutral-500 font-medium\">{author.role}</p>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["React","jsx","React","cva","React","jsx","React","jsx","jsx","cva","jsx","jsxs","React","jsx","React","jsx","React","jsx","jsxs","React","XIcon","jsx","jsxs","React","jsx","React","jsx","jsx","jsxs","jsx","jsxs"]}
@@ -0,0 +1,8 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ declare function vitePluginVibeCMS(config?: {
4
+ contentDir?: string;
5
+ publicDir?: string;
6
+ }): Plugin;
7
+
8
+ export { vitePluginVibeCMS };
@@ -0,0 +1,8 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ declare function vitePluginVibeCMS(config?: {
4
+ contentDir?: string;
5
+ publicDir?: string;
6
+ }): Plugin;
7
+
8
+ export { vitePluginVibeCMS };
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/vite-plugin.ts
31
+ var vite_plugin_exports = {};
32
+ __export(vite_plugin_exports, {
33
+ vitePluginVibeCMS: () => vitePluginVibeCMS
34
+ });
35
+ module.exports = __toCommonJS(vite_plugin_exports);
36
+ var import_promises = __toESM(require("fs/promises"));
37
+ var import_path = __toESM(require("path"));
38
+ var import_formidable = __toESM(require("formidable"));
39
+ function vitePluginVibeCMS(config = {}) {
40
+ const contentDir = config.contentDir || "src/content";
41
+ const publicDir = config.publicDir || "public";
42
+ return {
43
+ name: "vite-plugin-vibecms",
44
+ configureServer(server) {
45
+ server.middlewares.use(async (req, res, next) => {
46
+ if (req.url !== "/__vibecms/api") return next();
47
+ try {
48
+ let body = {};
49
+ if (req.headers["content-type"]?.includes("multipart/form-data")) {
50
+ const form = (0, import_formidable.default)({});
51
+ const [fields, files] = await form.parse(req);
52
+ const method2 = Array.isArray(fields.method) ? fields.method[0] : fields.method;
53
+ if (method2 === "writeMedia") {
54
+ const file = Array.isArray(files.file) ? files.file[0] : files.file;
55
+ if (file) {
56
+ const safeName = file.originalFilename?.replace(/[^a-z0-9.-]/gi, "_").toLowerCase() || "upload";
57
+ const uploadDir = import_path.default.join(process.cwd(), publicDir, "assets", "uploads");
58
+ await import_promises.default.mkdir(uploadDir, { recursive: true });
59
+ const targetPath = import_path.default.join(uploadDir, safeName);
60
+ await import_promises.default.copyFile(file.filepath, targetPath);
61
+ let result = { url: `/assets/uploads/${safeName}` };
62
+ try {
63
+ const sizeOf = (await import("image-size")).default;
64
+ const dimensions = sizeOf(targetPath);
65
+ if (dimensions && dimensions.width) {
66
+ result = { ...result, width: dimensions.width, height: dimensions.height, alt: file.originalFilename };
67
+ }
68
+ } catch (e) {
69
+ }
70
+ res.end(JSON.stringify(result));
71
+ return;
72
+ }
73
+ }
74
+ } else {
75
+ const chunks = [];
76
+ for await (const chunk of req) chunks.push(chunk);
77
+ body = JSON.parse(Buffer.concat(chunks).toString());
78
+ }
79
+ const { method, collection, slug, data } = body;
80
+ switch (method) {
81
+ case "read": {
82
+ const filePath = import_path.default.join(process.cwd(), contentDir, collection, `${slug}.json`);
83
+ const content = await import_promises.default.readFile(filePath, "utf-8");
84
+ res.end(content);
85
+ break;
86
+ }
87
+ case "write": {
88
+ const dir = import_path.default.join(process.cwd(), contentDir, collection);
89
+ await import_promises.default.mkdir(dir, { recursive: true });
90
+ const filePath = import_path.default.join(dir, `${slug}.json`);
91
+ await import_promises.default.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
92
+ res.end(JSON.stringify({ success: true }));
93
+ break;
94
+ }
95
+ case "delete": {
96
+ const baseDir = import_path.default.join(process.cwd(), contentDir);
97
+ const cols = await import_promises.default.readdir(baseDir);
98
+ for (const col of cols) {
99
+ if (col === collection) continue;
100
+ const colDir = import_path.default.join(baseDir, col);
101
+ const stat = await import_promises.default.stat(colDir).catch(() => null);
102
+ if (!stat?.isDirectory()) continue;
103
+ const files = await import_promises.default.readdir(colDir);
104
+ for (const file of files) {
105
+ if (!file.endsWith(".json")) continue;
106
+ const content = await import_promises.default.readFile(import_path.default.join(colDir, file), "utf8");
107
+ if (content.includes(`"${slug}"`)) {
108
+ res.statusCode = 400;
109
+ res.end(JSON.stringify({ error: `Referential Integrity Error: Cannot delete "${slug}" because it is referenced by ${col}/${file}` }));
110
+ return;
111
+ }
112
+ }
113
+ }
114
+ const filePath = import_path.default.join(baseDir, collection, `${slug}.json`);
115
+ await import_promises.default.unlink(filePath);
116
+ res.end(JSON.stringify({ success: true }));
117
+ break;
118
+ }
119
+ case "list": {
120
+ const { options } = body;
121
+ const dir = import_path.default.join(process.cwd(), contentDir, collection);
122
+ const files = await import_promises.default.readdir(dir);
123
+ const slugs = files.filter((f) => f.endsWith(".json")).map((f) => f.replace(".json", ""));
124
+ if (options?.withMeta) {
125
+ const metaList = await Promise.all(slugs.map(async (slug2) => {
126
+ try {
127
+ const content = await import_promises.default.readFile(import_path.default.join(dir, `${slug2}.json`), "utf-8");
128
+ const data2 = JSON.parse(content);
129
+ return { slug: slug2, title: data2.title || data2.name || slug2, ...data2 };
130
+ } catch {
131
+ return { slug: slug2, title: slug2 };
132
+ }
133
+ }));
134
+ res.end(JSON.stringify(metaList));
135
+ break;
136
+ }
137
+ res.end(JSON.stringify(slugs));
138
+ break;
139
+ }
140
+ case "pruneMedia": {
141
+ const uploadsDir = import_path.default.join(process.cwd(), publicDir, "assets", "uploads");
142
+ const baseDir = import_path.default.join(process.cwd(), contentDir);
143
+ let usedMedia = /* @__PURE__ */ new Set();
144
+ async function scanDir(dir) {
145
+ if (!require("fs").existsSync(dir)) return;
146
+ const entries = await import_promises.default.readdir(dir, { withFileTypes: true });
147
+ for (const entry of entries) {
148
+ const fullPath = import_path.default.join(dir, entry.name);
149
+ if (entry.isDirectory()) await scanDir(fullPath);
150
+ else if (entry.name.endsWith(".json")) {
151
+ const content = await import_promises.default.readFile(fullPath, "utf-8");
152
+ const regex = /\/assets\/uploads\/([^"'\s\\]+)/g;
153
+ let match;
154
+ while ((match = regex.exec(content)) !== null) {
155
+ usedMedia.add(match[1]);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ await scanDir(baseDir);
161
+ let deletedCount = 0;
162
+ let bytesFreed = 0;
163
+ if (require("fs").existsSync(uploadsDir)) {
164
+ const uFiles = await import_promises.default.readdir(uploadsDir);
165
+ for (const f of uFiles) {
166
+ if (!usedMedia.has(f) && !f.startsWith(".")) {
167
+ const stat = await import_promises.default.stat(import_path.default.join(uploadsDir, f));
168
+ bytesFreed += stat.size;
169
+ await import_promises.default.unlink(import_path.default.join(uploadsDir, f));
170
+ deletedCount++;
171
+ }
172
+ }
173
+ }
174
+ res.end(JSON.stringify({ deletedCount, bytesFreed }));
175
+ break;
176
+ }
177
+ default:
178
+ res.statusCode = 404;
179
+ res.end(JSON.stringify({ error: "Unknown method" }));
180
+ }
181
+ } catch (e) {
182
+ res.statusCode = 500;
183
+ res.end(JSON.stringify({ error: e.message }));
184
+ }
185
+ });
186
+ }
187
+ };
188
+ }
189
+ // Annotate the CommonJS export names for ESM import in node:
190
+ 0 && (module.exports = {
191
+ vitePluginVibeCMS
192
+ });
193
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin.ts"],"sourcesContent":["// packages/core/src/vite-plugin.ts\nimport type { Plugin } from 'vite';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport formidable from 'formidable';\n\nexport function vitePluginVibeCMS(config: { contentDir?: string; publicDir?: string } = {}): Plugin {\n const contentDir = config.contentDir || 'src/content';\n const publicDir = config.publicDir || 'public';\n\n return {\n name: 'vite-plugin-vibecms',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n if (req.url !== '/__vibecms/api') return next();\n\n try {\n let body: any = {};\n \n if (req.headers['content-type']?.includes('multipart/form-data')) {\n const form = formidable({});\n const [fields, files] = await form.parse(req as any);\n const method = Array.isArray(fields.method) ? fields.method[0] : fields.method;\n \n if (method === 'writeMedia') {\n const file = Array.isArray(files.file) ? files.file[0] : files.file;\n if (file) {\n const safeName = file.originalFilename?.replace(/[^a-z0-9.-]/gi, '_').toLowerCase() || 'upload';\n const uploadDir = path.join(process.cwd(), publicDir, 'assets', 'uploads');\n await fs.mkdir(uploadDir, { recursive: true });\n const targetPath = path.join(uploadDir, safeName);\n await fs.copyFile(file.filepath, targetPath);\n \n let result: any = { url: `/assets/uploads/${safeName}` };\n try {\n const sizeOf = (await import('image-size')).default;\n const dimensions = sizeOf(targetPath as any);\n if (dimensions && dimensions.width) {\n result = { ...result, width: dimensions.width, height: dimensions.height, alt: file.originalFilename };\n }\n } catch(e) {}\n \n res.end(JSON.stringify(result));\n return;\n }\n }\n } else {\n const chunks = [];\n for await (const chunk of req) chunks.push(chunk);\n body = JSON.parse(Buffer.concat(chunks).toString());\n }\n\n const { method, collection, slug, data } = body;\n\n switch (method) {\n case 'read': {\n const filePath = path.join(process.cwd(), contentDir, collection, `${slug}.json`);\n const content = await fs.readFile(filePath, 'utf-8');\n res.end(content);\n break;\n }\n case 'write': {\n const dir = path.join(process.cwd(), contentDir, collection);\n await fs.mkdir(dir, { recursive: true });\n const filePath = path.join(dir, `${slug}.json`);\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\n res.end(JSON.stringify({ success: true }));\n break;\n }\n case 'delete': {\n const baseDir = path.join(process.cwd(), contentDir);\n const cols = await fs.readdir(baseDir);\n for (const col of cols) {\n if (col === collection) continue;\n const colDir = path.join(baseDir, col);\n const stat = await fs.stat(colDir).catch(() => null);\n if (!stat?.isDirectory()) continue;\n \n const files = await fs.readdir(colDir);\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const content = await fs.readFile(path.join(colDir, file), 'utf8');\n if (content.includes(`\"${slug}\"`)) {\n res.statusCode = 400;\n res.end(JSON.stringify({ error: `Referential Integrity Error: Cannot delete \"${slug}\" because it is referenced by ${col}/${file}` }));\n return;\n }\n }\n }\n const filePath = path.join(baseDir, collection, `${slug}.json`);\n await fs.unlink(filePath);\n res.end(JSON.stringify({ success: true }));\n break;\n }\n case 'list': {\n const { options } = body;\n const dir = path.join(process.cwd(), contentDir, collection);\n const files = await fs.readdir(dir);\n const slugs = files.filter((f: string) => f.endsWith('.json')).map((f: string) => f.replace('.json', ''));\n \n if (options?.withMeta) {\n const metaList = await Promise.all(slugs.map(async (slug: string) => {\n try {\n const content = await fs.readFile(path.join(dir, `${slug}.json`), 'utf-8');\n const data = JSON.parse(content);\n return { slug, title: data.title || data.name || slug, ...data };\n } catch {\n return { slug, title: slug };\n }\n }));\n res.end(JSON.stringify(metaList));\n break;\n }\n res.end(JSON.stringify(slugs));\n break;\n }\n case 'pruneMedia': {\n const uploadsDir = path.join(process.cwd(), publicDir, 'assets', 'uploads');\n const baseDir = path.join(process.cwd(), contentDir);\n let usedMedia = new Set<string>();\n \n async function scanDir(dir: string) {\n if (!require('fs').existsSync(dir)) return;\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) await scanDir(fullPath);\n else if (entry.name.endsWith('.json')) {\n const content = await fs.readFile(fullPath, 'utf-8');\n const regex = /\\/assets\\/uploads\\/([^\"'\\s\\\\]+)/g;\n let match;\n while ((match = regex.exec(content)) !== null) {\n usedMedia.add(match[1]);\n }\n }\n }\n }\n await scanDir(baseDir);\n \n let deletedCount = 0;\n let bytesFreed = 0;\n if (require('fs').existsSync(uploadsDir)) {\n const uFiles = await fs.readdir(uploadsDir);\n for (const f of uFiles) {\n if (!usedMedia.has(f) && !f.startsWith('.')) {\n const stat = await fs.stat(path.join(uploadsDir, f));\n bytesFreed += stat.size;\n await fs.unlink(path.join(uploadsDir, f));\n deletedCount++;\n }\n }\n }\n res.end(JSON.stringify({ deletedCount, bytesFreed }));\n break;\n }\n default:\n res.statusCode = 404;\n res.end(JSON.stringify({ error: 'Unknown method' }));\n }\n } catch (e: any) {\n res.statusCode = 500;\n res.end(JSON.stringify({ error: e.message }));\n }\n });\n }\n };\n}\n"],"mappings":"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","names":["formidable","method","path","fs","slug","data"]}
@@ -0,0 +1,165 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ // src/vite-plugin.ts
9
+ import fs from "fs/promises";
10
+ import path from "path";
11
+ import formidable from "formidable";
12
+ function vitePluginVibeCMS(config = {}) {
13
+ const contentDir = config.contentDir || "src/content";
14
+ const publicDir = config.publicDir || "public";
15
+ return {
16
+ name: "vite-plugin-vibecms",
17
+ configureServer(server) {
18
+ server.middlewares.use(async (req, res, next) => {
19
+ if (req.url !== "/__vibecms/api") return next();
20
+ try {
21
+ let body = {};
22
+ if (req.headers["content-type"]?.includes("multipart/form-data")) {
23
+ const form = formidable({});
24
+ const [fields, files] = await form.parse(req);
25
+ const method2 = Array.isArray(fields.method) ? fields.method[0] : fields.method;
26
+ if (method2 === "writeMedia") {
27
+ const file = Array.isArray(files.file) ? files.file[0] : files.file;
28
+ if (file) {
29
+ const safeName = file.originalFilename?.replace(/[^a-z0-9.-]/gi, "_").toLowerCase() || "upload";
30
+ const uploadDir = path.join(process.cwd(), publicDir, "assets", "uploads");
31
+ await fs.mkdir(uploadDir, { recursive: true });
32
+ const targetPath = path.join(uploadDir, safeName);
33
+ await fs.copyFile(file.filepath, targetPath);
34
+ let result = { url: `/assets/uploads/${safeName}` };
35
+ try {
36
+ const sizeOf = (await import("image-size")).default;
37
+ const dimensions = sizeOf(targetPath);
38
+ if (dimensions && dimensions.width) {
39
+ result = { ...result, width: dimensions.width, height: dimensions.height, alt: file.originalFilename };
40
+ }
41
+ } catch (e) {
42
+ }
43
+ res.end(JSON.stringify(result));
44
+ return;
45
+ }
46
+ }
47
+ } else {
48
+ const chunks = [];
49
+ for await (const chunk of req) chunks.push(chunk);
50
+ body = JSON.parse(Buffer.concat(chunks).toString());
51
+ }
52
+ const { method, collection, slug, data } = body;
53
+ switch (method) {
54
+ case "read": {
55
+ const filePath = path.join(process.cwd(), contentDir, collection, `${slug}.json`);
56
+ const content = await fs.readFile(filePath, "utf-8");
57
+ res.end(content);
58
+ break;
59
+ }
60
+ case "write": {
61
+ const dir = path.join(process.cwd(), contentDir, collection);
62
+ await fs.mkdir(dir, { recursive: true });
63
+ const filePath = path.join(dir, `${slug}.json`);
64
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
65
+ res.end(JSON.stringify({ success: true }));
66
+ break;
67
+ }
68
+ case "delete": {
69
+ const baseDir = path.join(process.cwd(), contentDir);
70
+ const cols = await fs.readdir(baseDir);
71
+ for (const col of cols) {
72
+ if (col === collection) continue;
73
+ const colDir = path.join(baseDir, col);
74
+ const stat = await fs.stat(colDir).catch(() => null);
75
+ if (!stat?.isDirectory()) continue;
76
+ const files = await fs.readdir(colDir);
77
+ for (const file of files) {
78
+ if (!file.endsWith(".json")) continue;
79
+ const content = await fs.readFile(path.join(colDir, file), "utf8");
80
+ if (content.includes(`"${slug}"`)) {
81
+ res.statusCode = 400;
82
+ res.end(JSON.stringify({ error: `Referential Integrity Error: Cannot delete "${slug}" because it is referenced by ${col}/${file}` }));
83
+ return;
84
+ }
85
+ }
86
+ }
87
+ const filePath = path.join(baseDir, collection, `${slug}.json`);
88
+ await fs.unlink(filePath);
89
+ res.end(JSON.stringify({ success: true }));
90
+ break;
91
+ }
92
+ case "list": {
93
+ const { options } = body;
94
+ const dir = path.join(process.cwd(), contentDir, collection);
95
+ const files = await fs.readdir(dir);
96
+ const slugs = files.filter((f) => f.endsWith(".json")).map((f) => f.replace(".json", ""));
97
+ if (options?.withMeta) {
98
+ const metaList = await Promise.all(slugs.map(async (slug2) => {
99
+ try {
100
+ const content = await fs.readFile(path.join(dir, `${slug2}.json`), "utf-8");
101
+ const data2 = JSON.parse(content);
102
+ return { slug: slug2, title: data2.title || data2.name || slug2, ...data2 };
103
+ } catch {
104
+ return { slug: slug2, title: slug2 };
105
+ }
106
+ }));
107
+ res.end(JSON.stringify(metaList));
108
+ break;
109
+ }
110
+ res.end(JSON.stringify(slugs));
111
+ break;
112
+ }
113
+ case "pruneMedia": {
114
+ const uploadsDir = path.join(process.cwd(), publicDir, "assets", "uploads");
115
+ const baseDir = path.join(process.cwd(), contentDir);
116
+ let usedMedia = /* @__PURE__ */ new Set();
117
+ async function scanDir(dir) {
118
+ if (!__require("fs").existsSync(dir)) return;
119
+ const entries = await fs.readdir(dir, { withFileTypes: true });
120
+ for (const entry of entries) {
121
+ const fullPath = path.join(dir, entry.name);
122
+ if (entry.isDirectory()) await scanDir(fullPath);
123
+ else if (entry.name.endsWith(".json")) {
124
+ const content = await fs.readFile(fullPath, "utf-8");
125
+ const regex = /\/assets\/uploads\/([^"'\s\\]+)/g;
126
+ let match;
127
+ while ((match = regex.exec(content)) !== null) {
128
+ usedMedia.add(match[1]);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ await scanDir(baseDir);
134
+ let deletedCount = 0;
135
+ let bytesFreed = 0;
136
+ if (__require("fs").existsSync(uploadsDir)) {
137
+ const uFiles = await fs.readdir(uploadsDir);
138
+ for (const f of uFiles) {
139
+ if (!usedMedia.has(f) && !f.startsWith(".")) {
140
+ const stat = await fs.stat(path.join(uploadsDir, f));
141
+ bytesFreed += stat.size;
142
+ await fs.unlink(path.join(uploadsDir, f));
143
+ deletedCount++;
144
+ }
145
+ }
146
+ }
147
+ res.end(JSON.stringify({ deletedCount, bytesFreed }));
148
+ break;
149
+ }
150
+ default:
151
+ res.statusCode = 404;
152
+ res.end(JSON.stringify({ error: "Unknown method" }));
153
+ }
154
+ } catch (e) {
155
+ res.statusCode = 500;
156
+ res.end(JSON.stringify({ error: e.message }));
157
+ }
158
+ });
159
+ }
160
+ };
161
+ }
162
+ export {
163
+ vitePluginVibeCMS
164
+ };
165
+ //# sourceMappingURL=vite-plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin.ts"],"sourcesContent":["// packages/core/src/vite-plugin.ts\nimport type { Plugin } from 'vite';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport formidable from 'formidable';\n\nexport function vitePluginVibeCMS(config: { contentDir?: string; publicDir?: string } = {}): Plugin {\n const contentDir = config.contentDir || 'src/content';\n const publicDir = config.publicDir || 'public';\n\n return {\n name: 'vite-plugin-vibecms',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n if (req.url !== '/__vibecms/api') return next();\n\n try {\n let body: any = {};\n \n if (req.headers['content-type']?.includes('multipart/form-data')) {\n const form = formidable({});\n const [fields, files] = await form.parse(req as any);\n const method = Array.isArray(fields.method) ? fields.method[0] : fields.method;\n \n if (method === 'writeMedia') {\n const file = Array.isArray(files.file) ? files.file[0] : files.file;\n if (file) {\n const safeName = file.originalFilename?.replace(/[^a-z0-9.-]/gi, '_').toLowerCase() || 'upload';\n const uploadDir = path.join(process.cwd(), publicDir, 'assets', 'uploads');\n await fs.mkdir(uploadDir, { recursive: true });\n const targetPath = path.join(uploadDir, safeName);\n await fs.copyFile(file.filepath, targetPath);\n \n let result: any = { url: `/assets/uploads/${safeName}` };\n try {\n const sizeOf = (await import('image-size')).default;\n const dimensions = sizeOf(targetPath as any);\n if (dimensions && dimensions.width) {\n result = { ...result, width: dimensions.width, height: dimensions.height, alt: file.originalFilename };\n }\n } catch(e) {}\n \n res.end(JSON.stringify(result));\n return;\n }\n }\n } else {\n const chunks = [];\n for await (const chunk of req) chunks.push(chunk);\n body = JSON.parse(Buffer.concat(chunks).toString());\n }\n\n const { method, collection, slug, data } = body;\n\n switch (method) {\n case 'read': {\n const filePath = path.join(process.cwd(), contentDir, collection, `${slug}.json`);\n const content = await fs.readFile(filePath, 'utf-8');\n res.end(content);\n break;\n }\n case 'write': {\n const dir = path.join(process.cwd(), contentDir, collection);\n await fs.mkdir(dir, { recursive: true });\n const filePath = path.join(dir, `${slug}.json`);\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\n res.end(JSON.stringify({ success: true }));\n break;\n }\n case 'delete': {\n const baseDir = path.join(process.cwd(), contentDir);\n const cols = await fs.readdir(baseDir);\n for (const col of cols) {\n if (col === collection) continue;\n const colDir = path.join(baseDir, col);\n const stat = await fs.stat(colDir).catch(() => null);\n if (!stat?.isDirectory()) continue;\n \n const files = await fs.readdir(colDir);\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const content = await fs.readFile(path.join(colDir, file), 'utf8');\n if (content.includes(`\"${slug}\"`)) {\n res.statusCode = 400;\n res.end(JSON.stringify({ error: `Referential Integrity Error: Cannot delete \"${slug}\" because it is referenced by ${col}/${file}` }));\n return;\n }\n }\n }\n const filePath = path.join(baseDir, collection, `${slug}.json`);\n await fs.unlink(filePath);\n res.end(JSON.stringify({ success: true }));\n break;\n }\n case 'list': {\n const { options } = body;\n const dir = path.join(process.cwd(), contentDir, collection);\n const files = await fs.readdir(dir);\n const slugs = files.filter((f: string) => f.endsWith('.json')).map((f: string) => f.replace('.json', ''));\n \n if (options?.withMeta) {\n const metaList = await Promise.all(slugs.map(async (slug: string) => {\n try {\n const content = await fs.readFile(path.join(dir, `${slug}.json`), 'utf-8');\n const data = JSON.parse(content);\n return { slug, title: data.title || data.name || slug, ...data };\n } catch {\n return { slug, title: slug };\n }\n }));\n res.end(JSON.stringify(metaList));\n break;\n }\n res.end(JSON.stringify(slugs));\n break;\n }\n case 'pruneMedia': {\n const uploadsDir = path.join(process.cwd(), publicDir, 'assets', 'uploads');\n const baseDir = path.join(process.cwd(), contentDir);\n let usedMedia = new Set<string>();\n \n async function scanDir(dir: string) {\n if (!require('fs').existsSync(dir)) return;\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) await scanDir(fullPath);\n else if (entry.name.endsWith('.json')) {\n const content = await fs.readFile(fullPath, 'utf-8');\n const regex = /\\/assets\\/uploads\\/([^\"'\\s\\\\]+)/g;\n let match;\n while ((match = regex.exec(content)) !== null) {\n usedMedia.add(match[1]);\n }\n }\n }\n }\n await scanDir(baseDir);\n \n let deletedCount = 0;\n let bytesFreed = 0;\n if (require('fs').existsSync(uploadsDir)) {\n const uFiles = await fs.readdir(uploadsDir);\n for (const f of uFiles) {\n if (!usedMedia.has(f) && !f.startsWith('.')) {\n const stat = await fs.stat(path.join(uploadsDir, f));\n bytesFreed += stat.size;\n await fs.unlink(path.join(uploadsDir, f));\n deletedCount++;\n }\n }\n }\n res.end(JSON.stringify({ deletedCount, bytesFreed }));\n break;\n }\n default:\n res.statusCode = 404;\n res.end(JSON.stringify({ error: 'Unknown method' }));\n }\n } catch (e: any) {\n res.statusCode = 500;\n res.end(JSON.stringify({ error: e.message }));\n }\n });\n }\n };\n}\n"],"mappings":";;;;;;;;AAEA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,gBAAgB;AAEhB,SAAS,kBAAkB,SAAsD,CAAC,GAAW;AAClG,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,YAAY,OAAO,aAAa;AAEtC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,QAAQ;AACtB,aAAO,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;AAC/C,YAAI,IAAI,QAAQ,iBAAkB,QAAO,KAAK;AAE9C,YAAI;AACF,cAAI,OAAY,CAAC;AAEjB,cAAI,IAAI,QAAQ,cAAc,GAAG,SAAS,qBAAqB,GAAG;AAChE,kBAAM,OAAO,WAAW,CAAC,CAAC;AAC1B,kBAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,KAAK,MAAM,GAAU;AACnD,kBAAMA,UAAS,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,OAAO,CAAC,IAAI,OAAO;AAExE,gBAAIA,YAAW,cAAc;AAC3B,oBAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM;AAC/D,kBAAI,MAAM;AACR,sBAAM,WAAW,KAAK,kBAAkB,QAAQ,iBAAiB,GAAG,EAAE,YAAY,KAAK;AACvF,sBAAM,YAAY,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,UAAU,SAAS;AACzE,sBAAM,GAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,sBAAM,aAAa,KAAK,KAAK,WAAW,QAAQ;AAChD,sBAAM,GAAG,SAAS,KAAK,UAAU,UAAU;AAE3C,oBAAI,SAAc,EAAE,KAAK,mBAAmB,QAAQ,GAAG;AACvD,oBAAI;AACD,wBAAM,UAAU,MAAM,OAAO,YAAY,GAAG;AAC5C,wBAAM,aAAa,OAAO,UAAiB;AAC3C,sBAAI,cAAc,WAAW,OAAO;AAClC,6BAAS,EAAE,GAAG,QAAQ,OAAO,WAAW,OAAO,QAAQ,WAAW,QAAQ,KAAK,KAAK,iBAAiB;AAAA,kBACvG;AAAA,gBACH,SAAQ,GAAG;AAAA,gBAAC;AAEZ,oBAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAC9B;AAAA,cACF;AAAA,YACF;AAAA,UACF,OAAO;AACL,kBAAM,SAAS,CAAC;AAChB,6BAAiB,SAAS,IAAK,QAAO,KAAK,KAAK;AAChD,mBAAO,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,CAAC;AAAA,UACpD;AAEA,gBAAM,EAAE,QAAQ,YAAY,MAAM,KAAK,IAAI;AAE3C,kBAAQ,QAAQ;AAAA,YACd,KAAK,QAAQ;AACX,oBAAM,WAAW,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,YAAY,GAAG,IAAI,OAAO;AAChF,oBAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,kBAAI,IAAI,OAAO;AACf;AAAA,YACF;AAAA,YACA,KAAK,SAAS;AACZ,oBAAM,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,UAAU;AAC3D,oBAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,oBAAM,WAAW,KAAK,KAAK,KAAK,GAAG,IAAI,OAAO;AAC9C,oBAAM,GAAG,UAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AACnE,kBAAI,IAAI,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AACzC;AAAA,YACF;AAAA,YACA,KAAK,UAAU;AACb,oBAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AACnD,oBAAM,OAAO,MAAM,GAAG,QAAQ,OAAO;AACrC,yBAAW,OAAO,MAAM;AACtB,oBAAI,QAAQ,WAAY;AACxB,sBAAM,SAAS,KAAK,KAAK,SAAS,GAAG;AACrC,sBAAM,OAAO,MAAM,GAAG,KAAK,MAAM,EAAE,MAAM,MAAM,IAAI;AACnD,oBAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,sBAAM,QAAQ,MAAM,GAAG,QAAQ,MAAM;AACrC,2BAAW,QAAQ,OAAO;AACxB,sBAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,wBAAM,UAAU,MAAM,GAAG,SAAS,KAAK,KAAK,QAAQ,IAAI,GAAG,MAAM;AACjE,sBAAI,QAAQ,SAAS,IAAI,IAAI,GAAG,GAAG;AACjC,wBAAI,aAAa;AACjB,wBAAI,IAAI,KAAK,UAAU,EAAE,OAAO,+CAA+C,IAAI,iCAAiC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC;AACpI;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,oBAAM,WAAW,KAAK,KAAK,SAAS,YAAY,GAAG,IAAI,OAAO;AAC9D,oBAAM,GAAG,OAAO,QAAQ;AACxB,kBAAI,IAAI,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AACzC;AAAA,YACF;AAAA,YACA,KAAK,QAAQ;AACX,oBAAM,EAAE,QAAQ,IAAI;AACpB,oBAAM,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,UAAU;AAC3D,oBAAM,QAAQ,MAAM,GAAG,QAAQ,GAAG;AAClC,oBAAM,QAAQ,MAAM,OAAO,CAAC,MAAc,EAAE,SAAS,OAAO,CAAC,EAAE,IAAI,CAAC,MAAc,EAAE,QAAQ,SAAS,EAAE,CAAC;AAExG,kBAAI,SAAS,UAAU;AACrB,sBAAM,WAAW,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAOC,UAAiB;AACnE,sBAAI;AACF,0BAAM,UAAU,MAAM,GAAG,SAAS,KAAK,KAAK,KAAK,GAAGA,KAAI,OAAO,GAAG,OAAO;AACzE,0BAAMC,QAAO,KAAK,MAAM,OAAO;AAC/B,2BAAO,EAAE,MAAAD,OAAM,OAAOC,MAAK,SAASA,MAAK,QAAQD,OAAM,GAAGC,MAAK;AAAA,kBACjE,QAAQ;AACN,2BAAO,EAAE,MAAAD,OAAM,OAAOA,MAAK;AAAA,kBAC7B;AAAA,gBACF,CAAC,CAAC;AACF,oBAAI,IAAI,KAAK,UAAU,QAAQ,CAAC;AAChC;AAAA,cACF;AACA,kBAAI,IAAI,KAAK,UAAU,KAAK,CAAC;AAC7B;AAAA,YACF;AAAA,YACA,KAAK,cAAc;AACjB,oBAAM,aAAa,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,UAAU,SAAS;AAC1E,oBAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AACnD,kBAAI,YAAY,oBAAI,IAAY;AAEhC,6BAAe,QAAQ,KAAa;AAClC,oBAAI,CAAC,UAAQ,IAAI,EAAE,WAAW,GAAG,EAAG;AACpC,sBAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,2BAAW,SAAS,SAAS;AAC3B,wBAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,sBAAI,MAAM,YAAY,EAAG,OAAM,QAAQ,QAAQ;AAAA,2BACtC,MAAM,KAAK,SAAS,OAAO,GAAG;AACpC,0BAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,0BAAM,QAAQ;AACd,wBAAI;AACJ,4BAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC5C,gCAAU,IAAI,MAAM,CAAC,CAAC;AAAA,oBACzB;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AACA,oBAAM,QAAQ,OAAO;AAErB,kBAAI,eAAe;AACnB,kBAAI,aAAa;AACjB,kBAAI,UAAQ,IAAI,EAAE,WAAW,UAAU,GAAG;AACvC,sBAAM,SAAS,MAAM,GAAG,QAAQ,UAAU;AAC1C,2BAAW,KAAK,QAAQ;AACrB,sBAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,GAAG;AAC1C,0BAAM,OAAO,MAAM,GAAG,KAAK,KAAK,KAAK,YAAY,CAAC,CAAC;AACnD,kCAAc,KAAK;AACnB,0BAAM,GAAG,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC;AACxC;AAAA,kBACH;AAAA,gBACH;AAAA,cACH;AACA,kBAAI,IAAI,KAAK,UAAU,EAAE,cAAc,WAAW,CAAC,CAAC;AACpD;AAAA,YACF;AAAA,YACA;AACE,kBAAI,aAAa;AACjB,kBAAI,IAAI,KAAK,UAAU,EAAE,OAAO,iBAAiB,CAAC,CAAC;AAAA,UACvD;AAAA,QACF,SAAS,GAAQ;AACf,cAAI,aAAa;AACjB,cAAI,IAAI,KAAK,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["method","slug","data"]}