diff --git a/apps/token-tango-web-ui/@/components/ui/combobox.tsx b/apps/token-tango-web-ui/@/components/ui/combobox.tsx new file mode 100644 index 0000000..220d98b --- /dev/null +++ b/apps/token-tango-web-ui/@/components/ui/combobox.tsx @@ -0,0 +1,84 @@ +"use client"; + +import * as React from "react"; +import { Check, ChevronsUpDown } from "lucide-react"; + +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, +} from "@/components/ui/command"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; + +type ComboboxProps = { + options: string[]; + value: string; + onValueChange: (value: string) => void; + placeholder?: string; + emptyMessage?: string; + disabled?: boolean; + className?: string; +}; + +export function Combobox({ + options, + value, + onValueChange, + placeholder = "Select an option...", + emptyMessage = "No results found.", + disabled = false, + className, +}: ComboboxProps) { + const [open, setOpen] = React.useState(false); + + return ( + + + + + + + + {emptyMessage} + + {options.map((option) => ( + { + onValueChange(option); + setOpen(false); + }} + > + + {option} + + ))} + + + + + ); +} diff --git a/apps/token-tango-web-ui/@/components/ui/command.tsx b/apps/token-tango-web-ui/@/components/ui/command.tsx new file mode 100644 index 0000000..fd07ed7 --- /dev/null +++ b/apps/token-tango-web-ui/@/components/ui/command.tsx @@ -0,0 +1,151 @@ +import * as React from "react"; +import { type DialogProps } from "@radix-ui/react-dialog"; +import { Command as CommandPrimitive } from "cmdk"; +import { Search } from "lucide-react"; + +import { cn } from "@/lib/utils"; +import { Dialog, DialogContent } from "@/components/ui/dialog"; + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Command.displayName = CommandPrimitive.displayName; + +const CommandDialog = ({ children, ...props }: DialogProps) => { + return ( + + + + {children} + + + + ); +}; + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)); + +CommandInput.displayName = CommandPrimitive.Input.displayName; + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); + +CommandList.displayName = CommandPrimitive.List.displayName; + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)); + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName; + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); + +CommandGroup.displayName = CommandPrimitive.Group.displayName; + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +CommandSeparator.displayName = CommandPrimitive.Separator.displayName; + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); + +CommandItem.displayName = CommandPrimitive.Item.displayName; + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +CommandShortcut.displayName = "CommandShortcut"; + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +}; diff --git a/apps/token-tango-web-ui/@/components/ui/label.tsx b/apps/token-tango-web-ui/@/components/ui/label.tsx index 683faa7..7c96064 100644 --- a/apps/token-tango-web-ui/@/components/ui/label.tsx +++ b/apps/token-tango-web-ui/@/components/ui/label.tsx @@ -1,12 +1,12 @@ -import * as React from "react" -import * as LabelPrimitive from "@radix-ui/react-label" -import { cva, type VariantProps } from "class-variance-authority" +import * as React from "react"; +import * as LabelPrimitive from "@radix-ui/react-label"; +import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; const labelVariants = cva( "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" -) +); const Label = React.forwardRef< React.ElementRef, @@ -18,7 +18,7 @@ const Label = React.forwardRef< className={cn(labelVariants(), className)} {...props} /> -)) -Label.displayName = LabelPrimitive.Root.displayName +)); +Label.displayName = LabelPrimitive.Root.displayName; -export { Label } +export { Label }; diff --git a/apps/token-tango-web-ui/@/components/ui/popover.tsx b/apps/token-tango-web-ui/@/components/ui/popover.tsx new file mode 100644 index 0000000..43f891f --- /dev/null +++ b/apps/token-tango-web-ui/@/components/ui/popover.tsx @@ -0,0 +1,29 @@ +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/apps/token-tango-web-ui/package.json b/apps/token-tango-web-ui/package.json index ec9af64..daeed55 100644 --- a/apps/token-tango-web-ui/package.json +++ b/apps/token-tango-web-ui/package.json @@ -4,10 +4,11 @@ "private": true, "type": "module", "scripts": { - "build": "npx vite build --minify esbuild --emptyOutDir=false", + "build": "pnpm run tsc && npx vite build --minify esbuild --emptyOutDir=false", + "build:debug": "pnpm run tsc && npx vite build --emptyOutDir=false --mode debug", "lint": "eslint --ext .ts,.tsx --ignore-pattern node_modules .", "lint:fix": "eslint --ext .ts,.tsx --ignore-pattern node_modules --fix .", - "tsc": "tsc --noEmit -p widget-src", + "tsc": "tsc --noEmit", "dev": "pnpm run build --watch", "serve": "npx http-server dist --port 8080", "test": "vitest", @@ -17,45 +18,49 @@ "@repo/config": "workspace:*", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "@turbo/gen": "^1.12.4", - "@types/eslint": "^8.56.5", - "@types/node": "^20.11.24", - "@types/react": "^18.2.61", - "@types/react-dom": "^18.2.19", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.1", - "postcss": "^8.4.38", - "tailwindcss": "^3.4.4", - "typescript": "^5.4.5", - "vite": "^5.2.12", - "vite-plugin-singlefile": "^2.0.1", - "vitest": "^1.4.0" + "@turbo/gen": "^2.3.3", + "@types/eslint": "^9.6.1", + "@types/node": "^22.10.2", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@vitejs/plugin-react": "^4.2.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.17.0", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.2", + "vite": "^5.0.12", + "vite-plugin-singlefile": "^2.1.0", + "vitest": "^2.1.8" }, "dependencies": { - "@create-figma-plugin/ui": "^3.1.0", - "@create-figma-plugin/utilities": "^3.2.0", - "@hookform/resolvers": "^3.6.0", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-scroll-area": "^1.1.0", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.1", + "@create-figma-plugin/ui": "4.0.0-alpha.0", + "@create-figma-plugin/utilities": "4.0.0-alpha.0", + "@hookform/resolvers": "^3.9.1", + "@radix-ui/react-checkbox": "^1.1.3", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.4", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-popover": "^1.1.4", + "@radix-ui/react-scroll-area": "^1.2.2", + "@radix-ui/react-select": "^2.1.4", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.6", "@repo/utils": "workspace:*", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "lucide-react": "^0.390.0", + "buffer": "^6.0.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.0.0", + "cmdk": "0.2.1", + "lucide-react": "^0.294.0", "radius-toolkit": "workspace:*", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-hook-form": "^7.51.5", - "tailwind-merge": "^2.3.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.54.1", + "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", - "zod": "^3.23.8" + "zod": "link:@hookform/resolvers/zod" } } diff --git a/apps/token-tango-web-ui/src/components/custom-icons.tsx b/apps/token-tango-web-ui/src/components/custom-icons.tsx index a528a31..390f554 100644 --- a/apps/token-tango-web-ui/src/components/custom-icons.tsx +++ b/apps/token-tango-web-ui/src/components/custom-icons.tsx @@ -231,6 +231,29 @@ export const RemovedIcon = forwardRef>( ) ); +export const ServerIcon = forwardRef>( + (props, ref: Ref) => ( + + + + + + + ) +); + export const ModifiedIcon = forwardRef>( (props, ref: Ref) => ( = ({ activeMode, token }) => { > {token.name.split(".").map((word, i) => ( segments.includes(word)) ? "text-red-500 font-bold" @@ -287,7 +287,9 @@ export const TokenItemBar: FC = ({ activeMode, token }) => {
    {token.errors.map((error, index) => ( -
  • {error.message}
  • +
  • + {error.message} +
  • ))}
@@ -307,7 +309,11 @@ export const TokenItemBar: FC = ({ activeMode, token }) => {
    {token.warnings.map((warning, index) => ( -
  • {warning.message}
  • +
  • + {warning.message} +
  • ))}
@@ -368,7 +374,10 @@ export const TokenItemBar: FC = ({ activeMode, token }) => {

Errors:

    {token.errors.map((error, index) => ( -
  • +
  • {error.message}
  • ))} @@ -380,7 +389,10 @@ export const TokenItemBar: FC = ({ activeMode, token }) => {

    Warnings:

      {token.warnings.map((warning, index) => ( -
    • +
    • {warning.message}
    • ))} diff --git a/apps/token-tango-web-ui/src/components/list-vectors.tsx b/apps/token-tango-web-ui/src/components/list-vectors.tsx index 91f9841..a3297cc 100644 --- a/apps/token-tango-web-ui/src/components/list-vectors.tsx +++ b/apps/token-tango-web-ui/src/components/list-vectors.tsx @@ -154,7 +154,7 @@ export const VectorItem: FC = ({
        {Object.entries(vector.properties).map( ([key, value]) => ( -
      • +
      • {key}:{" "} {value}
      • diff --git a/apps/token-tango-web-ui/src/components/push.tsx b/apps/token-tango-web-ui/src/components/push.tsx index 4d6c502..0a5be0c 100644 --- a/apps/token-tango-web-ui/src/components/push.tsx +++ b/apps/token-tango-web-ui/src/components/push.tsx @@ -77,9 +77,15 @@ export const PushConfirmation: FC = ({ // initial loading of branch names useEffect(() => { - getBranchNames(state).then((branches) => { - setBranches(branches); - }); + if (state.tool === "GitHub") { + getBranchNames({ + repository: state.repository, + accessToken: state.accessToken, + branch: state.branch, + }).then((branches) => { + setBranches(branches); + }); + } }, [state]); // initial validation of the value of the form field diff --git a/apps/token-tango-web-ui/src/components/repository.tsx b/apps/token-tango-web-ui/src/components/repository.tsx deleted file mode 100644 index 391037d..0000000 --- a/apps/token-tango-web-ui/src/components/repository.tsx +++ /dev/null @@ -1,411 +0,0 @@ -import React, { FC, useEffect, useState } from "react"; -import { emit } from "@create-figma-plugin/utilities"; -import { - Card, - CardContent, - CardHeader, - CardTitle, - CardFooter, -} from "@/components/ui/card"; -import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; - -import { Button } from "@/components/ui/button"; -import { Label } from "@/components/ui/label"; -import { Input } from "@/components/ui/input"; - -import { useForm } from "react-hook-form"; - -import { UiCloseHandler } from "../../../../apps/token-tango-widget/types/state"; - -import { WidgetConfiguration, FormSchema, formSchema } from "@repo/config"; - -import { zodResolver } from "@hookform/resolvers/zod"; - -import { - testFileExists, - testRepositoryConnection, -} from "../services/repository.services"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { Checkbox } from "@/components/ui/checkbox"; - -import { createLogger } from "@repo/utils"; -import { FieldDescription } from "./field-description"; -import { CustomSelect } from "./custom-select"; -import { - TriangleAlertIcon, - InfoAlertIcon, - GithubIcon, - CheckIcon, - FileAddIcon, - FileSearchIcon, -} from "./custom-icons"; - -const log = createLogger("WEB:repository"); - -export type RepositoryConfigProps = { - state: WidgetConfiguration; - updateState: (newState: WidgetConfiguration) => void; -}; - -export const RepositoryConfig: FC = ({ - state, - updateState, -}) => { - const [isConnected, setIsConnected] = useState(false); - const [isSaveDisabled, setIsSaveDisabled] = useState(true); - const [fileStatus, setFileStatus] = useState< - "none" | "found" | "not-found" | "error" | "create-new" - >("none"); - const [branches, setBranches] = useState([]); - const [error, setError] = useState(null); - - const { - register, - handleSubmit, - formState, - getValues, - setValue, - watch, - clearErrors, - } = useForm({ - resolver: zodResolver(formSchema), - defaultValues: state, - mode: "onBlur", - }); - - const onSubmit = (values: FormSchema) => { - updateState({ - ...values, - status: isConnected ? "online" : "disconnected", - ...(error ? { error } : {}), - }); - }; - - const handleTestConnection = () => { - const { accessToken, repository } = getValues(); - testRepositoryConnection({ - repository, - accessToken, - }).then((response) => { - if (response.status === "online") { - setIsConnected(true); - setIsSaveDisabled(false); - setError(null); - const orderedBranches = response.branches.sort((a, b) => - a.name === "main" - ? -1 - : b.name === "main" - ? 1 - : a.protected - ? -1 - : b.protected - ? 1 - : 0 - ); - setBranches(response.branches.map((b) => b.name)); - } else { - setIsConnected(false); - setIsSaveDisabled(true); - setBranches([]); - setError( - "Connection test failed. Please check your credentials and try again." - ); - console.error(response.error); - } - }); - }; - - const handleCheckFile = async () => { - try { - const { status, file } = await testFileExists({ - repository: getValues("repository"), - accessToken: getValues("accessToken"), - branch: getValues("branch"), - filePath: getValues("filePath"), - }); - if (status === "found") { - setFileStatus("found"); - } else { - setFileStatus("not-found"); - } - setError(null); - } catch (err) { - setFileStatus("error"); - setError( - "Failed to check file. Please check the file path and try again." - ); - } - }; - - const branch = register("branch"); - const filePath = register("filePath"); - - const watchAccessToken = watch("accessToken"); - - useEffect(() => { - if (watchAccessToken && watchAccessToken.length === 40) { - clearErrors("accessToken"); - } - }, [watchAccessToken]); - - return ( - - -
        { - console.error("ERROR!!", errors); - })} - > - - Configure Repository Access - - {error ? ( - - - Error - {error} - - ) : ( - - - Configure your Codebase - - Select your tool and enter credentials to access your token - files - - - )} - -
        -
        - - }, - ]} - {...register("tool")} - /> -
        -
        - -
        - - -
        -
        -
        - -
        - - -
        -
        -
        - -
        -
        - - -
        - - Get a Github Access Token{" "} - - here - - - } - /> -
        -
        - -
        - -
        - - -
        -
        -
        - -
        -
        - - -
        - {fileStatus === "found" ? ( - - File exists in repository - - ) : fileStatus === "not-found" ? ( - - File does not exist. Check option below to create a new file - - ) : ( - - )} -
        -
        -
        - - - {fileStatus === "not-found" || fileStatus === "create-new" ? ( -
        - { - if (checked) { - setFileStatus("create-new"); - setValue("createNewFile", true); - } else { - setFileStatus("not-found"); - setValue("createNewFile", false); - } - }} - /> - -
        - ) : ( -
        - )} - -
        - - -
        - - - - - ); -}; diff --git a/apps/token-tango-web-ui/src/components/repository/common/custom-icons.tsx b/apps/token-tango-web-ui/src/components/repository/common/custom-icons.tsx new file mode 100644 index 0000000..ec1b567 --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/common/custom-icons.tsx @@ -0,0 +1,22 @@ +"use client"; + +import React from "react"; +import { + AlertTriangle, + Info, + Github, + Server, + Check, + FilePlus2, + FileSearch, + File, +} from "lucide-react"; + +export const TriangleAlertIcon = AlertTriangle; +export const InfoAlertIcon = Info; +export const GithubIcon = Github; +export const ServerIcon = Server; +export const CheckIcon = Check; +export const FileAddIcon = FilePlus2; +export const FileSearchIcon = FileSearch; +export const FileIcon = File; diff --git a/apps/token-tango-web-ui/src/components/repository/common/error-alert.tsx b/apps/token-tango-web-ui/src/components/repository/common/error-alert.tsx new file mode 100644 index 0000000..c4b7a5c --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/common/error-alert.tsx @@ -0,0 +1,23 @@ +"use client"; + +import React, { FC } from "react"; +import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; +import { TriangleAlertIcon } from "./custom-icons"; + +type ErrorAlertProps = { + title?: string; + description: string; +}; + +export const ErrorAlert: FC = ({ + title = "Error", + description, +}) => { + return ( + + + {title} + {description} + + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/common/field-description.tsx b/apps/token-tango-web-ui/src/components/repository/common/field-description.tsx new file mode 100644 index 0000000..c11bc4b --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/common/field-description.tsx @@ -0,0 +1,26 @@ +"use client"; + +import React, { FC, ReactNode } from "react"; +import { FieldError } from "react-hook-form"; + +type FieldDescriptionProps = { + error?: FieldError; + text: ReactNode; + className?: string; +}; + +export const FieldDescription: FC = ({ + error, + text, + className = "", +}) => { + return ( +

        + {error ? error.message : text} +

        + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/common/info-alert.tsx b/apps/token-tango-web-ui/src/components/repository/common/info-alert.tsx new file mode 100644 index 0000000..db49c5d --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/common/info-alert.tsx @@ -0,0 +1,20 @@ +"use client"; + +import React, { FC } from "react"; +import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; +import { InfoAlertIcon } from "./custom-icons"; + +type InfoAlertProps = { + title: string; + description: string; +}; + +export const InfoAlert: FC = ({ title, description }) => { + return ( + + + {title} + {description} + + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/file-download/file-download-form.tsx b/apps/token-tango-web-ui/src/components/repository/file-download/file-download-form.tsx new file mode 100644 index 0000000..e433071 --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/file-download/file-download-form.tsx @@ -0,0 +1,39 @@ +"use client"; + +import React, { FC } from "react"; +import { Label } from "@/components/ui/label"; +import { Input } from "@/components/ui/input"; + +import { FileDownloadFormProps } from "./file-download-form.utils"; +import { FieldDescription } from "../common/field-description"; +import { InfoAlert } from "../common/info-alert"; + +export const FileDownloadForm: FC = ({ + errors, + register, + getValues, +}) => { + return ( + <> +
        + +
        + + +
        +
        + + + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/file-download/file-download-form.utils.ts b/apps/token-tango-web-ui/src/components/repository/file-download/file-download-form.utils.ts new file mode 100644 index 0000000..06a6e25 --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/file-download/file-download-form.utils.ts @@ -0,0 +1,75 @@ +import { RepositoryFormSchema } from "@repo/config"; +import { + UseFormRegister, + FieldError, + UseFormSetValue, + UseFormTrigger, + UseFormClearErrors, + UseFormGetValues, +} from "react-hook-form"; + +// Type guard to check if a form schema is a File Download config +export const isFileDownloadConfig = ( + config: RepositoryFormSchema +): config is Extract => { + return config.tool === "File Download"; +}; + +// Type for the File Download form data +export type FileDownloadFormData = Extract< + RepositoryFormSchema, + { tool: "File Download" } +>; + +// Props specific to the File Download form component +export type FileDownloadFormProps = { + // Form state + errors: Record; + register: UseFormRegister; + getValues: UseFormGetValues; + setValue: UseFormSetValue; + clearErrors: UseFormClearErrors; + trigger: UseFormTrigger; + + // UI state + isSaveDisabled: boolean; + setIsSaveDisabled: (disabled: boolean) => void; +}; + +// Function to create props for the File Download form +export const createFileDownloadFormProps = ({ + errors, + register, + getValues, + setValue, + clearErrors, + trigger, + isSaveDisabled, + setIsSaveDisabled, +}: { + errors: Record; + register: UseFormRegister; + getValues: UseFormGetValues; + setValue: UseFormSetValue; + clearErrors: UseFormClearErrors; + trigger: UseFormTrigger; + isSaveDisabled: boolean; + setIsSaveDisabled: (disabled: boolean) => void; +}): FileDownloadFormProps | null => { + const values = getValues(); + if (!isFileDownloadConfig(values)) return null; + + return { + errors: errors as Record< + keyof FileDownloadFormData, + FieldError | undefined + >, + register: register as UseFormRegister, + getValues: getValues as UseFormGetValues, + setValue: setValue as UseFormSetValue, + clearErrors: clearErrors as UseFormClearErrors, + trigger: trigger as UseFormTrigger, + isSaveDisabled, + setIsSaveDisabled, + }; +}; diff --git a/apps/token-tango-web-ui/src/components/repository/github/github-form.tsx b/apps/token-tango-web-ui/src/components/repository/github/github-form.tsx new file mode 100644 index 0000000..5139483 --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/github/github-form.tsx @@ -0,0 +1,385 @@ +"use client"; + +import React, { FC, useEffect, useState } from "react"; +import { Label } from "@/components/ui/label"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Combobox } from "@/components/ui/combobox"; +import { FieldDescription } from "../common/field-description"; +import { + TriangleAlertIcon, + CheckIcon, + FileAddIcon, + FileSearchIcon, +} from "../common/custom-icons"; +import { + FileStatus, + GithubFormProps, + GithubFormData, +} from "./github-form.utils"; +import { + validateAccessToken, + testRepositoryConnection, + testFileExists, +} from "../../../services/repository.services"; + +export const GithubForm: FC = ({ + errors, + register, + isConnected, + setIsConnected, + isSaveDisabled, + setIsSaveDisabled, + getValues, + setValue, + clearErrors, + trigger, + error, + setError, +}) => { + const [fileStatus, setFileStatus] = useState("none"); + const [branch, setBranch] = useState(null); + const [branches, setBranches] = useState([]); + const [repositories, setRepositories] = useState([]); + const [isRepositoryDisabled, setIsRepositoryDisabled] = useState(true); + + const handleValidateToken = async () => { + const values = getValues(); + console.log(">> values", values); + console.log(">> about to validate accessToken", values.accessToken); + const response = await validateAccessToken(values.accessToken); + console.log(">> response", response); + if (response.status === "connected" && response.repositories) { + setError(null); + const repositoryNames = response.repositories.map( + (repo) => repo.full_name + ); + setRepositories(repositoryNames); + console.log(">> repositoryNames", repositoryNames); + setIsRepositoryDisabled(false); + setIsConnected(true); + } else { + console.log( + ">>status is not 'connected'", + response.status, + response.error + ); + setError(response.error || "Failed to validate access token"); + setIsRepositoryDisabled(true); + setRepositories([]); + setError( + "Access token validation failed. Please check your credentials and try again." + ); + setIsConnected(false); + console.error(response.error); + } + }; + + const handleTestConnection = () => { + const values = getValues(); + testRepositoryConnection({ + repository: values.repository, + accessToken: values.accessToken, + }).then((response) => { + if (response.status === "connected" && response.branches) { + setIsSaveDisabled(false); + setError(null); + const orderedBranches = response.branches.sort((a, b) => + a.name === "main" + ? -1 + : b.name === "main" + ? 1 + : a.protected + ? -1 + : b.protected + ? 1 + : 0 + ); + const branchNames = orderedBranches.map((b) => b.name); + setBranches(branchNames); + if (branchNames.includes("main")) { + setValue("branch", "main"); + setBranch("main"); + } + } else { + setIsSaveDisabled(true); + setBranches([]); + setError(response.error || "Failed to fetch repository branches"); + } + }); + }; + + const handleCheckFile = async () => { + const values = getValues(); + try { + const { status } = await testFileExists({ + repository: values.repository, + accessToken: values.accessToken, + branch: values.branch, + filePath: values.filePath, + }); + if (status === "found") { + setFileStatus("found"); + setIsSaveDisabled(false); + } else { + setFileStatus("not-found"); + setIsSaveDisabled(true); + } + } catch (err) { + setFileStatus("error"); + setIsSaveDisabled(true); + setError("Failed to check file existence"); + } + }; + + const filePath = register("filePath", { + onChange: () => { + setFileStatus("none"); + trigger("filePath"); + }, + }); + + useEffect(() => { + if ( + branches.length > 0 && + !getValues("branch") && + branches.includes("main") + ) { + console.log(">> pre-selected main"); + setValue("branch", "main"); + setBranch("main"); + } else { + setBranch(getValues("branch")); + console.log(">> no pre-selected main", getValues("branch")); + } + }, [branches]); + + return ( + <> +
        + +
        +
        + { + setValue("accessToken", e.target.value, { + shouldValidate: true, + }); + }, + onBlur: (e) => { + setValue("accessToken", e.target.value, { + shouldValidate: true, + }); + }, + })} + /> + +
        + + Get a Github Access Token{" "} + + here + + + } + /> +
        +
        + +
        + +
        +
        + { + setValue("repository", value); + handleTestConnection(); + }} + placeholder="Select a repository..." + disabled={isRepositoryDisabled} + className="flex-1" + /> +
        + +
        +
        + +
        + +
        + + +
        +
        + +
        + +
        + + +
        +
        + +
        + +
        +
        + { + filePath.onChange(e); + setValue("filePath", e.target.value); + }} + onBlur={filePath.onBlur} + disabled={!branches.length} + /> + +
        + + {fileStatus === "found" ? ( + + File exists in repository + + ) : fileStatus === "not-found" ? ( + + File does not exist. Check option below to create a new file + + ) : ( + + )} +
        +
        + + {(fileStatus === "not-found" || fileStatus === "create-new") && ( +
        + { + if (checked) { + setFileStatus("create-new"); + setValue("createNewFile", checked); + setIsSaveDisabled(false); + } else { + setFileStatus("not-found"); + setValue("createNewFile", checked); + setIsSaveDisabled(true); + } + }} + /> + +
        + )} + + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/github/github-form.utils.ts b/apps/token-tango-web-ui/src/components/repository/github/github-form.utils.ts new file mode 100644 index 0000000..70b0440 --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/github/github-form.utils.ts @@ -0,0 +1,95 @@ +import { RepositoryFormSchema } from "@repo/config"; +import { + UseFormRegister, + FieldError, + UseFormSetValue, + UseFormTrigger, + UseFormClearErrors, + UseFormGetValues, +} from "react-hook-form"; + +// Type guard to check if a form schema is a GitHub config +export const isGithubConfig = ( + config: RepositoryFormSchema +): config is Extract => { + return config.tool === "GitHub"; +}; + +// Type for the GitHub form data +export type GithubFormData = Extract; + +// File status type for GitHub form +export type FileStatus = + | "none" + | "found" + | "not-found" + | "error" + | "create-new"; + +// Props specific to the GitHub form component +export type GithubFormProps = { + // Form state + errors: Record; + register: UseFormRegister; + getValues: UseFormGetValues; + setValue: UseFormSetValue; + clearErrors: UseFormClearErrors; + trigger: UseFormTrigger; + + // Connection state + isConnected: boolean; + setIsConnected: (connected: boolean) => void; + isSaveDisabled: boolean; + setIsSaveDisabled: (disabled: boolean) => void; + + // Error handling + error: string | null; + setError: (error: string | null) => void; +}; + +// Function to create props for the GitHub form +export const createGithubFormProps = ({ + errors, + register, + getValues, + setValue, + clearErrors, + trigger, + isConnected, + setIsConnected, + isSaveDisabled, + setIsSaveDisabled, + error, + setError, +}: { + errors: Record; + register: UseFormRegister; + getValues: UseFormGetValues; + setValue: UseFormSetValue; + clearErrors: UseFormClearErrors; + trigger: UseFormTrigger; + isConnected: boolean; + setIsConnected: (connected: boolean) => void; + isSaveDisabled: boolean; + setIsSaveDisabled: (disabled: boolean) => void; + error: string | null; + setError: (error: string | null) => void; +}): GithubFormProps | null => { + const values = getValues(); + if (!isGithubConfig(values)) return null; + + return { + errors: errors as Record, + register: register as UseFormRegister, + getValues: getValues as UseFormGetValues, + setValue: setValue as UseFormSetValue, + clearErrors: clearErrors as UseFormClearErrors, + trigger: trigger as UseFormTrigger, + isConnected, + setIsConnected, + isSaveDisabled, + setIsSaveDisabled, + error, + setError, + }; +}; diff --git a/apps/token-tango-web-ui/src/components/repository/repository-config.tsx b/apps/token-tango-web-ui/src/components/repository/repository-config.tsx new file mode 100644 index 0000000..75024a4 --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/repository-config.tsx @@ -0,0 +1,191 @@ +"use client"; + +import React, { FC, useState } from "react"; +import { emit } from "@create-figma-plugin/utilities"; +import { useForm, FieldError } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; + +import { + Card, + CardContent, + CardHeader, + CardTitle, + CardFooter, +} from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; + +import { + WidgetConfiguration, + RepositoryFormSchema, + formSchema, +} from "@repo/config"; +import { createLogger } from "@repo/utils"; + +import { GithubForm } from "./github/github-form"; +import { FileDownloadForm } from "./file-download/file-download-form"; +import { RestServerForm } from "./rest-server/rest-server-form"; +import { ErrorAlert } from "./common/error-alert"; +import { InfoAlert } from "./common/info-alert"; +import { CustomSelect } from "../custom-select"; +import { GithubIcon, FileAddIcon, ServerIcon } from "./common/custom-icons"; + +import { createGithubFormProps } from "./github/github-form.utils"; +import { createFileDownloadFormProps } from "./file-download/file-download-form.utils"; +import { createRestServerFormProps } from "./rest-server/rest-server-form.utils"; +import { RepositoryConfigProps } from "./types"; + +import { UiCloseHandler } from "../../../../token-tango-widget/types/state"; + +const log = createLogger("WEB:repository"); + +export const RepositoryConfig: FC = ({ + state, + updateState, +}) => { + const [isConnected, setIsConnected] = useState(false); + const [isSaveDisabled, setIsSaveDisabled] = useState(false); + const [error, setError] = useState(null); + + console.log("$$$$ INITIAL STATE", state); + + const { + register, + handleSubmit, + formState: { errors }, + getValues, + setValue, + watch, + clearErrors, + reset, + trigger, + } = useForm({ + resolver: zodResolver(formSchema), + defaultValues: state, + mode: "onChange", + }); + + console.log("$$$$ FORM STATE", getValues()); + + const onSubmit = (values: RepositoryFormSchema) => { + if (values.tool === "GitHub") { + updateState({ + ...values, + status: isConnected ? "connected" : "disconnected", + ...(error ? { error } : {}), + }); + } else { + updateState(values); + } + }; + + const selectedTool = watch("tool"); + + const formProps = { + errors: errors as Record, + register, + getValues, + setValue, + clearErrors, + trigger, + isSaveDisabled, + setIsSaveDisabled: (disabled: boolean) => setIsSaveDisabled(disabled), + }; + + const githubProps = createGithubFormProps({ + ...formProps, + isConnected, + setIsConnected, + error, + setError: (newError: string | null) => setError(newError), + }); + + const fileDownloadProps = createFileDownloadFormProps(formProps); + const restServerProps = createRestServerFormProps(formProps); + + return ( + + +
        { + console.error("ERROR!!", errors); + })} + className="h-full flex flex-col" + > +
        + + Configure Token Source + + {error ? ( + + ) : ( + + )} +
        + +
        +
        +
        + + }, + { + name: "File Download", + value: "File Download", + icon: , + }, + { + name: "REST Server", + value: "REST Server", + icon: , + }, + ]} + {...register("tool")} + onChange={(e) => { + console.log(">> Tool onChange", e.target.value); + setValue( + "tool", + e.target.value as RepositoryFormSchema["tool"] + ); + }} + /> +
        + + {selectedTool === "GitHub" && githubProps && ( + + )} + {selectedTool === "File Download" && fileDownloadProps && ( + + )} + {selectedTool === "REST Server" && restServerProps && ( + + )} +
        +
        + + +
        + + +
        +
        +
        +
        +
        + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/rest-server/rest-server-form.tsx b/apps/token-tango-web-ui/src/components/repository/rest-server/rest-server-form.tsx new file mode 100644 index 0000000..b20e1aa --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/rest-server/rest-server-form.tsx @@ -0,0 +1,54 @@ +"use client"; + +import React, { FC } from "react"; +import { Label } from "@/components/ui/label"; +import { Input } from "@/components/ui/input"; +import { InfoAlert } from "../common/info-alert"; +import { FieldDescription } from "../common/field-description"; +import { RestServerFormProps } from "./rest-server-form.utils"; + +export const RestServerForm: FC = ({ + errors, + register, + getValues, +}) => { + return ( + <> +
        + +
        + + +
        +
        + +
        + +
        + + +
        +
        + + + + ); +}; diff --git a/apps/token-tango-web-ui/src/components/repository/rest-server/rest-server-form.utils.ts b/apps/token-tango-web-ui/src/components/repository/rest-server/rest-server-form.utils.ts new file mode 100644 index 0000000..bf802ee --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/rest-server/rest-server-form.utils.ts @@ -0,0 +1,72 @@ +import { RepositoryFormSchema } from "@repo/config"; +import { + UseFormRegister, + FieldError, + UseFormSetValue, + UseFormTrigger, + UseFormClearErrors, + UseFormGetValues, +} from "react-hook-form"; + +// Type guard to check if a form schema is a REST Server config +export const isRestServerConfig = ( + config: RepositoryFormSchema +): config is Extract => { + return config.tool === "REST Server"; +}; + +// Type for the REST Server form data +export type RestServerFormData = Extract< + RepositoryFormSchema, + { tool: "REST Server" } +>; + +// Props specific to the REST Server form component +export type RestServerFormProps = { + // Form state + errors: Record; + register: UseFormRegister; + getValues: UseFormGetValues; + setValue: UseFormSetValue; + clearErrors: UseFormClearErrors; + trigger: UseFormTrigger; + + // UI state + isSaveDisabled: boolean; + setIsSaveDisabled: (disabled: boolean) => void; +}; + +// Function to create props for the REST Server form +export const createRestServerFormProps = ({ + errors, + register, + getValues, + setValue, + clearErrors, + trigger, + isSaveDisabled, + setIsSaveDisabled, +}: { + errors: Record; + register: UseFormRegister; + getValues: UseFormGetValues; + setValue: UseFormSetValue; + clearErrors: UseFormClearErrors; + trigger: UseFormTrigger; + isSaveDisabled: boolean; + setIsSaveDisabled: (disabled: boolean) => void; +}): RestServerFormProps | null => { + const values = getValues(); + if (!isRestServerConfig(values)) return null; + + return { + errors: errors as Record, + register: register as UseFormRegister, + getValues: getValues as UseFormGetValues, + setValue: setValue as UseFormSetValue, + clearErrors: clearErrors as UseFormClearErrors, + trigger: trigger as UseFormTrigger, + isSaveDisabled, + setIsSaveDisabled, + }; +}; diff --git a/apps/token-tango-web-ui/src/components/repository/types.ts b/apps/token-tango-web-ui/src/components/repository/types.ts new file mode 100644 index 0000000..f2684fd --- /dev/null +++ b/apps/token-tango-web-ui/src/components/repository/types.ts @@ -0,0 +1,6 @@ +import { WidgetConfiguration } from "@repo/config"; + +export type RepositoryConfigProps = { + state: WidgetConfiguration; + updateState: (newState: WidgetConfiguration) => void; +}; diff --git a/apps/token-tango-web-ui/src/index.tsx b/apps/token-tango-web-ui/src/index.tsx index f369e8e..3606a61 100644 --- a/apps/token-tango-web-ui/src/index.tsx +++ b/apps/token-tango-web-ui/src/index.tsx @@ -1,5 +1,5 @@ import React, { Fragment, FC } from "react"; -import { render } from "react-dom"; +import { createRoot } from "react-dom/client"; import { useEffect, useState } from "react"; import { emit, on } from "@create-figma-plugin/utilities"; @@ -16,15 +16,14 @@ import { } from "../../../apps/token-tango-widget/types/state"; import { PushConfirmation } from "./components/push"; -import { RepositoryConfig } from "./components/repository"; import { PushMessageType, WidgetConfiguration } from "@repo/config"; import "./index.css"; import { ValidationResult } from "./components/validation"; -import { radiusLayerSubjectTypeFormat } from "radius-toolkit"; import { createLogger } from "@repo/utils"; import SpinningLogo from "./components/loading-icon"; +import { RepositoryConfig } from "./components/repository/repository-config"; const log = createLogger("WEB:index"); @@ -38,8 +37,6 @@ const initialState: WidgetConfiguration = { createNewFile: false, }; -const defaultFormat = radiusLayerSubjectTypeFormat; - const initialCommitState: PushMessageType = { branchName: "", commitMessage: "", @@ -60,14 +57,47 @@ export type AppRoute = | "repository" | "validation"; +// Type for valid debug routes +type DebugRouteParams = { + route?: AppRoute; + config?: string; // Base64 encoded config +}; + +// Parse URL parameters for debug mode +const parseDebugParams = (): DebugRouteParams => { + if (typeof window === "undefined") return {}; + + const params = new URLSearchParams(window.location.search); + const route = params.get("route") as AppRoute | null; + const config = params.get("config"); + + return { + ...(route && { route }), + ...(config && { config: decodeURIComponent(config) }), + }; +}; + +// Check if we're running in debug mode (browser) +const isDebugMode = (): boolean => { + return window.name === ""; +}; + export const App: FC = () => { - const [route, setRoute] = useState("loading"); - const [config, setConfig] = useState(initialState); + const [route, setRoute] = useState(() => { + const { route: debugRoute } = parseDebugParams(); + return debugRoute || "loading"; + }); + + const [config, setConfig] = useState(() => { + const { config: debugConfig } = parseDebugParams(); + return debugConfig ? JSON.parse(atob(debugConfig)) : initialState; + }); const [commit, setCommit] = useState(initialCommitState); const [state, setState] = useState(null); // establish the initial handers for routing and updates useEffect(() => { + if (isDebugMode()) return; on("PLUGIN_STATE_CHANGE", (state) => { log("warn", "PLUGIN_STATE_CHANGE", state); setConfig(state ?? initialState); @@ -96,20 +126,6 @@ export const App: FC = () => { setRoute("validation"); setState(state); }); - - // const hash = window.location.hash.substring(1); - // if (hash === "config") { - // setRoute("config"); - // } else if (hash === "push") { - // setRoute("push"); - // } else if (hash === "repository") { - // setRoute("repository"); - // } else if (hash === "validation") { - // const state = isState(mockState) ? mockState : null; - // log("warn", "MOCK", state); - // setRoute("validation"); - // setState(state); - // } }, []); const updateState = (newState: WidgetConfiguration) => { @@ -123,7 +139,6 @@ export const App: FC = () => { }; log("warn", "ROUTE", route); - log("debug", { state }); return ( @@ -146,4 +161,10 @@ export const App: FC = () => { ); }; -render(, document.getElementById("root")!); +const container = document.getElementById("root"); +if (container) { + const root = createRoot(container); + root.render(); +} else { + console.error("Root element not found"); +} diff --git a/apps/token-tango-web-ui/src/lib/utils.ts b/apps/token-tango-web-ui/src/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/apps/token-tango-web-ui/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/apps/token-tango-web-ui/src/services/content-processor.ts b/apps/token-tango-web-ui/src/services/content-processor.ts new file mode 100644 index 0000000..96c4c25 --- /dev/null +++ b/apps/token-tango-web-ui/src/services/content-processor.ts @@ -0,0 +1,22 @@ +import { Buffer } from "buffer"; +import { ContentProcessor } from "@repo/utils"; + +export type BufferEncoding = "utf-8" | "base64"; + +export const browserContentProcessor: ContentProcessor = { + decodeContent(content: string, encoding: BufferEncoding): string { + return Buffer.from(content).toString(encoding); + }, + + encodeContent(content: string, encoding: BufferEncoding): string { + return Buffer.from(content).toString(encoding); + }, + + stringifyContent(content: unknown): string { + return JSON.stringify(content, undefined, 2); + }, + + parseContent(content: string): unknown { + return JSON.parse(content); + }, +}; diff --git a/apps/token-tango-web-ui/src/services/github-api.md b/apps/token-tango-web-ui/src/services/github-api.md new file mode 100644 index 0000000..411d7eb --- /dev/null +++ b/apps/token-tango-web-ui/src/services/github-api.md @@ -0,0 +1,128 @@ +# GitHub API Documentation + +## Overview + +This document outlines the GitHub API endpoints and functions used in the Token Tango application. We use the GitHub REST API v2022-11-28 for all operations. + +## API Endpoints + +All endpoints are prefixed with `https://api.github.com/repos/{repoFullName}/` + +- `GET /contents/{path}` - Get repository contents +- `POST /git/blobs` - Create a Git blob +- `GET /git/trees/{branch}` - Get a Git tree +- `POST /git/trees` - Create a Git tree +- `POST /git/commits` - Create a Git commit +- `GET /commits` - Get commit history +- `GET /branches` - List repository branches +- `GET /user/repos` - List user repositories + +## Functions + +### Repository Client Creation + +```typescript +createGithubRepositoryClient({ accessToken, repoFullName }: GithubCredentials) +``` + +Creates a client instance with authentication for interacting with a specific repository. + +### File Operations + +#### `fetchRawFile(url: string, head?: boolean)` + +Fetches raw file content from GitHub, with optional HEAD request. + +#### `getFileListByPath(path: string, branch?: string, headers?: HeadersInit)` + +Lists files in a directory path. + +#### `getFileDetailsByPath(path: string, branch?: string, headers?: HeadersInit)` + +Gets detailed information about a specific file. + +#### `getFileInPreviousPath(path: string, searchFileName: string)` + +Recursively searches for a file in parent directories. + +### Git Operations + +#### `createFileBlob({ path, content, encoding }: GithubFile)` + +Creates a Git blob for file content. + +#### `getBaseTree(branchName: string)` + +Gets the base tree for a branch. + +#### `createGithubRepoTree(branchName: string, files: GithubFile[])` + +Creates a new Git tree with modified files. + +#### `createCommit(branchName: string, message: string, files: GithubFile[], newBranchName?: string)` + +Creates a new commit with the specified files. + +### Repository Information + +#### `getBranches()` + +Lists all branches in the repository. + +#### `getLastCommitByPath(path: string)` + +Gets the last commit that modified a specific path. + +#### `getRepositories()` + +Lists repositories accessible to the authenticated user. + +## Types + +### `GithubCredentials` + +```typescript +{ + accessToken: string; + repoFullName: string; +} +``` + +### `GithubFile` + +```typescript +{ + path: string; + content: string; + encoding: string; +} +``` + +### `GithubFileDetails` + +```typescript +{ + name: string; + path: string; + sha: string; + size: number; + url: string; + html_url: string; + download_url: string; + type: string; + encoding: "utf-8" | "base64"; + content: string; +} +``` + +## Headers + +All API requests include these default headers: + +```typescript +{ + Accept: "application/vnd.github+json", + Authorization: `Bearer ${accessToken}`, + "X-GitHub-Api-Version": "2022-11-28" +} +``` diff --git a/apps/token-tango-web-ui/src/services/gitlab-api.md b/apps/token-tango-web-ui/src/services/gitlab-api.md new file mode 100644 index 0000000..8c91740 --- /dev/null +++ b/apps/token-tango-web-ui/src/services/gitlab-api.md @@ -0,0 +1,237 @@ +# GitLab API Integration Plan + +## Overview + +This document outlines the planned GitLab API integration for Token Tango, mirroring our GitHub functionality. We will use the GitLab REST API v4. + +## API Endpoints + +All endpoints are prefixed with `https://gitlab.com/api/v4/projects/{projectId}/` + +- `GET /repository/files/{path}` - Get repository file contents +- `POST /repository/files/{path}` - Create/update repository file +- `GET /repository/tree` - List repository contents +- `GET /repository/commits` - Get commit history +- `GET /repository/branches` - List repository branches +- `GET /projects` - List user's projects + +## Planned Functions + +### Repository Client Creation + +```typescript +type GitlabCredentials = { + accessToken: string; + projectId: string | number; // Can be name/namespace/project or project ID +} + +createGitlabRepositoryClient({ accessToken, projectId }: GitlabCredentials) +``` + +Creates a client instance with authentication for interacting with a specific GitLab project. + +### File Operations + +#### `fetchRawFile(path: string, ref?: string)` + +```typescript +// GET /repository/files/{path}/raw?ref={branch} +// Returns file content directly +``` + +Fetches raw file content from GitLab, with optional branch/ref specification. + +#### `getFileListByPath(path: string, ref?: string)` + +```typescript +// GET /repository/tree?path={path}&ref={branch} +// Returns: Array<{ +// id: string; +// name: string; +// type: string; +// path: string; +// mode: string; +// }> +``` + +Lists files in a directory path. + +#### `getFileDetailsByPath(path: string, ref?: string)` + +```typescript +// GET /repository/files/{encoded_path}?ref={branch} +// Returns: { +// file_name: string; +// file_path: string; +// size: number; +// encoding: string; +// content: string; +// content_sha256: string; +// ref: string; +// blob_id: string; +// commit_id: string; +// last_commit_id: string; +// } +``` + +Gets detailed information about a specific file. + +### Git Operations + +#### `createCommit(branch: string, message: string, files: GitlabFile[], newBranch?: string)` + +```typescript +type GitlabFile = { + path: string; + content: string; + encoding: "text" | "base64"; +}; + +// For each file: +// POST /repository/files/{encoded_path} +// { +// branch: string; +// content: string; +// commit_message: string; +// encoding: string; +// } +``` + +Creates a new commit with the specified files. In GitLab, we commit files individually rather than creating blobs and trees. + +#### `createBranch(newBranch: string, ref: string)` + +```typescript +// POST /repository/branches +// { +// branch: string; +// ref: string; +// } +``` + +Creates a new branch from an existing ref. + +### Repository Information + +#### `getBranches()` + +```typescript +// GET /repository/branches +// Returns: Array<{ +// name: string; +// protected: boolean; +// default: boolean; +// developers_can_push: boolean; +// developers_can_merge: boolean; +// can_push: boolean; +// web_url: string; +// commit: { +// id: string; +// short_id: string; +// title: string; +// message: string; +// author_name: string; +// author_email: string; +// authored_date: string; +// committed_date: string; +// } +// }> +``` + +Lists all branches in the repository. + +#### `getLastCommitByPath(path: string, ref?: string)` + +```typescript +// GET /repository/commits?path={path}&ref={branch} +// Returns the last commit that modified the path +``` + +Gets the last commit that modified a specific path. + +#### `getProjects()` + +```typescript +// GET /projects?membership=true +// Returns list of accessible projects +``` + +Lists projects accessible to the authenticated user. + +## Types + +### `GitlabCredentials` + +```typescript +{ + accessToken: string; + projectId: string | number; +} +``` + +### `GitlabFile` + +```typescript +{ + path: string; + content: string; + encoding: "text" | "base64"; +} +``` + +### `GitlabFileDetails` + +```typescript +{ + file_name: string; + file_path: string; + size: number; + encoding: string; + content: string; + content_sha256: string; + ref: string; + blob_id: string; + commit_id: string; + last_commit_id: string; +} +``` + +## Headers + +All API requests include these default headers: + +```typescript +{ + 'PRIVATE-TOKEN': accessToken, + 'Content-Type': 'application/json' +} +``` + +## Key Differences from GitHub Integration + +1. **Project Identification**: GitLab uses project IDs or full path with namespace (e.g., `group/subgroup/project`) instead of GitHub's `owner/repo` format. + +2. **File Operations**: + + - GitLab requires paths to be URL-encoded in the API endpoints + - GitLab commits files individually rather than using Git's blob/tree system + - GitLab provides direct file content endpoints without needing to decode base64 + +3. **Authentication**: + + - GitLab uses `PRIVATE-TOKEN` header instead of `Bearer` token + - GitLab tokens can be scoped more granularly at the API level + +4. **Rate Limiting**: + - GitLab's rate limits are typically higher than GitHub's + - Limits are based on user type (authenticated, admin, etc.) + +## Implementation Notes + +1. All paths in GitLab API calls must be URL-encoded +2. Error handling should account for GitLab-specific error codes and messages +3. Consider implementing pagination for large repositories +4. Token scope requirements: + - `read_repository` for read operations + - `write_repository` for write operations + - `api` for general API access diff --git a/apps/token-tango-web-ui/src/services/library.services.ts b/apps/token-tango-web-ui/src/services/library.services.ts index 48490fd..45b945e 100644 --- a/apps/token-tango-web-ui/src/services/library.services.ts +++ b/apps/token-tango-web-ui/src/services/library.services.ts @@ -7,6 +7,7 @@ import { VectorOutput, diffTokenLayers, formatLayerName, + toTokenNameFormatType, isExpression, isString, isTokenValidationResult, @@ -96,8 +97,10 @@ export const toTokenValues = ( export const toCollectionEntries = (state: State): CollectionEntry[] => { const { collections, issues, format, oldTokenLayers, tokenLayers } = state; + const formatType = toTokenNameFormatType(format); + // convert original collection to token name collection using radius-toolkit - const nameCollections = toTokenNameCollection(collections, format); + const nameCollections = toTokenNameCollection(collections, formatType); // find which tokens were added/modified/deleted based on the difference // between new and old token layers diff --git a/apps/token-tango-web-ui/src/services/repository.services.ts b/apps/token-tango-web-ui/src/services/repository.services.ts index 49af38b..d3e54e5 100644 --- a/apps/token-tango-web-ui/src/services/repository.services.ts +++ b/apps/token-tango-web-ui/src/services/repository.services.ts @@ -1,64 +1,53 @@ -import { WidgetConfiguration } from "@repo/config"; -import { createGithubRepositoryClient } from "@repo/utils"; - +import { RepositoryFormSchema } from "@repo/config"; import { createLogger } from "@repo/utils"; +import { createRepositoryService, determineRepositoryType } from "@repo/utils"; +import { browserContentProcessor } from "./content-processor"; const log = createLogger("WEB:Services:repository"); +type GithubCredentials = Extract; + export const testRepositoryConnection = async ( - credentials: Pick + credentials: Pick ) => { - const client = createGithubRepositoryClient({ - repoFullName: credentials.repository, - accessToken: credentials.accessToken, - }); - try { - const branches = await client.getBranches(); - log("debug", "testRepositoryConnection", { branches }); - - return { status: "online", branches } as const; - } catch (error) { - return { status: "error", error: (error as Error).message } as const; - } + const service = createRepositoryService( + determineRepositoryType(credentials.repository) + ); + return service.testRepositoryConnection(credentials, browserContentProcessor); }; export const testFileExists = async ( credentials: Pick< - WidgetConfiguration, + GithubCredentials, "repository" | "accessToken" | "branch" | "filePath" > ) => { - const client = createGithubRepositoryClient({ - repoFullName: credentials.repository, - accessToken: credentials.accessToken, + const service = createRepositoryService( + determineRepositoryType(credentials.repository) + ); + return service.testFileExists({ + ...credentials, }); - try { - const { filePath, branch } = credentials; - const file = await client.getFileDetailsByPath(filePath, branch); - log("debug", "testFileExists", { file }); - return { status: "found", file } as const; - } catch (error) { - return { status: "error", error: (error as Error).message } as const; - } }; export const getBranchNames = async ( - credentials: Pick< - WidgetConfiguration, - "repository" | "accessToken" | "branch" - > + credentials: Pick ) => { - const client = createGithubRepositoryClient({ - repoFullName: credentials.repository, - accessToken: credentials.accessToken, + const service = createRepositoryService( + determineRepositoryType(credentials.repository) + ); + return service.getBranchNames({ + ...credentials, }); - - const branches = await client.getBranches(); - log("debug", "testRepositoryConnection", { branches }); - return branches.map((b) => b.name); }; export const testBranchAlreadyExists = (branches: string[], branch: string) => { - const branchExists = branches.includes(branch); - return { status: branchExists ? "exists" : "not-exists" } as const; + const service = createRepositoryService("GitHub"); // Tool type doesn't matter for this pure function + return service.testBranchExists(branches, branch); +}; + +export const validateAccessToken = async (accessToken: string) => { + // For now, we'll default to GitHub since we don't have tool selection at this point + const service = createRepositoryService("GitHub"); + return service.validateAccessToken(accessToken); }; diff --git a/apps/token-tango-web-ui/src/types/persistence.ts b/apps/token-tango-web-ui/src/types/persistence.ts new file mode 100644 index 0000000..e25ef19 --- /dev/null +++ b/apps/token-tango-web-ui/src/types/persistence.ts @@ -0,0 +1,74 @@ +/** + * Defines the different approaches for persisting tokens + */ +export type PersistenceType = "repository" | "rest-server" | "file-download"; + +/** + * Status for Remote Repository persistence + */ +export type RepositoryStatus = { + type: "repository"; + state: "connected" | "disconnected" | "error"; + error?: string; +}; + +/** + * Status for REST Server persistence + */ +export type RestServerStatus = { + type: "rest-server"; + state: "connected" | "unreachable" | "error"; + error?: string; +}; + +/** + * Status for File Download persistence + */ +export type FileDownloadStatus = { + type: "file-download"; + state: "ready" | "processing" | "complete"; + error?: string; +}; + +/** + * Union type for all persistence statuses + */ +export type PersistenceStatus = + | RepositoryStatus + | RestServerStatus + | FileDownloadStatus; + +/** + * Maps persistence type to display text + */ +export const persistenceTypeLabels: Record = { + repository: "Remote Repository", + "rest-server": "REST Server", + "file-download": "File Download", +}; + +/** + * Maps status states to display colors + */ +export const statusStateColors: Record = { + connected: "#00B012", + disconnected: "#7A7A7A", + error: "#b00000", + unreachable: "#7A7A7A", + ready: "#00B012", + processing: "#FFA500", + complete: "#00B012", +}; + +/** + * Maps status states to icons + */ +export const statusStateIcons: Record = { + connected: "check", + disconnected: "refresh", + error: "warning", + unreachable: "cloud-off", + ready: "download", + processing: "loading", + complete: "check", +}; diff --git a/apps/token-tango-web-ui/tsconfig.json b/apps/token-tango-web-ui/tsconfig.json index a361f38..97233dd 100644 --- a/apps/token-tango-web-ui/tsconfig.json +++ b/apps/token-tango-web-ui/tsconfig.json @@ -74,7 +74,8 @@ "@/*": ["./@/*"], "@repo/utils": ["../../../packages/utils/index.ts"], "@repo/config": ["../../../packages/repository-config/index.ts"], - "react-hook-form": ["./node_modules/react-hook-form/dist/index.d.ts"] + "react-hook-form": ["./node_modules/react-hook-form/dist/index.d.ts"], + "@radix-ui/*": ["./node_modules/@radix-ui/*"] }, "typeRoots": ["node_modules/@types", "node_modules/@figma"] }, diff --git a/apps/token-tango-web-ui/vite.config.ts b/apps/token-tango-web-ui/vite.config.ts index 16ffdb3..64c4f04 100644 --- a/apps/token-tango-web-ui/vite.config.ts +++ b/apps/token-tango-web-ui/vite.config.ts @@ -3,26 +3,42 @@ import { defineConfig } from "vite"; import { viteSingleFile } from "vite-plugin-singlefile"; // https://vitejs.dev/config/ -export default defineConfig({ - root: ".", - plugins: [viteSingleFile()], - resolve: { - alias: { - "@": path.resolve(__dirname, "@"), +export default defineConfig(({ command, mode }) => { + const isDebug = mode === "debug"; + console.log("command", command); + console.log("mode", mode); + console.log("isDebug", isDebug); + return { + root: ".", + plugins: [viteSingleFile()], + resolve: { + alias: { + "@": path.resolve(__dirname, "@"), + }, + }, + define: { + BUILD_ENV: JSON.stringify(mode), }, - }, - build: { - sourcemap: false, - target: "esnext", - assetsInlineLimit: 100000000, - chunkSizeWarningLimit: 100000000, - cssCodeSplit: false, - outDir: "./dist", - cssMinify: true, - rollupOptions: { - output: { - inlineDynamicImports: true, + build: { + // Enable source maps in debug mode + sourcemap: isDebug ? "inline" : false, + target: "esnext", + assetsInlineLimit: 100000000, + chunkSizeWarningLimit: 100000000, + cssCodeSplit: false, + outDir: "./dist", + // Only minify CSS in production + cssMinify: !isDebug, + // Disable minification in debug mode + minify: isDebug ? false : "esbuild", + // Add more detailed build options for debugging + rollupOptions: { + output: { + inlineDynamicImports: true, + // Preserve module structure in debug mode + format: isDebug ? "esm" : "iife", + }, }, }, - }, + }; }); diff --git a/apps/token-tango-widget/esbuild.config.ts b/apps/token-tango-widget/esbuild.config.ts new file mode 100644 index 0000000..44786cb --- /dev/null +++ b/apps/token-tango-widget/esbuild.config.ts @@ -0,0 +1,15 @@ +import * as esbuild from "esbuild"; + +const context = await esbuild.context({ + entryPoints: ["src/code.tsx"], + bundle: true, + outfile: "dist/code.js", + sourcemap: true, + sourcesContent: true, + keepNames: true, + metafile: true, + target: "es6", + minify: false, +}); + +await context.watch(); diff --git a/apps/token-tango-widget/package.json b/apps/token-tango-widget/package.json index 7db1698..958d018 100644 --- a/apps/token-tango-widget/package.json +++ b/apps/token-tango-widget/package.json @@ -1,14 +1,14 @@ { "name": "@repo/widget", - "version": "0.10.0-alpha", + "version": "0.10.0-alpha4", "description": "Radius Token Tango -- a Figma widget to Synchronize Design Tokens between Figma and Code", "type": "module", "scripts": { - "build": "esbuild src/code.tsx --bundle --outfile=dist/code.js --target=es6 --sourcemap=inline --minify=false", + "build": "pnpm run tsc && esbuild src/code.tsx --bundle --outfile=dist/code.js --target=es6 --sourcemap=inline --sources-content=true --keep-names=true --metafile=true --minify=true --log-level=warning --analyze --tree-shaking=true --legal-comments=none --define:process.env.NODE_ENV=\\\"production\\\" --banner:js=\"/* Radius Token Tango Widget - Version: %npm_package_version% */\"", "lint": "eslint --ext .ts,.tsx --ignore-pattern node_modules .", "lint:fix": "eslint --ext .ts,.tsx --ignore-pattern node_modules --fix .", - "tsc": "tsc --noEmit -p src", - "dev": "pnpm run build --watch", + "tsc": "tsc --noEmit", + "dev": "esbuild src/code.tsx --bundle --outfile=dist/code.js --target=es6 --sourcemap=inline --sources-content=true --keep-names=true --metafile=true --minify=false --watch", "test": "vitest" }, "author": "", @@ -24,6 +24,7 @@ "@typescript-eslint/parser": "^8.18.1", "esbuild": "^0.21.4", "eslint": "^8.57.1", + "tsx": "^4.19.2", "typescript": "^5.3.3", "vite": "^5.2.6", "vite-plugin-singlefile": "^2.0.1", @@ -58,6 +59,7 @@ "@create-figma-plugin/utilities": "^3.2.0", "@repo/bandoneon": "workspace:*", "@repo/config": "workspace:*", + "@repo/repository": "workspace:*", "@repo/eslint-config": "workspace:*", "@repo/utils": "workspace:*", "buffer": "^6.0.3", diff --git a/apps/token-tango-widget/src/code.tsx b/apps/token-tango-widget/src/code.tsx index 0e40146..99bfa9e 100644 --- a/apps/token-tango-widget/src/code.tsx +++ b/apps/token-tango-widget/src/code.tsx @@ -1,592 +1,104 @@ +"use client"; + import { EmptyPage } from "./ui/pages/empty-page"; -import { emit, on } from "@create-figma-plugin/utilities"; -import { - ConfirmPushHandler, - IssueVisualizerHandler, - RepositoryTokenLayers, - State, - UiCloseHandler, - UiCommitHandler, - UiStateHandler, - WidgetStateHandler, - getState, -} from "../types/state"; -import { - fetchRepositoryTokenLayers, - saveRepositoryTokenLayers, -} from "./services/load-github.services"; -import { getTokenLayers } from "./services/load-tokens.services"; import { LoadedPage } from "./ui/pages/loaded-page"; import { PageLayout } from "./ui/pages/layout"; - import { version } from "../package.json"; - -import { PushMessageType, WidgetConfiguration } from "@repo/config"; +import { getState } from "../types/state"; import { - FormatName, - FormatValidationResult, - TokenCollection, - isTokenCollection, - TokenLayers, - TokenNameCollection, - TokenNameFormatType, - formats, - toTokenNameCollection, - VectorOutput, -} from "radius-toolkit"; -import { SuccessfullyPushedDetails } from "./ui/components/success-panel"; - + createRepositoryConfigurationDialogCallback, + createIssueDialogCallback, + createPushTokensDialogCallback, +} from "./dialogs/dialog-handlers"; import { createLogger } from "@repo/utils"; -import { - isComponent, - isComponentSet, - isComposite, - isFrame, - isInstance, - isVector, -} from "./common/figma.types"; +import { useAppState } from "./hooks/use-app-state"; +import { isLoadedAppState } from "./types/app-state"; const log = createLogger("WIDGET:code"); const { widget } = figma; -const { useSyncedState, waitForTask } = widget; - -export type LoadedTokens = { - inspectedAt: string; - collections: TokenCollection[]; - tokenLayers?: TokenLayers; -}; - -export const isValidConfiguration = ( - u: WidgetConfiguration | unknown, -): u is WidgetConfiguration => { - return !!u; -}; +/** + * Main widget component that handles the routing logic and state management + */ export function Widget() { - const [synchConfiguration, setSynchConfiguration] = - useSyncedState("synchedState", null); - const [errorMessage, setErrorMessage] = useSyncedState( - "errorState", - null, - ); - const [tokenNameFormat, setTokenNameFormat] = - useSyncedState("tokenNameFormat", null); - const [synchDetails, setSynchDetails] = - useSyncedState("synchDetails", null); - const [successfullyPushed, setSuccessfullyPushed] = - useSyncedState( - "successfullyPushedTokenDetails", - null, - ); - - const [persistedTokens, setPersistedTokens] = useSyncedState( - "persistedTokens", - null, - ); - const [persistedVectors, setPersistedVectors] = useSyncedState( - "persistedVectors", - null, - ); - const [loadedVectors, setLoadedVectors] = useSyncedState( - "loadedVectors", - null, - ); - - const [withVectors, setWithVectors] = useSyncedState( - "withVectors", - false, - ); - - const [allErrors, setAllErrors] = useSyncedState( - "allErrors", - [], - ); - - const format = tokenNameFormat - ? formats.find((f) => f.name === tokenNameFormat) ?? formats[0] - : formats[0]; - - const doSynchronize = synchRepository( - synchConfiguration, - setErrorMessage, - setSynchDetails, - ); - - const doSaveTokens = saveTokensToRepository( - synchConfiguration, - setErrorMessage, - ); + console.log("rendering Widget"); - const updateStatus = (error?: string) => { - log("debug", ">>> UPDATING STATUS"); - setSuccessfullyPushed(null); + try { + const [state, actions] = useAppState(); - return synchConfiguration - ? error - ? setSynchConfiguration({ - ...synchConfiguration, - error, - status: "error", - }) - : setSynchConfiguration({ - ...synchConfiguration, - error: undefined, - status: "online", - }) - : {}; - }; + console.log("Widget currentRoute", state.route); - const doLoadTokensAndSynch = async () => { - log("debug", ">>> LOADING YOUR TOKENS"); - waitForTask( - Promise.all([ - loadVariables(format, setPersistedTokens, setAllErrors), - doSynchronize(updateStatus), - ]), + const openConfig = createRepositoryConfigurationDialogCallback( + state.configuration, + actions.setConfiguration, ); - }; - - type LayerRender = undefined | VectorOutput; - - const removeSuffix = (name: string) => name.split("#")[0] ?? name; - - const renderLayer = async ( - node: SceneNode, - parent: string | undefined = undefined, - isVariant: boolean = false, - ): Promise => { - console.log("RENDERING LAYER", node.name, parent, node.type); - const result: LayerRender[] = []; - if (!isComposite(node)) { - log("debug", "Not a composite node", node.name, parent, node.type); - return result; - } - // this is a component or an instance therefore an individual vector - if (isComponent(node) || isInstance(node)) { - console.log( - "BEFORE RENDERING LAYER", - node, - isComponent(node), - isInstance(node), - isVariant, - ); - - const source = await node.exportAsync({ format: "SVG_STRING" }); - - console.log( - "AFTER EXPORTING", - node.name, - source, - isComponent(node), - isVariant, - ); - - console.log("VARIANT PROPERTIES", node.variantProperties); - - const properties = - isComponent(node) && !isVariant - ? getPropertyDefinitions(node, removeSuffix) - : node.variantProperties ?? {}; - console.log("AFTER RENDERING LAYER", node.name, "properties", properties); - const description = isComponent(node) ? node.description : ""; - console.log( - "AFTER RENDERING LAYER", - node.name, - "description", - description, - ); - - result.push({ - name: node.name, - description, - source, - parent, - properties, - }); - return result; - } - - console.log("FINISHED LOADING", result.length, "items"); - // this is also an individual vector wrapped in a frame - if (isFrame(node) && node.children.every(isVector)) { - const source = await node.exportAsync({ format: "SVG_STRING" }); - result.push({ - name: node.name, - description: "", - source, - parent, - properties: {}, - }); - return result; - } - - // if this is a layer with children, we need to render each child - if (node.children) { - console.log("OBJECT WITH CHILDREN", node.name, node.children.length); - const isThisAComponentSet = isComponentSet(node); - console.log("IS COMPONENT SET", isThisAComponentSet); - await Promise.all( - node.children.map(async (child) => { - const childResult = ( - await renderLayer(child, node.name, isThisAComponentSet) - ).filter((r) => (Array.isArray(r) ? r.length > 0 : r)); - result.push(...childResult); - }), - ); - } - return result; - }; - - const doLoadIcons = async () => { - log("debug", ">>> LOADING YOUR ICONS"); - const selected = figma.currentPage.selection; - if (selected.length === 0) { - log("debug", "No layers selected"); - return; - } const result = ( - await Promise.all(selected.map((object) => renderLayer(object))) - ) - .flatMap((r) => r) - .filter(Boolean); - - log("debug", "RESULT", result); - setLoadedVectors(result.length); - setPersistedVectors(JSON.stringify(result)); - }; - - return ( - doSynchronize(updateStatus)} - > - {persistedTokens === null || synchDetails === null ? ( - setTokenNameFormat(newFormat)} - synchConfig={synchConfiguration} - loadedIcons={loadedVectors} - loadIcons={() => { - log("debug", "Loading your icons!"); - waitForTask(doLoadIcons()); - }} - withVectors={withVectors} - toggleWithVectors={() => setWithVectors(!withVectors)} - clearIcons={() => { - log("debug", "Clearing your icons!"); - setPersistedVectors(null); - setLoadedVectors(null); - }} - loadTokens={async () => { - log("debug", "Loading your tokens!"); - waitForTask(doLoadTokensAndSynch()); - }} - openConfig={createRepositoryConfigurationDialogCallback( - synchConfiguration, - setSynchConfiguration, - )} - /> - ) : ( - { - log("debug", "Clearing your icons!"); - setPersistedVectors(null); - setLoadedVectors(null); - }} - openIssues={createIssueDialogCallback( - getState( - persistedTokens, - persistedVectors, - synchDetails, - format, - allErrors, - ), - )} - reloadTokens={async () => { - log("debug", ">>> RELOADING ALL VARIABLES"); - waitForTask(doLoadTokensAndSynch()); - }} - pushTokens={createPushTokensDialogCallback( - synchConfiguration, - (edits) => { - log("debug", "PUSHING TO THE REPOSITORY", edits); - - const { tokenLayers, vectors, packagejson, meta } = getState( - persistedTokens, - persistedVectors, - synchDetails, - format, - allErrors, - ); - - // merge them with the existing data from Github - const newSyncDetails: RepositoryTokenLayers = [ - { ...tokenLayers, vectors }, - packagejson, - meta, - ]; - log("debug", newSyncDetails); - waitForTask( - doSaveTokens(newSyncDetails ?? null, edits, () => { + + {state.route === "empty" ? ( + + ) : isLoadedAppState(state) ? ( + { + log("debug", "PUSHING TO THE REPOSITORY", pushMessage); + + const { tokenLayers, vectors, packagejson, meta } = getState( + state.persistedTokens, + state.persistedVectors, + state.synchDetails, + state.tokenFormatType, + state.allErrors, + ); + + // merge them with the existing data from Github + const newSyncDetails = [ + { ...tokenLayers, vectors }, + packagejson, + meta, + ] as const; + + log("debug", newSyncDetails); + actions.saveTokens(newSyncDetails, pushMessage, () => { log("debug", "FINISHED!!"); - setSuccessfullyPushed({ - branch: edits.branchName, - ref: synchConfiguration?.branch ?? "", - repository: synchConfiguration?.repository ?? "", - version: edits.version ?? "", - }); - }), - ); - log("debug", "FINISHED PUSHING TO THE REPOSITORY"); - }, - )} - /> - )} - - ); -} - -widget.register(Widget); - -function getPropertyDefinitions( - node: ComponentNode, - removeSuffix: (name: string) => string, -) { - console.log("[getPropertyDefinitions] GETTING PROPS FROM", node.name); - try { - return Object.entries(node.componentPropertyDefinitions).reduce( - (acc, [name, { defaultValue }]) => { - return { ...acc, [removeSuffix(name)]: String(defaultValue) }; - }, - {} as Record, + }); + log("debug", "FINISHED PUSHING TO THE REPOSITORY"); + }, + )} + /> + ) : null} + ); + console.log("Widget FINAL", result); + return result; } catch (e) { - console.error( - `[getPropertyDefinitions] Error getting props from ${node.name}`, - e, - ); - throw e; + console.error("Error rendering widget:", e); + // Return a minimal fallback UI + return widget.h("text", { fill: "#FF0000" }, "Widget Error"); } } -async function loadVariables( - format: TokenNameFormatType, - setPersistedTokens: (newValue: string | null) => void, - setAllErrors: (newValue: FormatValidationResult[]) => void, -) { - log("debug", ">>> LOADING VARIABLES"); - const [collections, tokenLayers, errors] = await getTokenLayers(format, true); - log("debug", tokenLayers); - log("debug", errors); - log("debug", ">>> SETTING STATE VARIABLES"); - setPersistedTokens( - JSON.stringify({ collections, tokenLayers, inspectedAt: strNow() }), - ); - log("debug", ">>> LOADED VARIABLES"); - setAllErrors(errors); - log("debug", ">>> LOADED ERRORS"); -} - -function saveTokensToRepository( - synchConfiguration: WidgetConfiguration | null, - setErrorMessage: (newValue: string | null) => void, -) { - return async ( - synchDetails: RepositoryTokenLayers | null, - { branchName, commitMessage, version }: PushMessageType, - done: () => void, - ) => { - log("debug", "saving tokens..."); - if (!isValidConfiguration(synchConfiguration)) { - console.warn("Invalid Github configuration"); - setErrorMessage("Invalid Github configuration"); - return; - } - - if (synchDetails === null) { - console.warn("Invalid Loaded Data"); - setErrorMessage("Invalid Loaded Data"); - return; - } - - return await saveRepositoryTokenLayers( - { - credentials: { - accessToken: synchConfiguration.accessToken, - repoFullName: synchConfiguration?.repository, - }, - branch: synchConfiguration.branch, - tokenFilePath: synchConfiguration.filePath, - createFile: synchConfiguration.createNewFile, - }, - synchDetails, - commitMessage, - branchName, - version, - ) - .then(done) - .catch((e) => { - log("debug", "WHAT??", e); - throw new Error(e); - }); - }; -} - -function synchRepository( - synchConfiguration: WidgetConfiguration | null, - setErrorMessage: (newValue: string | null) => void, - setSynchDetails: (newValue: RepositoryTokenLayers | null) => void, -): (updateConfiguration: (err?: string) => void) => Promise { - log("debug", ">>>>>> Update Configuration", synchConfiguration); - return async (updateConfiguration) => { - log("debug", "synchronizing..."); - if (!isValidConfiguration(synchConfiguration)) { - console.warn("Invalid Github configuration"); - setErrorMessage("Invalid Github configuration"); - updateConfiguration("Invalid Github configuration"); - return; - } - - return await fetchRepositoryTokenLayers({ - credentials: { - accessToken: synchConfiguration.accessToken, - repoFullName: synchConfiguration?.repository, - }, - branch: synchConfiguration.branch, - tokenFilePath: synchConfiguration.filePath, - createFile: synchConfiguration.createNewFile, - }) - .then((details) => { - log("debug", "synchronizing...DONE!"); - - updateConfiguration(); // success! - - /// Update data from last commit of token file - return setSynchDetails(details); - }) - .catch((e: unknown) => { - if (e instanceof Error) { - setErrorMessage("Error Synchronizing with Git repository, " + e.message); - updateConfiguration("Error Synchronizing with Git repository, " + e.message); - } - else { - setErrorMessage("Error Synchronizing with Git repository"); - updateConfiguration("Error Synchronizing with Git repository"); - } - console.error(e); - }); - }; -} - -function createRepositoryConfigurationDialogCallback( - synchConfiguration: WidgetConfiguration | null, - setSynchConfiguration: (newValue: WidgetConfiguration | null) => void, -): () => void { - return () => - waitForTask( - new Promise((resolve) => { - figma.showUI(__html__, { - title: "Configure Token Export", - width: 575, - height: 700, - }); - emit("PLUGIN_STATE_CHANGE", synchConfiguration); - on("UI_STATE_CHANGE", (msg) => { - setSynchConfiguration(msg); - resolve("close"); - }); - on("UI_CLOSE", () => { - resolve("close"); - }); - }), - ); -} - -function createIssueDialogCallback(state: State): () => void { - log("debug", "createIssueDialogCallback"); - log("debug", { state }); - return () => - waitForTask( - new Promise((resolve) => { - figma.showUI(__html__, { - title: "Validation Issues", - width: 575, - height: 700, - }); - emit( - "PLUGIN_VIEW_ISSUE", - JSON.stringify({ - state, - }), - ); - on("UI_CLOSE", () => { - resolve("close"); - }); - }), - ); -} - -function createPushTokensDialogCallback( - synchConfiguration: WidgetConfiguration | null, - setConfirmPushDialogData: (newValue: PushMessageType) => void, -): (branch: string, message: string, version: string) => void { - return (branchName, commitMessage, version) => - new Promise((resolve) => { - figma.showUI(__html__, { - title: "Confirm Push to Github", - width: 575, - height: 630, - }); - if (!synchConfiguration || synchConfiguration.error) { - log("error", "Invalid Github configuration", synchConfiguration?.error); - throw new Error("Invalid Github configuration"); - } - emit("PLUGIN_CONFIRM_PUSH", { - ...synchConfiguration, - branchName, - commitMessage, - }); - on("UI_COMMIT_CHANGE", (msg) => { - setConfirmPushDialogData({ ...msg, version }); - resolve("close"); - }); - on("UI_CLOSE", () => { - resolve("close"); - }); - }); -} - -function formatLocalDateTime(d: Date): string { - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, "0"); - const day = String(d.getDate()).padStart(2, "0"); - - // Get local timezone abbreviation - const time = d.toLocaleTimeString("en-us", { timeZoneName: "short" }); - - const formattedDateTime = `${year}-${month}-${day} ${time}`; - return formattedDateTime; -} - -function strNow() { - const d = new Date(); - return formatLocalDateTime(d); +// Wrap registration in try-catch +try { + widget.register(Widget); +} catch (e) { + console.error("Error registering widget:", e); } diff --git a/apps/token-tango-widget/src/dialogs/dialog-handlers.ts b/apps/token-tango-widget/src/dialogs/dialog-handlers.ts new file mode 100644 index 0000000..38f8fee --- /dev/null +++ b/apps/token-tango-widget/src/dialogs/dialog-handlers.ts @@ -0,0 +1,106 @@ +import { emit, on } from "@create-figma-plugin/utilities"; +import { createLogger } from "@repo/utils"; +import { WidgetConfiguration } from "@repo/config"; + +import { PushMessageType } from "@repo/config"; +import { waitForTask } from "../types/figma-types"; +import { + ConfirmPushHandler, + IssueVisualizerHandler, + State, + UiCloseHandler, + UiCommitHandler, + UiStateHandler, + WidgetStateHandler, +} from "../../types/state"; + +const log = createLogger("WIDGET:dialogs"); + +/** + * Creates a callback for handling repository configuration dialog + */ +export function createRepositoryConfigurationDialogCallback( + synchConfiguration: WidgetConfiguration | null, + setSynchConfiguration: (newValue: WidgetConfiguration | null) => void, +): () => void { + return () => + waitForTask( + new Promise((resolve) => { + figma.showUI(__html__, { + title: "Configure Token Export", + width: 575, + height: 700, + }); + emit("PLUGIN_STATE_CHANGE", synchConfiguration); + on("UI_STATE_CHANGE", (msg) => { + console.log("UI_STATE_CHANGE sent from WEB UI", msg); + setSynchConfiguration(msg); + resolve("close"); + }); + on("UI_CLOSE", () => { + console.log("UI_CLOSE sent from WEB UI"); + resolve("close"); + }); + }), + ); +} + +/** + * Creates a callback for handling issue visualization dialog + */ +export function createIssueDialogCallback(state: State): () => void { + log("debug", "createIssueDialogCallback"); + log("debug", { state }); + return () => + waitForTask( + new Promise((resolve) => { + figma.showUI(__html__, { + title: "Validation Issues", + width: 575, + height: 700, + }); + emit( + "PLUGIN_VIEW_ISSUE", + JSON.stringify({ + state, + }), + ); + on("UI_CLOSE", () => { + resolve("close"); + }); + }), + ); +} + +/** + * Creates a callback for handling token push confirmation dialog + */ +export function createPushTokensDialogCallback( + synchConfiguration: WidgetConfiguration | null, + setConfirmPushDialogData: (newValue: PushMessageType) => void, +): (branch: string, message: string, version: string) => void { + return (branchName, commitMessage, version) => + new Promise((resolve) => { + figma.showUI(__html__, { + title: "Confirm Push to Github", + width: 575, + height: 630, + }); + if (!synchConfiguration || synchConfiguration.error) { + log("error", "Invalid Github configuration", synchConfiguration?.error); + throw new Error("Invalid Github configuration"); + } + emit("PLUGIN_CONFIRM_PUSH", { + ...synchConfiguration, + branchName, + commitMessage, + }); + on("UI_COMMIT_CHANGE", (msg) => { + setConfirmPushDialogData({ ...msg, version }); + resolve("close"); + }); + on("UI_CLOSE", () => { + resolve("close"); + }); + }); +} diff --git a/apps/token-tango-widget/src/hooks/use-app-state.ts b/apps/token-tango-widget/src/hooks/use-app-state.ts new file mode 100644 index 0000000..49c742f --- /dev/null +++ b/apps/token-tango-widget/src/hooks/use-app-state.ts @@ -0,0 +1,116 @@ +import { useTokenManagement } from "./use-token-management"; +import { useVectorManagement } from "./use-vector-management"; +import { useSyncManagement } from "./use-sync-management"; +import { useRouting } from "./use-routing"; +import { FormatName, getFormat, toTokenNameFormatType } from "radius-toolkit"; +import { AppState, EmptyAppState, LoadedAppState } from "../types/app-state"; +import { createLogger } from "@repo/utils"; +import { waitForTask } from "../types/figma-types"; +import { LoadedTokens } from "../types/widget-types"; + +const log = createLogger("WIDGET:app-state"); + +/** + * Actions that can be performed on the app state + */ +export type AppStateActions = { + loadTokens: () => Promise; + loadIcons: () => Promise; + clearIcons: () => void; + toggleVectors: () => void; + setTokenNameFormat: (format: FormatName) => void; + synchronize: () => Promise; + saveTokens: ( + synchDetails: Parameters< + ReturnType[1]["saveTokens"] + >[0], + pushMessage: Parameters< + ReturnType[1]["saveTokens"] + >[1], + onSuccess: Parameters< + ReturnType[1]["saveTokens"] + >[2], + ) => Promise; + setConfiguration: ( + config: Parameters< + ReturnType[1]["setConfiguration"] + >[0], + ) => void; +}; + +/** + * Hook that combines all the state management hooks into one + */ +export const useAppState = (): [AppState, AppStateActions] => { + const { currentRoute } = useRouting(); + const [tokenState, tokenActions] = useTokenManagement(); + const [vectorState, vectorActions] = useVectorManagement(); + const [syncState, syncActions] = useSyncManagement(); + + const format = getFormat(tokenState.tokenNameFormat ?? "radius-simple"); + if (!format) { + throw new Error("Invalid token name format"); + } + const tokenFormatType = toTokenNameFormatType(format); + + // Combine all the state into one object + const baseState = { + // Vector state + persistedVectors: vectorState.persistedVectors, + loadedVectors: vectorState.loadedVectors, + withVectors: vectorState.withVectors, + + // Token state + tokenNameFormat: tokenState.tokenNameFormat, + allErrors: tokenState.allErrors, + + // Sync state + configuration: syncState.configuration, + errorMessage: syncState.errorMessage, + synchDetails: syncState.synchDetails, + successfullyPushed: syncState.successfullyPushed, + + // Format + tokenFormatType, + }; + + // Create the state based on the current route + const state: AppState = + currentRoute === "empty" || !tokenState.persistedTokens + ? ({ + ...baseState, + route: "empty", + persistedTokens: null, + } as EmptyAppState) + : ({ + ...baseState, + route: "loaded", + persistedTokens: tokenState.persistedTokens, + parsedTokens: JSON.parse(tokenState.persistedTokens) as LoadedTokens, + } as LoadedAppState); + + // Combine all actions into one object + const actions: AppStateActions = { + loadTokens: async () => { + log("debug", ">>> LOADING YOUR TOKENS"); + waitForTask( + Promise.all([ + tokenActions.loadTokens(tokenFormatType), + syncActions.synchronize(), + ]), + ); + }, + loadIcons: async () => { + log("debug", "Loading your icons!"); + waitForTask(vectorActions.loadVectors()); + }, + clearIcons: vectorActions.clearVectors, + toggleVectors: vectorActions.toggleVectors, + setTokenNameFormat: tokenActions.setTokenNameFormat, + synchronize: syncActions.synchronize, + saveTokens: syncActions.saveTokens, + setConfiguration: syncActions.setConfiguration, + }; + + return [state, actions]; +}; diff --git a/apps/token-tango-widget/src/hooks/use-routing.ts b/apps/token-tango-widget/src/hooks/use-routing.ts new file mode 100644 index 0000000..6af6007 --- /dev/null +++ b/apps/token-tango-widget/src/hooks/use-routing.ts @@ -0,0 +1,53 @@ +// Define possible routes in the widget +export type RouteName = "empty" | "loaded"; + +type RouteState = { + currentRoute: RouteName; + params: Record; +}; + +/** + * Singleton store for routing state that minimizes widget re-renders + */ +const routingStore = { + state: { + currentRoute: "empty" as RouteName, + params: {} as Record, + }, + listeners: new Set<() => void>(), + + getState: () => routingStore.state, + + setState: (newState: Partial) => { + routingStore.state = { ...routingStore.state, ...newState }; + routingStore.listeners.forEach((listener) => listener()); + }, + + subscribe: (listener: () => void) => { + routingStore.listeners.add(listener); + return () => routingStore.listeners.delete(listener); + }, +}; + +/** + * Hook to access routing state with minimal widget re-renders + */ +export const useRouting = () => { + const { widget } = figma; + const { useSyncedState, useEffect } = widget; + const [, forceUpdate] = useSyncedState("routeUpdate", 0); + + // Subscribe to store updates only in the main widget component + useEffect(() => { + const unsubscribe = routingStore.subscribe(() => { + Promise.resolve().then(() => forceUpdate((prev) => prev + 1)); + }); + return unsubscribe; + }); + + return { + ...routingStore.getState(), + navigate: (route: RouteName) => routingStore.setState({ currentRoute: route }), + setParams: (params: Record) => routingStore.setState({ params }), + }; +}; \ No newline at end of file diff --git a/apps/token-tango-widget/src/hooks/use-sync-management.ts b/apps/token-tango-widget/src/hooks/use-sync-management.ts new file mode 100644 index 0000000..1295a6f --- /dev/null +++ b/apps/token-tango-widget/src/hooks/use-sync-management.ts @@ -0,0 +1,159 @@ +import { createLogger } from "@repo/utils"; +import { + WidgetConfiguration, + PushMessageType, + isGithubConfig, +} from "@repo/config"; +import { RepositoryTokenLayers } from "../../types/state"; +import { SuccessfullyPushedDetails } from "../ui/components/success-panel"; +import { + fetchRepositoryTokenLayers, + saveRepositoryTokenLayers, +} from "../services/load-github.services"; +import { isValidConfiguration } from "../types/widget-types"; +import { useSyncedState } from "../types/figma-types"; + +const log = createLogger("WIDGET:sync"); + +type SyncState = { + configuration: WidgetConfiguration | null; + errorMessage: string | null; + synchDetails: RepositoryTokenLayers | null; + successfullyPushed: SuccessfullyPushedDetails | null; +}; + +type SyncActions = { + synchronize: () => Promise; + saveTokens: ( + synchDetails: RepositoryTokenLayers, + pushMessage: PushMessageType, + onSuccess: () => void, + ) => Promise; + setConfiguration: (config: WidgetConfiguration | null) => void; + updateStatus: (error?: string) => void; +}; + +export const useSyncManagement = (): [SyncState, SyncActions] => { + const [configuration, setConfiguration] = + useSyncedState("synchedState", null); + const [errorMessage, setErrorMessage] = useSyncedState( + "errorState", + null, + ); + const [synchDetails, setSynchDetails] = + useSyncedState("synchDetails", null); + const [successfullyPushed, setSuccessfullyPushed] = + useSyncedState( + "successfullyPushedTokenDetails", + null, + ); + + const updateStatus = (error?: string) => { + log("debug", ">>> UPDATING STATUS"); + setSuccessfullyPushed(null); + + if (!configuration) return; + + error + ? setConfiguration({ + ...configuration, + error, + status: "error", + }) + : setConfiguration({ + ...configuration, + error: undefined, + status: "connected", + }); + }; + + const synchronize = async () => { + log("debug", "synchronizing..."); + if (!isValidConfiguration(configuration)) { + console.warn("Invalid Github configuration"); + setErrorMessage("Invalid Github configuration"); + updateStatus("Invalid Github configuration"); + return; + } + + try { + if (!isGithubConfig(configuration)) { + log("debug", "Not a Github configuration"); + return; + } + + const details = await fetchRepositoryTokenLayers({ + credentials: { + accessToken: configuration.accessToken, + repository: configuration.repository, + }, + branch: configuration.branch, + tokenFilePath: configuration.filePath, + createFile: configuration.createNewFile, + }); + + log("debug", "synchronizing...DONE!"); + updateStatus(); // success! + setSynchDetails(details as RepositoryTokenLayers); + } catch (e: unknown) { + log("debug", "synchronizing...ERROR!"); + setErrorMessage("Error Synchronizing with Git repository"); + updateStatus("Error Synchronizing with Git repository"); + console.error(e); + } + }; + + const saveTokens = async ( + synchDetails: RepositoryTokenLayers, + { branchName, commitMessage, version }: PushMessageType, + onSuccess: () => void, + ) => { + log("debug", "saving tokens..."); + if (!isValidConfiguration(configuration)) { + console.warn("Invalid Github configuration"); + setErrorMessage("Invalid Github configuration"); + return; + } + + try { + if (!isGithubConfig(configuration)) { + log("debug", "Not a Github configuration"); + return; + } + + const result = await saveRepositoryTokenLayers( + { + credentials: { + accessToken: configuration.accessToken, + repository: configuration.repository, + }, + branch: configuration.branch, + tokenFilePath: configuration.filePath, + createFile: configuration.createNewFile, + }, + synchDetails, + commitMessage, + branchName, + version, + ); + + setSuccessfullyPushed({ + branch: branchName, + ref: configuration.branch, + repository: configuration.repository, + version: version || synchDetails[1]?.version || "0.0.0", + }); + + onSuccess(); + } catch (e) { + log("debug", "WHAT??", e); + setErrorMessage(String(e)); + throw new Error(String(e)); + } + }; + + return [ + { configuration, errorMessage, synchDetails, successfullyPushed }, + { synchronize, saveTokens, setConfiguration, updateStatus }, + ]; +}; diff --git a/apps/token-tango-widget/src/hooks/use-token-management.ts b/apps/token-tango-widget/src/hooks/use-token-management.ts new file mode 100644 index 0000000..76f2299 --- /dev/null +++ b/apps/token-tango-widget/src/hooks/use-token-management.ts @@ -0,0 +1,72 @@ +import { createLogger } from "@repo/utils"; +import { FormatValidationResult, TokenNameFormatType, formats, FormatName } from "radius-toolkit"; +import { getTokenLayers } from "../services/load-tokens.services"; +import { useSyncedState } from "../types/figma-types"; + +const log = createLogger("WIDGET:tokens"); + +/** + * Format a date into a local date-time string + */ +const formatDateTime = (d: Date): string => { + return d.toLocaleString("en-US", { + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }); +}; + +type TokenState = { + persistedTokens: string | null; + tokenNameFormat: FormatName | null; + allErrors: FormatValidationResult[]; +}; + +type TokenActions = { + loadTokens: (format: TokenNameFormatType) => Promise; + setTokenNameFormat: (format: FormatName | null) => void; +}; + +export const useTokenManagement = (): [TokenState, TokenActions] => { + const [persistedTokens, setPersistedTokens] = useSyncedState( + "persistedTokens", + null, + ); + const [tokenNameFormat, setTokenNameFormat] = useSyncedState( + "tokenNameFormat", + null, + ); + const [allErrors, setAllErrors] = useSyncedState( + "allErrors", + [], + ); + + const loadTokens = async (format: TokenNameFormatType) => { + log("debug", ">>> LOADING VARIABLES"); + const [collections, tokenLayers, errors] = await getTokenLayers(format, true); + log("debug", tokenLayers); + log("debug", errors); + log("debug", ">>> SETTING STATE VARIABLES"); + + const now = new Date(); + setPersistedTokens( + JSON.stringify({ + collections, + tokenLayers, + inspectedAt: formatDateTime(now) + }), + ); + log("debug", ">>> LOADED VARIABLES"); + setAllErrors(errors); + log("debug", ">>> LOADED ERRORS"); + }; + + return [ + { persistedTokens, tokenNameFormat, allErrors }, + { loadTokens, setTokenNameFormat } + ]; +}; \ No newline at end of file diff --git a/apps/token-tango-widget/src/hooks/use-vector-management.ts b/apps/token-tango-widget/src/hooks/use-vector-management.ts new file mode 100644 index 0000000..7eadeb2 --- /dev/null +++ b/apps/token-tango-widget/src/hooks/use-vector-management.ts @@ -0,0 +1,120 @@ +import { createLogger } from "@repo/utils"; +import { LayerRender, VectorState } from "../types/vector-types"; +import { + useSyncedState, + isComponent, + isComposite, + isFrame, + isInstance, + isVector +} from "../types/figma-types"; + +const log = createLogger("WIDGET:vectors"); + +export const useVectorManagement = (): [VectorState, { + loadVectors: () => Promise; + clearVectors: () => void; + toggleVectors: () => void; +}] => { + const [persistedVectors, setPersistedVectors] = useSyncedState( + "persistedVectors", + null, + ); + const [loadedVectors, setLoadedVectors] = useSyncedState( + "loadedVectors", + null, + ); + const [withVectors, setWithVectors] = useSyncedState( + "withVectors", + false, + ); + + const removeSuffix = (name: string) => name.split("#")[0] ?? name; + + const renderLayer = async ( + node: SceneNode, + parent: string | undefined = undefined, + ): Promise => { + const result: LayerRender[] = []; + if (!isComposite(node)) { + log("debug", "Not a composite node", node.name, parent, node.type); + return result; + } + if (isComponent(node) || isInstance(node)) { + const source = await node.exportAsync({ format: "SVG_STRING" }); + + const properties = isComponent(node) + ? Object.entries(node.componentPropertyDefinitions).reduce( + (acc, [name, { defaultValue }]) => { + return { ...acc, [removeSuffix(name)]: String(defaultValue) }; + }, + {} as Record, + ) + : node.variantProperties ?? {}; + + const description = isComponent(node) ? node.description : ""; + + result.push({ + name: node.name, + description, + source, + parent, + properties, + }); + return result; + } + if (isFrame(node) && node.children.every(isVector)) { + const source = await node.exportAsync({ format: "SVG_STRING" }); + result.push({ + name: node.name, + description: "", + source, + parent, + properties: {}, + }); + return result; + } + if (node.children) { + await Promise.all( + node.children.map(async (child) => { + const childResult = (await renderLayer(child, node.name)).filter( + (r) => (Array.isArray(r) ? r.length > 0 : r), + ); + result.push(...childResult); + }), + ); + } + return result; + }; + + const loadVectors = async () => { + log("debug", ">>> LOADING YOUR ICONS"); + const selected = figma.currentPage.selection; + if (selected.length === 0) { + log("debug", "No layers selected"); + return; + } + const result = ( + await Promise.all(selected.map((object) => renderLayer(object))) + ) + .flatMap((r) => r) + .filter(Boolean); + + log("debug", "RESULT", result); + setLoadedVectors(result.length); + setPersistedVectors(JSON.stringify(result)); + }; + + const clearVectors = () => { + log("debug", "Clearing your icons!"); + setPersistedVectors(null); + setLoadedVectors(null); + }; + + const toggleVectors = () => setWithVectors(!withVectors); + + return [ + { persistedVectors, loadedVectors, withVectors }, + { loadVectors, clearVectors, toggleVectors } + ]; +}; \ No newline at end of file diff --git a/apps/token-tango-widget/src/services/content-processor.ts b/apps/token-tango-widget/src/services/content-processor.ts new file mode 100644 index 0000000..86e0d3e --- /dev/null +++ b/apps/token-tango-widget/src/services/content-processor.ts @@ -0,0 +1,22 @@ +import { Buffer } from "buffer"; +import { ContentProcessor } from "@repo/utils"; + +export type BufferEncoding = "utf-8" | "base64"; + +export const widgetContentProcessor: ContentProcessor = { + decodeContent(content: string, encoding: BufferEncoding): string { + return Buffer.from(content, encoding).toString(); + }, + + encodeContent(content: string, encoding: string): string { + return Buffer.from(content).toString(encoding as BufferEncoding); + }, + + stringifyContent(content: unknown): string { + return JSON.stringify(content, undefined, 2); + }, + + parseContent(content: string): unknown { + return JSON.parse(content); + }, +}; diff --git a/apps/token-tango-widget/src/services/load-github.services.ts b/apps/token-tango-widget/src/services/load-github.services.ts index ca5c007..fe3a883 100644 --- a/apps/token-tango-widget/src/services/load-github.services.ts +++ b/apps/token-tango-widget/src/services/load-github.services.ts @@ -1,36 +1,27 @@ import { join } from "path-browserify"; -import { Buffer } from "buffer"; import { - GithubOptions, - createGithubRepositoryClient, - GithubClient, - isPackageJSON, - isGithubFileDetails, - githubUrlToPath, - PackageJSON, - CommitDetails, - GithubFileDetails, - LastCommit, + createRepositoryService, + determineRepositoryType, + RepositoryOptions, } from "@repo/utils"; -import { TokenLayers } from "radius-toolkit"; - import { createLogger } from "@repo/utils"; import { RepositoryTokenLayers } from "../../types/state"; +import { widgetContentProcessor } from "./content-processor"; const log = createLogger("Services:load-github"); /** * Formats the relative path of a package.json file based on the provided options and packageJson - * @param options - The GithubOptions object containing the necessary credentials and branch information. + * @param options - The repository options object containing the necessary credentials and branch information. * @param packageJsonPath - The path to the package.json file. * @returns The formatted relative path of the package.json file. */ export const formatPackageJsonRelativePath = ( - options: GithubOptions, + options: RepositoryOptions, packageJsonPath: string | undefined, ) => { if (!packageJsonPath) return undefined; - const branchPrefix = join(options.credentials.repoFullName, options.branch); + const branchPrefix = join(options.credentials.repository, options.branch); const packageJsonFullPath = join(packageJsonPath ?? "", "package.json"); const packageJsonRelativePath = packageJsonFullPath?.replace( branchPrefix, @@ -39,208 +30,50 @@ export const formatPackageJsonRelativePath = ( return packageJsonRelativePath; }; -/** - * Retrieves the package.json file from the GitHub repository. - * - * @param client - The GitHub client. - * @param options - The GitHub options. - * @returns A tuple containing the package.json object, token file, and the relative path to the package.json file. - * @throws An error if the package.json file cannot be found or if there is a problem reading it. - */ -const getPackageJson = async (client: GithubClient, options: GithubOptions) => { - log("debug", ">>", "getPackageJson 1"); - const [tokenFilePath, packageFileDetails] = - await client.getFileInPreviousPath(options.tokenFilePath, "package.json"); - log("debug", ">>", "getPackageJson 2", tokenFilePath); - if (!packageFileDetails) { - log("error", ">>>", "package.json not found!"); - return [undefined, undefined] as const; - } - if (!isGithubFileDetails(packageFileDetails)) { - log("debug", "PACKAGE.JSON UNKNOWN FORMAT:", packageFileDetails); - return [undefined, tokenFilePath] as const; - } - - const packagejsonStr = Buffer.from( - packageFileDetails.content, - packageFileDetails.encoding, - ).toString(); - - const packagejson = JSON.parse(packagejsonStr); - - if (!isPackageJSON(packagejson)) { - log("debug", "PACKAGE.JSON NOT THE RIGHT FORMAT"); - return [undefined, tokenFilePath] as const; - } - log("debug", "SUCCESSFULLY", packagejson.version); - return [packagejson, tokenFilePath, packageFileDetails] as const; -}; - /** * fetch latest version of foundations and tokens from github * @param options - The options for fetching the token layers. * @returns A tuple containing the token layers, package.json, and metadata. */ -export const fetchRepositoryTokenLayers = async (options: GithubOptions) => { +export const fetchRepositoryTokenLayers = async ( + options: RepositoryOptions, +) => { log("debug", "fetchRepositoryTokenLayers 1"); - const client = createGithubRepositoryClient(options.credentials); - log("debug", "fetchRepositoryTokenLayers 2"); - const [packagejson, tokenFilePath, packageFileDetails] = await getPackageJson( - client, - options, - ); - - if (!packagejson) { - log("error", "fetchRepositoryTokenLayers 2.1", "instruct user to create a package.json file in their repo"); - throw new Error( - "package.json file not found, must be a Node repository", - ); - } - - const tokenFileDetails = await client - .getFileDetailsByPath(tokenFilePath, options.branch) - .catch((e) => { - if (e.message.includes("404")) { - console.info("Token file not found at ", tokenFilePath); - return undefined; - } - throw e; - }); - - log("debug", "fetchRepositoryTokenLayers 3", tokenFileDetails); - - if (!tokenFileDetails && !options.createFile) { - throw new Error( - "Token file not found and option to create new file is not set", - ); - } - - const fileToGetCommitsFrom = tokenFileDetails ?? packageFileDetails; - - const lastCommitsFromRepo = await client.getLastCommitByPath( - fileToGetCommitsFrom?.path ?? "/", - ); - - log("debug", "fetchRepositoryTokenLayers 4"); - const lastCommits: Array = lastCommitsFromRepo.map( - ({ - commit: { author, committer, message }, - sha, - author: authorDetails, - committer: committerDetails, - }) => ({ - sha, - message, - author, - committer, - autor_avatar_url: authorDetails?.avatar_url, - commiter_avatar_url: committerDetails?.avatar_url, - }), + const service = createRepositoryService( + determineRepositoryType(options.credentials.repository), ); - - log("debug", "fetchRepositoryTokenLayers 5"); - - // retry obtaining token file content if the original one is empty (ISSUE WITH GITHUB API) - const tokenFileContent = - tokenFileDetails && - tokenFileDetails.content && - (tokenFileDetails.encoding as string) !== "none" - ? Buffer.from( - tokenFileDetails.content, - tokenFileDetails.encoding, - ).toString() - : await client - .getFileDetailsByPath(tokenFilePath, options.branch, { - Accept: "application/vnd.github.raw+json", - "Accept-Encoding": "gzip, deflate, br, base64, utf-8", - "X-GitHub-Api-Version": "2022-11-28", - }) - .catch((e) => { - if (e.message.includes("404")) { - console.info("Token file not found at ", tokenFilePath); - return undefined; - } - throw e; - }) - .then((res) => JSON.stringify(res)); - - log("debug", "fetchRepositoryTokenLayers 6"); - log("debug", tokenFileContent); - - const [name, version] = [ - packagejson?.name ?? "---", - packagejson?.version ?? "0.0.0", - ] as const; - - const meta = { - name, - version, - lastCommits, - packageFileDetails, - }; - - // TODO: add proper typeguard for the contents of the file and some error messages to make it easier for consumers to understand what went wrong - const tokenLayers = - options.createFile && !tokenFileContent - ? ({ - layers: [], - order: [], - } satisfies TokenLayers) - : JSON.parse(tokenFileContent); - log("debug", "fetchRepositoryTokenLayers 7"); - log("debug", tokenLayers); - return [tokenLayers, packagejson, meta] as const; + return service.fetchRepositoryTokenLayers({ + ...options, + contentProcessor: widgetContentProcessor, + }); }; /** * Saves the repository token layers and increments the package.json version. - * @param options - The GithubOptions object containing the credentials and branch information. + * @param options - The repository options object containing the credentials and branch information. * @param tokenLayers - The object representing the token layers to be saved. * @param message - The commit message. * @param destinationBranch - The destination branch. * @param version - Version to update on package.json */ export const saveRepositoryTokenLayers = async ( - options: GithubOptions, + options: RepositoryOptions, synchData: RepositoryTokenLayers, message: string, destinationBranch?: string, version?: string, ) => { - const client = createGithubRepositoryClient(options.credentials); - - const [tokenLayers, packagejson, { packageFileDetails }] = synchData; - - const packageVersion = packagejson?.version ?? "0.0.0"; - log("debug", "Saving version", packageVersion, "->", version); - return await client.createCommit( - options.branch, + const service = createRepositoryService( + determineRepositoryType(options.credentials.repository), + ); + return service.saveRepositoryTokenLayers( + { + ...options, + contentProcessor: widgetContentProcessor, + }, + synchData[0], message, - [ - // token file - { - encoding: "utf-8", - path: options.tokenFilePath, - content: JSON.stringify(tokenLayers, undefined, 2), - }, - // increment package.json version - ...(packageFileDetails && packagejson - ? [ - { - encoding: "utf-8", - path: githubUrlToPath(packageFileDetails.url), - content: JSON.stringify( - { - ...packagejson, - version, - }, - undefined, - 2, - ), - }, - ] - : []), - ], destinationBranch, + version, ); }; diff --git a/apps/token-tango-widget/src/token-list/variants-docs.tsx b/apps/token-tango-widget/src/token-list/variants-docs.tsx deleted file mode 100644 index 547b35b..0000000 --- a/apps/token-tango-widget/src/token-list/variants-docs.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import { ComponentTokens, TokenRecords } from "../common/token.types.js"; -import { calculateSubjectsFromProps } from "../common/token.utils.js"; -import { Icon16px } from "../ui/components/icon.js"; -import { Pill } from "../ui/components/pill.js"; -import { PropDocs } from "./prop-docs.js"; - -const { widget } = figma; -const { Text, AutoLayout } = widget; - -export type VariantsDocsProps = { - name: string; - tokenList: TokenRecords; -}; - -export const EmptyComponentDocs = () => ( - - - - No component selected - - - Select a component and click the 'Add Component' button - - - -); - -export const VariantsDocs: FunctionalWidget = ({ - name, - tokenList, -}) => { - const variants = tokenList && Object.entries(tokenList); - if (!variants || variants.length < 1) return ; - - const items: ComponentTokens[] = variants.map(([attribute, tokenDict]) => { - const subjects = calculateSubjectsFromProps(Object.values(tokenDict)); - return { - name, - attribute, - subjects, - tokens: Object.entries(tokenDict), - } satisfies ComponentTokens; - }); - - return ( - - {items.map(({ name, subjects, attribute, tokens }) => ( - <> - - - - - {name} - - - {attribute} - - - {subjects.length > 0 ? ( - - - - subjects: - - {subjects.map((subject, idx) => ( - {subject} - ))} - - - ) : ( - - )} - - {tokens.length > 0 ? ( - - {tokens.map(([key, value]) => ( - - ))} - - ) : ( - - Same properties as default - - )} - - ))} - - ); -}; diff --git a/apps/token-tango-widget/src/types/app-state.ts b/apps/token-tango-widget/src/types/app-state.ts new file mode 100644 index 0000000..3190130 --- /dev/null +++ b/apps/token-tango-widget/src/types/app-state.ts @@ -0,0 +1,68 @@ +import { + FormatName, + FormatValidationResult, + TokenNameFormatType, +} from "radius-toolkit"; +import { WidgetConfiguration } from "@repo/config"; +import { SuccessfullyPushedDetails } from "../ui/components/success-panel"; +import { LoadedTokens } from "./widget-types"; +import { RepositoryTokenLayers } from "../../types/state"; + +/** + * Base state that is common to all routes + */ +type BaseAppState = { + // Vector state + persistedVectors: string | null; + loadedVectors: number | null; + withVectors: boolean; + + // Token state + tokenNameFormat: FormatName | null; + allErrors: FormatValidationResult[]; + + // Sync state + configuration: WidgetConfiguration | null; + errorMessage: string | null; + synchDetails: RepositoryTokenLayers | null; + successfullyPushed: SuccessfullyPushedDetails | null; + + // Format + tokenFormatType: TokenNameFormatType; +}; + +/** + * State when the app is in empty state (no tokens loaded) + */ +export type EmptyAppState = BaseAppState & { + route: "empty"; + persistedTokens: null; +}; + +/** + * State when the app has loaded tokens + */ +export type LoadedAppState = BaseAppState & { + route: "loaded"; + persistedTokens: string; + parsedTokens: LoadedTokens; +}; + +/** + * The complete app state as a discriminated union + */ +export type AppState = EmptyAppState | LoadedAppState; + +/** + * Type guard to check if the app state is loaded + */ +export const isLoadedAppState = (state: AppState): state is LoadedAppState => { + return state.route === "loaded"; +}; + +/** + * Type guard to check if the app state is empty + */ +export const isEmptyAppState = (state: AppState): state is EmptyAppState => { + return state.route === "empty"; +}; diff --git a/apps/token-tango-widget/src/types/figma-types.ts b/apps/token-tango-widget/src/types/figma-types.ts new file mode 100644 index 0000000..e90951c --- /dev/null +++ b/apps/token-tango-widget/src/types/figma-types.ts @@ -0,0 +1,48 @@ +const { widget } = figma; + +/** + * Re-export Figma widget's useSyncedState hook + */ +export const { useSyncedState, waitForTask } = widget; + +/** + * Type for Figma's useSyncedState hook + */ +export type UseSyncedState = [T, (newValue: T) => void]; + +/** + * Type guard for Figma component nodes + */ +export const isComponent = (node: SceneNode): node is ComponentNode => { + return node.type === "COMPONENT"; +}; + +/** + * Type guard for Figma instance nodes + */ +export const isInstance = (node: SceneNode): node is InstanceNode => { + return node.type === "INSTANCE"; +}; + +/** + * Type guard for Figma frame nodes + */ +export const isFrame = (node: SceneNode): node is FrameNode => { + return node.type === "FRAME"; +}; + +/** + * Type guard for Figma vector nodes + */ +export const isVector = (node: SceneNode): node is VectorNode => { + return node.type === "VECTOR"; +}; + +/** + * Type guard for composite nodes (nodes that can have children) + */ +export const isComposite = ( + node: SceneNode, +): node is ComponentNode | InstanceNode | FrameNode => { + return isComponent(node) || isInstance(node) || isFrame(node); +}; \ No newline at end of file diff --git a/apps/token-tango-widget/src/types/persistence-metadata.ts b/apps/token-tango-widget/src/types/persistence-metadata.ts new file mode 100644 index 0000000..affe1ae --- /dev/null +++ b/apps/token-tango-widget/src/types/persistence-metadata.ts @@ -0,0 +1,26 @@ +export type RepositoryMetadata = { + version?: string; + lastCommit?: { + message: string; + author: { + name: string; + avatar_url?: string; + date: string; + }; + }; +}; + +export type RestServerMetadata = { + version?: string; + lastSync?: string; +}; + +export type FileDownloadMetadata = { + lastModified?: string; +}; + +export type PersistenceMetadata = { + repository: RepositoryMetadata; + "rest-server": RestServerMetadata; + "file-download": FileDownloadMetadata; +}; diff --git a/apps/token-tango-widget/src/types/vector-types.ts b/apps/token-tango-widget/src/types/vector-types.ts new file mode 100644 index 0000000..c1001d6 --- /dev/null +++ b/apps/token-tango-widget/src/types/vector-types.ts @@ -0,0 +1,9 @@ +import { VectorOutput } from "radius-toolkit"; + +export type LayerRender = undefined | VectorOutput; + +export type VectorState = { + persistedVectors: string | null; + loadedVectors: number | null; + withVectors: boolean; +}; \ No newline at end of file diff --git a/apps/token-tango-widget/src/types/widget-types.ts b/apps/token-tango-widget/src/types/widget-types.ts new file mode 100644 index 0000000..db6f479 --- /dev/null +++ b/apps/token-tango-widget/src/types/widget-types.ts @@ -0,0 +1,43 @@ +import { + TokenCollection, + TokenLayers, + FormatValidationResult, + FormatName, +} from "radius-toolkit"; +import { WidgetConfiguration } from "@repo/config"; +import { SuccessfullyPushedDetails } from "../ui/components/success-panel"; +import { RepositoryTokenLayers } from "../../types/state"; + +/** + * Represents the loaded tokens data structure + */ +export type LoadedTokens = { + inspectedAt: string; + collections: TokenCollection[]; + tokenLayers?: TokenLayers; +}; + +/** + * Represents the widget's state + */ +export type WidgetState = { + configuration: WidgetConfiguration | null; + errorMessage: string | null; + tokenNameFormat: FormatName | null; + synchDetails: RepositoryTokenLayers | null; + successfullyPushed: SuccessfullyPushedDetails | null; + persistedTokens: string | null; + persistedVectors: string | null; + loadedVectors: number | null; + withVectors: boolean; + allErrors: FormatValidationResult[]; +}; + +/** + * Type guard for widget configuration + */ +export const isValidConfiguration = ( + u: WidgetConfiguration | unknown, +): u is WidgetConfiguration => { + return !!u; +}; diff --git a/apps/token-tango-widget/src/ui/auto-layout-patterns.md b/apps/token-tango-widget/src/ui/auto-layout-patterns.md new file mode 100644 index 0000000..417e2ff --- /dev/null +++ b/apps/token-tango-widget/src/ui/auto-layout-patterns.md @@ -0,0 +1,202 @@ +# AutoLayout Pattern Analysis + +## Total Usage Statistics + +- Total AutoLayout components found: 87 +- Components that could be replaced with defaults: 42 (48.3%) +- Components that could be replaced with 1-2 prop overrides: 39 (44.8%) +- Components that need to remain custom: 6 (6.9%) + +## Exact Patterns (Default Values) + +### 1. Basic Container (21 occurrences, up from 15) + +```typescript +const AContainer: FunctionalWidget = ({ + cornerRadius = 16, + height = 24, + verticalAlignItems = "center", + width = "hug-contents", + ...props // allows overriding any AutoLayout prop +}) => ( + +); +``` + +Found in: variable-bullet.tsx, button.tsx, library-button.tsx +Additional matches with overrides: persistence-ribbon.tsx (height=32), push-panel.tsx (cornerRadius=12) + +### 2. Vertical Stack (19 occurrences, up from 12) + +```typescript +const AStack: FunctionalWidget = ({ + direction = "vertical", + width = "fill-parent", + spacing = 16, + ...props +}) => ( + +); +``` + +Found in: layout.tsx, empty-page.tsx, loaded-page.tsx +Additional matches with overrides: success-panel.tsx (spacing=8), token-issues-summary.tsx (spacing=24) + +### 3. Round Container (12 occurrences, up from 8) + +```typescript +const ARound: FunctionalWidget = ({ + cornerRadius = 69, + overflow = "visible", + spacing = 8, + padding = { vertical: 8, horizontal: 24 }, + width = "hug-contents", + height = "hug-contents", + horizontalAlignItems = "center", + verticalAlignItems = "center", + ...props +}) => ( + +); +``` + +Found in: round-button.tsx, library-button.tsx +Additional matches with overrides: persistence-ribbon.tsx (padding adjustment) + +### 4. Label Group (11 occurrences, up from 7) + +```typescript +const ALabelGroup: FunctionalWidget = ({ + overflow = "visible", + spacing = 8, + verticalAlignItems = "center", + ...props +}) => ( + +); +``` + +Found in: button.tsx, round-button.tsx, library-button.tsx +Additional matches with overrides: variable-bullet.tsx (spacing=4) + +## Semi-Patterns (Common with Overrides) + +### 1. Flex Container (24 occurrences, up from 18) + +```typescript +const AFlex: FunctionalWidget = ({ + overflow = "visible", + spacing = 4, + verticalAlignItems = "center", + ...props // commonly overridden: padding, width, direction +}) => ( + +); +``` + +### 2. Card Container (16 occurrences, up from 13) + +```typescript +const ACard: FunctionalWidget = ({ + cornerRadius = 8, + overflow = "visible", + ...props // commonly overridden: padding, spacing, fill +}) => ( + +); +``` + +## Impact Analysis + +### Lines of Code Impact + +- Current total lines for AutoLayout declarations: ~435 +- Estimated lines after refactoring: ~240 +- Potential reduction: ~195 lines (44.8%) + +### Maintainability Impact + +1. Props with default values (can be overridden): + + - `overflow="visible"` (81 occurrences, up from 73) + - `verticalAlignItems="center"` (63 occurrences, up from 52) + - `spacing={8}` (42 occurrences, up from 31) + - `width="hug-contents"` (34 occurrences, up from 28) + +2. Most common override combinations: + - `spacing` adjustment (27 occurrences) + - `padding` customization (22 occurrences) + - `cornerRadius` adjustment (14 occurrences) + +## Recommended Component Hierarchy + +```typescript +type ABaseProps = Partial; + +// Base components with full prop override support +ABase // Most basic AutoLayout wrapper +└─ AContainer // Basic container with centered content + ├─ AStack // Vertical/Horizontal stack + ├─ AFlex // Flexible container with common alignment + ├─ ACard // Card-style container + └─ ARound // Round-style container +``` + +## Next Steps + +1. Create base components in this order: + + - `AContainer` (highest impact, 21 replacements) + - `AStack` (19 replacements) + - `AFlex` (24 replacements with overrides) + - `ACard` (16 replacements with overrides) + +2. Migration strategy: + - Start with components using default values + - Document common override patterns + - Create examples showing prop override usage + - Provide migration templates for each pattern + +## Remaining Custom Usage + +Only 6 AutoLayout components need to remain custom (down from 14) due to: + +- Complex dynamic styling logic +- Unique animation requirements +- Special event handling +- Integration with external systems diff --git a/apps/token-tango-widget/src/ui/components/bullet-label.tsx b/apps/token-tango-widget/src/ui/components/bullet-label.tsx index 6208b7b..93a8a18 100644 --- a/apps/token-tango-widget/src/ui/components/bullet-label.tsx +++ b/apps/token-tango-widget/src/ui/components/bullet-label.tsx @@ -1,4 +1,5 @@ import { Icon16px, IconProps } from "./icon.js"; +import { colors } from "@repo/bandoneon"; const { widget } = figma; const { Text, AutoLayout, Ellipse } = widget; @@ -10,12 +11,12 @@ export type BulletLabelProps = { } & BaseProps & TextChildren; -const colors: Record = { - green: "#09C000", - amber: "#f1ba13", - red: "#da0000", - white: "#ffffff", - black: "#232323", +const bulletColors: Record = { + green: colors.status.bullet.green, + amber: colors.status.bullet.amber, + red: colors.status.bullet.red, + white: colors.status.bullet.white, + black: colors.status.bullet.black, }; export const BulletLabel: FunctionalWidget = ({ @@ -29,8 +30,13 @@ export const BulletLabel: FunctionalWidget = ({ spacing={12} verticalAlignItems="center" > - - + + {children} diff --git a/apps/token-tango-widget/src/ui/components/button.tsx b/apps/token-tango-widget/src/ui/components/button.tsx index 5a91aea..ddc8012 100644 --- a/apps/token-tango-widget/src/ui/components/button.tsx +++ b/apps/token-tango-widget/src/ui/components/button.tsx @@ -1,29 +1,81 @@ -import { borderRadius, padding, typography } from "@repo/bandoneon"; +import { borderRadius, padding, typography, colors } from "@repo/bandoneon"; import { Icon16px, IconProps } from "./icon.js"; const { widget } = figma; const { Text, AutoLayout } = widget; -export type ButtonProps = BaseProps & TextChildren & IconProps; +// Define button variants +type ButtonVariant = "default" | "ghost"; +// Define button states +type ButtonState = "default" | "disabled"; + +// Extend ButtonProps to include variant and state +export type ButtonProps = BaseProps & + TextChildren & + IconProps & { + variant?: ButtonVariant; + state?: ButtonState; + }; + +/** + * Button component that supports different variants and states + */ export const Button: FunctionalWidget = ({ children, icon, - color, + variant = "default", + state = "default", ...props -}) => ( - - - {children} - - - -); +}) => { + console.log(">>>>>>>>>>>>>>>>>>>>>>>> BUTTON", variant, state, icon, props); + // Define variant-specific styles + const variantStyles = { + default: { + fill: + state === "disabled" + ? colors.button.default.disabled.bg + : colors.button.default.bg, + padding: padding.button, + textColor: + state === "disabled" + ? colors.button.default.disabled.fg + : colors.button.default.fg, + }, + ghost: { + fill: "transparent", + padding: { + vertical: padding.button.vertical, + horizontal: 0, + }, + textColor: + state === "disabled" + ? colors.button.ghost.disabled.fg + : colors.button.ghost.fg, + }, + }; + + const currentStyle = variantStyles[variant]; + + return ( + + + {children} + + + + ); +}; diff --git a/apps/token-tango-widget/src/ui/components/icon.tsx b/apps/token-tango-widget/src/ui/components/icon.tsx index 4e9f26e..ce5fad6 100644 --- a/apps/token-tango-widget/src/ui/components/icon.tsx +++ b/apps/token-tango-widget/src/ui/components/icon.tsx @@ -192,6 +192,20 @@ const iconSrc = { `, + changes: ` + + `, + modified: ` + + + + `, + fileAdd: ` + + `, + server: ` + + `, }; export type IconType = keyof typeof iconSrc; @@ -208,6 +222,7 @@ export function Icon16px({ size = 16, ...props }: IconProps) { + console.log(">>>>>>>>>>>>>>>>>>>>>>>> ICON", icon, color, size); const source = iconSrc[icon].replaceAll(`#262626`, color); return ( diff --git a/apps/token-tango-widget/src/ui/components/library-button.tsx b/apps/token-tango-widget/src/ui/components/library-button.tsx index 117809d..6013e2e 100644 --- a/apps/token-tango-widget/src/ui/components/library-button.tsx +++ b/apps/token-tango-widget/src/ui/components/library-button.tsx @@ -1,11 +1,7 @@ +const { widget } = figma; +const { AutoLayout, Text, Frame, SVG } = widget; import { colors } from "@repo/bandoneon"; import { Icon16px, IconProps } from "./icon.js"; -import { RoundButton } from "./round-button.js"; -import { WarningBadge } from "./warning-badge.js"; -import { h } from "preact"; - -const { widget } = figma; -const { Text, AutoLayout } = widget; export type LibrayButtonProps = { state?: "default" | "inactive" | "loaded"; diff --git a/apps/token-tango-widget/src/ui/components/name-format.tsx b/apps/token-tango-widget/src/ui/components/name-format.tsx index 467231e..82482b9 100644 --- a/apps/token-tango-widget/src/ui/components/name-format.tsx +++ b/apps/token-tango-widget/src/ui/components/name-format.tsx @@ -2,7 +2,11 @@ import { colors, typography } from "@repo/bandoneon"; import { Icon16px } from "./icon.js"; import { VariableBullet } from "./variable-bullet.js"; -import { TokenNameFormatType, FormatName } from "radius-toolkit"; +import { + TokenNameFormatType, + FormatName, + TokenNamePortableFormatType, +} from "radius-toolkit"; import { URL_TOKEN_FORMAT_DOCS } from "../../constants.js"; const { widget } = figma; @@ -10,8 +14,8 @@ const { Text, AutoLayout, Frame, SVG } = widget; export type NameFormatProps = { variant?: "default" | "compact"; - format: TokenNameFormatType; - formats: ReadonlyArray; + format: TokenNamePortableFormatType; + formats: ReadonlyArray; selectFormat?: (format: FormatName) => void; }; @@ -21,8 +25,10 @@ export const NameFormat: FunctionalWidget = ({ format, selectFormat, }) => { + console.log("NameFormat", format); const idx = formats.indexOf(format); const nextFormat = formats[(idx + 1) % formats.length] ?? format; + console.log("NameFormat", nextFormat); return variant === "compact" ? ( @@ -30,6 +36,7 @@ export const NameFormat: FunctionalWidget = ({ Token Format: diff --git a/apps/token-tango-widget/src/ui/components/persistence-ribbon.tsx b/apps/token-tango-widget/src/ui/components/persistence-ribbon.tsx new file mode 100644 index 0000000..a976c13 --- /dev/null +++ b/apps/token-tango-widget/src/ui/components/persistence-ribbon.tsx @@ -0,0 +1,332 @@ +import { colors } from "@repo/bandoneon"; +import { Icon16px, IconType } from "./icon"; +import { StatusButton } from "./status-button.js"; +import { Button } from "./button.js"; +import { + PersistenceStatus, + PersistenceType, + persistenceTypeLabels, + statusStateColors, + statusStateIcons, +} from "@repo/utils/src/persistence"; +import { PersistenceMetadata } from "../../types/persistence-metadata"; +import { WidgetConfiguration } from "@repo/config"; +import { WidgetState } from "../../types/widget-types"; + +const { widget } = figma; +const { Text, AutoLayout, SVG, Image } = widget; + +export type PersistenceRibbonProps = { + name: string; + persistenceType: PersistenceType; + status: PersistenceStatus["state"]; + error?: string; + variant?: "compact" | "detailed"; + metadata?: Partial; + onConfig?: () => void; +} & BaseProps & + TextChildren; + +const persistenceTypeIcons: Record = { + repository: "github", + "rest-server": "server", + "file-download": "fileAdd", +}; + +/** + * Renders a ribbon showing persistence information with two variants: + * - compact: shows only the basic info (name, type, status) + * - detailed: shows all available metadata for the persistence type + */ +export const PersistenceRibbon: FunctionalWidget = ({ + name, + persistenceType, + status, + error, + variant = "compact", + metadata, + onConfig, + ...props +}) => { + console.log(">>>>>>>>>>>>>>>>>>>>>>>> PERSISTENCE RIBBON", { + name, + persistenceType, + status, + metadata, + variant, + error, + }); + const icon = statusStateIcons[status]; + const color = statusStateColors[status]; + const typeLabel = persistenceTypeLabels[persistenceType]; + const isSuccess = status === "connected" || status === "complete"; + console.log(">>> ICON DATA", status, icon, color); + return ( + + + + + + + {typeLabel}: + + + {name} + + + + {onConfig && ( + + )} + + + + + {variant === "detailed" && metadata && ( + <> + {persistenceType === "repository" && metadata.repository && ( + <> + + + + + {name} + + {metadata.repository.version && ( + + {metadata.repository.version} + + )} + + + + + {metadata.repository.lastCommit && ( + + + {metadata.repository.lastCommit.author?.avatar_url && ( + + + + )} + + + {metadata.repository.lastCommit.message} + + + {metadata.repository.lastCommit.author.name} •{" "} + {metadata.repository.lastCommit.author.date} + + + + + )} + + )} + + {persistenceType === "rest-server" && + metadata["rest-server"]?.lastSync && ( + <> + + Last synced: {metadata["rest-server"].lastSync} + + {metadata["rest-server"].version && ( + + Version: {metadata["rest-server"].version} + + )} + + )} + + {persistenceType === "file-download" && + metadata["file-download"]?.lastModified && ( + <> + + Last modified: {metadata["file-download"].lastModified} + + + )} + + )} + + ); +}; + +/** + * Extracts the appropriate metadata from a widget configuration based on its persistence type + */ +export const extractPersistenceMetadata = ( + state: WidgetState, +): Partial => { + const metadata = state.synchDetails?.[2]; + switch (state.configuration?.tool) { + case "GitHub": + return { + repository: { + version: metadata?.version, + lastCommit: metadata?.lastCommits[0], + }, + }; + case "REST Server": + return { + "rest-server": { + version: metadata?.version, + lastSync: undefined, // TODO: implement last sync + }, + }; + case "File Download": + return { + "file-download": { + lastModified: undefined, // TODO: implement last modified + }, + }; + default: + return {}; + } +}; diff --git a/apps/token-tango-widget/src/ui/components/refreshed-content.tsx b/apps/token-tango-widget/src/ui/components/refreshed-content.tsx index 3d76241..cb13ee7 100644 --- a/apps/token-tango-widget/src/ui/components/refreshed-content.tsx +++ b/apps/token-tango-widget/src/ui/components/refreshed-content.tsx @@ -1,131 +1,145 @@ -import { TokenNameFormatType } from "radius-toolkit"; -import { Button } from "./button"; -import { Icon16px } from "./icon"; -import { FormatDescription, NameFormat } from "./name-format"; -import { RoundButton } from "./round-button"; +import { colors, typography } from "@repo/bandoneon"; import { - SmallRepositoryRibbon, - SmallRepositoryRibbonProps, -} from "./short-repository-ribbon"; -import { colors } from "@repo/bandoneon"; -import { LibraryButton } from "./library-button"; + PersistenceRibbon, + PersistenceRibbonProps, +} from "./persistence-ribbon"; +import { Button } from "./button"; const { widget } = figma; -const { Text, AutoLayout, Frame } = widget; +const { Text, AutoLayout } = widget; export type RefreshedContentProps = { - loadedIcons: number | null; - loadTokens: () => void; - loadIcons: () => void; - clearIcons: () => void; - openConfig: () => void; - format: TokenNameFormatType; -} & SmallRepositoryRibbonProps; + name: string; + lastRefreshed?: string; + onRefresh?: () => void; + onClose?: () => void; + loadedIcons?: number; + loadIcons?: () => void; + clearIcons?: () => void; + loadTokens?: () => void; + openConfig?: () => void; +} & PersistenceRibbonProps; +/** + * Displays the current connection status and available actions + */ export const RefreshedContent: FunctionalWidget = ({ name, + lastRefreshed, + onRefresh, + onClose, status, - loadTokens, + persistenceType, loadedIcons, - clearIcons, loadIcons, + clearIcons, + loadTokens, openConfig, + ...props }) => { + const isConnected = status === "connected" || status === "complete"; + console.log(">>>>>>>>>>>>>>>>>>>>>>>> REFRESHED CONTENT", { + name, + status, + persistenceType, + isConnected, + }); return ( + + {onClose && ( + + )} + {loadedIcons ? ( + + ) : ( + + )} + ); }; diff --git a/apps/token-tango-widget/src/ui/components/repository-ribbon.tsx b/apps/token-tango-widget/src/ui/components/repository-ribbon.tsx deleted file mode 100644 index 7d202d4..0000000 --- a/apps/token-tango-widget/src/ui/components/repository-ribbon.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { Button } from "./button.js"; -import { CommitRibbon } from "./commit-ribbon.js"; -import { Icon16px } from "./icon.js"; -import { statusChoices } from "./short-repository-ribbon.js"; -import { StatusButton } from "./status-button.js"; -const { widget } = figma; -const { Text, AutoLayout, Image, useSyncedState } = widget; - -export type RepositoryRibbonProps = BaseProps & { - name: string; - avatarUrl: string; - userName: string; - commitMessage: string; - version: string; - dateTime: string; - status: "online" | "disconnected" | "error"; - openConfig: () => void; - error?: string; -}; - -export const statusText: Record = { - disconnected: "Refresh", - error: "Error", - online: "Synced", -}; - -export const RepositoryRibbon: FunctionalWidget = ({ - name, - avatarUrl, - userName, - commitMessage, - version, - dateTime, - status, - error, - openConfig, - ...props -}) => { - const { icon, color } = statusChoices[status]; - const text = statusText[status]; - - return ( - - - - - - {name} - - - - openConfig()} - label="Settings" - /> - - - {text} - - - - - - - - - {name} - - - {version} - - - - - - - ); -}; diff --git a/apps/token-tango-widget/src/ui/components/round-button.tsx b/apps/token-tango-widget/src/ui/components/round-button.tsx index 4817f69..c3a4de6 100644 --- a/apps/token-tango-widget/src/ui/components/round-button.tsx +++ b/apps/token-tango-widget/src/ui/components/round-button.tsx @@ -1,4 +1,5 @@ import { Icon16px, IconProps } from "./icon.js"; +import { colors } from "@repo/bandoneon"; const { widget } = figma; const { Text, AutoLayout } = widget; @@ -11,10 +12,10 @@ export type RoundButtonProps = { IconProps & AutoLayoutProps; -const colorScheme = { - default: ["#232323", "#FFFFFF"], - disabled: ["#e7e7e7", "#808080"], -}; +const getButtonColors = (variant: RoundButtonProps["variant"]) => ({ + bg: colors.button.round[variant ?? "default"].bg, + fg: colors.button.round[variant ?? "default"].fg, +}); export const RoundButton: FunctionalWidget = ({ children, @@ -23,7 +24,7 @@ export const RoundButton: FunctionalWidget = ({ icon, ...props }) => { - const [bg, fg] = colorScheme[variant]; + const { bg, fg } = getButtonColors(variant); return ( -> = { - online: { color: "#00B012", icon: "check" }, - disconnected: { color: "#7A7A7A", icon: "refresh" }, - error: { color: "#b00000", icon: "warning" }, -}; - -export const SmallRepositoryRibbon: FunctionalWidget< - SmallRepositoryRibbonProps -> = ({ name, status, error, ...props }) => { - const { icon, color } = statusChoices[status]; - return ( - - - - - - - - Repository: - - - {name} - - - - - - - - ); -}; diff --git a/apps/token-tango-widget/src/ui/components/token-change-bar.tsx b/apps/token-tango-widget/src/ui/components/token-change-bar.tsx index c52eb15..71dcd18 100644 --- a/apps/token-tango-widget/src/ui/components/token-change-bar.tsx +++ b/apps/token-tango-widget/src/ui/components/token-change-bar.tsx @@ -130,6 +130,7 @@ export const TokenChangeBar: FunctionalWidget = ({ > {tokensChanged.slice(0, MAX_CHANGES_TO_SHOW).map((token) => ( = ({ )} {segments.map((segment, idx) => ( - <> + = ({ )} - + ))} {variant !== "compact" && ( { + console.log("WidgetHeader", empty); return ( void; - clearIcons: () => void; - loadIcons: () => void; + state: EmptyAppState; + actions: Pick< + AppStateActions, + | "loadTokens" + | "loadIcons" + | "clearIcons" + | "setTokenNameFormat" + | "setConfiguration" + >; openConfig: () => void; - withVectors: boolean; - toggleWithVectors: () => void; - loadedIcons: number | null; - selectedFormat: FormatName | null; - selectFormat: (format: FormatName) => void; }; +/** + * Page shown when no tokens are loaded + */ export const EmptyPage: FunctionalWidget = ({ - synchConfig, - loadTokens, - loadIcons, - clearIcons, - loadedIcons, + state, + actions, openConfig, - selectedFormat, - selectFormat, }) => { - const format = getFormat(selectedFormat ?? formats[0].name) ?? formats[0]; + const format = + getFormat(state.tokenNameFormat ?? formats[0].name) ?? formats[0]; + const formatType = toTokenNameFormatType(format); + + const configuration = state.configuration; + + const metadata = configuration + ? extractPersistenceMetadata(state) + : undefined; + return ( = ({ fill={colors.base.fg} width="fill-parent" > - + = ({ fill="#fff" width="fill-parent" > - {synchConfig ? ( + {configuration ? ( ) : ( ; appVersion: string; - format: TokenNameFormatType; openConfig: () => void; - synchronize?: () => void; - loadVariables?: () => void; } & HasChildrenProps; +/** + * Main layout component that wraps all pages + */ export const PageLayout = ({ - synched, - format, - error, + state, + actions, appVersion, - synchDetails, openConfig, children, }: PageLayoutProps) => { - const synchMetadata = synchDetails && synchDetails[2]; + console.log("PageLayout", state.synchDetails); + const synchMetadata = state.synchDetails && state.synchDetails[2]; return ( - - + + - {error && ( + {state.errorMessage && ( - {error} + {state.errorMessage} )} {synchMetadata && synchMetadata.lastCommits && - synchMetadata.lastCommits[0] && ( - )} diff --git a/apps/token-tango-widget/src/ui/pages/loaded-page.tsx b/apps/token-tango-widget/src/ui/pages/loaded-page.tsx index 1897f74..2400d34 100644 --- a/apps/token-tango-widget/src/ui/pages/loaded-page.tsx +++ b/apps/token-tango-widget/src/ui/pages/loaded-page.tsx @@ -1,46 +1,26 @@ const { widget } = figma; -const { AutoLayout, Text, useSyncedState } = widget; +const { AutoLayout, Text } = widget; import { NameFormat } from "../components/name-format"; -import { LoadedTokens } from "../../code"; -import { Icon16px } from "../components/icon"; -import { - TokenIssuesSummary, - TokenIssuesSummaryProps, -} from "../components/token-issues-summary"; +import { TokenIssuesSummary } from "../components/token-issues-summary"; import { PushPanel } from "../components/push-panel"; import { isTokenLayers } from "../../common/generator.utils"; -import { - TokenNameFormatType, - formats, - FormatValidationResult, - TokenCollection, - isTokenValidationResult, - diffTokenLayers, -} from "radius-toolkit"; -import { isNotNil } from "radius-toolkit"; +import { isTokenValidationResult, diffTokenLayers } from "radius-toolkit"; import { borderRadius, colors } from "@repo/bandoneon"; -import { - SuccessPanel, - SuccessfullyPushedDetails, -} from "../components/success-panel"; - +import { SuccessPanel } from "../components/success-panel"; import { createLogger } from "@repo/utils"; -import { RepositoryTokenLayers } from "../../../types/state"; import { Fragment } from "preact"; +import { LoadedAppState } from "../../types/app-state"; +import { AppStateActions } from "../../hooks/use-app-state"; const log = createLogger("pages:loaded"); type LoadedPageProps = { - format: TokenNameFormatType; - allTokens: LoadedTokens; - issues: FormatValidationResult[]; - synchDetails: RepositoryTokenLayers; - successfullyPushed: SuccessfullyPushedDetails | null; - loadedIcons: number | null; - loadIcons: () => void; - clearIcons: () => void; - reloadTokens: () => void; + state: LoadedAppState; + actions: Pick< + AppStateActions, + "loadTokens" | "loadIcons" | "clearIcons" | "saveTokens" + >; openIssues: () => void; pushTokens: (branch: string, message: string, version: string) => void; }; @@ -50,31 +30,34 @@ const sum = (acc: number, item: P) => acc + transform(item); +/** + * Page shown when tokens are loaded + */ export const LoadedPage: FunctionalWidget = ({ - format, - allTokens: { collections, inspectedAt, tokenLayers }, - issues, - synchDetails: [previousTokenLayers, packageJson, meta], - successfullyPushed, - loadedIcons, - loadIcons, - clearIcons, + state, + actions, openIssues, - reloadTokens, pushTokens, }) => { - log("debug", "BEGIN RENDERING LOADED PAGE 1", successfullyPushed); + log("debug", "BEGIN RENDERING LOADED PAGE 1", state.successfullyPushed); + + const { collections, inspectedAt, tokenLayers } = state.parsedTokens; + const [previousTokenLayers, packageJson, meta] = state.synchDetails || []; - const summary = getSummaryOfCollections(collections, issues); + const summary = getSummaryOfCollections(collections, state.allErrors); log("debug", "BEGIN RENDERING LOADED PAGE 2"); - const collectionList = renderCollectionList(collections, format, issues); + const collectionList = renderCollectionList( + collections, + state.tokenFormatType, + state.allErrors, + ); log("debug", "RENDERING LOADED PAGE"); if (!isTokenLayers(tokenLayers) || !isTokenLayers(previousTokenLayers)) - return invalidLayersFile(format, reloadTokens); + return invalidLayersFile(state.tokenFormatType, actions.loadTokens); log("debug", "DIFF TOKEN LAYERS"); const [added, modified, deleted] = diffTokenLayers( @@ -86,7 +69,7 @@ export const LoadedPage: FunctionalWidget = ({ log("debug", "DELETED", deleted); // we only want to detail errors related to tokens - const tokenIssues = issues.filter(isTokenValidationResult); + const tokenIssues = state.allErrors.filter(isTokenValidationResult); // separate errors in added tokens and modified tokens const addedErrs = tokenIssues.filter( @@ -101,11 +84,11 @@ export const LoadedPage: FunctionalWidget = ({ = ({ width="fill-parent" padding={8} fill={ - successfullyPushed ? colors.success.muted : colors.repository.muted + state.successfullyPushed + ? colors.success.muted + : colors.repository.muted } cornerRadius={borderRadius.base} > - {successfullyPushed ? ( - + {state.successfullyPushed ? ( + ) : ( @@ -136,9 +121,9 @@ export const LoadedPage: FunctionalWidget = ({ }; const renderCollectionList = ( - collections: LoadedTokens["collections"], - format: TokenNameFormatType, - errors: FormatValidationResult[], + collections: LoadedAppState["parsedTokens"]["collections"], + format: LoadedAppState["tokenFormatType"], + errors: LoadedAppState["allErrors"], ) => { return collections.map(({ name, modes }) => { const [mode] = modes; @@ -150,17 +135,19 @@ const renderCollectionList = ( name.split(format.separator), ); - const segmentsBySegmentName = segmentNames.reduce( + const segmentsBySegmentName = segmentNames.reduce>( (acc, segmentName, idx) => { const uniqueSegments = new Set( - variablesAsSegments.map((segments) => segments[idx]), + variablesAsSegments + .map((segments) => segments[idx]) + .filter((s): s is string => s !== undefined), ); return { ...acc, - [segmentName]: Array.from(uniqueSegments).filter(isNotNil), + [segmentName]: Array.from(uniqueSegments), }; }, - {} as Record, + {}, ); return { @@ -175,8 +162,9 @@ const renderCollectionList = ( }; }); }; + function invalidLayersFile( - format: TokenNameFormatType, + format: LoadedAppState["tokenFormatType"], reloadTokens: () => void, ): FigmaDeclarativeNode { return ( @@ -232,8 +220,8 @@ function invalidLayersFile( } function getSummaryOfCollections( - collections: TokenCollection[], - errors: FormatValidationResult[], + collections: LoadedAppState["parsedTokens"]["collections"], + errors: LoadedAppState["allErrors"], ) { return { collections: collections.length, diff --git a/apps/token-tango-widget/src/utils/date-utils.ts b/apps/token-tango-widget/src/utils/date-utils.ts new file mode 100644 index 0000000..57d5668 --- /dev/null +++ b/apps/token-tango-widget/src/utils/date-utils.ts @@ -0,0 +1,20 @@ +/** + * Formats a date into a local date-time string with timezone + */ +export function formatLocalDateTime(d: Date): string { + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, "0"); + const day = String(d.getDate()).padStart(2, "0"); + + // Get local timezone abbreviation + const time = d.toLocaleTimeString("en-us", { timeZoneName: "short" }); + + return `${year}-${month}-${day} ${time}`; +} + +/** + * Returns the current date-time as a formatted string + */ +export function strNow(): string { + return formatLocalDateTime(new Date()); +} \ No newline at end of file diff --git a/apps/token-tango-widget/true b/apps/token-tango-widget/true new file mode 100644 index 0000000..4cddbc8 --- /dev/null +++ b/apps/token-tango-widget/true @@ -0,0 +1,3039 @@ +{ + "inputs": { + "src/constants.ts": { + "bytes": 296, + "imports": [], + "format": "esm" + }, + "../../packages/bandoneon/src/styles/colours.ts": { + "bytes": 1719, + "imports": [], + "format": "esm" + }, + "../../packages/bandoneon/src/styles/typography.ts": { + "bytes": 2656, + "imports": [ + { + "path": "../../packages/bandoneon/src/styles/colours.ts", + "kind": "import-statement", + "original": "./colours" + } + ], + "format": "esm" + }, + "../../packages/bandoneon/src/styles/spacing.ts": { + "bytes": 533, + "imports": [], + "format": "esm" + }, + "../../packages/bandoneon/src/styles/index.ts": { + "bytes": 84, + "imports": [ + { + "path": "../../packages/bandoneon/src/styles/colours.ts", + "kind": "import-statement", + "original": "./colours" + }, + { + "path": "../../packages/bandoneon/src/styles/typography.ts", + "kind": "import-statement", + "original": "./typography" + }, + { + "path": "../../packages/bandoneon/src/styles/spacing.ts", + "kind": "import-statement", + "original": "./spacing" + } + ], + "format": "esm" + }, + "../../packages/bandoneon/src/index.ts": { + "bytes": 26, + "imports": [ + { + "path": "../../packages/bandoneon/src/styles/index.ts", + "kind": "import-statement", + "original": "./styles" + } + ], + "format": "esm" + }, + "src/ui/components/icon.tsx": { + "bytes": 18356, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/variable-bullet.tsx": { + "bytes": 3397, + "imports": [ + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon.js" + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/name-format.tsx": { + "bytes": 6841, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "./icon.js", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/variable-bullet.tsx", + "kind": "import-statement", + "original": "./variable-bullet.js" + }, + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "src/constants.ts", + "kind": "import-statement", + "original": "../../constants.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/status-button.tsx": { + "bytes": 2909, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/src/persistence.ts": { + "bytes": 1679, + "imports": [], + "format": "esm" + }, + "src/ui/components/persistence-ribbon.tsx": { + "bytes": 10179, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon" + }, + { + "path": "src/ui/components/status-button.tsx", + "kind": "import-statement", + "original": "./status-button.js" + }, + { + "path": "./button.js", + "kind": "import-statement", + "external": true + }, + { + "path": "../../packages/utils/src/persistence.ts", + "kind": "import-statement", + "original": "@repo/utils/src/persistence" + }, + { + "path": "../../types/persistence-metadata", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "../../types/widget-types", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/button.tsx": { + "bytes": 1987, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/refreshed-content.tsx": { + "bytes": 3469, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/persistence-ribbon.tsx", + "kind": "import-statement", + "original": "./persistence-ribbon" + }, + { + "path": "src/ui/components/button.tsx", + "kind": "import-statement", + "original": "./button" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js": { + "bytes": 71491, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/lg-button.tsx": { + "bytes": 1961, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/pages/empty-page.tsx": { + "bytes": 4968, + "imports": [ + { + "path": "src/constants.ts", + "kind": "import-statement", + "original": "../../constants" + }, + { + "path": "src/ui/components/name-format.tsx", + "kind": "import-statement", + "original": "../components/name-format" + }, + { + "path": "src/ui/components/refreshed-content.tsx", + "kind": "import-statement", + "original": "../components/refreshed-content" + }, + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "src/ui/components/lg-button.tsx", + "kind": "import-statement", + "original": "../components/lg-button" + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "../../types/app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "../../hooks/use-app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/persistence-ribbon.tsx", + "kind": "import-statement", + "original": "../components/persistence-ribbon" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/library-button.tsx": { + "bytes": 2782, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/error-pill.tsx": { + "bytes": 868, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "./icon.js", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/IssuePill.tsx": { + "bytes": 570, + "imports": [ + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/error-pill.tsx", + "kind": "import-statement", + "original": "./error-pill" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/token-issues-summary.tsx": { + "bytes": 6894, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "./icon", + "kind": "import-statement", + "external": true + }, + { + "path": "./button", + "kind": "import-statement", + "external": true + }, + { + "path": "./round-button", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/lg-button.tsx", + "kind": "import-statement", + "original": "./lg-button" + }, + { + "path": "src/ui/components/library-button.tsx", + "kind": "import-statement", + "original": "./library-button" + }, + { + "path": "src/ui/components/IssuePill.tsx", + "kind": "import-statement", + "original": "./IssuePill" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/bullet-label.tsx": { + "bytes": 1081, + "imports": [ + { + "path": "./icon.js", + "kind": "import-statement", + "external": true + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/token-change-bar.tsx": { + "bytes": 4640, + "imports": [ + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "src/ui/components/bullet-label.tsx", + "kind": "import-statement", + "original": "./bullet-label" + }, + { + "path": "./error-pill", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon" + }, + { + "path": "src/ui/components/variable-bullet.tsx", + "kind": "import-statement", + "original": "./variable-bullet" + }, + { + "path": "src/ui/components/IssuePill.tsx", + "kind": "import-statement", + "original": "./IssuePill" + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/version-bump.tsx": { + "bytes": 2618, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "./icon.js", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/warning-badge.tsx": { + "bytes": 706, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/push-panel.tsx": { + "bytes": 6646, + "imports": [ + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "src/ui/components/icon.tsx", + "kind": "import-statement", + "original": "./icon" + }, + { + "path": "./round-button", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/token-change-bar.tsx", + "kind": "import-statement", + "original": "./token-change-bar" + }, + { + "path": "src/ui/components/version-bump.tsx", + "kind": "import-statement", + "original": "./version-bump" + }, + { + "path": "src/ui/components/warning-badge.tsx", + "kind": "import-statement", + "original": "./warning-badge" + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/lg-button.tsx", + "kind": "import-statement", + "original": "./lg-button" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/logging.utils.ts": { + "bytes": 2057, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.js": { + "bytes": 753, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "../../node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js": { + "bytes": 2564, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "../../node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.js": { + "bytes": 16622, + "imports": [ + { + "path": "../../node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.js", + "kind": "require-call", + "original": "requires-port" + }, + { + "path": "../../node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js", + "kind": "require-call", + "original": "querystringify" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "../../packages/utils/github.utils.ts": { + "bytes": 15917, + "imports": [ + { + "path": "../../node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.js", + "kind": "import-statement", + "original": "url-parse" + }, + { + "path": "../../packages/utils/logging.utils.ts", + "kind": "import-statement", + "original": "./logging.utils" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/gitlab.utils.ts": { + "bytes": 6820, + "imports": [ + { + "path": "../../node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.js", + "kind": "import-statement", + "original": "url-parse" + }, + { + "path": "../../packages/utils/logging.utils.ts", + "kind": "import-statement", + "original": "./logging.utils" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/repository.interface.ts": { + "bytes": 4084, + "imports": [ + { + "path": "./token-layers.types", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/token-layers.types.ts": { + "bytes": 456, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/github.service.ts": { + "bytes": 10950, + "imports": [ + { + "path": "../../packages/utils/repository.interface.ts", + "kind": "import-statement", + "original": "./repository.interface" + }, + { + "path": "../../packages/utils/github.utils.ts", + "kind": "import-statement", + "original": "./github.utils" + }, + { + "path": "../../packages/utils/logging.utils.ts", + "kind": "import-statement", + "original": "./logging.utils" + }, + { + "path": "../../packages/utils/token-layers.types.ts", + "kind": "import-statement", + "original": "./token-layers.types" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/repository.factory.ts": { + "bytes": 679, + "imports": [ + { + "path": "./repository.interface", + "kind": "import-statement", + "external": true + }, + { + "path": "../../packages/utils/github.service.ts", + "kind": "import-statement", + "original": "./github.service" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/utils/index.ts": { + "bytes": 244, + "imports": [ + { + "path": "../../packages/utils/logging.utils.ts", + "kind": "import-statement", + "original": "./logging.utils" + }, + { + "path": "../../packages/utils/github.utils.ts", + "kind": "import-statement", + "original": "./github.utils" + }, + { + "path": "../../packages/utils/gitlab.utils.ts", + "kind": "import-statement", + "original": "./gitlab.utils" + }, + { + "path": "../../packages/utils/repository.interface.ts", + "kind": "import-statement", + "original": "./repository.interface" + }, + { + "path": "../../packages/utils/repository.factory.ts", + "kind": "import-statement", + "original": "./repository.factory" + }, + { + "path": "../../packages/utils/github.service.ts", + "kind": "import-statement", + "original": "./github.service" + }, + { + "path": "../../packages/utils/src/persistence.ts", + "kind": "import-statement", + "original": "./src/persistence" + } + ], + "format": "esm" + }, + "src/common/generator.utils.ts": { + "bytes": 2550, + "imports": [ + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/success-panel.tsx": { + "bytes": 6189, + "imports": [ + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "./icon", + "kind": "import-statement", + "external": true + }, + { + "path": "./round-button", + "kind": "import-statement", + "external": true + }, + { + "path": "./token-change-bar", + "kind": "import-statement", + "external": true + }, + { + "path": "./version-bump", + "kind": "import-statement", + "external": true + }, + { + "path": "./warning-badge", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/bandoneon", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/lg-button.tsx", + "kind": "import-statement", + "original": "./lg-button" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/preact@10.25.4/node_modules/preact/dist/preact.module.js": { + "bytes": 11430, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/pages/loaded-page.tsx": { + "bytes": 6675, + "imports": [ + { + "path": "../components/name-format", + "kind": "import-statement", + "external": true + }, + { + "path": "src/ui/components/token-issues-summary.tsx", + "kind": "import-statement", + "original": "../components/token-issues-summary" + }, + { + "path": "src/ui/components/push-panel.tsx", + "kind": "import-statement", + "original": "../components/push-panel" + }, + { + "path": "src/common/generator.utils.ts", + "kind": "import-statement", + "original": "../../common/generator.utils" + }, + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/success-panel.tsx", + "kind": "import-statement", + "original": "../components/success-panel" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "../../node_modules/.pnpm/preact@10.25.4/node_modules/preact/dist/preact.module.js", + "kind": "import-statement", + "original": "preact" + }, + { + "path": "../../types/app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "../../hooks/use-app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/widget-header.tsx": { + "bytes": 9607, + "imports": [ + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "./button.js", + "kind": "import-statement", + "external": true + }, + { + "path": "./icon.js", + "kind": "import-statement", + "external": true + }, + { + "path": "./name-format.js", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/components/bottom-logo.tsx": { + "bytes": 16869, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/ui/pages/layout.tsx": { + "bytes": 3024, + "imports": [ + { + "path": "src/ui/components/widget-header.tsx", + "kind": "import-statement", + "original": "../components/widget-header" + }, + { + "path": "src/ui/components/bottom-logo.tsx", + "kind": "import-statement", + "original": "../components/bottom-logo" + }, + { + "path": "src/ui/components/persistence-ribbon.tsx", + "kind": "import-statement", + "original": "../components/persistence-ribbon" + }, + { + "path": "../../packages/bandoneon/src/index.ts", + "kind": "import-statement", + "original": "@repo/bandoneon" + }, + { + "path": "src/ui/components/name-format.tsx", + "kind": "import-statement", + "original": "../components/name-format" + }, + { + "path": "../../types/app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "../../hooks/use-app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "package.json": { + "bytes": 2635, + "imports": [] + }, + "types/state.ts": { + "bytes": 4202, + "imports": [ + { + "path": "@create-figma-plugin/utilities", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "src/common/generator.utils.ts", + "kind": "import-statement", + "original": "../src/common/generator.utils" + }, + { + "path": "preact/compat", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/hex-rgb@5.0.0/node_modules/hex-rgb/index.js": { + "bytes": 1392, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-hex-color-to-rgb-color.js": { + "bytes": 447, + "imports": [ + { + "path": "../../node_modules/.pnpm/hex-rgb@5.0.0/node_modules/hex-rgb/index.js", + "kind": "import-statement", + "original": "hex-rgb" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/private/named-colors.js": { + "bytes": 3762, + "imports": [], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-named-color-to-hex-color.js": { + "bytes": 330, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/private/named-colors.js", + "kind": "import-statement", + "original": "./private/named-colors.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/rgb-hex@4.1.0/node_modules/rgb-hex/index.js": { + "bytes": 1966, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-rgb-color-to-hex-color.js": { + "bytes": 422, + "imports": [ + { + "path": "../../node_modules/.pnpm/rgb-hex@4.1.0/node_modules/rgb-hex/index.js", + "kind": "import-statement", + "original": "rgb-hex" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/is-valid-hex-color.js": { + "bytes": 230, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-hex-color-to-rgb-color.js", + "kind": "import-statement", + "original": "./convert-hex-color-to-rgb-color.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/events.js": { + "bytes": 1858, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/function/ensure-minimum-time.js": { + "bytes": 553, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-image-element.js": { + "bytes": 419, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-blob-async.js": { + "bytes": 413, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-blob-async.js": { + "bytes": 456, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-image-element.js", + "kind": "import-statement", + "original": "./create-canvas-element-from-image-element.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-blob-async.js", + "kind": "import-statement", + "original": "./create-image-element-from-blob-async.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-bytes-async.js": { + "bytes": 287, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-blob-async.js", + "kind": "import-statement", + "original": "./create-image-element-from-blob-async.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-bytes-async.js": { + "bytes": 463, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-image-element.js", + "kind": "import-statement", + "original": "./create-canvas-element-from-image-element.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-bytes-async.js", + "kind": "import-statement", + "original": "./create-image-element-from-bytes-async.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-paint.js": { + "bytes": 262, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/read-bytes-from-canvas-element-async.js": { + "bytes": 495, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/mixed-values.js": { + "bytes": 132, + "imports": [], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/document-use-count.js": { + "bytes": 762, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/private/empty-license.js": { + "bytes": 191, + "imports": [], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/validate-gumroad-license-key-main-async.js": { + "bytes": 1941, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/private/empty-license.js", + "kind": "import-statement", + "original": "./private/empty-license.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/validate-gumroad-license-key-ui-async.js": { + "bytes": 1803, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/private/empty-license.js", + "kind": "import-statement", + "original": "./private/empty-license.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/total-use-count.js": { + "bytes": 662, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/absolute-position/get-absolute-position.js": { + "bytes": 196, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/absolute-position/set-absolute-position.js": { + "bytes": 863, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/traverse-node.js": { + "bytes": 428, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/collapse-layer.js": { + "bytes": 366, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/traverse-node.js", + "kind": "import-statement", + "original": "./traverse-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js": { + "bytes": 235, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/compute-bounding-box.js": { + "bytes": 796, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/absolute-position/get-absolute-position.js", + "kind": "import-statement", + "original": "./absolute-position/get-absolute-position.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "./get-nodes/get-parent-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/compute-maximum-bounds.js": { + "bytes": 823, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/compute-bounding-box.js", + "kind": "import-statement", + "original": "./compute-bounding-box.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/deduplicate-nodes.js": { + "bytes": 216, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-node-index-path.js": { + "bytes": 828, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-document-components.js": { + "bytes": 549, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/traverse-node.js", + "kind": "import-statement", + "original": "../traverse-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-scene-node-by-id.js": { + "bytes": 360, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-selected-nodes-or-all-nodes.js": { + "bytes": 290, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/insert-node/insert-after-node.js": { + "bytes": 323, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "../get-nodes/get-parent-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/insert-node/insert-before-node.js": { + "bytes": 329, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "../get-nodes/get-parent-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/is-locked.js": { + "bytes": 256, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/is-visible.js": { + "bytes": 261, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/is-within-instance-node.js": { + "bytes": 387, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/load-fonts-async.js": { + "bytes": 1254, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/private/update-relaunch-buttons-data.js": { + "bytes": 641, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/set-relaunch-button.js": { + "bytes": 480, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/private/update-relaunch-buttons-data.js", + "kind": "import-statement", + "original": "./private/update-relaunch-buttons-data.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/unset-relaunch-button.js": { + "bytes": 666, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/private/update-relaunch-buttons-data.js", + "kind": "import-statement", + "original": "./private/update-relaunch-buttons-data.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sibling-nodes/are-sibling-nodes.js": { + "bytes": 469, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "../get-nodes/get-parent-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sibling-nodes/compute-sibling-nodes.js": { + "bytes": 1071, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "../get-nodes/get-parent-node.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sort-nodes/sort-nodes-by-canonical-order.js": { + "bytes": 840, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "../get-nodes/get-parent-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sibling-nodes/are-sibling-nodes.js", + "kind": "import-statement", + "original": "../sibling-nodes/are-sibling-nodes.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/natural-compare-lite@1.4.0/node_modules/natural-compare-lite/index.js": { + "bytes": 1303, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sort-nodes/sort-nodes-by-name.js": { + "bytes": 649, + "imports": [ + { + "path": "../../node_modules/.pnpm/natural-compare-lite@1.4.0/node_modules/natural-compare-lite/index.js", + "kind": "import-statement", + "original": "natural-compare-lite" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/compare-string-arrays.js": { + "bytes": 281, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sort-nodes/update-nodes-sort-order.js": { + "bytes": 1225, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/compare-string-arrays.js", + "kind": "import-statement", + "original": "../../object/compare-string-arrays.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "../get-nodes/get-parent-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sibling-nodes/are-sibling-nodes.js", + "kind": "import-statement", + "original": "../sibling-nodes/are-sibling-nodes.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/traverse-node-async.js": { + "bytes": 517, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/private/regex.js": { + "bytes": 307, + "imports": [], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/evaluate-numeric-expression.js": { + "bytes": 610, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/private/regex.js", + "kind": "import-statement", + "original": "./private/regex.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/is-valid-numeric-input.js": { + "bytes": 657, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/private/regex.js", + "kind": "import-statement", + "original": "./private/regex.js" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/clone-object.js": { + "bytes": 602, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/compare-objects.js": { + "bytes": 1063, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/deduplicate-array.js": { + "bytes": 331, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/extract-attributes.js": { + "bytes": 544, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/settings.js": { + "bytes": 535, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/string/format-message.js": { + "bytes": 410, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/string/pluralize.js": { + "bytes": 216, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/ui.js": { + "bytes": 620, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/index.js": { + "bytes": 4392, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-hex-color-to-rgb-color.js", + "kind": "import-statement", + "original": "./color/convert-hex-color-to-rgb-color.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-named-color-to-hex-color.js", + "kind": "import-statement", + "original": "./color/convert-named-color-to-hex-color.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/convert-rgb-color-to-hex-color.js", + "kind": "import-statement", + "original": "./color/convert-rgb-color-to-hex-color.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/color/is-valid-hex-color.js", + "kind": "import-statement", + "original": "./color/is-valid-hex-color.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/events.js", + "kind": "import-statement", + "original": "./events.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/function/ensure-minimum-time.js", + "kind": "import-statement", + "original": "./function/ensure-minimum-time.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-blob-async.js", + "kind": "import-statement", + "original": "./image/create-canvas-element-from-blob-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-bytes-async.js", + "kind": "import-statement", + "original": "./image/create-canvas-element-from-bytes-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-canvas-element-from-image-element.js", + "kind": "import-statement", + "original": "./image/create-canvas-element-from-image-element.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-blob-async.js", + "kind": "import-statement", + "original": "./image/create-image-element-from-blob-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-element-from-bytes-async.js", + "kind": "import-statement", + "original": "./image/create-image-element-from-bytes-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/create-image-paint.js", + "kind": "import-statement", + "original": "./image/create-image-paint.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/image/read-bytes-from-canvas-element-async.js", + "kind": "import-statement", + "original": "./image/read-bytes-from-canvas-element-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/mixed-values.js", + "kind": "import-statement", + "original": "./mixed-values.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/document-use-count.js", + "kind": "import-statement", + "original": "./monetization/document-use-count.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/validate-gumroad-license-key-main-async.js", + "kind": "import-statement", + "original": "./monetization/gumroad/validate-gumroad-license-key-main-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/gumroad/validate-gumroad-license-key-ui-async.js", + "kind": "import-statement", + "original": "./monetization/gumroad/validate-gumroad-license-key-ui-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/monetization/total-use-count.js", + "kind": "import-statement", + "original": "./monetization/total-use-count.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/absolute-position/get-absolute-position.js", + "kind": "import-statement", + "original": "./node/absolute-position/get-absolute-position.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/absolute-position/set-absolute-position.js", + "kind": "import-statement", + "original": "./node/absolute-position/set-absolute-position.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/collapse-layer.js", + "kind": "import-statement", + "original": "./node/collapse-layer.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/compute-bounding-box.js", + "kind": "import-statement", + "original": "./node/compute-bounding-box.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/compute-maximum-bounds.js", + "kind": "import-statement", + "original": "./node/compute-maximum-bounds.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/deduplicate-nodes.js", + "kind": "import-statement", + "original": "./node/deduplicate-nodes.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-node-index-path.js", + "kind": "import-statement", + "original": "./node/get-node-index-path.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-document-components.js", + "kind": "import-statement", + "original": "./node/get-nodes/get-document-components.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-parent-node.js", + "kind": "import-statement", + "original": "./node/get-nodes/get-parent-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-scene-node-by-id.js", + "kind": "import-statement", + "original": "./node/get-nodes/get-scene-node-by-id.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/get-nodes/get-selected-nodes-or-all-nodes.js", + "kind": "import-statement", + "original": "./node/get-nodes/get-selected-nodes-or-all-nodes.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/insert-node/insert-after-node.js", + "kind": "import-statement", + "original": "./node/insert-node/insert-after-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/insert-node/insert-before-node.js", + "kind": "import-statement", + "original": "./node/insert-node/insert-before-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/is-locked.js", + "kind": "import-statement", + "original": "./node/is-locked.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/is-visible.js", + "kind": "import-statement", + "original": "./node/is-visible.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/is-within-instance-node.js", + "kind": "import-statement", + "original": "./node/is-within-instance-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/load-fonts-async.js", + "kind": "import-statement", + "original": "./node/load-fonts-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/set-relaunch-button.js", + "kind": "import-statement", + "original": "./node/relaunch-button/set-relaunch-button.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/relaunch-button/unset-relaunch-button.js", + "kind": "import-statement", + "original": "./node/relaunch-button/unset-relaunch-button.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sibling-nodes/are-sibling-nodes.js", + "kind": "import-statement", + "original": "./node/sibling-nodes/are-sibling-nodes.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sibling-nodes/compute-sibling-nodes.js", + "kind": "import-statement", + "original": "./node/sibling-nodes/compute-sibling-nodes.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sort-nodes/sort-nodes-by-canonical-order.js", + "kind": "import-statement", + "original": "./node/sort-nodes/sort-nodes-by-canonical-order.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sort-nodes/sort-nodes-by-name.js", + "kind": "import-statement", + "original": "./node/sort-nodes/sort-nodes-by-name.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/sort-nodes/update-nodes-sort-order.js", + "kind": "import-statement", + "original": "./node/sort-nodes/update-nodes-sort-order.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/traverse-node.js", + "kind": "import-statement", + "original": "./node/traverse-node.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/node/traverse-node-async.js", + "kind": "import-statement", + "original": "./node/traverse-node-async.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/evaluate-numeric-expression.js", + "kind": "import-statement", + "original": "./number/evaluate-numeric-expression.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/number/is-valid-numeric-input.js", + "kind": "import-statement", + "original": "./number/is-valid-numeric-input.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/clone-object.js", + "kind": "import-statement", + "original": "./object/clone-object.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/compare-objects.js", + "kind": "import-statement", + "original": "./object/compare-objects.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/compare-string-arrays.js", + "kind": "import-statement", + "original": "./object/compare-string-arrays.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/deduplicate-array.js", + "kind": "import-statement", + "original": "./object/deduplicate-array.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/object/extract-attributes.js", + "kind": "import-statement", + "original": "./object/extract-attributes.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/settings.js", + "kind": "import-statement", + "original": "./settings.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/string/format-message.js", + "kind": "import-statement", + "original": "./string/format-message.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/string/pluralize.js", + "kind": "import-statement", + "original": "./string/pluralize.js" + }, + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/ui.js", + "kind": "import-statement", + "original": "./ui.js" + } + ], + "format": "esm" + }, + "src/types/figma-types.ts": { + "bytes": 1106, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/dialogs/dialog-handlers.ts": { + "bytes": 3123, + "imports": [ + { + "path": "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/index.js", + "kind": "import-statement", + "original": "@create-figma-plugin/utilities" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "src/types/figma-types.ts", + "kind": "import-statement", + "original": "../types/figma-types" + }, + { + "path": "../../types/state", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/common/variables.utils.ts": { + "bytes": 2532, + "imports": [ + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/services/load-tokens.services.ts": { + "bytes": 4154, + "imports": [ + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "src/common/generator.utils.ts", + "kind": "import-statement", + "original": "../common/generator.utils" + }, + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "src/common/variables.utils.ts", + "kind": "import-statement", + "original": "../common/variables.utils" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/hooks/use-token-management.ts": { + "bytes": 2016, + "imports": [ + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "src/services/load-tokens.services.ts", + "kind": "import-statement", + "original": "../services/load-tokens.services" + }, + { + "path": "src/types/figma-types.ts", + "kind": "import-statement", + "original": "../types/figma-types" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/hooks/use-vector-management.ts": { + "bytes": 3277, + "imports": [ + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "../types/vector-types", + "kind": "import-statement", + "external": true + }, + { + "path": "src/types/figma-types.ts", + "kind": "import-statement", + "original": "../types/figma-types" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/repository-config/repository.types.ts": { + "bytes": 953, + "imports": [ + { + "path": "zod", + "kind": "import-statement", + "external": true + }, + { + "path": "./repository.schema", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/utils", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/zod@3.24.1/node_modules/zod/lib/index.mjs": { + "bytes": 156114, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/repository-config/repository.schema.ts": { + "bytes": 1537, + "imports": [ + { + "path": "../../node_modules/.pnpm/zod@3.24.1/node_modules/zod/lib/index.mjs", + "kind": "import-statement", + "original": "zod" + } + ], + "format": "esm" + }, + "../../packages/repository-config/push.types.ts": { + "bytes": 220, + "imports": [ + { + "path": "zod", + "kind": "import-statement", + "external": true + }, + { + "path": "./push.schema", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "../../packages/repository-config/push.schema.ts": { + "bytes": 294, + "imports": [ + { + "path": "../../node_modules/.pnpm/zod@3.24.1/node_modules/zod/lib/index.mjs", + "kind": "import-statement", + "original": "zod" + } + ], + "format": "esm" + }, + "../../packages/repository-config/index.ts": { + "bytes": 134, + "imports": [ + { + "path": "../../packages/repository-config/repository.types.ts", + "kind": "import-statement", + "original": "./repository.types" + }, + { + "path": "../../packages/repository-config/repository.schema.ts", + "kind": "import-statement", + "original": "./repository.schema" + }, + { + "path": "../../packages/repository-config/push.types.ts", + "kind": "import-statement", + "original": "./push.types" + }, + { + "path": "../../packages/repository-config/push.schema.ts", + "kind": "import-statement", + "original": "./push.schema" + } + ], + "format": "esm" + }, + "../../node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js": { + "bytes": 16166, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js": { + "bytes": 3932, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "../../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js": { + "bytes": 2154, + "imports": [], + "format": "cjs" + }, + "../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js": { + "bytes": 58353, + "imports": [ + { + "path": "../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js", + "kind": "require-call", + "original": "base64-js" + }, + { + "path": "../../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js", + "kind": "require-call", + "original": "ieee754" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "cjs" + }, + "src/services/content-processor.ts": { + "bytes": 642, + "imports": [ + { + "path": "../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js", + "kind": "import-statement", + "original": "buffer" + }, + { + "path": "@repo/utils", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/services/load-github.services.ts": { + "bytes": 2642, + "imports": [ + { + "path": "../../node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js", + "kind": "import-statement", + "original": "path-browserify" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "../../types/state", + "kind": "import-statement", + "external": true + }, + { + "path": "src/services/content-processor.ts", + "kind": "import-statement", + "original": "./content-processor" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/types/widget-types.ts": { + "bytes": 1094, + "imports": [ + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "../ui/components/success-panel", + "kind": "import-statement", + "external": true + }, + { + "path": "../../types/state", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/hooks/use-sync-management.ts": { + "bytes": 4646, + "imports": [ + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "../../packages/repository-config/index.ts", + "kind": "import-statement", + "original": "@repo/config" + }, + { + "path": "../../types/state", + "kind": "import-statement", + "external": true + }, + { + "path": "../ui/components/success-panel", + "kind": "import-statement", + "external": true + }, + { + "path": "src/services/load-github.services.ts", + "kind": "import-statement", + "original": "../services/load-github.services" + }, + { + "path": "src/types/widget-types.ts", + "kind": "import-statement", + "original": "../types/widget-types" + }, + { + "path": "src/types/figma-types.ts", + "kind": "import-statement", + "original": "../types/figma-types" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/hooks/use-routing.ts": { + "bytes": 1500, + "imports": [ + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/hooks/use-app-state.ts": { + "bytes": 3732, + "imports": [ + { + "path": "src/hooks/use-token-management.ts", + "kind": "import-statement", + "original": "./use-token-management" + }, + { + "path": "src/hooks/use-vector-management.ts", + "kind": "import-statement", + "original": "./use-vector-management" + }, + { + "path": "src/hooks/use-sync-management.ts", + "kind": "import-statement", + "original": "./use-sync-management" + }, + { + "path": "src/hooks/use-routing.ts", + "kind": "import-statement", + "original": "./use-routing" + }, + { + "path": "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js", + "kind": "import-statement", + "original": "radius-toolkit" + }, + { + "path": "../types/app-state", + "kind": "import-statement", + "external": true + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "src/types/figma-types.ts", + "kind": "import-statement", + "original": "../types/figma-types" + }, + { + "path": "../types/widget-types", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/types/app-state.ts": { + "bytes": 1658, + "imports": [ + { + "path": "radius-toolkit", + "kind": "import-statement", + "external": true + }, + { + "path": "@repo/config", + "kind": "import-statement", + "external": true + }, + { + "path": "../ui/components/success-panel", + "kind": "import-statement", + "external": true + }, + { + "path": "./widget-types", + "kind": "import-statement", + "external": true + }, + { + "path": "../../types/state", + "kind": "import-statement", + "external": true + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + }, + "src/code.tsx": { + "bytes": 3141, + "imports": [ + { + "path": "src/ui/pages/empty-page.tsx", + "kind": "import-statement", + "original": "./ui/pages/empty-page" + }, + { + "path": "src/ui/pages/loaded-page.tsx", + "kind": "import-statement", + "original": "./ui/pages/loaded-page" + }, + { + "path": "src/ui/pages/layout.tsx", + "kind": "import-statement", + "original": "./ui/pages/layout" + }, + { + "path": "package.json", + "kind": "import-statement", + "original": "../package.json" + }, + { + "path": "types/state.ts", + "kind": "import-statement", + "original": "../types/state" + }, + { + "path": "src/dialogs/dialog-handlers.ts", + "kind": "import-statement", + "original": "./dialogs/dialog-handlers" + }, + { + "path": "../../packages/utils/index.ts", + "kind": "import-statement", + "original": "@repo/utils" + }, + { + "path": "src/hooks/use-app-state.ts", + "kind": "import-statement", + "original": "./hooks/use-app-state" + }, + { + "path": "src/types/app-state.ts", + "kind": "import-statement", + "original": "./types/app-state" + }, + { + "path": "", + "kind": "import-statement", + "external": true + } + ], + "format": "esm" + } + }, + "outputs": { + "dist/code.js": { + "imports": [], + "exports": [], + "entryPoint": "src/code.tsx", + "inputs": { + "../../node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.js": { + "bytesInOutput": 763 + }, + "../../node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js": { + "bytesInOutput": 1788 + }, + "../../node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.js": { + "bytesInOutput": 12545 + }, + "../../node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js": { + "bytesInOutput": 14718 + }, + "../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js": { + "bytesInOutput": 4239 + }, + "../../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js": { + "bytesInOutput": 2756 + }, + "../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js": { + "bytesInOutput": 65517 + }, + "src/constants.ts": { + "bytesInOutput": 278 + }, + "../../packages/bandoneon/src/styles/colours.ts": { + "bytesInOutput": 1696 + }, + "../../packages/bandoneon/src/styles/index.ts": { + "bytesInOutput": 0 + }, + "../../packages/bandoneon/src/styles/typography.ts": { + "bytesInOutput": 1840 + }, + "../../packages/bandoneon/src/styles/spacing.ts": { + "bytesInOutput": 435 + }, + "../../packages/bandoneon/src/index.ts": { + "bytesInOutput": 0 + }, + "src/ui/components/icon.tsx": { + "bytesInOutput": 18470 + }, + "src/ui/components/variable-bullet.tsx": { + "bytesInOutput": 3599 + }, + "src/ui/components/name-format.tsx": { + "bytesInOutput": 7324 + }, + "src/ui/components/status-button.tsx": { + "bytesInOutput": 3209 + }, + "../../packages/utils/src/persistence.ts": { + "bytesInOutput": 558 + }, + "src/ui/components/persistence-ribbon.tsx": { + "bytesInOutput": 9909 + }, + "src/ui/components/button.tsx": { + "bytesInOutput": 1699 + }, + "src/ui/components/refreshed-content.tsx": { + "bytesInOutput": 3745 + }, + "../../packages/radius-toolkit/dist/lib/radius-toolkit.es.js": { + "bytesInOutput": 76285 + }, + "src/ui/components/lg-button.tsx": { + "bytesInOutput": 2149 + }, + "src/ui/pages/empty-page.tsx": { + "bytesInOutput": 4485 + }, + "src/ui/components/library-button.tsx": { + "bytesInOutput": 3077 + }, + "src/ui/components/error-pill.tsx": { + "bytesInOutput": 834 + }, + "src/ui/components/IssuePill.tsx": { + "bytesInOutput": 489 + }, + "src/ui/components/token-issues-summary.tsx": { + "bytesInOutput": 7889 + }, + "src/ui/components/bullet-label.tsx": { + "bytesInOutput": 980 + }, + "src/ui/components/token-change-bar.tsx": { + "bytesInOutput": 4518 + }, + "src/ui/components/version-bump.tsx": { + "bytesInOutput": 3060 + }, + "src/ui/components/warning-badge.tsx": { + "bytesInOutput": 739 + }, + "src/ui/components/push-panel.tsx": { + "bytesInOutput": 7028 + }, + "../../packages/utils/logging.utils.ts": { + "bytesInOutput": 1302 + }, + "../../packages/utils/index.ts": { + "bytesInOutput": 0 + }, + "../../packages/utils/github.utils.ts": { + "bytesInOutput": 12326 + }, + "../../packages/utils/gitlab.utils.ts": { + "bytesInOutput": 99 + }, + "../../packages/utils/repository.interface.ts": { + "bytesInOutput": 848 + }, + "../../packages/utils/token-layers.types.ts": { + "bytesInOutput": 279 + }, + "../../packages/utils/github.service.ts": { + "bytesInOutput": 10928 + }, + "../../packages/utils/repository.factory.ts": { + "bytesInOutput": 350 + }, + "src/common/generator.utils.ts": { + "bytesInOutput": 2155 + }, + "src/ui/components/success-panel.tsx": { + "bytesInOutput": 6833 + }, + "../../node_modules/.pnpm/preact@10.25.4/node_modules/preact/dist/preact.module.js": { + "bytesInOutput": 15026 + }, + "src/ui/pages/loaded-page.tsx": { + "bytesInOutput": 6015 + }, + "src/ui/components/widget-header.tsx": { + "bytesInOutput": 10359 + }, + "src/ui/components/bottom-logo.tsx": { + "bytesInOutput": 17379 + }, + "src/ui/pages/layout.tsx": { + "bytesInOutput": 2614 + }, + "package.json": { + "bytesInOutput": 33 + }, + "types/state.ts": { + "bytesInOutput": 967 + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/events.js": { + "bytesInOutput": 1582 + }, + "../../node_modules/.pnpm/@create-figma-plugin+utilities@3.2.1/node_modules/@create-figma-plugin/utilities/lib/index.js": { + "bytesInOutput": 0 + }, + "src/types/figma-types.ts": { + "bytesInOutput": 678 + }, + "src/dialogs/dialog-handlers.ts": { + "bytesInOutput": 2420 + }, + "src/common/variables.utils.ts": { + "bytesInOutput": 2116 + }, + "src/services/load-tokens.services.ts": { + "bytesInOutput": 4091 + }, + "src/hooks/use-token-management.ts": { + "bytesInOutput": 1539 + }, + "src/hooks/use-vector-management.ts": { + "bytesInOutput": 3327 + }, + "../../packages/repository-config/repository.types.ts": { + "bytesInOutput": 103 + }, + "../../packages/repository-config/index.ts": { + "bytesInOutput": 0 + }, + "../../node_modules/.pnpm/zod@3.24.1/node_modules/zod/lib/index.mjs": { + "bytesInOutput": 138110 + }, + "../../packages/repository-config/repository.schema.ts": { + "bytesInOutput": 1284 + }, + "../../packages/repository-config/push.schema.ts": { + "bytesInOutput": 239 + }, + "src/services/load-github.services.ts": { + "bytesInOutput": 1124 + }, + "src/services/content-processor.ts": { + "bytesInOutput": 476 + }, + "src/types/widget-types.ts": { + "bytesInOutput": 109 + }, + "src/hooks/use-sync-management.ts": { + "bytesInOutput": 3874 + }, + "src/hooks/use-routing.ts": { + "bytesInOutput": 1347 + }, + "src/hooks/use-app-state.ts": { + "bytesInOutput": 2372 + }, + "src/types/app-state.ts": { + "bytesInOutput": 124 + }, + "src/code.tsx": { + "bytesInOutput": 2471 + } + }, + "bytes": 1811816 + } + } +} diff --git a/apps/token-tango-widget/types/state.ts b/apps/token-tango-widget/types/state.ts index 0a4d347..25eecb3 100644 --- a/apps/token-tango-widget/types/state.ts +++ b/apps/token-tango-widget/types/state.ts @@ -10,6 +10,7 @@ import { FormatValidationResult, TokenLayers, TokenNameFormatType, + TokenNamePortableFormatType, isString, isTokenCollection, isVectorOutput, @@ -48,9 +49,9 @@ export interface UiCloseHandler extends EventHandler { } export type RepositoryTokenLayers = readonly [ - TokenLayers, - PackageJSON | undefined, - { + layers: TokenLayers, + packagejson: PackageJSON | undefined, + metadata: { name: string; version: string; lastCommits: Array; @@ -62,7 +63,7 @@ export const getState = ( persistedTokens: string | null, persistedIcons: string | null, syncDetails: RepositoryTokenLayers | null, - format: TokenNameFormatType, + format: TokenNamePortableFormatType, issues: FormatValidationResult[], ) => { if (!persistedTokens || !syncDetails || !syncDetails) @@ -120,17 +121,17 @@ export const isState = (u: unknown): u is State => "issues" in u; export const whyIsState = (u: unknown) => { - console.log(!!u); + console.log("is not nil", !!u); if (!u) return; - console.log(typeof u === "object"); + console.log("is object", typeof u === "object"); if (typeof u !== "object") return; - console.log("collections" in u); - console.log("tokenLayers" in u); - console.log("inspectedAt" in u); - console.log("oldTokenLayers" in u); - console.log("meta" in u); - console.log("format" in u); - console.log("issues" in u); + console.log("collections in u", "collections" in u); + console.log("tokenLayers in u", "tokenLayers" in u); + console.log("inspectedAt in u", "inspectedAt" in u); + console.log("oldTokenLayers in u", "oldTokenLayers" in u); + console.log("meta in u", "meta" in u); + console.log("format in u", "format" in u); + console.log("issues in u", "issues" in u); }; export const deserializeState = (serializedState: string): State => { diff --git a/package.json b/package.json index a07b0da..5a73c63 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,14 @@ "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, "devDependencies": { - "@figma/plugin-typings": "^1.94.0", - "@figma/widget-typings": "^1.9.1", + "@figma/plugin-typings": "^1.106.0", + "@figma/widget-typings": "^1.11.0", "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", - "husky": "^9.0.11", - "prettier": "^3.2.5", - "turbo": "^2.0.4", - "typescript": "^5.4.5" + "husky": "^9.1.7", + "prettier": "^3.4.2", + "turbo": "^2.3.3", + "typescript": "^5.7.2" }, "packageManager": "pnpm@8.9.0", "engines": { diff --git a/packages/bandoneon/src/styles/colours.ts b/packages/bandoneon/src/styles/colours.ts index a7d1f6c..2dcb8af 100644 --- a/packages/bandoneon/src/styles/colours.ts +++ b/packages/bandoneon/src/styles/colours.ts @@ -5,6 +5,13 @@ export const status = { neutral: "#0077B2", fg: "#ffffff", info: "#696969", + bullet: { + green: "#09C000", + amber: "#f1ba13", + red: "#da0000", + white: "#ffffff", + black: "#232323", + }, } as const; export const base = { @@ -56,6 +63,39 @@ export const success = { muted: "#defadd", } as const; +export const text = { + primary: "#262626", + secondary: "#696969", + muted: "#808080", +} as const; + +export const button = { + default: { + bg: "#000000", + fg: "#ffffff", + disabled: { + bg: "#e7e7e7", + fg: "#808080", + }, + }, + ghost: { + fg: "#262626", + disabled: { + fg: "#808080", + }, + }, + round: { + default: { + bg: "#232323", + fg: "#FFFFFF", + }, + disabled: { + bg: "#e7e7e7", + fg: "#808080", + }, + }, +} as const; + export const colors = { white: "#ffffff", black: "#000000", @@ -67,4 +107,6 @@ export const colors = { library, active, success, + text, + button, } as const; diff --git a/packages/radius-toolkit/package.json b/packages/radius-toolkit/package.json index 9169a79..78b04c5 100644 --- a/packages/radius-toolkit/package.json +++ b/packages/radius-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "radius-toolkit", - "version": "0.6.3", + "version": "0.6.4", "description": "A toolkit for handling design tokens", "main": "dist/lib/radius-toolkit.cjs.js", "module": "dist/lib/radius-toolkit.es.js", diff --git a/packages/radius-toolkit/src/lib/formats/format.types.ts b/packages/radius-toolkit/src/lib/formats/format.types.ts index b3f5480..cc3da02 100644 --- a/packages/radius-toolkit/src/lib/formats/format.types.ts +++ b/packages/radius-toolkit/src/lib/formats/format.types.ts @@ -1,4 +1,10 @@ import { TokenVariable } from "../tokens/token.types"; +import { + createDecompositionFunction, + createRuleSet, + RuleDescriptions, + TokenFormatDescription, +} from "./rules.utils"; import { TokenNameDescription } from "./token-name-format.types"; /** @@ -39,9 +45,15 @@ export const isTokenNameCollection = (o: unknown): o is TokenNameCollection => Array.isArray((o as TokenNameCollection).tokens); export type TokenNameValidationResult = - | readonly [isValid: true] // ok - | readonly [isValid: boolean, message: string] // error or warning - | readonly [isValid: boolean, message: string, offendingSegments: string[]]; // error or warning with offending segments + | readonly [isValid: true] // success case + | readonly [isValid: false, message: string] // error without segments + | readonly [isValid: false, message: string, offendingSegments: string[]] // error with segments + | readonly [ + isValid: false, + message: string, + offendingSegments: string[], + isWarning: true, + ]; // warning with segments export type TokenGlobalRuleValidationResult = | readonly [] @@ -174,19 +186,6 @@ export type TokenRuleSet = Record< export type DecomposeTokenName = (name: string) => TokenNameDescription | null; -/** Token Name Format Type - * Describes the format of a token name - */ -export type TokenNameFormatType = { - name: FormatName; - description: string; - version: string; - segments: string[]; - separator: string; - decomposeTokenName: DecomposeTokenName; - rules?: TokenRuleSet; -}; - /** Token Name Format Type * Describes the format of a token name */ @@ -196,11 +195,13 @@ export type TokenNamePortableFormatType = { version: string; segments: string[]; separator: string; + formatDescription: TokenFormatDescription; + ruleDescriptions: RuleDescriptions; }; -export const isTokenNameFormatType = ( +export const isTokenNamePortableFormatType = ( format: unknown -): format is TokenNameFormatType => +): format is TokenNamePortableFormatType => typeof format === "object" && format !== null && "name" in format && @@ -210,13 +211,18 @@ export const isTokenNameFormatType = ( "separator" in format && "decomposeTokenName" in format; -export const isTokenNamePortableFormatType = ( - format: unknown -): format is TokenNamePortableFormatType => - typeof format === "object" && - format !== null && - "name" in format && - "description" in format && - "version" in format && - "segments" in format && - "separator" in format; +export type TokenNameFormatType = + TokenNamePortableFormatType & { + rules: TokenRuleSet; + decomposeTokenName: DecomposeTokenName; + }; + +export const toTokenNameFormatType = ( + format: TokenNamePortableFormatType +): TokenNameFormatType => { + return { + ...format, + rules: createRuleSet(format.ruleDescriptions), + decomposeTokenName: createDecompositionFunction(format.formatDescription), + }; +}; diff --git a/packages/radius-toolkit/src/lib/formats/format.utils.ts b/packages/radius-toolkit/src/lib/formats/format.utils.ts index 46eaa18..ca2ca1c 100644 --- a/packages/radius-toolkit/src/lib/formats/format.utils.ts +++ b/packages/radius-toolkit/src/lib/formats/format.utils.ts @@ -10,6 +10,11 @@ export const isNumber = (s: string) => !isNaN(Number(s)); export const isNumberOrFraction = (s: string) => isNumber(s) || isFraction(s); +export const isLowerCase = (s: string) => s === s.toLowerCase(); + +export const isLowerCaseIdentifier = (s: string) => + /^[a-z_][a-z0-9_]*$/.test(s); + export const isCamelCase = (s: string) => /^[a-z0-9]+(?:[A-Z][a-z0-9]*)*$/.test(s) && !/[A-Z]{2}/.test(s); @@ -30,7 +35,9 @@ export const validationResult = ( message?: string, offendingSegments?: string[] ): TokenNameValidationResult => { - return [result, message || "", offendingSegments || []] as const; + return result + ? [result] + : ([result, message || "", offendingSegments || []] as const); }; export const validationError = ( @@ -44,7 +51,7 @@ export const validationWarning = ( message: string, offendingSegments?: string[] ): TokenNameValidationResult => { - return [true, message || "", offendingSegments || []] as const; + return [false, message || "", offendingSegments || []] as const; }; export const globalValidationError = ( diff --git a/packages/radius-toolkit/src/lib/formats/formats.ts b/packages/radius-toolkit/src/lib/formats/formats.ts index fbd0216..0a5b97c 100644 --- a/packages/radius-toolkit/src/lib/formats/formats.ts +++ b/packages/radius-toolkit/src/lib/formats/formats.ts @@ -3,8 +3,10 @@ import { radiusLayerSubjectTypeFormat } from "./radius-layer-subject-type"; import { TokenNameCollection, TokenNameFormatType, + TokenNamePortableFormatType, isTokenGlobalNameRule, isTokenNameRule, + toTokenNameFormatType, } from "./format.types"; import { createLogger } from "../utils/logging.utils"; @@ -22,7 +24,7 @@ export const formatNames: FormatName[] = formats.map((format) => format.name); export const getFormat = ( formatName: FormatName -): TokenNameFormatType | undefined => { +): TokenNamePortableFormatType | undefined => { return formats.find((format) => format.name === formatName); }; @@ -31,7 +33,8 @@ export const createValidators = (formatName: FormatName) => { if (!format) { throw new Error(`Format ${formatName} not found`); } - return createValidatorFunctions(format); + const formatType = toTokenNameFormatType(format); + return createValidatorFunctions(formatType); }; export const splitBy = @@ -57,11 +60,13 @@ const splityGlobalRules = splitBy(isTokenGlobalNameRule, isTokenNameRule); export type TokenNameIssue = { message?: string; + isWarning?: boolean; offendingSegments?: string[]; }; export type TokenGlobalIssue = { message?: string; + isWarning?: boolean; offendingSegments?: [ collectionName: string, tokenName?: string | undefined, @@ -88,9 +93,31 @@ export const createValidatorFunctions = (format: TokenNameFormatType) => { tokenType ); if (!isValid && message) { - return [[...errors, { message, offendingSegments }], warnings]; + return [ + [ + ...errors, + { + message, + offendingSegments: Array.isArray(offendingSegments) + ? offendingSegments + : undefined, + }, + ], + warnings, + ]; } else if (message) { - return [errors, [...warnings, { message, offendingSegments }]]; + return [ + errors, + [ + ...warnings, + { + message, + offendingSegments: Array.isArray(offendingSegments) + ? offendingSegments + : undefined, + }, + ], + ]; } return [errors, warnings]; }, diff --git a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/format.ts b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/format.ts deleted file mode 100644 index 2ec1deb..0000000 --- a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/format.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TokenNameFormatType } from "../format.types"; -import { rules, decomposeTokenName } from "./rules"; - -export const radiusLayerSubjectTypeFormat: TokenNameFormatType<"radius-layer-subject-type"> = - { - name: "radius-layer-subject-type", - description: "Radius Layer Subject Type", - version: "1.0.0", - separator: ".", - segments: ["layer", "subject", "type", "attribute"], - decomposeTokenName, - rules, - }; diff --git a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/index.ts b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/index.ts index c89fec4..147df91 100644 --- a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/index.ts +++ b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/index.ts @@ -1 +1 @@ -export * from "./format"; +export * from "./radius-layer-subject-type.format"; diff --git a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.format.ts b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.format.ts new file mode 100644 index 0000000..f182697 --- /dev/null +++ b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.format.ts @@ -0,0 +1,23 @@ +import { + TokenNamePortableFormatType, + toTokenNameFormatType, +} from "../format.types"; +import { + formatDescription, + ruleDescriptions, +} from "./radius-layer-subject-type.rules"; + +export const radiusLayerSubjectTypeFormat: TokenNamePortableFormatType<"radius-layer-subject-type"> = + { + name: "radius-layer-subject-type", + description: "Radius Layer Subject Type", + version: "2.0.0", + separator: ".", + segments: ["layer", "subject", "type", "attribute"], + formatDescription, + ruleDescriptions, + }; + +export const radiusLayerSubjectTypeFormatType = toTokenNameFormatType( + radiusLayerSubjectTypeFormat +); diff --git a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/rules.test.ts b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.rules.test.ts similarity index 79% rename from packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/rules.test.ts rename to packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.rules.test.ts index 2a0f3a3..f5bfb9d 100644 --- a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/rules.test.ts +++ b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.rules.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { rules } from "./rules"; +import { rules } from "./radius-layer-subject-type.rules"; import { ruleTestValues } from "../rules-testing.utils"; export const testValidValues = ruleTestValues([ @@ -22,12 +22,6 @@ export const testValidValues = ruleTestValues([ { input: "semantic.action.outlineColor.blue" }, { input: "semantic.action.padding.primary.xs" }, { input: "semantic.action.padding.primary.sm" }, - { input: "component.button.spacing.primary.sm" }, - { input: "component.button.spacing.primary.md" }, - { input: "component.button.spacing.primary.lg" }, - { input: "component.button.spacing.secondary.sm" }, - { input: "component.button.spacing.secondary.md" }, - { input: "component.button.spacing.secondary.lg" }, { input: "someLayer.genericSubject.animation.slow" }, { input: "someLayer.genericSubject.width.1/2" }, { input: "someLayer.genericSubject.width.2" }, @@ -71,6 +65,7 @@ export const testInvalidValues = ruleTestValues([ "minimum-three-segments", "consistent-type-naming", "layer-as-first-segment", + "attribute-segments", ], }, { @@ -94,6 +89,36 @@ export const testInvalidValues = ruleTestValues([ "subject-for-non-primitive-tokens", ], }, + { + input: "component.button.spacing.primary.sm", + errors: [], + warnings: ["avoid-generic-types"], + }, + { + input: "component.button.spacing.primary.md", + errors: [], + warnings: ["avoid-generic-types"], + }, + { + input: "component.button.spacing.primary.lg", + errors: [], + warnings: ["avoid-generic-types"], + }, + { + input: "component.button.spacing.secondary.sm", + errors: [], + warnings: ["avoid-generic-types"], + }, + { + input: "component.button.spacing.secondary.md", + errors: [], + warnings: ["avoid-generic-types"], + }, + { + input: "component.button.spacing.secondary.lg", + errors: [], + warnings: ["avoid-generic-types"], + }, ]); describe("test rules: radius-layer-subject-type", () => { diff --git a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.rules.ts b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.rules.ts new file mode 100644 index 0000000..724c521 --- /dev/null +++ b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/radius-layer-subject-type.rules.ts @@ -0,0 +1,354 @@ +import { + createRuleSet, + createDecompositionFunction, + TokenFormatDescription, + RuleDescriptions, +} from "../rules.utils"; + +export const formatDescription: TokenFormatDescription = { + name: "radius-layer-subject-type", + version: "1.0.0", + description: { + short: + "A format that enforces layer-based token naming with subjects and types", + long: `The radius-layer-subject-type format ensures that design tokens follow a consistent naming convention as the complexity of the token layer increases. + This format is ideal for scenarios where multiple modes and layers of aliases are needed, ensuring clarity and distinction among various types of tokens. + + The format enforces a clear hierarchy: + - Layer (first segment): Indicates the abstraction level (primitive, semantic, component) + - Subject (second segment, optional for primitives): Provides context (e.g., action, button) + - Type (third segment): Defines what the token represents (e.g., color, spacing) + - Attributes (remaining segments): Additional variations or states`, + }, + separator: ".", + primitiveFormat: { + requiredSegments: 3, + layerName: "primitive", + description: + "Primitive tokens follow a simplified format with exactly three segments: layer, type, and value", + }, + segments: [ + { + name: "layer", + type: "layer", + description: "Indicates the abstraction level of the token", + examples: { + valid: ["primitive", "semantic", "component"], + invalid: ["color", "spacing", "size"], + }, + }, + { + name: "subject", + type: "subject", + description: "Provides context about what the token applies to", + examples: { + valid: ["button", "action", "input"], + invalid: ["color", "spacing"], + }, + condition: { + type: "non-primitive", + description: "Subject is only required for non-primitive tokens", + }, + }, + { + name: "type", + type: "type", + description: + "Defines the kind of value the token contains (color, spacing, etc.)", + examples: { + valid: ["color", "spacing", "borderRadius"], + invalid: ["button", "action"], + }, + }, + ], + examples: { + valid: [ + "primitive.color.primary", + "semantic.action.color.primary", + "component.button.backgroundColor.hover", + ], + invalid: [ + "color.primary", + "semantic.color", + "component.backgroundColor.button", + ], + }, +}; + +export const decomposeTokenName = + createDecompositionFunction(formatDescription); + +export const ruleDescriptions: RuleDescriptions = { + "minimum-three-segments": { + description: + "Token names must have at least three segments. Primitive tokens have exactly three segments, while other layers have four or more segments.", + validators: [ + { + type: "segment", + length: { min: 3 }, + message: "Token names must have at least three segments", + }, + ], + }, + "layer-as-first-segment": { + description: + "The first segment of the token name must indicate the layer and not the type. Common layer names include `primitive`, `semantic`, or `component`, but can vary by the design team's preferences.", + validators: [ + { + type: "position", + position: "first", + pattern: { + type: "function", + name: "isTokenType", + operator: "not", + }, + message: "First segment must not be a token type", + }, + ], + }, + "subject-for-non-primitive-tokens": { + description: + "The subject segment is mandatory for semantic or component tokens but absent in primitive tokens. Subjects should be the second segment, that can be any name, but not a type.", + validators: [ + { + type: "position", + position: 1, + pattern: { + type: "function", + name: "isTokenType", + operator: "not", + }, + message: + "Second segment must not be a token type for non-primitive tokens", + skipIf: [ + { + type: "primitive-token", + }, + ], + }, + ], + }, + "attribute-segments": { + description: + "The fourth segment and subsequent segments can be anything the designers want to use to distinguish tokens.", + validators: [ + { + type: "segment", + length: { min: 4 }, + message: "Non-primitive tokens must have at least four segments", + skipIf: [ + { + type: "primitive-token", + }, + ], + }, + ], + }, + "lowercase-or-camelcase": { + description: + "Each segment can be in lowercase or camelCase unless it's the last segment, that can be either a camelCase value or an expression", + validators: [ + { + type: "segment-pattern", + pattern: { type: "function", name: "isLowerCaseOrCamelCase" }, + excludeLastSegment: true, + message: + "Segments should be in lowercase or camelCase, or an expression if it's the last segment", + }, + { + type: "position", + position: "last", + pattern: { + type: "function", + name: "isLowerCaseCamelCaseOrNumber", + }, + message: "Last segment should be in camelCase or be a numeric value", + }, + ], + }, + "dot-separation": { + description: + "Segments within a token name must be separated by a single dot", + validators: [ + { + type: "string-pattern", + pattern: { type: "regex", pattern: "\\." }, + message: + "Segments within a token name must be separated by a single dot", + }, + ], + }, + "no-leading-or-trailing-dots": { + description: "Token names must not start or end with a dot", + validators: [ + { + type: "string-pattern", + pattern: { type: "regex", pattern: "^[^.].*[^.]$" }, + message: "Token names must not start or end with a dot", + }, + ], + }, + "length-constraints": { + description: + "Each segment within a token name should be between 1 to 20 characters long", + validators: [ + { + type: "segment-pattern", + pattern: { type: "regex", pattern: "^.{1,20}$" }, + message: + "Each segment within a token name should be between 1 to 20 characters long", + }, + ], + }, + "no-consecutive-dots": { + description: "Multiple consecutive dots (`..`) are not allowed", + validators: [ + { + type: "string-pattern", + pattern: { type: "regex", pattern: "^(?!.*\\.\\.).*$" }, + message: "Multiple consecutive dots (`..`) are not allowed", + }, + ], + }, + "consistent-type-naming": { + description: + "The third segment of the token name (or the second in the case of primitive tokens) must indicate the token type, unless it's a color token.", + validators: [ + { + type: "position", + position: 2, + pattern: { type: "function", name: "isTokenType" }, + message: "Third segment must be a valid token type", + skipIf: [ + { + type: "token-type", + value: "COLOR", + }, + { + type: "primitive-token", + }, + ], + }, + ], + }, + "modes-unique-to-collections": { + description: + "Ensure that modes are unique to each collection to avoid conflicts and maintain semantic consistency within the collection.", + validators: [ + { + type: "collection", + validation: { type: "unique-modes" }, + message: "Modes should be unique to each collection", + }, + ], + severity: "warning", + }, + "same-prefix-for-collections": { + description: + "Ensure that all tokens within a collection share a common prefix to facilitate filtering and grouping.", + validators: [ + { + severity: "warning", + type: "collection", + validation: { type: "common-prefix" }, + message: "Collections should have a common prefix", + }, + ], + severity: "warning", + }, + "subjects-unique-to-layers": { + description: + "Avoid using the same subject name across different layers to prevent confusion and maintain clarity and proper semantics in the design language.", + validators: [ + { + severity: "warning", + type: "collection", + validation: { type: "unique-subjects" }, + message: "Subjects should be unique to each layer", + }, + ], + severity: "warning", + }, + "attributes-used-sparingly": { + description: + "Use attributes only when necessary to prevent overcomplicating the token structure.", + validators: [ + { + severity: "warning", + type: "collection", + validation: { type: "attribute-sparsity", minSegments: 4 }, + message: "Attributes should be used sparingly", + }, + ], + severity: "warning", + }, + "repetition-of-information": { + description: + "Avoid repeating the same information in different segments to keep token names concise and clear.", + validators: [ + { + severity: "warning", + type: "collection", + validation: { + type: "segment-pattern", + pattern: { type: "function", name: "hasNoRepeatedSegments" }, + }, + message: "Repetition of information should be avoided", + }, + ], + severity: "warning", + }, + "avoid-generic-types": { + description: + "Avoid generic types like color or spacing when more specific types can be used.", + validators: [ + { + type: "position", + position: 2, + pattern: { + type: "function", + name: "isNotGenericType", + allowEmpty: true, + }, + message: + "Avoid using generic types when more specific types are available", + skipIf: [ + { + type: "segment-count", + max: 2, + }, + ], + }, + ], + severity: "warning", + }, + "primitive-tokens-no-aliases": { + description: + "Primitive tokens should be direct values and not contain aliases to other tokens to maintain simplicity and directness.", + validators: [ + { + severity: "warning", + type: "collection", + validation: { type: "no-aliases", target: "primitive" }, + message: "Primitive tokens should not contain aliases", + }, + ], + severity: "warning", + }, + "non-primitive-tokens-no-arbitrary-values": { + description: + "Non-primitive tokens should reference primitive tokens to maintain consistency and avoid arbitrary values.", + validators: [ + { + severity: "warning", + type: "collection", + validation: { type: "no-aliases", target: "non-primitive" }, + message: + "Non-primitive tokens should only contain references to primitive values", + }, + ], + severity: "warning", + }, +}; + +export const rules = createRuleSet(ruleDescriptions); diff --git a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/rules.ts b/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/rules.ts deleted file mode 100644 index ee0a38f..0000000 --- a/packages/radius-toolkit/src/lib/formats/radius-layer-subject-type/rules.ts +++ /dev/null @@ -1,450 +0,0 @@ -import { isVariableAlias } from "../../tokens"; -import { - DecomposeTokenName, - TokenGlobalRuleValidationResult, - TokenNameCollection, -} from "../format.types"; -import { - globalValidationError, - globalValidationWarning, - invertGroupedObject, - isCamelCase, - isNumberOrFraction, - ruleSet, - toKebabCase, - validationError, - validationResult, - validationWarning, -} from "../format.utils"; -import { TokenNameDescription, getTokenType } from "../token-name-format.types"; - -export const decomposePrimitiveToken = (name: string) => { - const segments = name.split("."); - if (segments.length > 4 || segments.length < 2) return null; - const [layer, typeSegment, ...attributes] = segments; - const type = getTokenType(typeSegment); - return { type, attributes, otherSegments: { layer } } as TokenNameDescription; -}; - -export const isPrimitiveToken = (name: string) => { - const decomposed = decomposePrimitiveToken(name); - return !!decomposed; -}; - -export const getSubject = (name: string) => { - return name.split(".")[1]; -}; - -export const decomposeTokenName: DecomposeTokenName = (name) => { - const primitiveDescription = decomposePrimitiveToken(name); - if (primitiveDescription && primitiveDescription.type) { - return primitiveDescription; - } - const [layer, subject, typeSegment, ...attributes] = name.split("."); - const type = getTokenType(typeSegment); - if (!type) return null; - return { - type, - attributes, - otherSegments: { layer, subject }, - } satisfies TokenNameDescription; -}; - -export const groupByFirstNSegments = ( - n: number, - collections: TokenNameCollection[] -) => { - // accumulate all tokens with more than n segments in a single array - const tokensWithAttributes = collections.reduce( - (acc, collection) => { - const tokens = collection.tokens.filter( - (token) => token.name.split(".").length > n - ); - return [...acc, ...tokens]; - }, - [] as TokenNameCollection["tokens"] - ); - // create an object with the first n segments as keys and the number of tokens with those same first 4 segments as values - const tokensByFirstFourSegments = tokensWithAttributes.reduce( - (acc, token) => { - const firstFourSegments = token.name.split(".").slice(0, n).join("."); - const nextSegment = token.name.split(".")[n]; - const count = acc[firstFourSegments]?.count || 0; - return { - ...acc, - [firstFourSegments]: { count: count + 1, nextSegment }, - }; - }, - {} as Record - ); - return tokensByFirstFourSegments; -}; - -export const rules = ruleSet({ - "minimum-three-segments": { - description: - "Token names must have at least three segments. Primitive tokens have exactly three segments, while other layers have four or more segments.", - validate: (name: string) => { - const segments = name.split("."); - return segments.length >= 3 - ? validationResult(true) - : validationError( - `Token names must have at least three segments (found ${segments.length})` - ); - }, - }, - "layer-as-first-segment": { - description: - "The first segment of the token name must indicate the layer and not the type. Common layer names include `primitive`, `semantic`, or `component`, but can vary by the design team's preferences.", - validate: (name: string) => { - const [firstSegment] = name.split("."); - return !firstSegment || getTokenType(firstSegment) - ? validationError( - `Segment ${firstSegment} is not a valid token layer`, - [firstSegment] - ) - : validationResult(true); - }, - }, - "subject-for-non-primitive-tokens": { - description: - "The subject segment is mandatory for semantic or component tokens but absent in primitive tokens. Subjects should be the second segment, that can be any name, but not a type.", - validate: (name: string) => { - const segments = name.split("."); - const isPrimitive = isPrimitiveToken(name); - const [_layer, subject] = segments; - return isPrimitive || (!!subject && !getTokenType(subject)) - ? validationResult(true) - : validationError( - `Token ${name} is missing a subject segment. ${subject} is not a valid subject name`, - [subject] - ); - }, - }, - "attribute-segments": { - description: - "The fourth segment and subsequent segments can be anything the designers want to use to distinguish tokens.", - validate: (name: string) => { - const segments = name.split("."); - const isPrimitive = isPrimitiveToken(name); - const hasAttributes = segments.length > 3; - return isPrimitive || hasAttributes - ? validationResult(true) - : validationError(`Token ${name} is missing attribute segments`); - }, - }, - "lowercase-or-camelcase": { - description: - "Each segment can be in lowercase or camelCase unless it's the last segment, that can be either a camelCase value or or an expression", - validate: (name: string) => { - const segments = name.split("."); - const allButLast = segments.slice(0, segments.length - 1); - const lastSegment = segments[segments.length - 1]; - return allButLast.every(isCamelCase) && - (isCamelCase(lastSegment) || isNumberOrFraction(lastSegment)) - ? validationResult(true) - : validationError( - "Segments should be in lowercase or camelCase, or an expression if it's the last segment. It should also have no special characters.", - segments.filter((s) => !isCamelCase(s)) - ); - }, - }, - "dot-separation": { - description: - "Segments within a token name must be separated by a single dot", - validate: (name: string) => { - return name.includes(".") - ? validationResult(true) - : validationError( - "Segments within a token name must be separated by a single dot" - ); - }, - }, - "no-leading-or-trailing-dots": { - description: "Token names must not start or end with a dot", - validate: (name: string) => { - return !name.startsWith(".") && !name.endsWith(".") - ? validationResult(true) - : validationError("Token names must not start or end with a dot"); - }, - }, - "length-constraints": { - description: - "Each segment within a token name should be between 1 to 20 characters long", - validate: (name: string) => { - const segments = name.split("."); - return segments.every((s) => s.length >= 1 && s.length <= 20) - ? validationResult(true) - : validationError( - "Each segment within a token name should be between 1 to 20 characters long" - ); - }, - }, - "no-consecutive-dots": { - description: "Multiple consecutive dots (`..`) are not allowed", - validate: (name: string) => { - return name.includes("..") - ? validationError("Multiple consecutive dots (`..`) are not allowed") - : validationResult(true); - }, - }, - "consistent-type-naming": { - description: - "The third segment of the token name (or the second in the case of primitive tokens) must indicate the token type, unless it's a color token. Types should be drawn from a predefined list.", - validate: (name: string, tokenType: string) => { - if (tokenType === "COLOR") return validationResult(true); - const { type: primitiveType } = decomposePrimitiveToken(name) ?? {}; - const { type: semanticType } = decomposeTokenName(name) ?? {}; - - const type = primitiveType || semanticType; - - return type - ? validationResult(true) - : validationError( - `The token ${name} has an invalid (type), or has its type in the wrong position. Types should be the second segment for primary tokens, or the third value for semantic tokens` - ); - }, - }, - "modes-unique-to-collections": { - description: - "Ensure that modes are unique to each collection to avoid conflicts and maintain semantic consistency within the collection.", - type: "global", - validate: ( - collections: TokenNameCollection[] - ): TokenGlobalRuleValidationResult => { - // returns an object with modes as keys and an array of collections names as values - const collectionsByMode = collections.reduce( - (acc, collection) => { - if (!collection.modes) return acc; - return collection.modes.reduce((acc, mode) => { - return { - ...acc, - [mode]: [...(acc[mode] || []), collection.name], - }; - }, acc); - }, - {} as Record - ); - - const duplicates = Object.entries(collectionsByMode) - .filter(([_mode, collections]) => collections.length > 1) - .map(([mode, collections]) => ({ - mode, - collections, - })); - return duplicates.length === 0 - ? [] - : globalValidationError( - `Modes should be unique to each collection. Found duplicate modes in ${duplicates - .flatMap((d) => d.collections) - .join(", ")}`, - [] - ); - }, - }, - "same-prefix-for-collections": { - description: - "Ensure that all tokens within a collection share a common prefix to facilitate filtering and grouping.", - type: "global", - validate: ( - collections: TokenNameCollection[] - ): TokenGlobalRuleValidationResult => { - const collectionPrefixes = collections.map((collection) => { - const prefixes = collection.tokens.map( - (token) => token.name.split(".")[0] - ); - return { name: collection.name, prefixes }; - }); - const heterogenousPrefixes = collectionPrefixes.filter(({ prefixes }) => { - return new Set(prefixes).size > 1; - }); - return heterogenousPrefixes.length === 0 - ? [] - : globalValidationWarning( - `Collections should have a common prefix. Found heterogenous prefixes in ${heterogenousPrefixes - .map((h) => h.name) - .join(", ")}`, - [] - ); - }, - }, - "subjects-unique-to-layers": { - description: - "Avoid using the same subject name across different layers to prevent confusion and maintain clarity and proper semantics in the design language.", - type: "global", - validate: ( - collections: TokenNameCollection[] - ): TokenGlobalRuleValidationResult => { - const subjectsByLayer = collections.reduce( - (acc, collection) => { - if (collection.tokens.every((token) => isPrimitiveToken(token.name))) - return acc; - const subjects = collection.tokens.map((token) => - getSubject(token.name) - ); - return { - ...acc, - [collection.name]: subjects, - }; - }, - {} as Record - ); - const layersBySubject = invertGroupedObject(subjectsByLayer); - const duplicates = Object.entries(layersBySubject).filter( - ([_subject, layers]) => layers.length > 1 - ); - return duplicates.length === 0 - ? [] - : globalValidationWarning( - `Subjects should be unique to each layer. Found duplicate subjects in ${duplicates - .flatMap((d) => d[1]) - .join(", ")}`, - [] - ); - }, - }, - "attributes-used-sparingly": { - description: - "Use attributes only when necessary to prevent overcomplicating the token structure.", - type: "global", - validate: ( - collections: TokenNameCollection[] - ): TokenGlobalRuleValidationResult => { - // console.log("RULE: attributes-used-sparingly 1"); - const flatCollectionOfTokens = collections.reduce( - (acc, collection) => [...acc, ...collection.tokens], - [] as TokenNameCollection["tokens"] - ); - // console.log("RULE: attributes-used-sparingly 2", flatCollectionOfTokens); - const maxNumberOfSegments = Math.max( - 0, - ...flatCollectionOfTokens.map((token) => token.name.split(".").length) - ); - // console.log("RULE: attributes-used-sparingly 3", maxNumberOfSegments); - - if (maxNumberOfSegments < 4) return []; - - const indistinguisedAttributes = new Array(maxNumberOfSegments - 3) - .fill(0) - .map((_, i) => { - const tokensByFirstNSegments = groupByFirstNSegments( - i + 4, - collections - ); - // console.log( - // "RULE: attributes-used-sparingly 4", - // tokensByFirstNSegments - // ); - return Object.entries(tokensByFirstNSegments) - .filter(([_, { count }]) => count === 1) - .map( - ([firstSegments, { nextSegment }]) => - `${firstSegments}.${nextSegment}` - ); - }) - .flat(); - // console.log( - // "RULE: attributes-used-sparingly 5", - // indistinguisedAttributes - // ); - return indistinguisedAttributes.length === 0 - ? [] - : globalValidationWarning( - `Attributes should be used sparingly. Found attributes that do not distinguish tokens: ${indistinguisedAttributes.join(", ")}`, - [] - ); - }, - }, - "repetition-of-information": { - description: - "Avoid repeating the same information in different segments to keep token names concise and clear.", - validate: (name: string) => { - const segmentCollection = toKebabCase(name).split("-"); - const duplicateItems = segmentCollection.filter( - (item, index) => segmentCollection.indexOf(item) !== index - ); - return duplicateItems.length === 0 - ? validationResult(true) - : validationWarning( - `Repetition of information should be avoided. Found redundant information in token Name: ${duplicateItems.join(", ")}`, - duplicateItems - ); - }, - }, - "avoid-generic-types": { - description: - "Avoid generic types like color or spacing when more specific types can be used.", - validate: (name: string) => { - const segments = name.split("."); - const attributeSegments = segments.slice(3); - if (attributeSegments.length === 0) return validationResult(true); - const genericTypes = ["color", "spacing"]; - const tokenType = segments[2]; - const moreSpecificName = attributeSegments.find( - (segment) => !!getTokenType(segment) - ); - return genericTypes.includes(tokenType) && moreSpecificName - ? validationWarning( - `Avoid generic types like 'color' or 'spacing' when better names are available. Consider using more specific names: ${tokenType} -> ${moreSpecificName}`, - [moreSpecificName] - ) - : validationResult(true); - }, - }, - "primitive-tokens-no-aliases": { - description: - "Primitive tokens should be direct values and not contain aliases to other tokens to maintain simplicity and directness.", - type: "global", - validate: ( - collections: TokenNameCollection[] - ): TokenGlobalRuleValidationResult => { - const primitiveTokens = collections - .filter( - (collection) => - collection.name === "primitive" || - collection.tokens.every((token) => isPrimitiveToken(token.name)) - ) - .flatMap((collection) => collection.tokens); - const aliases = primitiveTokens.filter((token) => - Object.values(token.values ?? {}).some(isVariableAlias) - ); - return aliases.length === 0 - ? [] - : globalValidationWarning( - `Primitive tokens should not contain aliases. Found aliases in ${aliases - .map((a) => a.name) - .join(", ")}`, - [] - ); - }, - }, - "non-primitive-tokens-no-arbitrary-values": { - description: - "Non-primitive tokens should reference primitive tokens to maintain consistency and avoid arbitrary values.", - type: "global", - validate: ( - collections: TokenNameCollection[] - ): TokenGlobalRuleValidationResult => { - const nonPrimitiveTokens = collections - .filter( - (collection) => - collection.name !== "primitive" && - collection.tokens.some((token) => !isPrimitiveToken(token.name)) - ) - .flatMap((collection) => collection.tokens); - const arbitraryValues = nonPrimitiveTokens.filter( - (token) => - !isPrimitiveToken(token.name) && - Object.values(token.values ?? {}).some(isVariableAlias) - ); - return arbitraryValues.length === 0 - ? [] - : globalValidationWarning( - `Non-primitive tokens should only contain references to primitive values. Found arbitrary values in ${arbitraryValues - .map((a) => a.name) - .join(", ")}`, - [] - ); - }, - }, -}); diff --git a/packages/radius-toolkit/src/lib/formats/radius-simple/format.ts b/packages/radius-toolkit/src/lib/formats/radius-simple/format.ts deleted file mode 100644 index d0526d3..0000000 --- a/packages/radius-toolkit/src/lib/formats/radius-simple/format.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TokenNameFormatType } from "../format.types"; -import { rules, decomposeTokenName } from "./rules"; - -export const radiusSimpleFormat: TokenNameFormatType<"radius-simple"> = { - name: "radius-simple", - description: "Radius Simple", - version: "1.0.0", - separator: ".", - segments: ["type", "attribute"], - decomposeTokenName, - rules, -}; diff --git a/packages/radius-toolkit/src/lib/formats/radius-simple/index.ts b/packages/radius-toolkit/src/lib/formats/radius-simple/index.ts index c89fec4..13ca4e6 100644 --- a/packages/radius-toolkit/src/lib/formats/radius-simple/index.ts +++ b/packages/radius-toolkit/src/lib/formats/radius-simple/index.ts @@ -1 +1 @@ -export * from "./format"; +export * from "./radius-simple.format"; diff --git a/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.format.ts b/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.format.ts new file mode 100644 index 0000000..f9ab448 --- /dev/null +++ b/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.format.ts @@ -0,0 +1,18 @@ +import { + TokenNamePortableFormatType, + toTokenNameFormatType, +} from "../format.types"; +import { ruleDescriptions, formatDescription } from "./radius-simple.rules"; + +export const radiusSimpleFormat: TokenNamePortableFormatType<"radius-simple"> = + { + name: "radius-simple", + description: "Radius Simple", + version: "2.0.0", + separator: ".", + segments: ["type", "attribute"], + formatDescription, + ruleDescriptions, + }; + +export const radiusSimpleFormatType = toTokenNameFormatType(radiusSimpleFormat); diff --git a/packages/radius-toolkit/src/lib/formats/radius-simple/rules.test.ts b/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.rules.test.ts similarity index 99% rename from packages/radius-toolkit/src/lib/formats/radius-simple/rules.test.ts rename to packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.rules.test.ts index b1db5e7..1565704 100644 --- a/packages/radius-toolkit/src/lib/formats/radius-simple/rules.test.ts +++ b/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.rules.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest"; -import { rules } from "./rules"; +import { rules } from "./radius-simple.rules"; import { ruleTestValues } from "../rules-testing.utils"; -export const testValidValues = ruleTestValues([ +export const testValidValues = ruleTestValues([ { input: "accentColor.auto" }, { input: "animation.none" }, { input: "animation.spin" }, diff --git a/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.rules.ts b/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.rules.ts new file mode 100644 index 0000000..62b63eb --- /dev/null +++ b/packages/radius-toolkit/src/lib/formats/radius-simple/radius-simple.rules.ts @@ -0,0 +1,162 @@ +import { + createDecompositionFunction, + TokenFormatDescription, + createRuleSet, + RuleDescriptions, +} from "../rules.utils"; + +export const formatDescription: TokenFormatDescription = { + name: "radius-simple", + version: "1.0.0", + description: { + short: "A simple type-first token naming format", + long: `The radius-simple format provides a straightforward approach to naming design tokens, + focusing on the token type as the primary identifier. This format is ideal for simpler design systems + where all tokens belong to a single collection or where semantic layering is not required. + + The format follows a simple structure: + - Type (first segment): What the token represents (color, spacing, etc.) + - Attributes (remaining segments): Variations or specific use cases + + This format is particularly useful for: + - Small to medium-sized design systems + - Systems without complex semantic layering + - Direct mapping between design tokens and their values`, + }, + separator: ".", + segments: [ + { + name: "type", + type: "type", + description: "The kind of design token (color, spacing, etc.)", + examples: { + valid: ["color", "spacing", "borderRadius"], + invalid: ["primary", "large", "button"], + }, + }, + { + name: "attributes", + type: "attributes", + description: + "Additional descriptors that specify the token's purpose or variation", + examples: { + valid: ["primary", "large", "hover"], + invalid: ["color", "spacing"], + }, + }, + ], + examples: { + valid: [ + "color.primary", + "spacing.large", + "borderRadius.small", + "fontSize.body.large", + ], + invalid: ["primary.color", "button.backgroundColor", "large.spacing"], + }, +}; + +export const decomposeTokenName = + createDecompositionFunction(formatDescription); + +export const ruleDescriptions: RuleDescriptions = { + "min-two-segments": { + description: "Token names must have at least two segments", + validators: [ + { + type: "segment", + length: { min: 2 }, + message: "Token names must have at least two segments", + }, + ], + }, + "dot-separation": { + description: + "Segments within a token name must be separated by a single dot", + validators: [ + { + type: "string-pattern", + pattern: { type: "regex", pattern: "\\." }, + message: + "Segments within a token name must be separated by a single dot", + }, + ], + }, + "type-as-first-segment": { + description: + "The first segment of the token name must indicate the token type unless the token is a color", + validators: [ + { + type: "position", + position: "first", + pattern: { type: "function", name: "isTokenType" }, + message: "First segment must be a valid token type", + skipIf: [ + { + type: "token-type", + value: "COLOR", + }, + ], + }, + ], + }, + "lowercase-or-camelcase": { + description: + "Each segment can be in lowercase or camelCase unless it's the last segment, that can be either a camelCase value or a numeric value", + validators: [ + { + type: "segment-pattern", + pattern: { type: "function", name: "isLowerCaseOrCamelCase" }, + excludeLastSegment: true, + message: + "Segments should be in lowercase or camelCase, or an expression if it's the last segment. It should also have no special characters", + }, + { + type: "position", + position: "last", + pattern: { + type: "function", + name: "isLowerCaseCamelCaseOrNumber", + }, + message: "Last segment should be in camelCase or be a numeric value", + }, + ], + }, + "no-leading-or-trailing-dots": { + description: "Token names must not start or end with a dot", + validators: [ + { + type: "string-pattern", + pattern: { type: "regex", pattern: "^[^.].*[^.]$" }, + message: "Token names must not start or end with a dot", + }, + ], + }, + length: { + description: + "Each segment within a token name should be between 1 to 25 characters long", + validators: [ + { + type: "segment-pattern", + pattern: { + type: "regex", + pattern: "^.{1,25}$", + }, + message: + "Each segment within a token name should be between 1 to 25 characters long", + }, + ], + }, + "no-consecutive-dots": { + description: "Multiple consecutive dots are not allowed", + validators: [ + { + type: "string-pattern", + pattern: { type: "regex", pattern: "^(?!.*\\.\\.).*$" }, + message: "Multiple consecutive dots are not allowed", + }, + ], + }, +}; + +export const rules = createRuleSet(ruleDescriptions); diff --git a/packages/radius-toolkit/src/lib/formats/radius-simple/rules.ts b/packages/radius-toolkit/src/lib/formats/radius-simple/rules.ts deleted file mode 100644 index b3d4cb7..0000000 --- a/packages/radius-toolkit/src/lib/formats/radius-simple/rules.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { DecomposeTokenName } from "../format.types"; -import { - isCamelCase, - isNumberOrFraction, - ruleSet, - validationError, - validationResult, -} from "../format.utils"; -import { TokenNameDescription, getTokenType } from "../token-name-format.types"; - -export const decomposeTokenName: DecomposeTokenName = (name) => { - const [typeSegment, ...attributes] = name.split("."); - const type = getTokenType(typeSegment); - if (!type) return null; - return { - type, - attributes, - } satisfies TokenNameDescription; -}; - -export const rules = ruleSet({ - "min-two-segments": { - description: "Token names must have at least two segments", - validate: (name: string) => { - const segments = name.split("."); - return segments.length >= 2 - ? validationResult(true) - : validationError( - `Token names must have at least two segments (found ${segments.length})` - ); - }, - }, - "dot-separation": { - description: - "Segments within a token name must be separated by a single dot", - validate: (name: string) => { - return name.includes(".") - ? validationResult(true) - : validationError( - "Segments within a token name must be separated by a single dot" - ); - }, - }, - "type-as-first-segment": { - description: - "The first segment of the token name must indicate the token type unless the token is a color", - validate: (name: string, tokenType: string) => { - if (tokenType === "COLOR") return validationResult(true); - const [firstSegment] = name.split("."); - const type = getTokenType(firstSegment); - return type - ? validationResult(true) - : validationError( - `Segment '${firstSegment}' is not a valid token type`, - [firstSegment] - ); - }, - }, - "lowercase-or-camelcase": { - description: - "Each segment can be in lowercase or camelCase unless it's the last segment, that can be either a camelCase value or a numeric value", - validate: (name: string) => { - const segments = name.split("."); - const allButLast = segments.slice(0, segments.length - 1); - const lastSegment = segments[segments.length - 1]; - return allButLast.every(isCamelCase) && - (isCamelCase(lastSegment) || isNumberOrFraction(lastSegment)) - ? validationResult(true) - : validationError( - "Segments should be in lowercase or camelCase, or an expression if it's the last segment. It should also have no special characters", - segments.filter((s) => !isCamelCase(s)) - ); - }, - }, - "no-leading-or-trailing-dots": { - description: "Token names must not start or end with a dot", - validate: (name: string) => { - return !name.startsWith(".") && !name.endsWith(".") - ? validationResult(true) - : validationError("Token names must not start or end with a dot"); - }, - }, - length: { - description: - "Each segment within a token name should be between 1 to 25 characters long", - validate: (name: string) => { - const segments = name.split("."); - return segments.every((s) => s.length >= 1 && s.length <= 25) - ? validationResult(true) - : validationError( - "Each segment within a token name should be between 1 to 25 characters long", - segments.filter((s) => s.length < 1 || s.length > 25) - ); - }, - }, - "no-consecutive-dots": { - description: "Multiple consecutive dots are not allowed", - validate: (name: string) => { - return !name.includes("..") - ? validationResult(true) - : validationError("Multiple consecutive dots are not allowed"); - }, - }, -}); diff --git a/packages/radius-toolkit/src/lib/formats/rules-testing.utils.ts b/packages/radius-toolkit/src/lib/formats/rules-testing.utils.ts index 8a2cb1a..dd9308d 100644 --- a/packages/radius-toolkit/src/lib/formats/rules-testing.utils.ts +++ b/packages/radius-toolkit/src/lib/formats/rules-testing.utils.ts @@ -1,5 +1,18 @@ import { test, expect } from "vitest"; -import { TokenRuleSet, isTokenGlobalNameRule } from "./format.types"; +import { + TokenRuleSet, + isTokenGlobalNameRule, + TokenNameValidationResult, + TokenGlobalRuleValidationResult, +} from "./format.types"; + +// Define possible validation states for better type safety +type ValidationState = { + hasError: boolean; + hasWarning: boolean; + message?: string; + offendingSegments?: string[]; +}; export type RuleTest = { input: string; @@ -8,43 +21,129 @@ export type RuleTest = { }; /** - * automatically runs a set of test cases for a given rule set - * @param tokenNameTests list of test cases to run + * Analyzes a validation result and returns its state */ +const getValidationState = ( + result: TokenNameValidationResult | TokenGlobalRuleValidationResult +): ValidationState => { + // Handle empty global validation result + if (Array.isArray(result) && result.length === 0) { + return { + hasError: false, + hasWarning: false, + message: "", + offendingSegments: [], + }; + } + + // Handle single element array (valid result) + if (Array.isArray(result) && result.length === 1 && result[0] === true) { + return { + hasError: false, + hasWarning: false, + message: "", + offendingSegments: [], + }; + } + + // Handle two element array [isValid, message] + if (Array.isArray(result) && result.length === 2) { + const [isValid, message] = result; + return { + hasError: !isValid, + hasWarning: false, + message, + offendingSegments: [], + }; + } + + // Handle three element array [isValid, message, offendingSegments] + if (Array.isArray(result) && result.length === 3) { + const [isValid, message, offendingSegments] = result; + return { + hasError: !isValid, + hasWarning: false, + message: message as string, + offendingSegments: offendingSegments as string[], + }; + } + + // Handle four element array [isValid, message, offendingSegments, isWarning] + if ( + Array.isArray(result) && + result.length === 4 && + typeof result[3] === "boolean" + ) { + const [isValid, message, offendingSegments, isWarning] = result; + return { + hasError: !isValid && !isWarning, + hasWarning: isWarning, + message, + offendingSegments, + }; + } + + // Default case - treat as invalid + return { + hasError: true, + hasWarning: false, + message: "Invalid validation result format", + offendingSegments: [], + }; +}; + +/** + * automatically runs a set of test cases for a given rule set + */ export const ruleTestValues = ( tokenNameTests: RuleTest[] ) => { return (ruleSet: TokenRuleSet) => { const ruleEntries = Object.entries(ruleSet); + ruleEntries.forEach(([ruleName, rule]) => { if (isTokenGlobalNameRule(rule)) { // TODO: Implement global rule tests return; } + tokenNameTests.forEach((tokenNameTest) => { - const { input, errors, warnings } = tokenNameTest; - test(`Rule '${ruleName}' should validate '${input}'`, () => { - const [ok, msg] = rule.validate(input, ""); - if (!ok) { - expect(errors, "to expect errors").toBeTruthy(); + const { + input, + errors: expectedErrors = [], + warnings: expectedWarnings = [], + } = tokenNameTest; + + test(`Rule '${ruleName}' validating '${input}'`, () => { + const result = rule.validate(input, ""); + const { hasError, hasWarning, message } = getValidationState(result); + + // Test for errors + if (hasError) { expect( - errors?.length, - "to expect at least one error" - ).toBeGreaterThan(0); - const err = errors?.find((e) => e === ruleName); - expect(msg, "to have an error message").toBeTruthy(); - expect(err, "to have the correct error").toBe(ruleName); + expectedErrors, + `Rule '${ruleName}' should have triggered an error for '${input}'` + ).toContain(ruleName); + expect(message).toBeDefined(); } else { - const err = errors?.find((e) => e === ruleName); - const warn = warnings?.find((e) => e === ruleName); - - expect(err, "to expect no errors").toBeFalsy(); - if (warn) { - expect(warn, "to have the correct warning").toBe(ruleName); - } else { - expect(msg, "to have no warnings").toBeFalsy(); - } + expect( + expectedErrors, + `Rule '${ruleName}' should not have triggered an error for '${input}', but it did` + ).not.toContain(ruleName); + } + + // Test for warnings + if (hasWarning) { + expect( + expectedWarnings, + `Rule '${ruleName}' should have triggered a warning for '${input}'` + ).toContain(ruleName); + } else { + expect( + expectedWarnings, + `Rule '${ruleName}' should not have triggered a warning for '${input}', but it did` + ).not.toContain(ruleName); } }); }); diff --git a/packages/radius-toolkit/src/lib/formats/rules.utils.ts b/packages/radius-toolkit/src/lib/formats/rules.utils.ts new file mode 100644 index 0000000..9190042 --- /dev/null +++ b/packages/radius-toolkit/src/lib/formats/rules.utils.ts @@ -0,0 +1,697 @@ +import { + TokenNameCollection, + DecomposeTokenName, + TokenRuleSet, + TokenNameRule, + TokenGlobalNameRule, + TokenNameValidationResult, + TokenGlobalRuleValidationResult, +} from "./format.types"; +import { + isCamelCase, + isLowerCase, + isLowerCaseIdentifier, + isNumberOrFraction, + toKebabCase, +} from "./format.utils"; +import { getTokenType, TokenTypeName } from "./token-name-format.types"; +import { isVariableAlias } from "../tokens"; + +// Predefined validation functions that can be referenced by name +export const validationFunctions = { + isCamelCase, + isLowerCase, + isLowerCaseIdentifier, + isLowerCaseOrCamelCase: (segment: string) => + isLowerCase(segment) || isCamelCase(segment), + isNumberOrFraction, + isLowerCaseCamelCaseOrNumber: (segment: string) => + isLowerCaseIdentifier(segment) || + isCamelCase(segment) || + isNumberOrFraction(segment), + isTokenType: (segment: string) => getTokenType(segment) !== undefined, + isPrimitiveToken: (name: string) => { + const segments = name.split("."); + if (segments.length !== 3) return false; + const [layer, typeSegment] = segments; + return layer === "primitive" && getTokenType(typeSegment) !== undefined; + }, + hasNoRepeatedSegments: (name: string) => { + const segments = toKebabCase(name).split("-"); + return !segments.some( + (segment, index) => segments.indexOf(segment) !== index + ); + }, + isNotGenericType: (segment: string) => { + const genericTypes = ["color", "spacing"]; + return !genericTypes.includes(segment); + }, +} as const; + +export type ValidationFunctionName = keyof typeof validationFunctions; + +// Core validation result types +export type ValidationSeverity = "error" | "warning" | "disabled"; + +export type ValidationResult = { + isValid: boolean; + message?: string; + offendingSegments?: string[]; + severity: ValidationSeverity; +}; + +// Skip conditions +export type SkipCondition = + | { type: "token-type"; value: string } + | { type: "primitive-token" } + | { type: "segment-count"; min?: number; max?: number } + | { type: "segment-value"; position: number; value: string } + | { type: "pattern-match"; pattern: StringPattern }; + +// Base validator configuration +type BaseValidatorConfig = { + severity?: ValidationSeverity; + message?: string; + skipIf?: SkipCondition[]; + description?: string; + examples?: { + valid: string[]; + invalid: string[]; + }; +}; + +// Pattern types for serializable configurations +export type StringPattern = + | { + type: "regex"; + pattern: string; + } + | { + type: "function"; + name: ValidationFunctionName; + allowEmpty?: boolean; + operator?: "not"; + }; + +export type SegmentLength = { + min?: number; + max?: number; +}; + +export type SegmentPosition = number | "last" | "first"; + +// Collection validation types +export type CollectionValidationType = + | { type: "unique-modes" } + | { type: "common-prefix" } + | { type: "unique-subjects" } + | { type: "no-aliases"; target: "primitive" | "non-primitive" } + | { type: "segment-uniqueness"; position: number } + | { type: "segment-pattern"; pattern: StringPattern } + | { type: "attribute-sparsity"; minSegments: number }; + +// Validator configurations +type SegmentValidatorConfig = BaseValidatorConfig & { + type: "segment"; + length?: SegmentLength; + separator?: string; +}; + +type SegmentPatternValidatorConfig = BaseValidatorConfig & { + type: "segment-pattern"; + pattern: StringPattern; + excludeLastSegment?: boolean; +}; + +type PositionalValidatorConfig = BaseValidatorConfig & { + type: "position"; + position: SegmentPosition; + pattern: StringPattern; +}; + +type StringPatternValidatorConfig = BaseValidatorConfig & { + type: "string-pattern"; + pattern: StringPattern; +}; + +type CollectionValidatorConfig = BaseValidatorConfig & { + type: "collection"; + validation: CollectionValidationType; +}; + +// Rule configuration +export type RuleConfig = { + description: string; + severity?: ValidationSeverity; + validators: ( + | SegmentValidatorConfig + | SegmentPatternValidatorConfig + | PositionalValidatorConfig + | StringPatternValidatorConfig + | CollectionValidatorConfig + )[]; + examples?: { + valid: string[]; + invalid: string[]; + }; +}; + +export type RuleDescriptions = { + [key in T]: RuleConfig; +}; + +// Helper to evaluate skip conditions +const shouldSkipValidation = ( + conditions: SkipCondition[] | undefined, + context: { + name: string; + tokenType?: string; + segments: string[]; + } +): boolean => { + if (!conditions) return false; + + return conditions.some((condition) => { + switch (condition.type) { + case "token-type": + return context.tokenType === condition.value; + case "primitive-token": + return validationFunctions.isPrimitiveToken(context.name); + case "segment-count": + return ( + (!condition.min || context.segments.length >= condition.min) && + (!condition.max || context.segments.length <= condition.max) + ); + case "segment-value": + return context.segments[condition.position] === condition.value; + case "pattern-match": + return evaluatePattern(condition.pattern, context.name); + } + }); +}; + +// Helper to create validation result +const createValidationResult = ( + isValid: boolean, + config: BaseValidatorConfig, + message?: string, + offendingSegments?: string[] +): ValidationResult => { + return { + isValid, + message: message || config.message, + offendingSegments, + severity: config.severity || "error", + }; +}; + +// Helper functions to evaluate patterns +const evaluatePattern = (pattern: StringPattern, value: string): boolean => { + if (pattern.type === "regex") { + return new RegExp(pattern.pattern).test(value); + } else { + const fn = validationFunctions[pattern.name]; + if (!value?.length && !pattern.allowEmpty) return false; + if (pattern.operator === "not") return !fn(value); + return fn(value); + } +}; + +// Collection validation functions +const validateCollectionByType = ( + config: CollectionValidationType, + collections: TokenNameCollection[] +): { isValid: boolean; message?: string; offendingSegments?: string[] } => { + switch (config.type) { + case "unique-modes": { + const collectionsByMode = collections.reduce( + (acc, collection) => { + if (!collection.modes) return acc; + return collection.modes.reduce( + (acc, mode) => ({ + ...acc, + [mode]: [...(acc[mode] || []), collection.name], + }), + acc + ); + }, + {} as Record + ); + + const duplicates = Object.entries(collectionsByMode) + .filter(([_, cols]) => cols.length > 1) + .map(([mode, cols]) => ({ mode, collections: cols })); + + return { + isValid: duplicates.length === 0, + message: + duplicates.length > 0 + ? `Modes should be unique to each collection. Found duplicate modes in ${duplicates.flatMap((d) => d.collections).join(", ")}` + : undefined, + }; + } + + case "common-prefix": { + const heterogenousPrefixes = collections + .map((collection) => ({ + name: collection.name, + prefixes: [ + ...new Set( + collection.tokens.map((token) => token.name.split(".")[0]) + ), + ], + })) + .filter(({ prefixes }) => prefixes.length > 1); + + return { + isValid: heterogenousPrefixes.length === 0, + message: + heterogenousPrefixes.length > 0 + ? `Collections should have a common prefix. Found heterogenous prefixes in ${heterogenousPrefixes.map((h) => h.name).join(", ")}` + : undefined, + }; + } + + case "no-aliases": { + const tokens = collections + .filter((collection) => + config.target === "primitive" + ? collection.name === "primitive" || + collection.tokens.every((token) => + validationFunctions.isPrimitiveToken(token.name) + ) + : collection.name !== "primitive" && + collection.tokens.some( + (token) => !validationFunctions.isPrimitiveToken(token.name) + ) + ) + .flatMap((collection) => collection.tokens); + + const aliases = tokens.filter((token) => + Object.values(token.values ?? {}).some(isVariableAlias) + ); + + return { + isValid: aliases.length === 0, + message: + aliases.length > 0 + ? `${config.target === "primitive" ? "Primitive" : "Non-primitive"} tokens should not contain aliases. Found aliases in ${aliases.map((a) => a.name).join(", ")}` + : undefined, + }; + } + + case "attribute-sparsity": { + const flatTokens = collections.flatMap((c) => c.tokens); + const maxSegments = Math.max( + 0, + ...flatTokens.map((t) => t.name.split(".").length) + ); + + if (maxSegments < config.minSegments) return { isValid: true }; + + const indistinguishedAttributes = new Array( + maxSegments - config.minSegments + 1 + ) + .fill(0) + .map((_, i) => { + const segmentGroups = flatTokens.reduce( + (acc, token) => { + const segments = token.name.split("."); + const key = segments.slice(0, config.minSegments + i).join("."); + return { + ...acc, + [key]: (acc[key] || 0) + 1, + }; + }, + {} as Record + ); + + return Object.entries(segmentGroups) + .filter(([_, count]) => count === 1) + .map(([segments]) => segments); + }) + .flat(); + + return { + isValid: indistinguishedAttributes.length === 0, + message: + indistinguishedAttributes.length > 0 + ? `Attributes should be used sparingly. Found attributes that do not distinguish tokens: ${indistinguishedAttributes.join(", ")}` + : undefined, + }; + } + + default: + return { isValid: true }; + } +}; + +// Validator functions +const validateSegments = ( + config: SegmentValidatorConfig, + context: { name: string; tokenType?: string } +): ValidationResult => { + const segments = context.name.split(config.separator || "."); + + if (shouldSkipValidation(config.skipIf, { ...context, segments })) { + return createValidationResult(true, config); + } + + const { length } = config; + const isValid = + (!length?.min || segments.length >= length.min) && + (!length?.max || segments.length <= length.max); + + return createValidationResult( + isValid, + config, + isValid + ? undefined + : `Token names must have between ${length?.min} and ${length?.max} segments` + ); +}; + +const validateSegmentPattern = ( + config: SegmentPatternValidatorConfig, + context: { name: string; tokenType?: string } +): ValidationResult => { + const segments = context.name.split("."); + const segmentsToValidate = config.excludeLastSegment + ? segments.slice(0, -1) + : segments; + + const invalidSegments = segmentsToValidate.filter( + (segment) => !evaluatePattern(config.pattern, segment) + ); + + return createValidationResult( + invalidSegments.length === 0, + config, + invalidSegments.length > 0 ? "Invalid segment pattern" : undefined, + invalidSegments + ); +}; + +const validatePosition = ( + config: PositionalValidatorConfig, + context: { name: string; tokenType?: string } +): ValidationResult => { + if ( + shouldSkipValidation(config.skipIf, { + ...context, + segments: context.name.split("."), + }) + ) { + return createValidationResult(true, config); + } + + const segments = context.name.split("."); + const position = + config.position === "last" + ? segments.length - 1 + : config.position === "first" + ? 0 + : config.position; + + const segment = segments[position]; + if ( + !segment && + config.pattern.type === "function" && + config.pattern.allowEmpty + ) + return createValidationResult(true, config); + + const isValid = evaluatePattern(config.pattern, segment); + return createValidationResult( + isValid, + config, + isValid ? undefined : `Invalid segment at position ${position}`, + [segment] + ); +}; + +const validateStringPattern = ( + config: StringPatternValidatorConfig, + context: { name: string; tokenType?: string } +): ValidationResult => { + const isValid = evaluatePattern(config.pattern, context.name); + return createValidationResult( + isValid, + config, + isValid ? undefined : "Invalid string pattern", + [] + ); +}; + +const validateCollection = ( + config: CollectionValidatorConfig, + collections: TokenNameCollection[] +): ValidationResult => { + const result = validateCollectionByType(config.validation, collections); + if (result.isValid) return createValidationResult(true, config); + + return createValidationResult( + false, + config, + result.message || "", + result.offendingSegments || [] + ); +}; + +// Helper to convert internal validation result to external token name validation result +const toTokenNameValidationResult = ( + result: ValidationResult +): TokenNameValidationResult => { + if (result.isValid) return [true] as const; + if (result.severity === "warning") + return [ + false, + result.message || "", + result.offendingSegments || [], + true, + ] as const; + return [false, result.message || "", result.offendingSegments || []] as const; +}; + +// Helper to convert internal validation results to external global validation result +const toGlobalValidationResult = ( + results: ValidationResult[], + _collections: TokenNameCollection[] +): TokenGlobalRuleValidationResult => { + if (results.length === 0) return [] as const; + + const firstResult = results[0]; + if (!firstResult.offendingSegments) { + return [firstResult.message || ""] as const; + } + + return [ + firstResult.message || "", + firstResult.severity === "warning", + firstResult.offendingSegments.map((segment) => [segment]) as [ + string, + string?, + string?, + ][], + ] as const; +}; + +// Main rule creator function +export const createRule = ( + config: RuleConfig +): TokenNameRule | TokenGlobalNameRule => { + const isCollectionRule = config.validators.some( + (v) => v.type === "collection" + ); + + const baseConfig: BaseValidatorConfig = { + severity: config.severity || "error", + examples: config.examples, + }; + + if (isCollectionRule) { + return { + description: config.description, + type: "global" as const, + validate: ( + collections: TokenNameCollection[] + ): TokenGlobalRuleValidationResult => { + if (config.severity === "disabled") return [] as const; + + const results: ValidationResult[] = []; + for (const validator of config.validators) { + if (validator.type === "collection") { + const result = validateCollection( + { + ...validator, + ...baseConfig, + }, + collections + ); + if (!result.isValid) results.push(result); + } + } + return toGlobalValidationResult(results, collections); + }, + }; + } + + return { + description: config.description, + validate: (name: string, tokenType?: string): TokenNameValidationResult => { + if (config.severity === "disabled") { + return [true] as const; + } + + for (const validator of config.validators) { + const validatorWithBase = { + ...validator, + severity: validator.severity || baseConfig.severity, + }; + + let result: ValidationResult; + const context = { name, tokenType }; + + switch (validator.type) { + case "segment": + result = validateSegments( + validatorWithBase as SegmentValidatorConfig, + context + ); + break; + case "segment-pattern": + result = validateSegmentPattern( + validatorWithBase as SegmentPatternValidatorConfig, + context + ); + break; + case "position": + result = validatePosition( + validatorWithBase as PositionalValidatorConfig, + context + ); + break; + case "string-pattern": + result = validateStringPattern( + validatorWithBase as StringPatternValidatorConfig, + context + ); + break; + default: + continue; + } + + if (!result.isValid) return toTokenNameValidationResult(result); + } + + return [true] as const; + }, + }; +}; + +// Helper function to create a rule set +export const createRuleSet = (rules: RuleDescriptions) => { + return Object.fromEntries( + Object.entries(rules).map(([key, config]) => [ + key, + createRule(config as RuleConfig), + ]) + ) as TokenRuleSet; +}; + +// Token decomposition types +export type TokenSegmentDescription = { + name: string; + type: "layer" | "subject" | "type" | "attributes"; + description: string; + examples?: { + valid: string[]; + invalid: string[]; + }; + condition?: { + type: "primitive" | "non-primitive"; + value?: string; + description?: string; + }; +}; + +export type TokenFormatDescription = { + name: string; + version: string; + description: { + short: string; + long: string; + }; + segments: TokenSegmentDescription[]; + separator: string; + primitiveFormat?: { + requiredSegments: number; + layerName: string; + description: string; + }; + examples?: { + valid: string[]; + invalid: string[]; + }; +}; + +// Token decomposition function creator +export const createDecompositionFunction = ( + format: TokenFormatDescription +): DecomposeTokenName => { + return (name: string) => { + const segments = name.split(format.separator); + + // Check if it's a primitive token if primitive format is defined + const isPrimitive = + format.primitiveFormat && + segments.length === format.primitiveFormat.requiredSegments && + segments[0] === format.primitiveFormat.layerName; + + // Early return if format doesn't match + if ( + isPrimitive && + segments.length !== format?.primitiveFormat?.requiredSegments + ) + return null; + if (!isPrimitive && segments.length < format.segments.length) return null; + + // Map segments to their roles + const segmentMap = format.segments.reduce( + (acc, segDesc, index) => { + if (segDesc.condition) { + const shouldInclude = + ((segDesc.condition.type === "primitive" && isPrimitive) || + (segDesc.condition.type === "non-primitive" && !isPrimitive)) && + (!segDesc.condition.value || + segments[index] === segDesc.condition.value); + + if (shouldInclude) { + acc[segDesc.name] = segments[index]; + } + } else { + acc[segDesc.name] = segments[index]; + } + return acc; + }, + {} as Record + ); + + // Get remaining segments as attributes + const attributeStartIndex = format.segments.filter( + (s) => + !s.condition || + (s.condition.type === "primitive" && isPrimitive) || + (s.condition.type === "non-primitive" && !isPrimitive) + ).length; + const attributes = segments.slice(attributeStartIndex); + + return { + type: segmentMap.type as TokenTypeName, + attributes, + otherSegments: Object.fromEntries( + Object.entries(segmentMap).filter(([key]) => key !== "type") + ), + }; + }; +}; diff --git a/packages/radius-toolkit/src/lib/formats/token-name-format.types.md b/packages/radius-toolkit/src/lib/formats/token-name-format.types.md deleted file mode 100644 index e69de29..0000000 diff --git a/packages/radius-toolkit/src/lib/formats/token-name-format.types.ts b/packages/radius-toolkit/src/lib/formats/token-name-format.types.ts index 131ef43..18c8902 100644 --- a/packages/radius-toolkit/src/lib/formats/token-name-format.types.ts +++ b/packages/radius-toolkit/src/lib/formats/token-name-format.types.ts @@ -1,112 +1,117 @@ export const tokenTypeNames = [ - // Responsiveness - "screens", - "supports", - "data", - - // Reusable base configs + // Core Design Tokens (Primitive Values) "colors", "spacing", - // Components + // Layout & Responsive Patterns + "screens", "container", + "supports", + "data", - // Utilities + // Spacing Derivatives + "padding", + "margin", + "gap", + "space", "inset", - "zIndex", - "order", + "scrollMargin", + "scrollPadding", + + // Sizing & Dimensions + "width", + "minWidth", + "maxWidth", + "height", + "minHeight", + "maxHeight", + "aspectRatio", + + // Grid System "gridColumn", "gridColumnStart", "gridColumnEnd", "gridRow", "gridRowStart", "gridRowEnd", + "gridAutoColumns", + "gridAutoRows", + "gridTemplateColumns", + "gridTemplateRows", + "columns", - "aspectRatio", - - "height", - "maxHeight", - "minHeight", - "width", - "maxWidth", - "minWidth", - - "gap", - - "backgroundColor", - - "fill", - "stroke", - - "padding", - "margin", - + // Flexbox "flex", "flexShrink", "flexGrow", "flexBasis", - "borderSpacing", - "transformOrigin", - "translate", - "rotate", - "skew", - "scale", - "animation", - "keyframes", - "cursor", - "scrollMargin", - "scrollPadding", - "listStyleType", - "columns", - "gridAutoColumns", - "gridAutoRows", - "gridTemplateColumns", - "gridTemplateRows", - "space", - "divideWidth", - "divideColor", - "divideOpacity", + // Positioning & Stacking + "zIndex", + "order", - "borderRadius", - "borderWidth", + // Colors & Opacity Derivatives + "backgroundColor", + "backgroundOpacity", "borderColor", "borderOpacity", - "backgroundOpacity", - "backgroundImage", - "gradientColorStops", - "backgroundSize", - "backgroundPosition", - "strokeWidth", - "objectPosition", + "textColor", + "textOpacity", + "placeholderColor", + "placeholderOpacity", + "ringColor", + "ringOpacity", + "divideColor", + "divideOpacity", + "boxShadowColor", + "outlineColor", + "ringOffsetColor", + "caretColor", + "accentColor", + "opacity", + "fill", + "stroke", - "textIndent", + // Typography "fontFamily", "fontSize", "fontWeight", "lineHeight", "letterSpacing", - "textColor", - "textOpacity", + "textIndent", "textDecorationColor", "textDecorationThickness", "textUnderlineOffset", + "listStyleType", - "placeholderColor", - "placeholderOpacity", - "caretColor", - "accentColor", - "opacity", - "boxShadow", - "boxShadowColor", + // Borders & Outlines + "borderRadius", + "borderWidth", + "borderSpacing", "outlineWidth", "outlineOffset", - "outlineColor", "ringWidth", - "ringColor", - "ringOpacity", "ringOffsetWidth", - "ringOffsetColor", + "divideWidth", + "strokeWidth", + + // Backgrounds & Images + "backgroundImage", + "gradientColorStops", + "backgroundSize", + "backgroundPosition", + "objectPosition", + + // Transforms & Animations + "transformOrigin", + "translate", + "rotate", + "skew", + "scale", + "animation", + "keyframes", + + // Filters & Effects "blur", "brightness", "contrast", @@ -116,6 +121,9 @@ export const tokenTypeNames = [ "invert", "saturate", "sepia", + "boxShadow", + + // Backdrop Filters "backdropBlur", "backdropBrightness", "backdropContrast", @@ -125,10 +133,15 @@ export const tokenTypeNames = [ "backdropOpacity", "backdropSaturate", "backdropSepia", + + // Transitions & Animations "transitionProperty", "transitionTimingFunction", "transitionDelay", "transitionDuration", + + // Miscellaneous + "cursor", "willChange", "content", "aria", @@ -152,9 +165,14 @@ export type TokenNameDescription = { const isTokenType = (t: unknown): t is TokenTypeName => tokenTypeNames.indexOf(t as TokenTypeName) !== -1; -export const getTokenType = (t: unknown): TokenTypeName | undefined => - isTokenType(t) - ? t - : (t as keyof typeof tokenTypeAliases) in tokenTypeAliases - ? (tokenTypeAliases[t as keyof typeof tokenTypeAliases] as TokenTypeName) - : undefined; +export const getTokenType = (t: unknown): TokenTypeName | undefined => { + if (isTokenType(t)) { + return t; + } + if ((t as keyof typeof tokenTypeAliases) in tokenTypeAliases) { + return tokenTypeAliases[ + t as keyof typeof tokenTypeAliases + ] as TokenTypeName; + } + return undefined; +}; diff --git a/packages/radius-toolkit/src/lib/formats/token-types.md b/packages/radius-toolkit/src/lib/formats/token-types.md new file mode 100644 index 0000000..3f6beac --- /dev/null +++ b/packages/radius-toolkit/src/lib/formats/token-types.md @@ -0,0 +1,122 @@ +# Token Types in Design Systems + +## Understanding Polymorphic Token Types + +Token types in design systems are polymorphic by nature, meaning they should precisely match the level of decision and constraint they represent. This is a crucial concept that ensures token names accurately reflect their intended use and limitations. + +### The Principle of Decision-Level Matching + +When naming tokens, the type segment must reflect the exact level of decision made about that token's usage. For example: + +- If a color token can be used for any color property, use `color` +- If a color token is specifically for text, use `textColor` +- If a color token is specifically for backgrounds, use `backgroundColor` + +This isn't just about naming—it's about encoding decisions and constraints directly into the token structure. + +## Available Types + +### Color Types +- `color` - Generic color token that can be used for any color property +- `backgroundColor` - Color specifically for background properties +- `textColor` - Color specifically for text properties +- `borderColor` - Color specifically for borders +- `outlineColor` - Color specifically for outlines +- `accentColor` - Color specifically for accent properties +- `caretColor` - Color specifically for text input cursors +- `fillColor` - Color specifically for SVG fills +- `strokeColor` - Color specifically for SVG strokes + +### Spacing Types +- `spacing` - Generic spacing token that can be used for any spacing property +- `padding` - Spacing specifically for padding +- `margin` - Spacing specifically for margins +- `gap` - Spacing specifically for gaps between elements +- `inset` - Spacing specifically for positioning elements + +### Size Types +- `size` - Generic size token that can be used for width or height +- `width` - Size specifically for width +- `height` - Size specifically for height +- `maxWidth` - Size specifically for maximum width +- `maxHeight` - Size specifically for maximum height +- `minWidth` - Size specifically for minimum width +- `minHeight` - Size specifically for minimum height + +### Typography Types +- `fontSize` - Size specifically for text +- `lineHeight` - Height specifically for text lines +- `letterSpacing` - Spacing specifically for letters +- `wordSpacing` - Spacing specifically for words +- `fontFamily` - Font family specification +- `fontWeight` - Font weight specification + +### Border Types +- `borderWidth` - Width specifically for borders +- `borderRadius` - Radius specifically for border corners +- `borderStyle` - Style specifically for borders +- `outlineWidth` - Width specifically for outlines +- `outlineStyle` - Style specifically for outlines +- `outlineOffset` - Offset specifically for outlines + +### Shadow Types +- `boxShadow` - Shadow specifically for boxes +- `textShadow` - Shadow specifically for text +- `dropShadow` - Shadow specifically for drop effects + +### Transform Types +- `scale` - Transformation specifically for scaling +- `rotate` - Transformation specifically for rotation +- `translate` - Transformation specifically for translation +- `skew` - Transformation specifically for skewing + +### Animation Types +- `transitionProperty` - Property specifically for transition properties +- `transitionDuration` - Duration specifically for transitions +- `transitionTimingFunction` - Timing function specifically for transitions +- `transitionDelay` - Delay specifically for transitions +- `animationDuration` - Duration specifically for animations +- `animationTimingFunction` - Timing function specifically for animations +- `animationDelay` - Delay specifically for animations + +### Grid Types +- `gridTemplateColumns` - Template specifically for grid columns +- `gridTemplateRows` - Template specifically for grid rows +- `gridColumn` - Position specifically for grid columns +- `gridRow` - Position specifically for grid rows +- `gridAutoFlow` - Flow specifically for grid auto-placement +- `gridAutoColumns` - Size specifically for auto-generated grid columns +- `gridAutoRows` - Size specifically for auto-generated grid rows + +## Examples of Decision-Level Matching + +### ❌ Incorrect Usage +```css +primitive.backgroundColor.primary /* Too specific if the color can be used for text or if there's more than one primary color */ +component.button.color.primary /* Too generic if the color can only be used for background */ +``` + +### ✅ Correct Usage +```css +primitive.color.primary /* Correctly specifies the color can be used for any color property */ +component.button.backgroundColor.primary /* Correctly specifies the color can only be used for backgrounds */ +component.button.foregroundColor.primary.light /* Correctly specifies the color can only be used for text and that there's a light variant */ +``` + +## Why This Matters + +1. **Self-Documentation**: The type immediately tells other developers how the token can be used +2. **Constraint Enforcement**: Tools can validate that tokens are only used in their intended context +3. **Maintainability**: Makes it clear what needs to be updated when design changes occur +4. **Scalability**: Helps prevent misuse as the design system grows +5. **Clarity**: Removes ambiguity about token usage + +## Best Practices + +1. **Be Specific**: Always use the most specific type that accurately represents the token's intended use +2. **Match Constraints**: The type should match any technical or design constraints +3. **Consider Context**: Think about how the token will be used in different scenarios +4. **Be Consistent**: Once a type pattern is established, maintain it across similar tokens +5. **Document Decisions**: When choosing between a generic and specific type, document why the decision was made + +Remember: The type segment is not just a name — it's a contract that communicates decisions and constraints to everyone using the design system. \ No newline at end of file diff --git a/packages/radius-toolkit/src/lib/loaders/installed.loader.ts b/packages/radius-toolkit/src/lib/loaders/installed.loader.ts index d705c55..46d12d2 100644 --- a/packages/radius-toolkit/src/lib/loaders/installed.loader.ts +++ b/packages/radius-toolkit/src/lib/loaders/installed.loader.ts @@ -6,8 +6,6 @@ export const installedModuleLoader: TemplateLoader = async ( ) => { if (templateId.startsWith(".")) return null; try { - // console.log("internalTemplateLoader", templateId); - const module = await import(templateId); if (!("render" in module)) return null; return module as TemplateModule; diff --git a/packages/radius-toolkit/src/lib/loaders/internal.loader.ts b/packages/radius-toolkit/src/lib/loaders/internal.loader.ts index e664648..006c95d 100644 --- a/packages/radius-toolkit/src/lib/loaders/internal.loader.ts +++ b/packages/radius-toolkit/src/lib/loaders/internal.loader.ts @@ -6,7 +6,6 @@ export const internalTemplateLoader: TemplateLoader = async ( templateId, _options ) => { - // console.log("internalTemplateLoader", templateId); if (templateId.startsWith(".")) return null; return builtInTemplates[templateId as BuiltInTemplate] || null; }; diff --git a/packages/radius-toolkit/src/lib/tokens/token-parser.utils.ts b/packages/radius-toolkit/src/lib/tokens/token-parser.utils.ts index 479e209..3e56431 100644 --- a/packages/radius-toolkit/src/lib/tokens/token-parser.utils.ts +++ b/packages/radius-toolkit/src/lib/tokens/token-parser.utils.ts @@ -1,3 +1,4 @@ +import { toKebabCase } from "../formats/format.utils"; import { TokenOutput, JSONStructure, @@ -5,8 +6,7 @@ import { GeneratorMappingFunction, isGeneratorMappingSpecificDictionaryItem, isString, -} from "./token-parser.types.js"; -import { toKebabCase } from "../formats"; +} from "./token-parser.types"; export const DEFAULT_MODE_NAME = "Mode 1"; export const formatLayerName = (modeName: string, description: string) => { @@ -96,6 +96,7 @@ export const createReplaceFunction = ( mapping: GeneratorMappingDictionary[string] ): GeneratorMappingFunction => { const items = mapping || []; + const replacingFunctions = items.flatMap((item) => { if (isGeneratorMappingSpecificDictionaryItem(item)) { const [tokenRegex, specificItems] = item; diff --git a/packages/radius-toolkit/src/lib/tokens/token.utils.test.ts b/packages/radius-toolkit/src/lib/tokens/token.utils.test.ts index 0ee8fbc..3fcff0d 100644 --- a/packages/radius-toolkit/src/lib/tokens/token.utils.test.ts +++ b/packages/radius-toolkit/src/lib/tokens/token.utils.test.ts @@ -5,11 +5,21 @@ import { combineComponentUsage, } from "./token.utils"; import { ComponentUsage } from "./token.types"; -import { getFormat, radiusLayerSubjectTypeFormat } from "../formats"; +import { + getFormat, + radiusLayerSubjectTypeFormat, + toTokenNameFormatType, +} from "../formats"; describe("calculateSubjectsFromProps", () => { + const format = getFormat("radius-layer-subject-type"); + if (!format) { + throw new Error("Format not found"); + } + const formatType = toTokenNameFormatType(format); + const getSubjects = calculateSubjectsFromProps( - getFormat("radius-layer-subject-type") ?? radiusLayerSubjectTypeFormat + formatType ?? radiusLayerSubjectTypeFormat ); it("should return an array of subjects from component props", () => { @@ -38,9 +48,12 @@ describe("inferVariableType", () => { value: "#FF0000", type: "color", }; - const getTokenType = inferVariableType( - getFormat("radius-layer-subject-type") ?? radiusLayerSubjectTypeFormat - ); + const format = getFormat("radius-layer-subject-type"); + if (!format) { + throw new Error("Format not found"); + } + const formatType = toTokenNameFormatType(format); + const getTokenType = inferVariableType(formatType); const type = getTokenType(variable); expect(type).toBe("color"); }); diff --git a/packages/repository-config/package.json b/packages/repository-config/package.json index f187e77..c21cdc4 100644 --- a/packages/repository-config/package.json +++ b/packages/repository-config/package.json @@ -12,7 +12,8 @@ "test": "echo 'no tests needed'" }, "dependencies": { - "zod": "^3.23.8" + "zod": "^3.23.8", + "@repo/utils": "workspace:*" }, "devDependencies": { "typescript": "^5.3.3", diff --git a/packages/repository-config/repository.schema.ts b/packages/repository-config/repository.schema.ts index 0c77c84..768b18e 100644 --- a/packages/repository-config/repository.schema.ts +++ b/packages/repository-config/repository.schema.ts @@ -1,13 +1,13 @@ import { z } from "zod"; -// Base schema +// Base schema without tool const baseSchema = z.object({ name: z.string().min(1, "Name is required"), - tool: z.enum(["GitHub"]), }); // Specialized Schema for GitHub -const githubSchema = z.object({ +const githubSchema = baseSchema.extend({ + tool: z.literal("GitHub"), repository: z .string() .regex( @@ -16,7 +16,10 @@ const githubSchema = z.object({ ), accessToken: z .string() - .length(40, "Access token must be in the correct format"), + .regex( + /^(ghp_[a-zA-Z0-9]{36}|github_pat_[a-zA-Z0-9_]{82}|[a-f0-9]{40})$/, + "Invalid token format. Must be a valid GitHub personal access token" + ), filePath: z .string() .regex( @@ -28,13 +31,30 @@ const githubSchema = z.object({ createNewFile: z.boolean().default(false), }); -// TODO: add support for other tools +// Schema for File Download +const fileDownloadSchema = baseSchema.extend({ + tool: z.literal("File Download"), +}); -// Extend base schema with tool-specific schema +// Schema for REST Server +const restServerSchema = baseSchema.extend({ + tool: z.literal("REST Server"), + url: z.string().url("Invalid URL format"), + headers: z + .array( + z.object({ + key: z.string().min(1, "Header key is required"), + value: z.string().min(1, "Header value is required"), + }) + ) + .default([]), +}); + +// Combine all schemas into a discriminated union export const formSchema = z.discriminatedUnion("tool", [ - baseSchema - .extend({ - tool: z.literal("GitHub"), - }) - .merge(githubSchema), + githubSchema, + fileDownloadSchema, + restServerSchema, ]); + +export type FormSchema = z.infer; diff --git a/packages/repository-config/repository.types.ts b/packages/repository-config/repository.types.ts index 73a8b67..733ebc4 100644 --- a/packages/repository-config/repository.types.ts +++ b/packages/repository-config/repository.types.ts @@ -1,8 +1,29 @@ import * as z from "zod"; import { formSchema } from "./repository.schema"; -export type FormSchema = z.infer; +import { PersistenceStatus } from "@repo/utils"; +export type RepositoryFormSchema = z.infer; -export type WidgetConfiguration = FormSchema & { - status?: "disconnected" | "error" | "online"; +export type WidgetConfiguration = RepositoryFormSchema & { + status?: PersistenceStatus["state"]; error?: string; }; + +export type RepositoryConfigProps = { + state: WidgetConfiguration; + updateState: (newState: WidgetConfiguration) => void; +}; +export type GithubConfig = Extract; +export type FileDownloadConfig = Extract< + RepositoryFormSchema, + { tool: "File Download" } +>; +export type RestServerConfig = Extract< + RepositoryFormSchema, + { tool: "REST Server" } +>; +export const isGithubConfig = ( + config: RepositoryFormSchema +): config is GithubConfig => config.tool === "GitHub"; +export const isRestServerConfig = ( + config: RepositoryFormSchema +): config is RestServerConfig => config.tool === "REST Server"; diff --git a/packages/utils/github.service.ts b/packages/utils/github.service.ts new file mode 100644 index 0000000..21bfbae --- /dev/null +++ b/packages/utils/github.service.ts @@ -0,0 +1,370 @@ +import { + RepositoryService, + RepositoryCredentials, + RepositoryOptions, + ConnectionStatus, + FileStatus, + TokenLayersResult, + defaultContentProcessor, +} from "./repository.interface"; +import { + createGithubRepositoryClient, + isGithubFileDetails, + isPackageJSON, + githubUrlToPath, + GithubCredentials, +} from "./github.utils"; +import { createLogger } from "./logging.utils"; +import { + isTokenLayerStructure, + TokenLayerStructure, +} from "./token-layers.types"; + +const log = createLogger("utils:github-service"); + +/** + * GitHub implementation of the RepositoryService interface. + * This is a thin wrapper around the existing GitHub functionality to maintain compatibility + * while providing a consistent interface for different repository tools. + */ +export class GitHubService implements RepositoryService { + private adaptCredentials(creds: RepositoryCredentials): GithubCredentials { + log("debug", "Adapting credentials for repository:", creds.repository); + return { + accessToken: creds.accessToken, + repoFullName: creds.repository, + }; + } + + async validateAccessToken(accessToken: string): Promise { + try { + const client = createGithubRepositoryClient({ + accessToken, + repoFullName: "", // Not needed for validation + }); + const repositories = await client.getRepositories(); + return { + status: "connected", + repositories: repositories.map((repo) => ({ + id: repo.name, // Using name as id since GitHub API doesn't return numeric id in this context + name: repo.name, + full_name: repo.full_name, + })), + }; + } catch (error) { + log("error", "Failed to validate access token:", error); + return { + status: "error", + error: + error instanceof Error ? error.message : "Unknown error occurred", + }; + } + } + + async testRepositoryConnection( + credentials: Pick, + contentProcessor = defaultContentProcessor + ): Promise { + try { + const client = createGithubRepositoryClient( + this.adaptCredentials(credentials as RepositoryCredentials) + ); + const branches = await client.getBranches(); + return { + status: "connected", + branches: branches.map((branch) => ({ + name: branch.name, + protected: branch.protected || false, + })), + }; + } catch (error) { + log("error", "Failed to test repository connection:", error); + return { + status: "error", + error: + error instanceof Error ? error.message : "Unknown error occurred", + }; + } + } + + async testFileExists( + credentials: RepositoryCredentials & { branch: string; filePath: string } + ): Promise { + log( + "debug", + "Testing file existence:", + credentials.filePath, + "in branch:", + credentials.branch + ); + const client = createGithubRepositoryClient( + this.adaptCredentials(credentials) + ); + + try { + const { filePath, branch } = credentials; + const file = await client.getFileDetailsByPath(filePath, branch); + log("info", "File found:", filePath); + return { + status: "found", + file: { + name: file.name, + path: file.path, + size: file.size, + encoding: file.encoding, + content: file.content, + url: file.url, + }, + }; + } catch (error) { + log("error", "File existence test failed:", (error as Error).message); + return { + status: "error", + error: (error as Error).message, + }; + } + } + + async fetchRepositoryTokenLayers( + options: RepositoryOptions + ): Promise { + log( + "debug", + "Fetching repository token layers from:", + options.tokenFilePath + ); + const client = createGithubRepositoryClient( + this.adaptCredentials(options.credentials) + ); + const contentProcessor = + options.contentProcessor ?? defaultContentProcessor; + + // Get package.json + log( + "debug", + "Looking for package.json relative to:", + options.tokenFilePath + ); + const [tokenFilePath, packageFileDetails] = + await client.getFileInPreviousPath(options.tokenFilePath, "package.json"); + + if (!packageFileDetails) { + log("error", "package.json file not found"); + throw new Error("package.json file not found, must be a Node repository"); + } + + if (!isGithubFileDetails(packageFileDetails)) { + log("error", "Invalid package.json format"); + throw new Error("Invalid package.json format"); + } + + const packagejsonStr = + packageFileDetails.encoding === "none" + ? packageFileDetails.content + : contentProcessor.decodeContent( + packageFileDetails.content, + packageFileDetails.encoding + ); + + const packagejson = contentProcessor.parseContent(packagejsonStr); + if (!isPackageJSON(packagejson)) { + log("error", "Invalid package.json content"); + throw new Error("Invalid package.json content"); + } + + // Get token file + log("debug", "Fetching token file:", options.tokenFilePath); + const tokenFileDetails = await client + .getFileDetailsByPath(tokenFilePath, options.branch) + .catch((e) => { + if (e.message.includes("404")) { + log("warn", "Token file not found:", options.tokenFilePath); + return undefined; + } + throw e; + }); + + if (!tokenFileDetails && !options.createFile) { + log("error", "Token file not found and creation not allowed"); + throw new Error( + "Token file not found and option to create new file is not set" + ); + } + + // Get last commits + log("debug", "Fetching last commits"); + const fileToGetCommitsFrom = tokenFileDetails ?? packageFileDetails; + const lastCommitsFromRepo = await client.getLastCommitByPath( + fileToGetCommitsFrom?.path ?? "/" + ); + + console.log("lastCommitsFromRepo", lastCommitsFromRepo); + + const lastCommits = lastCommitsFromRepo.map( + ({ + commit: { author, committer, message }, + sha, + author: authorDetails, + committer: committerDetails, + }) => ({ + sha, + message, + author: { + ...author, + avatar_url: authorDetails?.avatar_url, + }, + committer: { + ...committer, + avatar_url: committerDetails?.avatar_url, + }, + }) + ); + + // Get token file content + log("debug", "Processing token file content"); + const tokenFileContent = + tokenFileDetails && + tokenFileDetails.content && + tokenFileDetails.encoding !== "none" + ? contentProcessor.decodeContent( + tokenFileDetails.content, + tokenFileDetails.encoding + ) + : await client + .getFileDetailsByPath(tokenFilePath, options.branch, { + Accept: "application/vnd.github.raw+json", + "Accept-Encoding": "gzip, deflate, br, base64, utf-8", + "X-GitHub-Api-Version": "2022-11-28", + }) + .catch((e) => { + if (e.message.includes("404")) { + log("warn", "Raw token file not found"); + return undefined; + } + throw e; + }) + .then((res) => contentProcessor.stringifyContent(res)); + + const [name, version] = [ + packagejson?.name ?? "---", + packagejson?.version ?? "0.0.0", + ]; + + log("debug", "Creating token layers structure"); + const tokenLayers = + options.createFile && !tokenFileContent + ? { + layers: [], + order: [], + } + : contentProcessor.parseContent(tokenFileContent); + + if (!isTokenLayerStructure(tokenLayers)) { + log("error", "Invalid token layers format"); + throw new Error("Invalid token layers format"); + } + + log("info", "Successfully fetched repository token layers"); + return [ + tokenLayers, + packagejson, + { + name, + version, + lastCommits, + packageFileDetails: { + name: packageFileDetails.name, + path: packageFileDetails.path, + size: packageFileDetails.size, + encoding: packageFileDetails.encoding, + content: packageFileDetails.content, + url: packageFileDetails.url, + }, + }, + ] as const; + } + + async saveRepositoryTokenLayers( + options: RepositoryOptions, + tokenLayers: TokenLayerStructure, + message: string, + destinationBranch?: string, + version?: string + ): Promise<{ status: "success" | "error"; error?: string }> { + log("debug", "Saving repository token layers"); + try { + const client = createGithubRepositoryClient( + this.adaptCredentials(options.credentials) + ); + const contentProcessor = + options.contentProcessor ?? defaultContentProcessor; + + log("debug", "Fetching current repository state"); + const [_tokenLayers, packagejson, { packageFileDetails }] = + await this.fetchRepositoryTokenLayers(options); + + log("debug", "Creating commit with changes"); + await client.createCommit( + options.branch, + message, + [ + { + encoding: "utf-8", + path: options.tokenFilePath, + content: contentProcessor.stringifyContent(tokenLayers), + }, + ...(packageFileDetails && packagejson && version + ? [ + { + encoding: "utf-8", + path: githubUrlToPath(packageFileDetails.url), + content: contentProcessor.stringifyContent({ + ...packagejson, + version, + }), + }, + ] + : []), + ], + destinationBranch + ); + + log("info", "Successfully saved repository token layers"); + return { status: "success" }; + } catch (error) { + log( + "error", + "Failed to save repository token layers:", + (error as Error).message + ); + return { + status: "error", + error: (error as Error).message, + }; + } + } + + async getBranchNames(credentials: RepositoryCredentials): Promise { + log( + "debug", + "Getting branch names for repository:", + credentials.repository + ); + const client = createGithubRepositoryClient( + this.adaptCredentials(credentials) + ); + const branches = await client.getBranches(); + log("info", "Successfully retrieved branch names"); + return branches.map((b) => b.name); + } + + testBranchExists( + branches: string[], + branch: string + ): { status: "exists" | "not-exists" } { + log("debug", "Testing branch existence:", branch); + return { + status: branches.includes(branch) ? "exists" : "not-exists", + }; + } +} diff --git a/packages/utils/github.utils.ts b/packages/utils/github.utils.ts index 88ca8bc..582bbf0 100644 --- a/packages/utils/github.utils.ts +++ b/packages/utils/github.utils.ts @@ -10,7 +10,7 @@ export type GithubFile = { encoding: string; }; -export type ObjectWithSha = { sha: string }; +type ObjectWithSha = { sha: string }; export const isObjectWithSHA = (u: unknown): u is ObjectWithSha => u !== null && typeof u === "object" && @@ -26,7 +26,7 @@ export type GithubFileDetails = { html_url: string; download_url: string; type: string; - encoding: "utf-8" | "base64"; + encoding: "utf-8" | "base64" | "none"; content: string; }; @@ -39,7 +39,7 @@ export const isGithubFileDetails = (u: unknown): u is GithubFileDetails => "html_url" in u && "download_url" in u; -export type CommitUser = { +type CommitUser = { name: string; email: string; date: string; @@ -55,7 +55,7 @@ export const isCommitUser = (u: unknown): u is CommitUser => "date" in u && typeof u["date"] === "string"; -export type UserDetails = { +type UserDetails = { login: string; id: number; avatar_url: string; @@ -71,7 +71,7 @@ export const isUserDetails = (u: unknown): u is UserDetails => "avatar_url" in u && typeof u["avatar_url"] === "string"; -export type CommitData = { +type CommitData = { author: CommitUser; committer: CommitUser; message: string; @@ -90,13 +90,32 @@ export const isCommitData = (u: unknown): u is CommitData => "url" in u && typeof u["url"] === "string"; -export type CommitDetails = { +type CommitDetails = { sha: string; node_id: string; - commit: CommitData; + commit: { + author: CommitUser; + committer: CommitUser; + message: string; + tree: { + sha: string; + url: string; + }; + url: string; + comment_count: number; + verification: { + verified: boolean; + reason: string; + signature: string | null; + payload: string | null; + }; + }; url: string; + html_url: string; + comments_url: string; author: UserDetails; committer: UserDetails; + parents: Array; }; export const isCommitDetails = (u: unknown): u is CommitDetails => @@ -117,7 +136,7 @@ export const isCommitDetailsArray = (u: unknown): u is Array => { return Array.isArray(u) && u.every((item) => isCommitDetails(item)); }; -export type CommitListItem = { +type CommitListItem = { name: string; protected: boolean; }; @@ -169,28 +188,28 @@ export type GithubOptions = { createFile: boolean; }; -export type PackageJSON = { +type PackageJSON = { name?: string; version?: string; [key: string]: unknown; }; -export type LastCommit = { - sha: string; - message: string; - author: { - name: string; - email: string; - date: string; - }; - committer: { - name: string; - email: string; - date: string; - }; - autor_avatar_url?: string; - commiter_avatar_url?: string; -}; +// type LastCommit = { +// sha: string; +// message: string; +// author: { +// name: string; +// email: string; +// date: string; +// }; +// committer: { +// name: string; +// email: string; +// date: string; +// }; +// autor_avatar_url?: string; +// commiter_avatar_url?: string; +// }; export const isPackageJSON = (u: unknown): u is PackageJSON => u !== null && typeof u === "object" && ("name" in u || "version" in u); @@ -472,11 +491,46 @@ export const createGithubRepositoryClient = ({ return result; }; + const userCommand = async ( + endpoint: string, + method = "GET", + headers: HeadersInit = {} + ) => { + const response = await fetch(`https://api.github.com/${endpoint}`, { + method, + headers: { + Accept: "application/vnd.github+json", + Authorization: `Bearer ${accessToken}`, + "X-GitHub-Api-Version": "2022-11-28", + ...headers, + }, + }); + + if (!response.ok) { + console.error(await response.json()); + throw new Error(`HTTP returned code ${response.status}`); + } + return response.json(); + }; + + const getRepositories = async () => { + const result = await userCommand("user/repos"); + log("debug", ">>>", result); + // You might want to create a more specific type for repository results + return result as Array<{ + full_name: string; + name: string; + private: boolean; + html_url: string; + }>; + }; + return { fetchRawFile, createCommit, getBaseTree, getBranches, + getRepositories, getFileListByPath, getFileDetailsByPath, getLastCommitByPath, diff --git a/packages/utils/gitlab.utils.ts b/packages/utils/gitlab.utils.ts new file mode 100644 index 0000000..dc92492 --- /dev/null +++ b/packages/utils/gitlab.utils.ts @@ -0,0 +1,276 @@ +import URL from "url-parse"; +import { createLogger } from "./logging.utils"; + +const log = createLogger("utils:gitlab"); + +// Type definitions +export type GitlabFile = { + path: string; + content: string; + encoding: "text" | "base64"; +}; + +export type GitlabFileDetails = { + file_name: string; + file_path: string; + size: number; + encoding: string; + content: string; + content_sha256: string; + ref: string; + blob_id: string; + commit_id: string; + last_commit_id: string; +}; + +export type GitlabTreeItem = { + id: string; + name: string; + type: string; + path: string; + mode: string; +}; + +export type GitlabBranch = { + name: string; + protected: boolean; + default: boolean; + developers_can_push: boolean; + developers_can_merge: boolean; + can_push: boolean; + web_url: string; + commit: { + id: string; + short_id: string; + title: string; + message: string; + author_name: string; + author_email: string; + authored_date: string; + committed_date: string; + }; +}; + +export type GitlabProject = { + id: number; + name: string; + name_with_namespace: string; + path: string; + path_with_namespace: string; + web_url: string; +}; + +export type GitlabCredentials = { + accessToken: string; + projectId: string | number; +}; + +export type GitlabOptions = { + credentials: GitlabCredentials; + branch: string; + tokenFilePath: string; + createFile: boolean; +}; + +// Type guards +export const isGitlabFileDetails = (u: unknown): u is GitlabFileDetails => + u !== null && + typeof u === "object" && + "file_name" in u && + "file_path" in u && + "content" in u; + +export const isGitlabTreeItem = (u: unknown): u is GitlabTreeItem => + u !== null && + typeof u === "object" && + "id" in u && + "name" in u && + "type" in u && + "path" in u; + +export const isGitlabBranch = (u: unknown): u is GitlabBranch => + u !== null && + typeof u === "object" && + "name" in u && + "protected" in u && + "commit" in u; + +export const isGitlabProject = (u: unknown): u is GitlabProject => + u !== null && + typeof u === "object" && + "id" in u && + "path_with_namespace" in u; + +// Utility functions +export const gitlabUrlToPath = (url: string) => { + const parsedUrl = new URL(url); + return decodeURIComponent( + parsedUrl.pathname.replace(/^.*\/repository\/files\//, "") + ); +}; + +// Main client creation function +export const createGitlabRepositoryClient = ({ + accessToken, + projectId, +}: GitlabCredentials) => { + const encodePath = (path: string) => + encodeURIComponent(path.replace(/^\//, "")); + + const command = async ( + partialUrl: string, + body?: T, + method = "POST", + headers: HeadersInit = {} + ) => { + const url = `https://gitlab.com/api/v4/projects/${encodeURIComponent(String(projectId))}/${partialUrl}`; + log("debug", ">>> Before fetch", method, url); + + const response = await fetch(url, { + method, + headers: { + "Content-Type": "application/json", + "PRIVATE-TOKEN": accessToken, + ...headers, + }, + ...(body ? { body: JSON.stringify(body) } : {}), + }).catch((e) => { + log("debug", ">>>", e); + console.error("ERROR WHILE FETCHING", e); + return e; + }); + + log("debug", "<<<<<<<<<< After fetch", response.status); + if (!response.ok) { + console.error(await response.json()); + throw new Error(`HTTP returned code ${response.status}`); + } + + const res = await response.json(); + log("debug", ">>> RES", res); + return res; + }; + + const fetchRawFile = async (path: string, ref?: string) => { + const encodedPath = encodePath(path); + const url = `https://gitlab.com/api/v4/projects/${encodeURIComponent(String(projectId))}/repository/files/${encodedPath}/raw${ref ? `?ref=${ref}` : ""}`; + + log("debug", ">>>>> before raw fetch", url); + const response = await fetch(url, { + headers: { + "PRIVATE-TOKEN": accessToken, + }, + }); + log("debug", ">>>>> after raw fetch", response.status); + return response; + }; + + const getFileListByPath = async (path: string, ref?: string) => { + const result = await command( + `repository/tree?path=${encodePath(path)}${ref ? `&ref=${ref}` : ""}`, + undefined, + "GET" + ); + + if (!Array.isArray(result) || !result.every(isGitlabTreeItem)) { + throw new Error(`Could not obtain tree for path ${path}`); + } + return result; + }; + + const getFileDetailsByPath = async (path: string, ref?: string) => { + const encodedPath = encodePath(path); + const result = await command( + `repository/files/${encodedPath}${ref ? `?ref=${ref}` : ""}`, + undefined, + "GET" + ); + + if (!isGitlabFileDetails(result)) { + throw new Error(`Could not obtain file details for ${path}`); + } + return result; + }; + + const createBranch = async (newBranch: string, ref: string) => { + return command("repository/branches", { + branch: newBranch, + ref, + }); + }; + + const createCommit = async ( + branch: string, + message: string, + files: GitlabFile[], + newBranch?: string + ) => { + if (newBranch) { + await createBranch(newBranch, branch); + branch = newBranch; + } + + // In GitLab, we commit files individually + for (const file of files) { + const encodedPath = encodePath(file.path); + await command(`repository/files/${encodedPath}`, { + branch, + content: file.content, + commit_message: message, + encoding: file.encoding, + }); + } + + return { status: "success" }; + }; + + const getLastCommitByPath = async (path: string, ref?: string) => { + const result = await command( + `repository/commits?path=${encodePath(path)}${ref ? `&ref=${ref}` : ""}&per_page=1`, + undefined, + "GET" + ); + + if (!Array.isArray(result) || result.length === 0) { + throw new Error(`Could not obtain last commit for ${path}`); + } + return result[0]; + }; + + const getBranches = async () => { + const result = await command("repository/branches", undefined, "GET"); + if (!Array.isArray(result) || !result.every(isGitlabBranch)) { + throw new Error("Could not obtain branches for the repository"); + } + return result; + }; + + const getProjects = async () => { + const result = await fetch( + "https://gitlab.com/api/v4/projects?membership=true", + { + headers: { + "PRIVATE-TOKEN": accessToken, + }, + } + ).then((res) => res.json()); + + if (!Array.isArray(result) || !result.every(isGitlabProject)) { + throw new Error("Could not obtain projects list"); + } + return result; + }; + + return { + fetchRawFile, + createCommit, + getBranches, + getProjects, + getFileListByPath, + getFileDetailsByPath, + getLastCommitByPath, + createBranch, + }; +}; + +export type GitlabClient = ReturnType; diff --git a/packages/utils/index.ts b/packages/utils/index.ts index 59571ab..5f96869 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -1,2 +1,7 @@ export * from "./logging.utils"; export * from "./github.utils"; +export * from "./gitlab.utils"; +export * from "./repository.interface"; +export * from "./repository.factory"; +export * from "./github.service"; +export * from "./src/persistence"; diff --git a/packages/utils/logging.utils.ts b/packages/utils/logging.utils.ts index 5a83078..f6671d9 100644 --- a/packages/utils/logging.utils.ts +++ b/packages/utils/logging.utils.ts @@ -1,7 +1,49 @@ +// Declare BUILD_ENV for TypeScript +declare const BUILD_ENV: string | undefined; + +/** + * Environment detection that works in both Node.js and browser environments + * without relying on process.env + */ +const isDevelopment = () => { + try { + // Check if we're in a production build + if (typeof BUILD_ENV !== "undefined") { + return BUILD_ENV === "development" || BUILD_ENV === "debug"; + } + + // For local development in browser + if (typeof window !== "undefined") { + const hostname = window.location.hostname; + return ( + hostname === "localhost" || + hostname === "127.0.0.1" || + hostname.startsWith("192.168.") || + hostname.endsWith(".local") + ); + } + + // For test environments (checking global objects that exist in test runners) + if (typeof globalThis !== "undefined") { + return Object.keys(globalThis).some( + (key) => + key.toLowerCase().includes("test") || + key.toLowerCase().includes("jest") || + key.toLowerCase().includes("vitest") + ); + } + + // Default to production for safety + return false; + } catch { + // If anything fails, default to production for safety + return false; + } +}; + export type LogLevel = "info" | "warn" | "error" | "debug"; const logLevels = ["debug", "info", "warn", "error"] as const; -export const showLevelsAbove: LogLevel = - process.env.NODE_ENV === "development" ? "debug" : "warn"; +export const showLevelsAbove: LogLevel = isDevelopment() ? "debug" : "warn"; const loggerFunctions = { debug: console.log, @@ -10,9 +52,14 @@ const loggerFunctions = { error: console.error, }; +/** + * Creates a logger with namespace that respects the current environment + * @param namespace - The namespace for the logger (usually component or module name) + * @returns A function that takes a log level and arguments to log + */ export const createLogger = (namespace: string) => { const showLevels = logLevels.slice(logLevels.indexOf(showLevelsAbove)); - return (level: LogLevel, ...args: any[]) => { + return (level: LogLevel, ...args: unknown[]) => { if (showLevels.includes(level)) { loggerFunctions[level](`[${namespace}]`, ...args); } diff --git a/packages/utils/package.json b/packages/utils/package.json index ced31e6..85928c9 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -8,7 +8,7 @@ "logging.utils.ts" ], "scripts": { - "build": "tsc", + "build": "tsc --noEmit && tsc", "test": "vitest", "lint": "eslint --ignore-pattern node_modules .", "lint:fix": "eslint --ext .ts,.tsx --ignore-pattern node_modules --fix ." diff --git a/packages/utils/repository.factory.ts b/packages/utils/repository.factory.ts new file mode 100644 index 0000000..a69a2c9 --- /dev/null +++ b/packages/utils/repository.factory.ts @@ -0,0 +1,22 @@ +import { + RepositoryService, + RepositoryServiceFactory, +} from "./repository.interface"; +import { GitHubService } from "./github.service"; + +/** + * Factory function to create the appropriate repository service based on the tool. + * Currently only supports GitHub, but is designed to be extended with GitLab support. + */ +export const createRepositoryService: RepositoryServiceFactory = ( + tool: "GitHub" | "GitLab" +): RepositoryService => { + switch (tool) { + case "GitHub": + return new GitHubService(); + case "GitLab": + throw new Error("GitLab support is not yet implemented"); + default: + throw new Error(`Unsupported repository tool: ${tool}`); + } +}; diff --git a/packages/utils/repository.interface.ts b/packages/utils/repository.interface.ts new file mode 100644 index 0000000..4e899b0 --- /dev/null +++ b/packages/utils/repository.interface.ts @@ -0,0 +1,152 @@ +import { TokenLayerStructure } from "./token-layers.types"; + +// Common types that are tool-agnostic +export type RepositoryCredentials = { + accessToken: string; + repository: string; // For GitHub: owner/repo, For GitLab: project ID or path +}; + +export type RepositoryOptions = { + credentials: RepositoryCredentials; + branch: string; + tokenFilePath: string; + createFile: boolean; + contentProcessor?: ContentProcessor; // Optional content processor for browser-specific operations +}; + +export type BufferEncoding = "utf-8" | "base64"; + +// Content processor interface for browser-specific operations +export interface ContentProcessor { + decodeContent(content: string, encoding: BufferEncoding): string; + encodeContent(content: string, encoding: BufferEncoding): string; + stringifyContent(content: unknown): string; + parseContent(content: string): unknown; +} + +export type FileDetails = { + name: string; + path: string; + size: number; + encoding: string; + content: string; + url: string; +}; + +export type CommitAuthor = { + name: string; + email: string; + date: string; + avatar_url?: string; +}; + +export type LastCommit = { + sha: string; + message: string; + author: CommitAuthor; + committer: CommitAuthor; +}; + +export type RepositoryFile = { + path: string; + content: string; + encoding: string; +}; + +export type ConnectionStatus = { + status: "connected" | "disconnected" | "error"; + error?: string; + repositories?: Array<{ + id: string | number; + name: string; + full_name: string; + }>; + branches?: { name: string; protected: boolean }[]; +}; + +export type FileStatus = { + status: "found" | "error"; + error?: string; + file?: FileDetails; +}; + +export type PackageJSON = { + name?: string; + version?: string; + [key: string]: unknown; +}; + +export type TokenLayersResult = readonly [ + TokenLayerStructure, + PackageJSON | undefined, + { + name: string; + version: string; + lastCommits: LastCommit[]; + packageFileDetails: FileDetails; + }, +]; + +// Default content processor that throws errors (must be overridden in browser environment) +export const defaultContentProcessor: ContentProcessor = { + decodeContent: () => { + throw new Error("Content processor not provided"); + }, + encodeContent: () => { + throw new Error("Content processor not provided"); + }, + stringifyContent: () => { + throw new Error("Content processor not provided"); + }, + parseContent: () => { + throw new Error("Content processor not provided"); + }, +}; + +// The core interface that both GitHub and GitLab implementations will follow +export interface RepositoryService { + // Connection and validation + validateAccessToken(accessToken: string): Promise; + testRepositoryConnection( + credentials: Pick, + contentProcessor?: ContentProcessor + ): Promise; + testFileExists( + credentials: RepositoryCredentials & { branch: string; filePath: string } + ): Promise; + + // Token layer operations + fetchRepositoryTokenLayers( + options: RepositoryOptions + ): Promise; + saveRepositoryTokenLayers( + options: RepositoryOptions, + tokenLayers: TokenLayerStructure, + message: string, + destinationBranch?: string, + version?: string + ): Promise<{ status: "success" | "error"; error?: string }>; + + // Repository information + getBranchNames(credentials: RepositoryCredentials): Promise; + testBranchExists( + branches: string[], + branch: string + ): { status: "exists" | "not-exists" }; +} + +// Factory function type for creating repository services +export type RepositoryServiceFactory = ( + tool: "GitHub" | "GitLab" +) => RepositoryService; + +// Helper to determine if a repository string is for GitHub or GitLab +export const determineRepositoryType = ( + repository: string +): "GitHub" | "GitLab" => { + // GitLab can be numeric ID or group/project path + const isGitLabId = /^\d+$/.test(repository); + const hasSubgroups = repository.split("/").length > 2; + + return isGitLabId || hasSubgroups ? "GitLab" : "GitHub"; +}; diff --git a/packages/utils/repository.ts b/packages/utils/repository.ts new file mode 100644 index 0000000..9138b1b --- /dev/null +++ b/packages/utils/repository.ts @@ -0,0 +1,21 @@ +// Re-export only the generic interface types and factory functions +export type { + RepositoryCredentials, + RepositoryOptions, + RepositoryService, + RepositoryServiceFactory, + ContentProcessor, + FileDetails, + CommitAuthor, + LastCommit, + ConnectionStatus, + FileStatus, + TokenLayersResult, +} from "./repository.interface"; + +// Re-export the factory functions and utilities +export { createRepositoryService } from "./repository.factory"; +export { + determineRepositoryType, + defaultContentProcessor, +} from "./repository.interface"; diff --git a/packages/utils/src/persistence.ts b/packages/utils/src/persistence.ts new file mode 100644 index 0000000..e92e36a --- /dev/null +++ b/packages/utils/src/persistence.ts @@ -0,0 +1,77 @@ +/** + * Defines the different approaches for persisting tokens + */ +export type PersistenceType = "repository" | "rest-server" | "file-download"; + +/** + * Status for Remote Repository persistence + */ +export type RepositoryStatus = { + type: "repository"; + state: "connected" | "disconnected" | "error"; + error?: string; +}; + +/** + * Status for REST Server persistence + */ +export type RestServerStatus = { + type: "rest-server"; + state: "connected" | "unreachable" | "error"; + error?: string; +}; + +/** + * Status for File Download persistence + */ +export type FileDownloadStatus = { + type: "file-download"; + state: "ready" | "processing" | "complete"; + error?: string; +}; + +/** + * Union type for all persistence statuses + */ +export type PersistenceStatus = + | RepositoryStatus + | RestServerStatus + | FileDownloadStatus; + +/** + * Maps persistence type to display text + */ +export const persistenceTypeLabels: Record = { + repository: "Remote Repository", + "rest-server": "REST Server", + "file-download": "File Download", +}; + +/** + * Maps status states to display colors + */ +export const statusStateColors: Record = { + connected: "#00B012", + disconnected: "#7A7A7A", + error: "#b00000", + unreachable: "#7A7A7A", + ready: "#00B012", + processing: "#FFA500", + complete: "#00B012", +}; + +/** + * Maps status states to icons from the available icon set + */ +export const statusStateIcons: Record< + PersistenceStatus["state"], + "check" | "refresh" | "alert" +> = { + connected: "check", + disconnected: "refresh", + error: "alert", + unreachable: "refresh", + ready: "check", + processing: "refresh", + complete: "check", +}; diff --git a/packages/utils/token-layers.types.ts b/packages/utils/token-layers.types.ts new file mode 100644 index 0000000..3d8a233 --- /dev/null +++ b/packages/utils/token-layers.types.ts @@ -0,0 +1,14 @@ +// This is a generic type that matches the structure of TokenLayers from radius-toolkit +export type TokenLayerStructure = { + layers: Array; + order: Array; +}; + +export const isTokenLayerStructure = (u: unknown): u is TokenLayerStructure => + u !== null && + typeof u === "object" && + "layers" in u && + Array.isArray(u["layers"]) && + "order" in u && + Array.isArray(u["order"]) && + u["order"].every((item) => typeof item === "string"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 862e368..e2caec7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: devDependencies: '@figma/plugin-typings': - specifier: ^1.94.0 - version: 1.94.0 + specifier: ^1.106.0 + version: 1.106.0 '@figma/widget-typings': - specifier: ^1.9.1 - version: 1.9.1(@figma/plugin-typings@1.94.0) + specifier: ^1.11.0 + version: 1.11.0(@figma/plugin-typings@1.106.0) '@repo/eslint-config': specifier: workspace:* version: link:packages/eslint-config @@ -21,95 +21,104 @@ importers: specifier: workspace:* version: link:packages/typescript-config husky: - specifier: ^9.0.11 - version: 9.0.11 + specifier: ^9.1.7 + version: 9.1.7 prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.4.2 + version: 3.4.2 turbo: - specifier: ^2.0.4 - version: 2.0.4 + specifier: ^2.3.3 + version: 2.3.3 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.7.2 + version: 5.7.2 apps/token-tango-web-ui: dependencies: '@create-figma-plugin/ui': - specifier: ^3.1.0 - version: 3.1.0(preact@10.22.1) + specifier: 4.0.0-alpha.0 + version: 4.0.0-alpha.0(preact@10.25.4) '@create-figma-plugin/utilities': - specifier: ^3.2.0 - version: 3.2.0 + specifier: 4.0.0-alpha.0 + version: 4.0.0-alpha.0 '@hookform/resolvers': - specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + specifier: ^3.9.1 + version: 3.9.1(react-hook-form@7.54.2(react@18.3.1)) '@radix-ui/react-checkbox': - specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-collapsible': - specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': - specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': - specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.1.4 + version: 2.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': - specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': - specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.2.2 + version: 1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': - specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.1.4 + version: 2.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': - specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.61)(react@18.3.1) + specifier: ^1.1.1 + version: 1.1.1(@types/react@18.3.18)(react@18.3.1) '@radix-ui/react-switch': - specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tabs': - specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.6 + version: 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@repo/utils': specifier: workspace:* version: link:../../packages/utils + buffer: + specifier: ^6.0.3 + version: 6.0.3 class-variance-authority: - specifier: ^0.7.0 - version: 0.7.0 + specifier: ^0.7.1 + version: 0.7.1 clsx: - specifier: ^2.1.1 + specifier: ^2.0.0 version: 2.1.1 + cmdk: + specifier: 0.2.1 + version: 0.2.1(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lucide-react: - specifier: ^0.390.0 - version: 0.390.0(react@18.3.1) + specifier: ^0.294.0 + version: 0.294.0(react@18.3.1) radius-toolkit: specifier: workspace:* version: link:../../packages/radius-toolkit react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.54.1 + version: 7.54.2(react@18.3.1) tailwind-merge: - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.5.5 + version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.4(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2))) zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: link:@hookform/resolvers/zod + version: link:@hookform/resolvers/zod devDependencies: '@repo/config': specifier: workspace:* @@ -121,53 +130,56 @@ importers: specifier: workspace:* version: link:../../packages/typescript-config '@turbo/gen': - specifier: ^1.12.4 - version: 1.12.4(@types/node@20.11.24)(typescript@5.4.5) + specifier: ^2.3.3 + version: 2.3.3(@types/node@22.10.2)(typescript@5.7.2) '@types/eslint': - specifier: ^8.56.5 - version: 8.56.5 + specifier: ^9.6.1 + version: 9.6.1 '@types/node': - specifier: ^20.11.24 - version: 20.11.24 + specifier: ^22.10.2 + version: 22.10.2 '@types/react': - specifier: ^18.2.61 - version: 18.2.61 + specifier: ^18.2.0 + version: 18.3.18 '@types/react-dom': - specifier: ^18.2.19 - version: 18.2.19 + specifier: ^18.2.0 + version: 18.3.5(@types/react@18.3.18) + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.3.4(vite@5.4.11(@types/node@22.10.2)) autoprefixer: - specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.49) eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.17.0 + version: 9.17.0(jiti@1.21.7) postcss: - specifier: ^8.4.38 - version: 8.4.38 + specifier: ^8.4.49 + version: 8.4.49 tailwindcss: - specifier: ^3.4.4 - version: 3.4.4(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5)) + specifier: ^3.4.17 + version: 3.4.17(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.7.2 + version: 5.7.2 vite: - specifier: ^5.2.12 - version: 5.2.12(@types/node@20.11.24) + specifier: ^5.0.12 + version: 5.4.11(@types/node@22.10.2) vite-plugin-singlefile: - specifier: ^2.0.1 - version: 2.0.1(rollup@4.18.0)(vite@5.2.12(@types/node@20.11.24)) + specifier: ^2.1.0 + version: 2.1.0(rollup@4.29.1)(vite@5.4.11(@types/node@22.10.2)) vitest: - specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.24) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2) apps/token-tango-widget: dependencies: '@create-figma-plugin/ui': specifier: ^3.1.0 - version: 3.1.0(preact@10.20.1) + version: 3.2.1(preact@10.25.4) '@create-figma-plugin/utilities': specifier: ^3.2.0 - version: 3.2.0 + version: 3.2.1 '@repo/bandoneon': specifier: workspace:* version: link:../../packages/bandoneon @@ -194,32 +206,32 @@ importers: version: 1.0.1 preact: specifier: ^10.20.1 - version: 10.20.1 + version: 10.25.4 radius-toolkit: specifier: workspace:* version: link:../../packages/radius-toolkit semver: specifier: ^7.6.0 - version: 7.6.0 + version: 7.6.3 url: specifier: ^0.11.3 - version: 0.11.3 + version: 0.11.4 url-parse: specifier: ^1.5.10 version: 1.5.10 devDependencies: '@figma/eslint-plugin-figma-plugins': specifier: '*' - version: 0.10.0(eslint@8.57.1) + version: 0.15.0(eslint@8.57.1) '@figma/plugin-typings': specifier: ^1.105.0 - version: 1.105.0 + version: 1.106.0 '@figma/widget-typings': specifier: ^1.9.2 - version: 1.9.2(@figma/plugin-typings@1.105.0) + version: 1.11.0(@figma/plugin-typings@1.106.0) '@types/path-browserify': specifier: ^1.0.2 - version: 1.0.2 + version: 1.0.3 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -228,34 +240,37 @@ importers: version: 1.4.11 '@typescript-eslint/eslint-plugin': specifier: ^8.18.1 - version: 8.18.1(@typescript-eslint/parser@8.18.1(eslint@8.57.1)(typescript@5.3.3))(eslint@8.57.1)(typescript@5.3.3) + version: 8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^8.18.1 - version: 8.18.1(eslint@8.57.1)(typescript@5.3.3) + version: 8.18.2(eslint@8.57.1)(typescript@5.7.2) esbuild: specifier: ^0.21.4 - version: 0.21.4 + version: 0.21.5 eslint: specifier: ^8.57.1 version: 8.57.1 + tsx: + specifier: ^4.19.2 + version: 4.19.2 typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.7.2 vite: specifier: ^5.2.6 - version: 5.2.6(@types/node@20.11.24) + version: 5.4.11(@types/node@22.10.2) vite-plugin-singlefile: specifier: ^2.0.1 - version: 2.0.1(rollup@4.18.0)(vite@5.2.6(@types/node@20.11.24)) + version: 2.1.0(rollup@4.29.1)(vite@5.4.11(@types/node@22.10.2)) vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.24) + version: 1.6.0(@types/node@22.10.2) packages/bandoneon: devDependencies: typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.7.2 packages/eslint-config: devDependencies: @@ -267,7 +282,7 @@ importers: version: 7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2) '@vercel/style-guide': specifier: ^6.0.0 - version: 6.0.0(eslint@8.57.1)(prettier@3.2.5)(typescript@5.7.2)(vitest@1.4.0(@types/node@20.11.24)) + version: 6.0.0(eslint@8.57.1)(prettier@3.4.2)(typescript@5.7.2)(vitest@2.1.8(@types/node@22.10.2)) eslint: specifier: ^8.56.0 version: 8.57.1 @@ -291,10 +306,10 @@ importers: version: 12.1.0 jiti: specifier: ^1.21.6 - version: 1.21.6 + version: 1.21.7 semver: specifier: ^7.6.0 - version: 7.6.0 + version: 7.6.3 devDependencies: '@types/semver': specifier: ^7.5.8 @@ -304,38 +319,41 @@ importers: version: 8.57.1 typedoc: specifier: ^0.26.2 - version: 0.26.2(typescript@5.4.5) + version: 0.26.11(typescript@5.7.2) typedoc-plugin-markdown: specifier: ^4.1.0 - version: 4.1.0(typedoc@0.26.2(typescript@5.4.5)) + version: 4.3.3(typedoc@0.26.11(typescript@5.7.2)) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.7.2 vite: specifier: ^5.2.0 - version: 5.2.12(@types/node@20.11.24) + version: 5.4.11(@types/node@22.10.2) vite-plugin-commonjs: specifier: ^0.10.1 - version: 0.10.1 + version: 0.10.4 vite-plugin-dts: specifier: ^3.9.1 - version: 3.9.1(@types/node@20.11.24)(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@20.11.24)) + version: 3.9.1(@types/node@22.10.2)(rollup@4.29.1)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)) vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.24) + version: 1.6.0(@types/node@22.10.2) packages/repository-config: dependencies: + '@repo/utils': + specifier: workspace:* + version: link:../utils zod: specifier: ^3.23.8 - version: 3.23.8 + version: 3.24.1 devDependencies: typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.7.2 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.24) + version: 1.6.0(@types/node@22.10.2) packages/typescript-config: {} @@ -347,7 +365,7 @@ importers: devDependencies: '@eslint/js': specifier: ^9.6.0 - version: 9.6.0 + version: 9.17.0 '@types/url-parse': specifier: ^1.4.11 version: 1.4.11 @@ -356,35 +374,27 @@ importers: version: 8.57.1 globals: specifier: ^15.8.0 - version: 15.8.0 + version: 15.14.0 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.7.2 typescript-eslint: specifier: ^8.18.1 - version: 8.18.1(eslint@8.57.1)(typescript@5.4.5) + version: 8.18.2(eslint@8.57.1)(typescript@5.7.2) vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.24) + version: 1.6.0(@types/node@22.10.2) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.22.13': - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -422,18 +432,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-string-parser@7.22.5': - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} @@ -446,26 +452,29 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.22.20': - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.24.6': - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.26.3': resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime-corejs3@7.22.10': - resolution: {integrity: sha512-IcixfV2Jl3UrqZX4c81+7lVg5++2ufYJyAFW3Aux/ZTvY6LVYYhJ9rMgnbX0zGVq6eqfVpnoatTjZdVki/GmWA==} + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime-corejs3@7.26.0': + resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.24.7': - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} '@babel/template@7.25.9': @@ -476,306 +485,318 @@ packages: resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.3': - resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} - engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} - '@create-figma-plugin/ui@3.1.0': - resolution: {integrity: sha512-V8q5HtypBTxE3i8migBw6XNrM7fCtsgBEQ0/nwZw5q0in7sDNNtwu9H7ghyN8WX1NMqIBeNBGMPvwBUrzWj9KQ==} + '@create-figma-plugin/ui@3.2.1': + resolution: {integrity: sha512-x2bUyu0gyUiupLpvbM2CCSV//FZjasR3YVWear6DYV4o95BzyV7NnMjr/4cDfuokFMgSSI7rclioRTGUn2Lu5Q==} + engines: {node: '>=20'} + peerDependencies: + preact: '>=10' + + '@create-figma-plugin/ui@4.0.0-alpha.0': + resolution: {integrity: sha512-eJrMBtXl18g1nXF301SACuqTqresUoyOnynwWMxPKvxDLOvuMxG2i+pGZIY/0ZU/+Huw+ckSSamiLi7ENyVpGw==} engines: {node: '>=20'} peerDependencies: preact: '>=10' - '@create-figma-plugin/utilities@3.2.0': - resolution: {integrity: sha512-+5JddDqI6XjVJs0EqgLd+6B9ukjhHFEBesqPI/e0okqS+Ay7Gt3xsD0vMrZjVYfJcmRAprgJhdGBGJZjOZiQIA==} + '@create-figma-plugin/utilities@3.2.1': + resolution: {integrity: sha512-p32DEIv8VVakT9DBOk+QGDWMx9DtX/VKpuAcvo8B3zcqVRmL2DYPVkOLrC8UNmWySTm8I7rR3ztRG790UdACUg==} + engines: {node: '>=20'} + + '@create-figma-plugin/utilities@4.0.0-alpha.0': + resolution: {integrity: sha512-5cggQ5Vr6Du5fjxYwGsS1qOBq3kgw7jvECkV+TcLpT46m2VJdct9sf+FUMiwaxOlrbWhs+ZfFWGBpmWkLz4pWA==} engines: {node: '>=20'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.4': - resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.4': - resolution: {integrity: sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.4': - resolution: {integrity: sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.4': - resolution: {integrity: sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.4': - resolution: {integrity: sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.4': - resolution: {integrity: sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.4': - resolution: {integrity: sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.4': - resolution: {integrity: sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.4': - resolution: {integrity: sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.4': - resolution: {integrity: sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.4': - resolution: {integrity: sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.4': - resolution: {integrity: sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.4': - resolution: {integrity: sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.4': - resolution: {integrity: sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.4': - resolution: {integrity: sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.4': - resolution: {integrity: sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.4': - resolution: {integrity: sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.4': - resolution: {integrity: sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.4': - resolution: {integrity: sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.4': - resolution: {integrity: sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.4': - resolution: {integrity: sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.4': - resolution: {integrity: sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.4': - resolution: {integrity: sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -784,57 +805,77 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.9.1': + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@figma/eslint-plugin-figma-plugins@0.10.0': - resolution: {integrity: sha512-y2P7UAH3g5FijMN+dHigjs0BPEZ/x4iN0F1Z8kAVGS/dqCEIXvRR8l13ety5QzwZSka/l4/6iN/DGnt2b1xBig==} + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@figma/plugin-typings@1.105.0': - resolution: {integrity: sha512-UpeS7TUvc4Mv9OP+RMI6GtBTKpD9EMTwsa3H1M6GPE5zTicr/PnBUrrkU52PFXqb9FeVZhMopCdPm7AXQeDa7Q==} + '@eslint/plugin-kit@0.2.4': + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@figma/plugin-typings@1.94.0': - resolution: {integrity: sha512-1Qm3iXs/cvNx99Ge46jUnZtcJV7/VJP96yGVSFIfc+wIp+CGbwByksBVQdLX+sFt6a5dQVAHINbY3daBSitWkw==} + '@figma/eslint-plugin-figma-plugins@0.15.0': + resolution: {integrity: sha512-ol/v6qje8sxE2npvjCbOQUGlTx++RdYcq98jKaNokL/qN1IF7Y6Y7jgj2wiAYmT2V+aABvtX7MNtKKJ2fbcfWA==} - '@figma/widget-typings@1.9.1': - resolution: {integrity: sha512-jmh/hsBxLP4aKgtbmxkJe84Ufk93S7TwOxpLD7L58R472boU5vyZ7qF5DKlhwiRjF0sgaryXJxSXuIjdR1GBXQ==} - peerDependencies: - '@figma/plugin-typings': 1.x + '@figma/plugin-typings@1.106.0': + resolution: {integrity: sha512-fUWranOKUEDJe80GUAgs7gLyMdkiBdwi72QPx1XctB62ecmedpTO/qKx/C7GcoxeRVQ90n+NWS7zpSInWMTJkA==} - '@figma/widget-typings@1.9.2': - resolution: {integrity: sha512-o+fEFC4urfG5M0WtgJ/AbAQVBUHD46CrQZxc+jXoHpVkatrN72b93OggQajnsZuOxNXYvdD1voNmG8rVgcJMew==} + '@figma/widget-typings@1.11.0': + resolution: {integrity: sha512-LzGV/zikkgbDq3w2Rag2Lel/oltT7+gI+MmO61fKmCusrHjX+Y1Np84zwBTSlK1GxeA2Z4JQEYvSfiiQMW5W8A==} peerDependencies: '@figma/plugin-typings': 1.x - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} - '@floating-ui/react-dom@2.1.0': - resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@hookform/resolvers@3.6.0': - resolution: {integrity: sha512-UBcpyOX3+RR+dNnqBd0lchXpoL8p4xC21XP8H6Meb8uve5Br1GCnmg0PcBoKKqPKgGu9GHQ/oygcmPrQhetwqw==} + '@hookform/resolvers@3.9.1': + resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==} peerDependencies: react-hook-form: ^7.0.0 + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -848,6 +889,14 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -864,31 +913,20 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.20': - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -924,6 +962,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -932,33 +974,17 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@radix-ui/number@1.0.1': - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} - '@radix-ui/primitive@1.0.1': - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + '@radix-ui/primitive@1.0.0': + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} - '@radix-ui/primitive@1.1.0': - resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} - '@radix-ui/react-arrow@1.0.3': - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-arrow@1.1.0': - resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + '@radix-ui/react-arrow@1.1.1': + resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -970,47 +996,34 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.0.4': - resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + '@radix-ui/react-checkbox@1.1.3': + resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collapsible@1.0.3': - resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-collection@1.0.3': - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + '@radix-ui/react-collapsible@1.1.2': + resolution: {integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.0': - resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + '@radix-ui/react-collection@1.1.1': + resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1022,17 +1035,13 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.0.1': - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + '@radix-ui/react-compose-refs@1.0.0': + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-compose-refs@1.1.0': - resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1040,17 +1049,13 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.0.1': - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + '@radix-ui/react-context@1.0.0': + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-context@1.1.0': - resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1058,27 +1063,24 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.0.5': - resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + '@radix-ui/react-dialog@1.0.0': + resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-direction@1.0.1': - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + '@radix-ui/react-dialog@1.1.4': + resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true + '@types/react-dom': + optional: true '@radix-ui/react-direction@1.1.0': resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} @@ -1089,21 +1091,14 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.0.5': - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + '@radix-ui/react-dismissable-layer@1.0.0': + resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-dismissable-layer@1.1.0': - resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + '@radix-ui/react-dismissable-layer@1.1.3': + resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1115,49 +1110,56 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.0.6': - resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + '@radix-ui/react-dropdown-menu@2.1.4': + resolution: {integrity: sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.0.1': - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + '@radix-ui/react-focus-guards@1.0.0': + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.0.4': - resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + '@radix-ui/react-focus-scope@1.0.0': + resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 + + '@radix-ui/react-focus-scope@1.1.1': + resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-id@1.0.1': - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + '@radix-ui/react-id@1.0.0': + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true '@radix-ui/react-id@1.1.0': resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} @@ -1168,47 +1170,47 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.0.2': - resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + '@radix-ui/react-label@2.1.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-menu@2.0.6': - resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} + '@radix-ui/react-menu@2.1.4': + resolution: {integrity: sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-popper@1.1.3': - resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + '@radix-ui/react-popover@1.1.4': + resolution: {integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.0': - resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + '@radix-ui/react-popper@1.2.1': + resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1220,21 +1222,14 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.0.4': - resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + '@radix-ui/react-portal@1.0.0': + resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-portal@1.1.1': - resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + '@radix-ui/react-portal@1.1.3': + resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1246,21 +1241,14 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.0.1': - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + '@radix-ui/react-presence@1.0.0': + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-presence@1.1.0': - resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1272,21 +1260,14 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@1.0.3': - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + '@radix-ui/react-primitive@1.0.0': + resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-primitive@2.0.0': - resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + '@radix-ui/react-primitive@2.0.1': + resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1298,21 +1279,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.0.4': - resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.0': - resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + '@radix-ui/react-roving-focus@1.1.1': + resolution: {integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1324,8 +1292,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.1.0': - resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==} + '@radix-ui/react-scroll-area@1.2.2': + resolution: {integrity: sha512-EFI1N/S3YxZEW/lJ/H1jY3njlvTd8tBmgKEn4GHi51+aMm94i6NmAJstsm5cu3yJwYqYc93gpCPm21FeAbFk6g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1337,30 +1305,26 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.0.0': - resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + '@radix-ui/react-select@2.1.4': + resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-slot@1.0.2': - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + '@radix-ui/react-slot@1.0.0': + resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-slot@1.1.0': - resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + '@radix-ui/react-slot@1.1.1': + resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1368,21 +1332,21 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.0.3': - resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + '@radix-ui/react-switch@1.1.2': + resolution: {integrity: sha512-zGukiWHjEdBCRyXvKR6iXAQG6qXm2esuAD6kDOi9Cn+1X6ev3ASo4+CsYaD6Fov9r/AQFekqnD/7+V0Cs6/98g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-tabs@1.1.0': - resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==} + '@radix-ui/react-tabs@1.1.2': + resolution: {integrity: sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1394,8 +1358,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.1.1': - resolution: {integrity: sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==} + '@radix-ui/react-tooltip@1.1.6': + resolution: {integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1407,14 +1371,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.0.1': - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + '@radix-ui/react-use-callback-ref@1.0.0': + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} @@ -1425,14 +1385,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.0.1': - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + '@radix-ui/react-use-controllable-state@1.0.0': + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true '@radix-ui/react-use-controllable-state@1.1.0': resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} @@ -1443,14 +1399,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.0.3': - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + '@radix-ui/react-use-escape-keydown@1.0.0': + resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true '@radix-ui/react-use-escape-keydown@1.1.0': resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} @@ -1461,14 +1413,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.0.1': - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + '@radix-ui/react-use-layout-effect@1.0.0': + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: - '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true '@radix-ui/react-use-layout-effect@1.1.0': resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} @@ -1479,20 +1427,11 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-previous@1.0.1': - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.0.1': - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -1506,15 +1445,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-size@1.0.1': - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-size@1.1.0': resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} peerDependencies: @@ -1524,21 +1454,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.0.3': - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-visually-hidden@1.1.0': - resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + '@radix-ui/react-visually-hidden@1.1.1': + resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1550,14 +1467,11 @@ packages: '@types/react-dom': optional: true - '@radix-ui/rect@1.0.1': - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1565,83 +1479,98 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.29.1': + resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.29.1': + resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.29.1': + resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.29.1': + resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-freebsd-arm64@4.29.1': + resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.29.1': + resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.29.1': + resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.29.1': + resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.29.1': + resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-gnu@4.29.1': + resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.29.1': + resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.29.1': + resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.29.1': + resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-win32-arm64-msvc@4.29.1': + resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.29.1': + resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-msvc@4.29.1': + resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} cpu: [x64] os: [win32] @@ -1673,8 +1602,20 @@ packages: '@rushstack/ts-command-line@4.19.1': resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} - '@shikijs/core@1.9.0': - resolution: {integrity: sha512-cbSoY8P/jgGByG8UOl3jnP/CWg/Qk+1q+eAKWtcrU3pNoILF8wTsLB0jT44qUBV8Ce1SvA9uqcM9Xf+u3fJFBw==} + '@shikijs/core@1.24.4': + resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} + + '@shikijs/engine-javascript@1.24.4': + resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} + + '@shikijs/engine-oniguruma@1.24.4': + resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} + + '@shikijs/types@1.24.4': + resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} + + '@shikijs/vscode-textmate@9.3.1': + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -1682,8 +1623,8 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1694,26 +1635,41 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/gen@1.12.4': - resolution: {integrity: sha512-3Z8KZ6Vnc2x6rr8sNJ4QNYpkAttLBfb91uPzDlFDY7vgJg+vfXT8YWyZznVL+19ZixF2C/F4Ucp4/YjG2e1drg==} + '@turbo/gen@2.3.3': + resolution: {integrity: sha512-MIXXX0sVRvfTWOrLhjDT1KJ15dqzRlNlHIvNeWoS5ZtTMQ9XuBl9D5ek/5vMj77n+84mFRS/VKAoEuScOIWwaw==} hasBin: true - '@turbo/workspaces@1.12.4': - resolution: {integrity: sha512-a1hF8Nr6MOeCpvlLR569dGTlzgRLj2Rxo6dTb4jtL+jhHwCb94A9kDPgcRnYGFr45mgulICarVaNZxDjw4/riQ==} + '@turbo/workspaces@2.3.3': + resolution: {integrity: sha512-PSys7Hy5NuX76HBleOkd8wlRtI4GCzLHS2XUpKeGIj0vpzH4fqE+tpi7fBb5t9U7UiyM6E6pyabSKjoD2zUsoQ==} hasBin: true '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/eslint@8.56.5': - resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/inquirer@6.5.0': resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} @@ -1726,38 +1682,37 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/node@20.11.24': - resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/path-browserify@1.0.2': - resolution: {integrity: sha512-ZkC5IUqqIFPXx3ASTTybTzmQdwHwe2C0u3eL75ldQ6T9E9IWFJodn6hIfbZGab73DfyiHN4Xw15gNxUq2FbvBA==} + '@types/path-browserify@1.0.3': + resolution: {integrity: sha512-ZmHivEbNCBtAfcrFeBCiTjdIc2dey0l7oCGNGpSuRTy8jP6UVND7oUowlvDujBy8r2Hoa8bfFUOCiPWfmtkfxw==} - '@types/prop-types@15.7.5': - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@18.2.19': - resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} - - '@types/react@18.2.61': - resolution: {integrity: sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==} + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 - '@types/scheduler@0.16.3': - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + '@types/react@18.3.18': + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1765,20 +1720,23 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/through@0.0.30': - resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/url-parse@1.4.11': resolution: {integrity: sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} @@ -1802,8 +1760,8 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.18.1': - resolution: {integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==} + '@typescript-eslint/eslint-plugin@8.18.2': + resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -1830,8 +1788,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.18.1': - resolution: {integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==} + '@typescript-eslint/parser@8.18.2': + resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1841,8 +1799,8 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@6.17.0': - resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/scope-manager@7.18.0': @@ -1853,8 +1811,8 @@ packages: resolution: {integrity: sha512-3gVrJQYG7u2+JQKP7pUQSda8x5jVz2Y3sa8rfzrmNn13E1AbkaEGtAX1UGtFYBReyi5gClsMd21mol3ibr+q6w==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.18.1': - resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + '@typescript-eslint/scope-manager@8.18.2': + resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@7.18.0': @@ -1877,8 +1835,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.18.1': - resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} + '@typescript-eslint/type-utils@8.18.2': + resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1888,8 +1846,8 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@6.17.0': - resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/types@7.18.0': @@ -1900,8 +1858,8 @@ packages: resolution: {integrity: sha512-AOxkQ34TpXT5FQ87EJ6z6GkCSngS8kTfbDe3cl94WU2Jutm6xtt29EXI8/Wk7XB7uM6eAE+YlDCqVeOxxMVdgA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.18.1': - resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + '@typescript-eslint/types@8.18.2': + resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -1913,8 +1871,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@6.17.0': - resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1940,8 +1898,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.18.1': - resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + '@typescript-eslint/typescript-estree@8.18.2': + resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' @@ -1952,8 +1910,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@6.17.0': - resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1970,8 +1928,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.18.1': - resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + '@typescript-eslint/utils@8.18.2': + resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1981,8 +1939,8 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@6.17.0': - resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/visitor-keys@7.18.0': @@ -1993,8 +1951,8 @@ packages: resolution: {integrity: sha512-dcI1fO3GPKs2R152DA0tPnw+jghiucLvgA4Hd7R8iGmmnhyVkeIjDu2yac89nbiAImRpVPwYw5VKlEWy/WWs0A==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.18.1': - resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} + '@typescript-eslint/visitor-keys@8.18.2': + resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.1': @@ -2018,20 +1976,55 @@ packages: typescript: optional: true - '@vitest/expect@1.4.0': - resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} - '@vitest/runner@1.4.0': - resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - '@vitest/snapshot@1.4.0': - resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} - '@vitest/spy@1.4.0': - resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - '@vitest/utils@1.4.0': - resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} '@volar/language-core@1.11.1': resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} @@ -2042,11 +2035,11 @@ packages: '@volar/typescript@1.11.1': resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - '@vue/compiler-core@3.4.27': - resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-dom@3.4.27': - resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} '@vue/language-core@1.8.27': resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} @@ -2056,39 +2049,25 @@ packages: typescript: optional: true - '@vue/shared@3.4.27': - resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} aggregate-error@3.1.0: @@ -2106,8 +2085,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -2149,18 +2128,12 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -2179,22 +2152,18 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -2202,6 +2171,10 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -2209,30 +2182,24 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2240,8 +2207,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} binary-extensions@2.3.0: @@ -2257,15 +2224,10 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.24.3: resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2281,9 +2243,6 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2292,10 +2251,6 @@ packages: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -2315,16 +2270,20 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001629: - resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} - caniuse-lite@1.0.30001689: - resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2340,12 +2299,22 @@ packages: change-case@3.1.0: resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2358,8 +2327,8 @@ packages: resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} - class-variance-authority@0.7.0: - resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} @@ -2373,8 +2342,8 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} cli-width@3.0.0: @@ -2385,14 +2354,16 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cmdk@0.2.1: + resolution: {integrity: sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2406,6 +2377,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -2428,8 +2402,8 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} @@ -2440,16 +2414,12 @@ packages: core-js-compat@3.39.0: resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} - core-js-pure@3.32.1: - resolution: {integrity: sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ==} + core-js-pure@3.39.0: + resolution: {integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==} create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2459,26 +2429,26 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-uri-to-buffer@5.0.1: - resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} de-indent@1.0.2: @@ -2492,8 +2462,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2501,8 +2471,12 @@ packages: supports-color: optional: true - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-extend@0.6.0: @@ -2546,6 +2520,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -2586,11 +2563,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.795: - resolution: {integrity: sha512-hHo4lK/8wb4NUa+NJYSFyJ0xedNHiR6ylilDtb8NUW9d4dmBFmGiecYEKCEbti1wTNzbKXLfl4hPWEkAFbHYlw==} + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} - electron-to-chromium@1.5.74: - resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2598,8 +2575,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -2609,16 +2586,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.6: - resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-abstract@1.23.8: + resolution: {integrity: sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2629,24 +2598,17 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} - - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.3: - resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -2654,28 +2616,20 @@ packages: es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - esbuild@0.21.4: - resolution: {integrity: sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==} - engines: {node: '>=12'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2717,36 +2671,21 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + eslint-import-resolver-typescript@3.7.0: + resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' - - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' + eslint-plugin-import-x: '*' peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: + eslint-plugin-import: optional: true - eslint-import-resolver-webpack: + eslint-plugin-import-x: optional: true - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2795,11 +2734,11 @@ packages: jest: optional: true - eslint-plugin-jsx-a11y@6.8.0: - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 eslint-plugin-only-warn@1.1.0: resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} @@ -2815,14 +2754,14 @@ packages: eslint-plugin-jest: optional: true - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + eslint-plugin-react@7.37.3: + resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -2868,6 +2807,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -2886,6 +2829,20 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2895,8 +2852,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -2929,6 +2886,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2940,10 +2901,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -2954,8 +2911,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} @@ -2973,8 +2930,12 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-up@4.1.0: @@ -2989,14 +2950,18 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} fraction.js@4.3.7: @@ -3010,10 +2975,6 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3025,12 +2986,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - function.prototype.name@1.1.7: - resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -3043,10 +3000,6 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.2.6: resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} @@ -3067,19 +3020,15 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - get-uri@6.0.1: - resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} git-hooks-list@3.1.0: @@ -3093,9 +3042,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: @@ -3110,13 +3058,13 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globals@15.8.0: - resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -3130,9 +3078,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3152,8 +3097,9 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -3166,38 +3112,28 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - has-proto@1.2.0: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -3212,12 +3148,15 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - https-proxy-agent@7.0.1: - resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} human-signals@2.1.0: @@ -3228,8 +3167,8 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true @@ -3240,8 +3179,8 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -3281,25 +3220,13 @@ packages: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} - internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - - ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - - ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} @@ -3312,9 +3239,6 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} @@ -3323,10 +3247,6 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-boolean-object@1.2.1: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} @@ -3335,25 +3255,21 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} @@ -3362,9 +3278,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-finalizationregistry@1.1.1: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} @@ -3388,25 +3301,10 @@ packages: is-lower-case@1.1.3: resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -3427,24 +3325,14 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} @@ -3457,26 +3345,14 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -3488,23 +3364,14 @@ packages: is-upper-case@1.1.2: resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakref@1.1.0: resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} engines: {node: '>= 0.4'} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - is-weakset@2.0.4: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} @@ -3519,16 +3386,12 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - iterator.prototype@1.1.4: resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} engines: {node: '>= 0.4'} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} @@ -3550,8 +3413,8 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jju@1.4.0: @@ -3560,19 +3423,22 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true @@ -3613,8 +3479,8 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} @@ -3624,12 +3490,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -3638,8 +3500,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} locate-path@5.0.0: @@ -3677,15 +3539,17 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3698,16 +3562,16 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.390.0: - resolution: {integrity: sha512-APqbfEcVuHnZbiy3E97gYWLeBdkE4e6NbY6AuVETZDZVn/bQCHYUoHyxcUHyvRopfPOHhFUEvDyyQzHwM+S9/w==} + lucide-react@0.294.0: + resolution: {integrity: sha512-V7o0/VECSGbLHn3/1O67FUgBwWB+hmzshrgDVRJQhMh8uj5D3HBuIvhuAmQTtlupILSplwIZg5FTc4tTKMA2SA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -3716,10 +3580,13 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - math-intrinsics@1.0.0: - resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -3730,8 +3597,23 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mimic-fn@2.1.0: @@ -3756,8 +3638,8 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -3771,11 +3653,11 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} muggle-string@0.3.1: resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} @@ -3786,8 +3668,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3811,9 +3693,6 @@ packages: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -3832,8 +3711,8 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} object-assign@4.1.1: @@ -3844,9 +3723,6 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-inspect@1.13.3: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} @@ -3855,26 +3731,14 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} - object.fromentries@2.0.8: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} @@ -3883,12 +3747,8 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} once@1.4.0: @@ -3902,8 +3762,11 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + oniguruma-to-es@0.8.1: + resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@4.1.1: @@ -3918,6 +3781,10 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3946,14 +3813,17 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.0.0: - resolution: {integrity: sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==} + pac-proxy-agent@7.1.0: + resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} engines: {node: '>= 14'} - pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} @@ -4010,8 +3880,12 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4032,8 +3906,8 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + pkg-types@1.3.0: + resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} @@ -4067,28 +3941,25 @@ packages: ts-node: optional: true - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} - preact@10.20.1: - resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} - - preact@10.22.1: - resolution: {integrity: sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==} + preact@10.25.4: + resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -4102,8 +3973,8 @@ packages: prettier: optional: true - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -4118,8 +3989,11 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} proxy-from-env@1.1.0: @@ -4132,12 +4006,12 @@ packages: punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} engines: {node: '>=0.6'} querystringify@2.2.0: @@ -4155,11 +4029,11 @@ packages: peerDependencies: react: ^18.3.1 - react-hook-form@7.51.5: - resolution: {integrity: sha512-J2ILT5gWx1XUIJRETiA7M19iXHlG74+6O3KApzvqB/w8S5NQR7AbU8HVZrMALdmDgWpRPYiZJl0zx8Z4L2mP6Q==} - engines: {node: '>=12.22.0'} + react-hook-form@7.54.2: + resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} + engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react: ^16.8.0 || ^17 || ^18 || ^19 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -4167,18 +4041,22 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-remove-scroll-bar@2.3.6: - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - react-remove-scroll@2.5.5: - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + react-remove-scroll@2.5.4: + resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4187,12 +4065,22 @@ packages: '@types/react': optional: true - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + react-remove-scroll@2.6.2: + resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -4220,25 +4108,26 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + reflect.getprototypeof@1.0.9: + resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.8: - resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} - engines: {node: '>= 0.4'} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} @@ -4267,8 +4156,9 @@ packages: resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: @@ -4292,8 +4182,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.29.1: + resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4311,10 +4201,6 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -4322,8 +4208,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} @@ -4348,8 +4235,13 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -4360,10 +4252,6 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} @@ -4376,8 +4264,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.9.0: - resolution: {integrity: sha512-i6//Lqgn7+7nZA0qVjoYH0085YdNk4MC+tJV4bo+HgjgRMJ0JmkLZzFAuvVioJqLkcGDK5GAMpghZEZkCnwxpQ==} + shiki@1.24.4: + resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} @@ -4391,10 +4279,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -4420,13 +4304,13 @@ packages: snake-case@2.1.0: resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} - socks-proxy-agent@8.0.1: - resolution: {integrity: sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} @@ -4435,29 +4319,38 @@ packages: resolution: {integrity: sha512-/HrPQAeeLaa+vbAH/znjuhwUluuiM/zL5XX9kop8UpDgjtyWKt43hGDk2vd/TBdDpzIyzIHVUgmYofzYrAQjew==} hasBin: true - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -4465,8 +4358,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -4480,8 +4373,12 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: @@ -4491,20 +4388,10 @@ packages: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} @@ -4512,6 +4399,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4544,8 +4434,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} @@ -4575,16 +4465,16 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} - tailwind-merge@2.3.0: - resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.4: - resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true @@ -4605,12 +4495,15 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} @@ -4618,14 +4511,26 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} @@ -4633,22 +4538,15 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-api-utils@1.0.2: - resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -4656,8 +4554,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -4676,8 +4574,8 @@ packages: tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -4685,46 +4583,51 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - turbo-darwin-64@2.0.4: - resolution: {integrity: sha512-x9mvmh4wudBstML8Z8IOmokLWglIhSfhQwnh2gBCSqabgVBKYvzl8Y+i+UCNPxheCGTgtsPepTcIaKBIyFIcvw==} + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + turbo-darwin-64@2.3.3: + resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.0.4: - resolution: {integrity: sha512-/B1Ih8zPRGVw5vw4SlclOf3C/woJ/2T6ieH6u54KT4wypoaVyaiyMqBcziIXycdObIYr7jQ+raHO7q3mhay9/A==} + turbo-darwin-arm64@2.3.3: + resolution: {integrity: sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.0.4: - resolution: {integrity: sha512-6aG670e5zOWu6RczEYcB81nEl8EhiGJEvWhUrnAfNEUIMBEH1pR5SsMmG2ol5/m3PgiRM12r13dSqTxCLcHrVg==} + turbo-linux-64@2.3.3: + resolution: {integrity: sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.0.4: - resolution: {integrity: sha512-AXfVOjst+mCtPDFT4tCu08Qrfv12Nj7NDd33AjGwV79NYN1Y1rcFY59UQ4nO3ij3rbcvV71Xc+TZJ4csEvRCSg==} + turbo-linux-arm64@2.3.3: + resolution: {integrity: sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.0.4: - resolution: {integrity: sha512-QOnUR9hKl0T5gq5h1fAhVEqBSjpcBi/BbaO71YGQNgsr6pAnCQdbG8/r3MYXet53efM0KTdOhieWeO3KLNKybA==} + turbo-windows-64@2.3.3: + resolution: {integrity: sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.0.4: - resolution: {integrity: sha512-3v8WpdZy1AxZw0gha0q3caZmm+0gveBQ40OspD6mxDBIS+oBtO5CkxhIXkFJJW+jDKmDlM7wXDIGfMEq+QyNCQ==} + turbo-windows-arm64@2.3.3: + resolution: {integrity: sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==} cpu: [arm64] os: [win32] - turbo@2.0.4: - resolution: {integrity: sha512-Ilme/2Q5kYw0AeRr+aw3s02+WrEYaY7U8vPnqSZU/jaDG/qd6jHVN6nRWyd/9KXvJGYM69vE6JImoGoyNjLwaw==} + turbo@2.3.3: + resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==} hasBin: true type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} type-fest@0.20.2: @@ -4743,72 +4646,47 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedoc-plugin-markdown@4.1.0: - resolution: {integrity: sha512-sUiEJVaa6+MOFShRy14j1OP/VXC5OLyHNecJ2nKeGuBy2M3YiMatSLoIiddFAqVptSuILJTZiJzCBIY6yzAVyg==} + typedoc-plugin-markdown@4.3.3: + resolution: {integrity: sha512-kESCcNRzOcFJATLML2FoCfaTF9c0ujmbZ+UXsJvmNlFLS3v8tDKfDifreJXvXWa9d8gUcetZqOqFcZ/7+Ba34Q==} engines: {node: '>= 18'} peerDependencies: - typedoc: 0.26.x + typedoc: 0.27.x - typedoc@0.26.2: - resolution: {integrity: sha512-q/t+M+PZqhN9gPWLBZ3CCvP+KT8O1tyYkSzEYbcQ6mo89avdIrMlBEl3vfo5BgSzwC6Lbmq0W64E8RkY+eVsLA==} + typedoc@0.26.11: + resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} engines: {node: '>= 18'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x - typescript-eslint@8.18.1: - resolution: {integrity: sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==} + typescript-eslint@8.18.2: + resolution: {integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -4817,34 +4695,44 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - uglify-js@3.18.0: - resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -4866,25 +4754,26 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - url@0.11.3: - resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -4901,21 +4790,32 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} validator@13.12.0: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} - vite-node@1.4.0: - resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-commonjs@0.10.1: - resolution: {integrity: sha512-taP8R9kYGlCW5OzkVR0UIWRCnG6rSxeWWuA7tnU5b9t5MniibOnDY219NhisTeDhJAeGT8cEnrhVWZ9A5yD+vg==} + vite-plugin-commonjs@0.10.4: + resolution: {integrity: sha512-eWQuvQKCcx0QYB5e5xfxBNjQKyrjEWZIR9UOkOV6JAgxVhtbZvCOF+FNC2ZijBJ3U3Px04ZMMyyMyFBVWIJ5+g==} vite-plugin-dts@3.9.1: resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} @@ -4927,18 +4827,18 @@ packages: vite: optional: true - vite-plugin-dynamic-import@1.5.0: - resolution: {integrity: sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g==} + vite-plugin-dynamic-import@1.6.0: + resolution: {integrity: sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg==} - vite-plugin-singlefile@2.0.1: - resolution: {integrity: sha512-J74tfN6TE4fz0Hp7E1+dmVTmCpyazv4yuIpR6jd22Kq76d2CQDSQx3wDiHX8LT02f922V+YrLhRq2VIk/UYrig==} + vite-plugin-singlefile@2.1.0: + resolution: {integrity: sha512-7tJo+UgZABlKpY/nubth/wxJ4+pUGREPnEwNOknxwl2MM0zTvF14KTU4Ln1lc140gjLLV5mjDrvuoquU7OZqCg==} engines: {node: '>18.0.0'} peerDependencies: - rollup: ^4.12.0 - vite: ^5.1.4 + rollup: ^4.28.1 + vite: ^5.4.11 || ^6.0.0 - vite@5.2.12: - resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4946,6 +4846,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -4958,6 +4859,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -4965,43 +4868,40 @@ packages: terser: optional: true - vite@5.2.6: - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: + '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: - '@types/node': - optional: true - less: + '@edge-runtime/vm': optional: true - lightningcss: + '@types/node': optional: true - sass: + '@vitest/browser': optional: true - stylus: + '@vitest/ui': optional: true - sugarss: + happy-dom: optional: true - terser: + jsdom: optional: true - vitest@1.4.0: - resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.4.0 - '@vitest/ui': 1.4.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5030,34 +4930,20 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.17: - resolution: {integrity: sha512-i2prb5irfKvNFV84NNLOZaNiMx20sm/AG2u59hU+JsjraeD5xs9LgQa+VzU95e2Tn0YMc/4drYPgPV3QvRAPPA==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -5065,11 +4951,15 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -5094,8 +4984,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} hasBin: true @@ -5107,8 +4997,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} z-schema@5.0.5: @@ -5116,36 +5006,32 @@ packages: engines: {node: '>=8.0.0'} hasBin: true - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} -snapshots: + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - '@aashutoshrathi/word-wrap@1.2.6': {} +snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.2.1': - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - - '@babel/code-frame@7.22.13': + '@ampproject/remapping@2.3.0': dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.1.1 '@babel/compat-data@7.26.3': {} '@babel/core@7.26.0': dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 '@babel/generator': 7.26.3 '@babel/helper-compilation-targets': 7.25.9 @@ -5156,7 +5042,7 @@ snapshots: '@babel/traverse': 7.26.4 '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5177,7 +5063,7 @@ snapshots: '@babel/types': 7.26.3 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-compilation-targets@7.25.9': dependencies: @@ -5203,12 +5089,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.22.5': {} + '@babel/helper-plugin-utils@7.25.9': {} '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.22.20': {} - '@babel/helper-validator-identifier@7.25.9': {} '@babel/helper-validator-option@7.25.9': {} @@ -5218,28 +5102,28 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.26.3 - '@babel/highlight@7.22.20': + '@babel/parser@7.26.3': dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/types': 7.26.3 - '@babel/parser@7.24.6': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.23.3 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/parser@7.26.3': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/runtime-corejs3@7.22.10': + '@babel/runtime-corejs3@7.26.0': dependencies: - core-js-pure: 3.32.1 - regenerator-runtime: 0.14.0 + core-js-pure: 3.39.0 + regenerator-runtime: 0.14.1 - '@babel/runtime@7.24.7': + '@babel/runtime@7.26.0': dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.14.1 '@babel/template@7.25.9': dependencies: @@ -5254,33 +5138,33 @@ snapshots: '@babel/parser': 7.26.3 '@babel/template': 7.25.9 '@babel/types': 7.26.3 - debug: 4.3.4 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.3': - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@create-figma-plugin/ui@3.1.0(preact@10.20.1)': + '@create-figma-plugin/ui@3.2.1(preact@10.25.4)': + dependencies: + '@create-figma-plugin/utilities': 3.2.1 + preact: 10.25.4 + + '@create-figma-plugin/ui@4.0.0-alpha.0(preact@10.25.4)': dependencies: - '@create-figma-plugin/utilities': 3.2.0 - preact: 10.20.1 + '@create-figma-plugin/utilities': 4.0.0-alpha.0 + preact: 10.25.4 - '@create-figma-plugin/ui@3.1.0(preact@10.22.1)': + '@create-figma-plugin/utilities@3.2.1': dependencies: - '@create-figma-plugin/utilities': 3.2.0 - preact: 10.22.1 + hex-rgb: 5.0.0 + natural-compare-lite: 1.4.0 + rgb-hex: 4.1.0 - '@create-figma-plugin/utilities@3.2.0': + '@create-figma-plugin/utilities@4.0.0-alpha.0': dependencies: hex-rgb: 5.0.0 natural-compare-lite: 1.4.0 @@ -5290,158 +5174,192 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.21.4': + '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.21.4': + '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.21.4': + '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.21.4': + '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.21.4': + '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.21.4': + '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.21.4': + '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.21.4': + '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.21.4': + '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm@0.20.2': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.21.4': + '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.21.4': + '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.21.4': + '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.21.4': + '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.21.4': + '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.21.4': + '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.21.4': + '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.21.4': + '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.21.4': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.21.4': + '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.21.4': + '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/win32-arm64@0.21.4': + '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-ia32@0.21.4': + '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-x64@0.21.4': + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.7))': + dependencies: + eslint: 9.17.0(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} + '@eslint/config-array@0.19.1': + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.1': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -5451,54 +5369,61 @@ snapshots: '@eslint/js@8.57.1': {} - '@eslint/js@9.6.0': {} + '@eslint/js@9.17.0': {} + + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.4': + dependencies: + levn: 0.4.1 - '@figma/eslint-plugin-figma-plugins@0.10.0(eslint@8.57.1)': + '@figma/eslint-plugin-figma-plugins@0.15.0(eslint@8.57.1)': dependencies: - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.17.0(eslint@8.57.1)(typescript@5.4.5) - typescript: 5.4.5 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - eslint - supports-color - '@figma/plugin-typings@1.105.0': {} - - '@figma/plugin-typings@1.94.0': {} + '@figma/plugin-typings@1.106.0': {} - '@figma/widget-typings@1.9.1(@figma/plugin-typings@1.94.0)': + '@figma/widget-typings@1.11.0(@figma/plugin-typings@1.106.0)': dependencies: - '@figma/plugin-typings': 1.94.0 + '@figma/plugin-typings': 1.106.0 - '@figma/widget-typings@1.9.2(@figma/plugin-typings@1.105.0)': + '@floating-ui/core@1.6.8': dependencies: - '@figma/plugin-typings': 1.105.0 + '@floating-ui/utils': 0.2.8 - '@floating-ui/core@1.6.2': + '@floating-ui/dom@1.6.12': dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.5': + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 - - '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 + '@floating-ui/dom': 1.6.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/utils@0.2.2': {} + '@floating-ui/utils@0.2.8': {} + + '@hookform/resolvers@3.9.1(react-hook-form@7.54.2(react@18.3.1))': + dependencies: + react-hook-form: 7.54.2(react@18.3.1) + + '@humanfs/core@0.19.1': {} - '@hookform/resolvers@3.6.0(react-hook-form@7.51.5(react@18.3.1))': + '@humanfs/node@0.16.6': dependencies: - react-hook-form: 7.51.5(react@18.3.1) + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5507,6 +5432,10 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5529,65 +5458,52 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.24 - '@types/yargs': 17.0.32 + '@types/node': 22.10.2 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} - - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.20': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@microsoft/api-extractor-model@7.28.13(@types/node@20.11.24)': + '@microsoft/api-extractor-model@7.28.13(@types/node@22.10.2)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.11.24) + '@rushstack/node-core-library': 4.0.2(@types/node@22.10.2) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.11.24)': + '@microsoft/api-extractor@7.43.0(@types/node@22.10.2)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.11.24) + '@microsoft/api-extractor-model': 7.28.13(@types/node@22.10.2) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.11.24) + '@rushstack/node-core-library': 4.0.2(@types/node@22.10.2) '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.11.24) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.11.24) + '@rushstack/terminal': 0.10.0(@types/node@22.10.2) + '@rushstack/ts-command-line': 4.19.1(@types/node@22.10.2) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 @@ -5617,742 +5533,697 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.18.0 + + '@nolyfill/is-core-module@1.0.39': {} '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.1.1': {} - '@radix-ui/number@1.0.1': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/number@1.1.0': {} - '@radix-ui/primitive@1.0.1': + '@radix-ui/primitive@1.0.0': dependencies: - '@babel/runtime': 7.24.7 - - '@radix-ui/primitive@1.1.0': {} + '@babel/runtime': 7.26.0 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-checkbox@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.61)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-collapsible@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.0.0(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.26.0 react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-context@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-context@1.0.0(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.26.0 react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-context@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 - - '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + + '@radix-ui/react-dialog@1.0.0(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-context': 1.0.0(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.0(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.0(react@18.3.1) + '@radix-ui/react-portal': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.0(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.2.61)(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-direction@1.0.1(@types/react@18.2.61)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 + react-remove-scroll: 2.5.4(@types/react@18.3.18)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + + '@radix-ui/react-dialog@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + aria-hidden: 1.2.4 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-direction@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-dropdown-menu@2.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-menu': 2.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-focus-guards@1.0.0(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - '@radix-ui/react-id@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-id@1.0.0(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) + react: 18.3.1 - '@radix-ui/react-id@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-menu@2.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.2.61)(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/rect': 1.0.1 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-popover@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-slot': 1.0.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.2.61)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-roving-focus@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-select@2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-select@2.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.2.61)(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-slot@1.0.2(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-slot@1.0.0(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-slot@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-slot@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 - - '@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + + '@radix-ui/react-switch@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-tabs@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-tooltip@1.1.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.61)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-tooltip@1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.61)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.0.0(react@18.3.1)': dependencies: + '@babel/runtime': 7.26.0 react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.0.0(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.61)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.0.0(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.61)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.0.0(react@18.3.1)': dependencies: + '@babel/runtime': 7.26.0 react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/rect': 1.0.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.2.61)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.2.61 - - '@radix-ui/react-use-size@1.0.1(@types/react@18.2.61)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.61)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 - - '@radix-ui/react-use-size@1.1.0(@types/react@18.2.61)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.61)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 + '@types/react': 18.3.18 - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 - '@types/react-dom': 18.2.19 - - '@radix-ui/rect@1.0.1': - dependencies: - '@babel/runtime': 7.24.7 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) '@radix-ui/rect@1.1.0': {} - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/pluginutils@5.1.4(rollup@4.29.1)': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: - rollup: 4.18.0 + rollup: 4.29.1 + + '@rollup/rollup-android-arm-eabi@4.29.1': + optional: true + + '@rollup/rollup-android-arm64@4.29.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': + '@rollup/rollup-darwin-arm64@4.29.1': optional: true - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-darwin-x64@4.29.1': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-freebsd-arm64@4.29.1': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-freebsd-x64@4.29.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.29.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.29.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.29.1': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.29.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-linux-x64-musl@4.29.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.29.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.29.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.4': {} - '@rushstack/node-core-library@4.0.2(@types/node@20.11.24)': + '@rushstack/node-core-library@4.0.2(@types/node@22.10.2)': dependencies: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 z-schema: 5.0.5 optionalDependencies: - '@types/node': 20.11.24 + '@types/node': 22.10.2 '@rushstack/rig-package@0.5.2': dependencies: - resolve: 1.22.8 + resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@20.11.24)': + '@rushstack/terminal@0.10.0(@types/node@22.10.2)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.11.24) + '@rushstack/node-core-library': 4.0.2(@types/node@22.10.2) supports-color: 8.1.1 optionalDependencies: - '@types/node': 20.11.24 + '@types/node': 22.10.2 - '@rushstack/ts-command-line@4.19.1(@types/node@20.11.24)': + '@rushstack/ts-command-line@4.19.1(@types/node@22.10.2)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.11.24) + '@rushstack/terminal': 0.10.0(@types/node@22.10.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@shikijs/core@1.9.0': {} + '@shikijs/core@1.24.4': + dependencies: + '@shikijs/engine-javascript': 1.24.4 + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/engine-javascript@1.24.4': + dependencies: + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.8.1 + + '@shikijs/engine-oniguruma@1.24.4': + dependencies: + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + + '@shikijs/types@1.24.4': + dependencies: + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.1': {} '@sinclair/typebox@0.27.8': {} '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -6360,19 +6231,19 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.12.4(@types/node@20.11.24)(typescript@5.4.5)': + '@turbo/gen@2.3.3(@types/node@22.10.2)(typescript@5.7.2)': dependencies: - '@turbo/workspaces': 1.12.4 - chalk: 2.4.2 + '@turbo/workspaces': 2.3.3 commander: 10.0.1 fs-extra: 10.1.0 inquirer: 8.2.6 - minimatch: 9.0.3 + minimatch: 9.0.5 node-plop: 0.26.3 - proxy-agent: 6.3.0 - ts-node: 10.9.1(@types/node@20.11.24)(typescript@5.4.5) + picocolors: 1.0.1 + proxy-agent: 6.5.0 + ts-node: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) update-check: 1.5.4 - validate-npm-package-name: 5.0.0 + validate-npm-package-name: 5.0.1 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -6380,38 +6251,62 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@1.12.4': + '@turbo/workspaces@2.3.3': dependencies: - chalk: 2.4.2 commander: 10.0.1 execa: 5.1.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 fs-extra: 10.1.0 gradient-string: 2.0.2 inquirer: 8.2.6 js-yaml: 4.1.0 ora: 4.1.1 - rimraf: 3.0.2 - semver: 7.6.0 + picocolors: 1.0.1 + semver: 7.6.2 update-check: 1.5.4 '@types/argparse@1.0.38': {} - '@types/eslint@8.56.5': + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.3 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.3 + + '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.12 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 - '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.11.24 + '@types/node': 22.10.2 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 '@types/inquirer@6.5.0': dependencies: - '@types/through': 0.0.30 + '@types/through': 0.0.33 rxjs: 6.6.7 '@types/istanbul-lib-coverage@2.0.6': {} @@ -6424,51 +6319,52 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/json-schema@7.0.12': {} - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/minimatch@5.1.2': {} - '@types/node@20.11.24': + '@types/node@22.10.2': dependencies: - undici-types: 5.26.5 + undici-types: 6.20.0 '@types/normalize-package-data@2.4.4': {} - '@types/path-browserify@1.0.2': {} + '@types/path-browserify@1.0.3': {} - '@types/prop-types@15.7.5': {} + '@types/prop-types@15.7.14': {} - '@types/react-dom@18.2.19': + '@types/react-dom@18.3.5(@types/react@18.3.18)': dependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - '@types/react@18.2.61': + '@types/react@18.3.18': dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - - '@types/scheduler@0.16.3': {} + '@types/prop-types': 15.7.14 + csstype: 3.1.3 '@types/semver@7.5.8': {} '@types/stack-utils@2.0.3': {} - '@types/through@0.0.30': + '@types/through@0.0.33': dependencies: - '@types/node': 20.11.24 + '@types/node': 22.10.2 '@types/tinycolor2@1.4.6': {} + '@types/unist@3.0.3': {} + '@types/url-parse@1.4.11': {} '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.32': + '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 @@ -6482,9 +6378,9 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -6497,48 +6393,31 @@ snapshots: '@typescript-eslint/scope-manager': 7.18.1-alpha.3 '@typescript-eslint/type-utils': 7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/utils': 7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 7.18.1-alpha.3 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@8.57.1)(typescript@5.3.3))(eslint@8.57.1)(typescript@5.3.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@8.57.1)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@8.57.1)(typescript@5.3.3) - '@typescript-eslint/utils': 8.18.1(eslint@8.57.1)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/visitor-keys': 7.18.1-alpha.3 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@8.57.1)(typescript@5.4.5))(eslint@8.57.1)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/utils': 8.18.1(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/parser': 8.18.2(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/type-utils': 8.18.2(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.2 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6548,7 +6427,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.1 optionalDependencies: typescript: 5.7.2 @@ -6561,34 +6440,22 @@ snapshots: '@typescript-eslint/types': 7.18.1-alpha.3 '@typescript-eslint/typescript-estree': 7.18.1-alpha.3(typescript@5.7.2) '@typescript-eslint/visitor-keys': 7.18.1-alpha.3 - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.1 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.1(eslint@8.57.1)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 8.18.1 - debug: 4.3.4 - eslint: 8.57.1 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.18.1(eslint@8.57.1)(typescript@5.4.5)': + '@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 8.18.1 - debug: 4.3.4 + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.4.0 eslint: 8.57.1 - typescript: 5.4.5 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6597,10 +6464,10 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@6.17.0': + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 '@typescript-eslint/scope-manager@7.18.0': dependencies: @@ -6612,18 +6479,18 @@ snapshots: '@typescript-eslint/types': 7.18.1-alpha.3 '@typescript-eslint/visitor-keys': 7.18.1-alpha.3 - '@typescript-eslint/scope-manager@8.18.1': + '@typescript-eslint/scope-manager@8.18.2': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -6633,72 +6500,61 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.1-alpha.3(typescript@5.7.2) '@typescript-eslint/utils': 7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2) - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.18.1(eslint@8.57.1)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.3.3) - '@typescript-eslint/utils': 8.18.1(eslint@8.57.1)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.18.1(eslint@8.57.1)(typescript@5.4.5)': + '@typescript-eslint/type-utils@8.18.2(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.4.5) - '@typescript-eslint/utils': 8.18.1(eslint@8.57.1)(typescript@5.4.5) - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@8.57.1)(typescript@5.7.2) + debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@6.17.0': {} + '@typescript-eslint/types@6.21.0': {} '@typescript-eslint/types@7.18.0': {} '@typescript-eslint/types@7.18.1-alpha.3': {} - '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/types@8.18.2': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 + semver: 7.6.3 tsutils: 3.21.0(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.17.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 - debug: 4.3.4 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.0.2(typescript@5.4.5) + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6706,12 +6562,12 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.7.2) + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -6721,48 +6577,34 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.1-alpha.3 '@typescript-eslint/visitor-keys': 7.18.1-alpha.3 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.7.2) + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.3.3)': - dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 - debug: 4.3.4 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 - debug: 4.3.4 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 @@ -6770,28 +6612,28 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) eslint: 8.57.1 eslint-scope: 5.1.1 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.17.0(eslint@8.57.1)(typescript@5.4.5)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@types/json-schema': 7.0.12 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.2) eslint: 8.57.1 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) @@ -6802,7 +6644,7 @@ snapshots: '@typescript-eslint/utils@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.1-alpha.3 '@typescript-eslint/types': 7.18.1-alpha.3 '@typescript-eslint/typescript-estree': 7.18.1-alpha.3(typescript@5.7.2) @@ -6811,25 +6653,14 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.18.1(eslint@8.57.1)(typescript@5.3.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.3.3) - eslint: 8.57.1 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.18.1(eslint@8.57.1)(typescript@5.4.5)': + '@typescript-eslint/utils@8.18.2(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.4.5) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) eslint: 8.57.1 - typescript: 5.4.5 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6838,9 +6669,9 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.17.0': + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 '@typescript-eslint/visitor-keys@7.18.0': @@ -6853,14 +6684,14 @@ snapshots: '@typescript-eslint/types': 7.18.1-alpha.3 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.18.1': + '@typescript-eslint/visitor-keys@8.18.2': dependencies: - '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/types': 8.18.2 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.2.1': {} - '@vercel/style-guide@6.0.0(eslint@8.57.1)(prettier@3.2.5)(typescript@5.7.2)(vitest@1.4.0(@types/node@20.11.24))': + '@vercel/style-guide@6.0.0(eslint@8.57.1)(prettier@3.4.2)(typescript@5.7.2)(vitest@2.1.8(@types/node@22.10.2))': dependencies: '@babel/core': 7.26.0 '@babel/eslint-parser': 7.25.9(@babel/core@7.26.0)(eslint@8.57.1) @@ -6869,59 +6700,110 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) eslint-config-prettier: 9.1.0(eslint@8.57.1) eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.31.0) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.1-alpha.3(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-playwright: 1.8.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) - eslint-plugin-react: 7.37.2(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.1) + eslint-plugin-react: 7.37.3(eslint@8.57.1) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) eslint-plugin-testing-library: 6.5.0(eslint@8.57.1)(typescript@5.7.2) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-unicorn: 51.0.1(eslint@8.57.1) - eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@1.4.0(@types/node@20.11.24)) - prettier-plugin-packagejson: 2.5.6(prettier@3.2.5) + eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@2.1.8(@types/node@22.10.2)) + prettier-plugin-packagejson: 2.5.6(prettier@3.4.2) optionalDependencies: eslint: 8.57.1 - prettier: 3.2.5 + prettier: 3.4.2 typescript: 5.7.2 transitivePeerDependencies: - - eslint-import-resolver-node - eslint-import-resolver-webpack + - eslint-plugin-import-x - jest - supports-color - vitest - '@vitest/expect@1.4.0': + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.10.2))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.11(@types/node@22.10.2) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.5.0 + + '@vitest/expect@2.1.8': + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.2))': dependencies: - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - chai: 4.4.1 + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.11(@types/node@22.10.2) + + '@vitest/pretty-format@2.1.8': + dependencies: + tinyrainbow: 1.2.0 - '@vitest/runner@1.4.0': + '@vitest/runner@1.6.0': dependencies: - '@vitest/utils': 1.4.0 + '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@1.4.0': + '@vitest/runner@2.1.8': dependencies: - magic-string: 0.30.10 + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.17 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@1.4.0': + '@vitest/snapshot@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 - '@vitest/utils@1.4.0': + '@vitest/spy@2.1.8': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 + '@vitest/utils@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + '@volar/language-core@1.11.1': dependencies: '@volar/source-map': 1.11.1 @@ -6935,54 +6817,46 @@ snapshots: '@volar/language-core': 1.11.1 path-browserify: 1.0.1 - '@vue/compiler-core@3.4.27': + '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.24.6 - '@vue/shared': 3.4.27 + '@babel/parser': 7.26.3 + '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 - '@vue/compiler-dom@3.4.27': + '@vue/compiler-dom@3.5.13': dependencies: - '@vue/compiler-core': 3.4.27 - '@vue/shared': 3.4.27 + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/language-core@1.8.27(typescript@5.4.5)': + '@vue/language-core@1.8.27(typescript@5.7.2)': dependencies: '@volar/language-core': 1.11.1 '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 computeds: 0.0.1 - minimatch: 9.0.4 + minimatch: 9.0.5 muggle-string: 0.3.1 path-browserify: 1.0.1 vue-template-compiler: 2.7.16 optionalDependencies: - typescript: 5.4.5 + typescript: 5.7.2 - '@vue/shared@3.4.27': {} + '@vue/shared@3.5.13': {} acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 - acorn-walk@8.2.0: {} - - acorn-walk@8.3.2: {} - - acorn@8.11.3: {} - - acorn@8.12.0: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 acorn@8.14.0: {} - agent-base@7.1.0: - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} aggregate-error@3.1.0: dependencies: @@ -7002,7 +6876,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -7035,140 +6909,109 @@ snapshots: aria-hidden@1.2.4: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - array-buffer-byte-length@1.0.0: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.2 + aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-array-buffer: 3.0.5 - array-includes@3.1.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + get-intrinsic: 1.2.6 + is-string: 1.1.1 array-union@2.1.0: {} array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.8 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.8 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.2: - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 is-array-buffer: 3.0.5 assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} ast-types@0.13.4: dependencies: - tslib: 2.6.2 - - asynciterator.prototype@1.0.0: - dependencies: - has-symbols: 1.0.3 + tslib: 2.8.1 - autoprefixer@10.4.19(postcss@8.4.38): + autoprefixer@10.4.20(postcss@8.4.49): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001629 + browserslist: 4.24.3 + caniuse-lite: 1.0.30001690 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.38 + picocolors: 1.1.1 + postcss: 8.4.49 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.5: {} - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - axe-core@4.7.0: {} + axe-core@4.10.2: {} - axobject-query@3.2.1: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} balanced-match@1.0.2: {} base64-js@1.5.1: {} - basic-ftp@5.0.3: {} + basic-ftp@5.0.5: {} binary-extensions@2.3.0: {} @@ -7187,21 +7030,14 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 - - browserslist@4.23.0: - dependencies: - caniuse-lite: 1.0.30001629 - electron-to-chromium: 1.4.795 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + fill-range: 7.1.1 browserslist@4.24.3: dependencies: - caniuse-lite: 1.0.30001689 - electron-to-chromium: 1.5.74 + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) @@ -7217,10 +7053,6 @@ snapshots: builtin-modules@3.3.0: {} - builtins@5.0.1: - dependencies: - semver: 7.6.0 - cac@6.7.14: {} call-bind-apply-helpers@1.0.1: @@ -7228,19 +7060,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.1 - es-define-property: 1.0.0 - get-intrinsic: 1.2.4 + es-define-property: 1.0.1 + get-intrinsic: 1.2.6 set-function-length: 1.2.2 call-bound@1.0.3: @@ -7257,19 +7081,27 @@ snapshots: camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001629: {} + caniuse-lite@1.0.30001690: {} - caniuse-lite@1.0.30001689: {} + ccount@2.0.1: {} - chai@4.4.1: + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 + type-detect: 4.1.0 + + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -7308,16 +7140,22 @@ snapshots: upper-case: 1.1.3 upper-case-first: 1.1.2 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + chardet@0.7.0: {} check-error@1.0.3: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -7330,9 +7168,9 @@ snapshots: ci-info@4.1.0: {} - class-variance-authority@0.7.0: + class-variance-authority@0.7.1: dependencies: - clsx: 2.0.0 + clsx: 2.1.1 clean-regexp@1.0.0: dependencies: @@ -7344,16 +7182,22 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-spinners@2.9.0: {} + cli-spinners@2.9.2: {} cli-width@3.0.0: {} clone@1.0.4: {} - clsx@2.0.0: {} - clsx@2.1.1: {} + cmdk@0.2.1(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.0.0(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -7366,6 +7210,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} commander@12.1.0: {} @@ -7379,7 +7225,7 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} + confbox@0.1.8: {} constant-case@2.0.0: dependencies: @@ -7392,16 +7238,10 @@ snapshots: dependencies: browserslist: 4.24.3 - core-js-pure@3.32.1: {} + core-js-pure@3.39.0: {} create-require@1.1.1: {} - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -7410,27 +7250,27 @@ snapshots: cssesc@3.0.0: {} - csstype@3.1.2: {} + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} - data-uri-to-buffer@5.0.1: {} + data-uri-to-buffer@6.0.2: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -7438,15 +7278,17 @@ snapshots: debug@3.2.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 - debug@4.3.4: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 + + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -7458,9 +7300,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -7493,6 +7335,10 @@ snapshots: detect-node-es@1.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -7527,15 +7373,15 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.795: {} + electron-to-chromium@1.5.76: {} - electron-to-chromium@1.5.74: {} + emoji-regex-xs@1.0.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.15.0: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -7546,64 +7392,22 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.22.3: - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 - - es-abstract@1.23.6: - dependencies: - array-buffer-byte-length: 1.0.1 + es-abstract@1.23.8: + dependencies: + array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 get-intrinsic: 1.2.6 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -7616,159 +7420,127 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 - is-negative-zero: 2.0.3 is-regex: 1.2.1 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 is-weakref: 1.1.0 - math-intrinsics: 1.0.0 + math-intrinsics: 1.1.0 object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 + object.assign: 4.1.7 + own-keys: 1.0.1 regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.3 + typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.17 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.0.15: - dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-set-tostringtag: 2.0.2 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 - has-property-descriptors: 1.0.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.6 - iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 - - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 - has-symbols: 1.0.3 + has-symbols: 1.1.0 internal-slot: 1.1.0 iterator.prototype: 1.1.4 safe-array-concat: 1.1.3 - es-module-lexer@1.5.3: {} + es-module-lexer@1.6.0: {} es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.2: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.0 - hasown: 2.0.0 - es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.0 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + hasown: 2.0.2 es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 - esbuild@0.20.2: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - - esbuild@0.21.4: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.4 - '@esbuild/android-arm': 0.21.4 - '@esbuild/android-arm64': 0.21.4 - '@esbuild/android-x64': 0.21.4 - '@esbuild/darwin-arm64': 0.21.4 - '@esbuild/darwin-x64': 0.21.4 - '@esbuild/freebsd-arm64': 0.21.4 - '@esbuild/freebsd-x64': 0.21.4 - '@esbuild/linux-arm': 0.21.4 - '@esbuild/linux-arm64': 0.21.4 - '@esbuild/linux-ia32': 0.21.4 - '@esbuild/linux-loong64': 0.21.4 - '@esbuild/linux-mips64el': 0.21.4 - '@esbuild/linux-ppc64': 0.21.4 - '@esbuild/linux-riscv64': 0.21.4 - '@esbuild/linux-s390x': 0.21.4 - '@esbuild/linux-x64': 0.21.4 - '@esbuild/netbsd-x64': 0.21.4 - '@esbuild/openbsd-x64': 0.21.4 - '@esbuild/sunos-x64': 0.21.4 - '@esbuild/win32-arm64': 0.21.4 - '@esbuild/win32-ia32': 0.21.4 - '@esbuild/win32-x64': 0.21.4 - - escalade@3.1.1: {} + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 escalade@3.2.0: {} @@ -7802,26 +7574,25 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.16.0 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: - debug: 4.3.4 - enhanced-resolve: 5.15.0 + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.18.0 eslint: 8.57.1 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) fast-glob: 3.3.2 - get-tsconfig: 4.7.2 - is-core-module: 2.13.1 + get-tsconfig: 4.8.1 + is-bun-module: 1.3.0 is-glob: 4.0.3 + stable-hash: 0.0.4 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1) transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - supports-color eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): @@ -7834,41 +7605,31 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - eslint: 8.57.1 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): dependencies: escape-string-regexp: 1.0.5 eslint: 8.57.1 - ignore: 5.3.1 + ignore: 5.3.2 eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.16.0 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 @@ -7889,25 +7650,24 @@ snapshots: - supports-color - typescript - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): dependencies: - '@babel/runtime': 7.24.7 - aria-query: 5.3.0 - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.7.0 - axobject-query: 3.2.1 + axe-core: 4.10.2 + axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.15 eslint: 8.57.1 - hasown: 2.0.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 eslint-plugin-only-warn@1.1.0: {} @@ -7918,18 +7678,18 @@ snapshots: optionalDependencies: eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.1-alpha.3(@typescript-eslint/parser@7.18.1-alpha.3(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - eslint-plugin-react-hooks@4.6.0(eslint@8.57.1): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react@7.37.2(eslint@8.57.1): + eslint-plugin-react@7.37.3(eslint@8.57.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 + es-iterator-helpers: 1.2.1 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.2 @@ -7937,11 +7697,11 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 eslint-plugin-testing-library@6.5.0(eslint@8.57.1)(typescript@5.7.2): @@ -7964,33 +7724,33 @@ snapshots: eslint-plugin-unicorn@51.0.1(eslint@8.57.1): dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@babel/helper-validator-identifier': 7.25.9 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@eslint/eslintrc': 2.1.4 ci-info: 4.1.0 clean-regexp: 1.0.0 core-js-compat: 3.39.0 eslint: 8.57.1 - esquery: 1.5.0 + esquery: 1.6.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 - jsesc: 3.0.2 + jsesc: 3.1.0 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.6.0 + semver: 7.6.3 strip-indent: 3.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@1.4.0(@types/node@20.11.24)): + eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)(vitest@2.1.8(@types/node@22.10.2)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - vitest: 1.4.0(@types/node@20.11.24) + vitest: 2.1.8(@types/node@22.10.2) transitivePeerDependencies: - supports-color - typescript @@ -8005,6 +7765,11 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} @@ -8013,7 +7778,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -8024,13 +7789,13 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.4 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -8038,7 +7803,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -8048,12 +7813,59 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color + eslint@9.17.0(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@9.6.1: dependencies: acorn: 8.14.0 @@ -8062,7 +7874,7 @@ snapshots: esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -8078,13 +7890,13 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 esutils@2.0.3: {} execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -8096,16 +7908,18 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expect-type@1.1.0: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -8122,27 +7936,19 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.15.0: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -8158,7 +7964,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - fill-range@7.0.1: + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8174,17 +7984,22 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.1: {} + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -8195,7 +8010,7 @@ snapshots: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 fs-extra@7.0.1: dependencies: @@ -8203,12 +8018,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -8216,16 +8025,10 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - functions-have-names: 1.2.3 - - function.prototype.name@1.1.7: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -8237,14 +8040,6 @@ snapshots: get-func-name@2.0.2: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 @@ -8256,7 +8051,7 @@ snapshots: gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - math-intrinsics: 1.0.0 + math-intrinsics: 1.1.0 get-nonce@1.0.1: {} @@ -8266,27 +8061,21 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.0: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.2.6 - get-tsconfig@4.7.2: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.1: + get-uri@6.0.4: dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 - debug: 4.3.4 - fs-extra: 8.1.0 + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -8300,12 +8089,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.1: + glob@10.4.5: dependencies: - foreground-child: 3.1.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 glob@7.2.3: @@ -8323,25 +8113,23 @@ snapshots: dependencies: type-fest: 0.20.2 - globals@15.8.0: {} + globals@14.0.0: {} - globalthis@1.0.3: - dependencies: - define-properties: 1.2.1 + globals@15.14.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@10.0.2: dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 glob: 7.2.3 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -8350,14 +8138,10 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -8376,9 +8160,9 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.18.0 + uglify-js: 3.19.3 - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -8386,33 +8170,39 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.1: {} + es-define-property: 1.0.1 has-proto@1.2.0: dependencies: dunder-proto: 1.0.1 - has-symbols@1.0.3: {} - has-symbols@1.1.0: {} - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 - hasown@2.0.0: + hasown@2.0.2: dependencies: function-bind: 1.1.2 - hasown@2.0.2: + hast-util-to-html@9.0.4: dependencies: - function-bind: 1.1.2 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 he@1.2.0: {} @@ -8425,17 +8215,19 @@ snapshots: hosted-git-info@2.8.9: {} - http-proxy-agent@7.0.0: + html-void-elements@3.0.0: {} + + http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.1: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -8443,7 +8235,7 @@ snapshots: human-signals@5.0.0: {} - husky@9.0.11: {} + husky@9.1.7: {} iconv-lite@0.4.24: dependencies: @@ -8451,7 +8243,7 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: @@ -8509,31 +8301,16 @@ snapshots: through: 2.3.8 wrap-ansi: 6.2.0 - internal-slot@1.0.6: - dependencies: - get-intrinsic: 1.2.4 - hasown: 2.0.0 - side-channel: 1.0.6 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 - invariant@2.2.4: + ip-address@9.0.5: dependencies: - loose-envify: 1.4.0 - - ip@1.1.8: {} - - ip@2.0.0: {} - - is-array-buffer@3.0.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-typed-array: 1.1.12 + jsbn: 1.1.0 + sprintf-js: 1.1.3 is-array-buffer@3.0.5: dependencies: @@ -8545,25 +8322,16 @@ snapshots: is-async-function@2.0.0: dependencies: - has-tostringtag: 1.0.0 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 + has-tostringtag: 1.0.2 is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.0 - is-boolean-object@1.2.1: dependencies: call-bound: 1.0.3 @@ -8573,13 +8341,13 @@ snapshots: dependencies: builtin-modules: 3.3.0 - is-callable@1.2.7: {} - - is-core-module@2.13.1: + is-bun-module@1.3.0: dependencies: - hasown: 2.0.0 + semver: 7.6.3 - is-core-module@2.16.0: + is-callable@1.2.7: {} + + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -8589,10 +8357,6 @@ snapshots: get-intrinsic: 1.2.6 is-typed-array: 1.1.15 - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.0 - is-date-object@1.1.0: dependencies: call-bound: 1.0.3 @@ -8600,10 +8364,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.3 @@ -8612,7 +8372,7 @@ snapshots: is-generator-function@1.0.10: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-glob@4.0.3: dependencies: @@ -8624,18 +8384,8 @@ snapshots: dependencies: lower-case: 1.1.4 - is-map@2.0.2: {} - is-map@2.0.3: {} - is-negative-zero@2.0.2: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -8649,11 +8399,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.0 - is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -8661,14 +8406,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - is-set@2.0.2: {} - is-set@2.0.3: {} - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.3 @@ -8677,32 +8416,20 @@ snapshots: is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - is-string@1.1.1: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - is-symbol@1.1.1: dependencies: call-bound: 1.0.3 has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.12: - dependencies: - which-typed-array: 1.1.13 - is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.17 + which-typed-array: 1.1.18 is-unicode-supported@0.1.0: {} @@ -8710,23 +8437,12 @@ snapshots: dependencies: upper-case: 1.1.3 - is-weakmap@2.0.1: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-weakref@1.1.0: dependencies: call-bound: 1.0.3 - is-weakset@2.0.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-weakset@2.0.4: dependencies: call-bound: 1.0.3 @@ -8738,24 +8454,16 @@ snapshots: isexe@2.0.0: {} - iterator.prototype@1.1.2: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - iterator.prototype@1.1.4: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.0.0 get-intrinsic: 1.2.6 has-symbols: 1.1.0 - reflect.getprototypeof: 1.0.8 + reflect.getprototypeof: 1.0.9 set-function-name: 2.0.2 - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -8779,12 +8487,12 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.26.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -8792,27 +8500,29 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 22.10.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - jiti@1.21.6: {} + jiti@1.21.7: {} jju@1.4.0: {} js-tokens@4.0.0: {} - js-tokens@9.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 + jsbn@1.1.0: {} + jsesc@0.5.0: {} - jsesc@3.0.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -8834,16 +8544,16 @@ snapshots: jsonfile@6.1.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.4 - object.values: 1.1.7 + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 keyv@4.5.4: dependencies: @@ -8851,20 +8561,18 @@ snapshots: kolorist@1.8.0: {} - language-subtag-registry@0.3.22: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@2.1.0: {} - - lilconfig@3.1.1: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -8872,10 +8580,10 @@ snapshots: dependencies: uc.micro: 2.1.0 - local-pkg@0.5.0: + local-pkg@0.5.1: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 + mlly: 1.7.3 + pkg-types: 1.3.0 locate-path@5.0.0: dependencies: @@ -8910,13 +8618,15 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.2: {} + lower-case-first@1.0.2: dependencies: lower-case: 1.1.4 lower-case@1.1.4: {} - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: @@ -8928,15 +8638,15 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.390.0(react@18.3.1): + lucide-react@0.294.0(react@18.3.1): dependencies: react: 18.3.1 lunr@2.3.9: {} - magic-string@0.30.10: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-error@1.3.6: {} @@ -8949,7 +8659,19 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - math-intrinsics@1.0.0: {} + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 mdurl@2.0.0: {} @@ -8957,9 +8679,26 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.5: + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mimic-fn@2.1.0: {} @@ -8980,7 +8719,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -8992,14 +8731,14 @@ snapshots: dependencies: minimist: 1.2.8 - mlly@1.7.0: + mlly@1.7.3: dependencies: - acorn: 8.12.0 + acorn: 8.14.0 pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 + pkg-types: 1.3.0 + ufo: 1.5.4 - ms@2.1.2: {} + ms@2.1.3: {} muggle-string@0.3.1: {} @@ -9011,7 +8750,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare-lite@1.4.0: {} @@ -9027,7 +8766,7 @@ snapshots: node-plop@0.26.3: dependencies: - '@babel/runtime-corejs3': 7.22.10 + '@babel/runtime-corejs3': 7.26.0 '@types/inquirer': 6.5.0 change-case: 3.1.0 del: 5.1.0 @@ -9037,16 +8776,14 @@ snapshots: isbinaryfile: 4.0.10 lodash.get: 4.4.2 mkdirp: 0.5.6 - resolve: 1.22.8 - - node-releases@2.0.14: {} + resolve: 1.22.10 node-releases@2.0.19: {} normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.10 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -9058,7 +8795,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.1.0: + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -9066,66 +8803,42 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.1: {} - object-inspect@1.13.3: {} object-keys@1.1.1: {} - object.assign@4.1.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.assign@4.1.5: + object.assign@4.1.7: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 + es-object-atoms: 1.0.0 has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 - object.fromentries@2.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.6 - - object.values@1.1.7: - dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.8 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -9141,20 +8854,26 @@ snapshots: dependencies: mimic-fn: 4.0.0 - optionator@0.9.3: + oniguruma-to-es@0.8.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@4.1.1: dependencies: chalk: 3.0.0 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.2 is-interactive: 1.0.0 log-symbols: 3.0.0 mute-stream: 0.0.8 @@ -9166,7 +8885,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -9175,6 +8894,12 @@ snapshots: os-tmpdir@1.0.2: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.6 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -9185,7 +8910,7 @@ snapshots: p-limit@5.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-locate@4.1.0: dependencies: @@ -9201,25 +8926,26 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.0.0: + pac-proxy-agent@7.1.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4 - get-uri: 6.0.1 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.1 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - pac-resolver@7.0.0: + pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - ip: 1.1.8 netmask: 2.0.2 + package-json-from-dist@1.0.1: {} + param-case@2.1.1: dependencies: no-case: 2.3.2 @@ -9230,7 +8956,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9258,7 +8984,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 path-type@4.0.0: {} @@ -9272,7 +8998,9 @@ snapshots: pathval@1.1.1: {} - picocolors@1.0.0: {} + pathval@2.0.0: {} + + picocolors@1.0.1: {} picocolors@1.1.1: {} @@ -9284,68 +9012,66 @@ snapshots: pirates@4.0.6: {} - pkg-types@1.1.1: + pkg-types@1.3.0: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 + confbox: 0.1.8 + mlly: 1.7.3 pathe: 1.1.2 pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.38): + postcss-import@15.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.38 + postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.4.38): + postcss-js@4.0.1(postcss@8.4.49): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.38 + postcss: 8.4.49 - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): dependencies: - lilconfig: 3.1.1 - yaml: 2.4.5 + lilconfig: 3.1.3 + yaml: 2.6.1 optionalDependencies: - postcss: 8.4.38 - ts-node: 10.9.1(@types/node@20.11.24)(typescript@5.4.5) + postcss: 8.4.49 + ts-node: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) - postcss-nested@6.0.1(postcss@8.4.38): + postcss-nested@6.2.0(postcss@8.4.49): dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.1.0 + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.4.38: + postcss@8.4.49: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - - preact@10.20.1: {} + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 - preact@10.22.1: {} + preact@10.25.4: {} prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.6(prettier@3.2.5): + prettier-plugin-packagejson@2.5.6(prettier@3.4.2): dependencies: sort-package-json: 2.12.0 synckit: 0.9.2 optionalDependencies: - prettier: 3.2.5 + prettier: 3.4.2 - prettier@3.2.5: {} + prettier@3.4.2: {} pretty-format@29.7.0: dependencies: @@ -9361,16 +9087,18 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proxy-agent@6.3.0: + property-information@6.5.0: {} + + proxy-agent@6.5.0: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + agent-base: 7.1.3 + debug: 4.4.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.0 + pac-proxy-agent: 7.1.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.1 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -9380,11 +9108,11 @@ snapshots: punycode@1.4.1: {} - punycode@2.3.0: {} + punycode@2.3.1: {} - qs@6.12.1: + qs@6.13.1: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 querystringify@2.2.0: {} @@ -9403,7 +9131,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-hook-form@7.51.5(react@18.3.1): + react-hook-form@7.54.2(react@18.3.1): dependencies: react: 18.3.1 @@ -9411,33 +9139,45 @@ snapshots: react-is@18.3.1: {} - react-remove-scroll-bar@2.3.6(@types/react@18.2.61)(react@18.3.1): + react-refresh@0.14.2: {} + + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + react-remove-scroll@2.5.4(@types/react@18.3.18)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.2.61)(react@18.3.1) - tslib: 2.6.2 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - react-remove-scroll@2.5.5(@types/react@18.2.61)(react@18.3.1): + react-remove-scroll@2.6.2(@types/react@18.3.18)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.2.61)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.2.61)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.2.61)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.2.61)(react@18.3.1) + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - react-style-singleton@2.2.1(@types/react@18.2.61)(react@18.3.1): + react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): dependencies: get-nonce: 1.0.1 - invariant: 2.2.4 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 react@18.3.1: dependencies: @@ -9470,39 +9210,35 @@ snapshots: dependencies: picomatch: 2.3.1 - reflect.getprototypeof@1.0.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - - reflect.getprototypeof@1.0.8: + reflect.getprototypeof@1.0.9: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 dunder-proto: 1.0.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 gopd: 1.2.0 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.0: {} + regenerator-runtime@0.14.1: {} - regexp-tree@0.1.27: {} + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.1: + regex-utilities@2.3.0: {} + + regex@5.1.1: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - set-function-name: 2.0.1 + regex-utilities: 2.3.0 + + regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 @@ -9528,18 +9264,18 @@ snapshots: resolve@1.19.0: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9556,26 +9292,29 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.18.0: + rollup@4.29.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.29.1 + '@rollup/rollup-android-arm64': 4.29.1 + '@rollup/rollup-darwin-arm64': 4.29.1 + '@rollup/rollup-darwin-x64': 4.29.1 + '@rollup/rollup-freebsd-arm64': 4.29.1 + '@rollup/rollup-freebsd-x64': 4.29.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 + '@rollup/rollup-linux-arm-musleabihf': 4.29.1 + '@rollup/rollup-linux-arm64-gnu': 4.29.1 + '@rollup/rollup-linux-arm64-musl': 4.29.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 + '@rollup/rollup-linux-riscv64-gnu': 4.29.1 + '@rollup/rollup-linux-s390x-gnu': 4.29.1 + '@rollup/rollup-linux-x64-gnu': 4.29.1 + '@rollup/rollup-linux-x64-musl': 4.29.1 + '@rollup/rollup-win32-arm64-msvc': 4.29.1 + '@rollup/rollup-win32-ia32-msvc': 4.29.1 + '@rollup/rollup-win32-x64-msvc': 4.29.1 fsevents: 2.3.3 run-async@2.4.1: {} @@ -9590,14 +9329,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 - - safe-array-concat@1.0.1: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 + tslib: 2.8.1 safe-array-concat@1.1.3: dependencies: @@ -9609,11 +9341,10 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.0.0: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-regex: 1.1.4 + es-errors: 1.3.0 + isarray: 2.0.5 safe-regex-test@1.1.0: dependencies: @@ -9635,9 +9366,9 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.2: {} + + semver@7.6.3: {} sentence-case@2.1.1: dependencies: @@ -9649,14 +9380,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.1: - dependencies: - define-data-property: 1.1.4 - functions-have-names: 1.2.3 + get-intrinsic: 1.2.6 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -9672,9 +9397,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.9.0: + shiki@1.24.4: dependencies: - '@shikijs/core': 1.9.0 + '@shikijs/core': 1.24.4 + '@shikijs/engine-javascript': 1.24.4 + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 side-channel-list@1.0.0: dependencies: @@ -9696,13 +9426,6 @@ snapshots: object-inspect: 1.13.3 side-channel-map: 1.0.1 - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - side-channel@1.1.0: dependencies: es-errors: 1.3.0 @@ -9725,17 +9448,17 @@ snapshots: dependencies: no-case: 2.3.2 - socks-proxy-agent@8.0.1: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - socks: 2.7.1 + agent-base: 7.1.3 + debug: 4.4.0 + socks: 2.8.3 transitivePeerDependencies: - supports-color - socks@2.7.1: + socks@2.8.3: dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 sort-object-keys@1.1.3: {} @@ -9747,37 +9470,43 @@ snapshots: get-stdin: 9.0.0 git-hooks-list: 3.1.0 is-plain-obj: 4.1.0 - semver: 7.6.0 + semver: 7.6.3 sort-object-keys: 1.1.3 tinyglobby: 0.2.10 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.20 - spdx-exceptions@2.3.0: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.16: {} + spdx-license-ids@3.0.20: {} sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + + stable-hash@0.0.4: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 stackback@0.0.2: {} - std-env@3.7.0: {} + std-env@3.8.0: {} string-argv@0.3.2: {} @@ -9793,25 +9522,32 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.11: + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.8 + + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-symbols: 1.1.0 internal-slot: 1.1.0 regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.8 string.prototype.trim@1.2.10: dependencies: @@ -9819,22 +9555,10 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 has-property-descriptors: 1.0.2 - string.prototype.trim@1.2.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - - string.prototype.trimend@1.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 @@ -9842,12 +9566,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.3 - string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 @@ -9858,13 +9576,18 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -9880,15 +9603,15 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: + strip-literal@2.1.1: dependencies: - js-tokens: 9.0.0 + js-tokens: 9.0.1 sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 - glob: 10.4.1 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -9916,39 +9639,37 @@ snapshots: synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.2 + tslib: 2.8.1 - tailwind-merge@2.3.0: - dependencies: - '@babel/runtime': 7.24.7 + tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.4(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2))): dependencies: - tailwindcss: 3.4.4(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) - tailwindcss@3.4.4(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5)): + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.1 + fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.6 - lilconfig: 2.1.0 - micromatch: 4.0.5 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.38 - postcss-import: 15.1.0(postcss@8.4.38) - postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5)) - postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.1.0 - resolve: 1.22.8 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 sucrase: 3.35.0 transitivePeerDependencies: - ts-node @@ -9967,10 +9688,12 @@ snapshots: through@2.3.8: {} - tinybench@2.8.0: {} + tinybench@2.9.0: {} tinycolor2@1.6.0: {} + tinyexec@0.3.2: {} + tinyglobby@0.2.10: dependencies: fdir: 6.4.2(picomatch@4.0.2) @@ -9983,8 +9706,14 @@ snapshots: tinypool@0.8.4: {} + tinypool@1.0.2: {} + + tinyrainbow@1.2.0: {} + tinyspy@2.2.1: {} + tinyspy@3.0.2: {} + title-case@2.1.1: dependencies: no-case: 2.3.2 @@ -9994,45 +9723,33 @@ snapshots: dependencies: os-tmpdir: 1.0.2 - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-api-utils@1.0.2(typescript@5.4.5): - dependencies: - typescript: 5.4.5 - - ts-api-utils@1.3.0(typescript@5.3.3): - dependencies: - typescript: 5.3.3 - - ts-api-utils@1.3.0(typescript@5.4.5): - dependencies: - typescript: 5.4.5 + trim-lines@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.7.2): + ts-api-utils@1.4.3(typescript@5.7.2): dependencies: typescript: 5.7.2 ts-interface-checker@0.1.13: {} - ts-node@10.9.1(@types/node@20.11.24)(typescript@5.4.5): + ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.24 - acorn: 8.11.3 - acorn-walk: 8.2.0 + '@types/node': 22.10.2 + acorn: 8.14.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -10045,45 +9762,52 @@ snapshots: tslib@1.14.1: {} - tslib@2.6.2: {} + tslib@2.8.1: {} tsutils@3.21.0(typescript@5.7.2): dependencies: tslib: 1.14.1 typescript: 5.7.2 - turbo-darwin-64@2.0.4: + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + turbo-darwin-64@2.3.3: optional: true - turbo-darwin-arm64@2.0.4: + turbo-darwin-arm64@2.3.3: optional: true - turbo-linux-64@2.0.4: + turbo-linux-64@2.3.3: optional: true - turbo-linux-arm64@2.0.4: + turbo-linux-arm64@2.3.3: optional: true - turbo-windows-64@2.0.4: + turbo-windows-64@2.3.3: optional: true - turbo-windows-arm64@2.0.4: + turbo-windows-arm64@2.3.3: optional: true - turbo@2.0.4: + turbo@2.3.3: optionalDependencies: - turbo-darwin-64: 2.0.4 - turbo-darwin-arm64: 2.0.4 - turbo-linux-64: 2.0.4 - turbo-linux-arm64: 2.0.4 - turbo-windows-64: 2.0.4 - turbo-windows-arm64: 2.0.4 + turbo-darwin-64: 2.3.3 + turbo-darwin-arm64: 2.3.3 + turbo-linux-64: 2.3.3 + turbo-linux-arm64: 2.3.3 + turbo-windows-64: 2.3.3 + turbo-windows-arm64: 2.3.3 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} + type-detect@4.1.0: {} type-fest@0.20.2: {} @@ -10093,25 +9817,12 @@ snapshots: type-fest@0.8.1: {} - typed-array-buffer@1.0.0: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-typed-array: 1.1.12 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.0: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 @@ -10120,15 +9831,7 @@ snapshots: has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.0: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - - typed-array-byte-offset@1.0.3: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -10136,13 +9839,7 @@ snapshots: gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.8 - - typed-array-length@1.0.4: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - is-typed-array: 1.1.12 + reflect.getprototypeof: 1.0.9 typed-array-length@1.0.7: dependencies: @@ -10151,64 +9848,77 @@ snapshots: gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.8 + reflect.getprototypeof: 1.0.9 - typedoc-plugin-markdown@4.1.0(typedoc@0.26.2(typescript@5.4.5)): + typedoc-plugin-markdown@4.3.3(typedoc@0.26.11(typescript@5.7.2)): dependencies: - typedoc: 0.26.2(typescript@5.4.5) + typedoc: 0.26.11(typescript@5.7.2) - typedoc@0.26.2(typescript@5.4.5): + typedoc@0.26.11(typescript@5.7.2): dependencies: lunr: 2.3.9 markdown-it: 14.1.0 - minimatch: 9.0.4 - shiki: 1.9.0 - typescript: 5.4.5 - yaml: 2.4.5 + minimatch: 9.0.5 + shiki: 1.24.4 + typescript: 5.7.2 + yaml: 2.6.1 - typescript-eslint@8.18.1(eslint@8.57.1)(typescript@5.4.5): + typescript-eslint@8.18.2(eslint@8.57.1)(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@8.57.1)(typescript@5.4.5))(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/parser': 8.18.1(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/utils': 8.18.1(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.2(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 - typescript: 5.4.5 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - typescript@5.3.3: {} - typescript@5.4.2: {} - typescript@5.4.5: {} - typescript@5.7.2: {} uc.micro@2.1.0: {} - ufo@1.5.3: {} + ufo@1.5.4: {} - uglify-js@3.18.0: + uglify-js@3.19.3: optional: true - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} + undici-types@6.20.0: {} - universalify@0.1.2: {} + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 - universalify@2.0.0: {} + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 - update-browserslist-db@1.0.13(browserslist@4.23.0): + unist-util-visit@5.0.0: dependencies: - browserslist: 4.23.0 - escalade: 3.1.1 - picocolors: 1.0.0 + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@0.1.2: {} + + universalify@2.0.1: {} update-browserslist-db@1.1.1(browserslist@4.24.3): dependencies: @@ -10229,32 +9939,32 @@ snapshots: uri-js@4.4.1: dependencies: - punycode: 2.3.0 + punycode: 2.3.1 url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - url@0.11.3: + url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.12.1 + qs: 6.13.1 - use-callback-ref@1.3.2(@types/react@18.2.61)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): dependencies: react: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 - use-sidecar@1.1.2(@types/react@18.2.61)(react@18.3.1): + use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 optionalDependencies: - '@types/react': 18.2.61 + '@types/react': 18.3.18 util-deprecate@1.0.2: {} @@ -10269,118 +9979,165 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.0: - dependencies: - builtins: 5.0.1 + validate-npm-package-name@5.0.1: {} validator@13.12.0: {} - vite-node@1.4.0(@types/node@20.11.24): + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@1.6.0(@types/node@22.10.2): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.11(@types/node@22.10.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@2.1.8(@types/node@22.10.2): dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.4.0 + es-module-lexer: 1.6.0 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.2.12(@types/node@20.11.24) + vite: 5.4.11(@types/node@22.10.2) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite-plugin-commonjs@0.10.1: + vite-plugin-commonjs@0.10.4: dependencies: - acorn: 8.11.3 - fast-glob: 3.3.1 - magic-string: 0.30.10 - vite-plugin-dynamic-import: 1.5.0 + acorn: 8.14.0 + magic-string: 0.30.17 + vite-plugin-dynamic-import: 1.6.0 - vite-plugin-dts@3.9.1(@types/node@20.11.24)(rollup@4.18.0)(typescript@5.4.5)(vite@5.2.12(@types/node@20.11.24)): + vite-plugin-dts@3.9.1(@types/node@22.10.2)(rollup@4.29.1)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.11.24) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@vue/language-core': 1.8.27(typescript@5.4.5) - debug: 4.3.4 + '@microsoft/api-extractor': 7.43.0(@types/node@22.10.2) + '@rollup/pluginutils': 5.1.4(rollup@4.29.1) + '@vue/language-core': 1.8.27(typescript@5.7.2) + debug: 4.4.0 kolorist: 1.8.0 - magic-string: 0.30.10 - typescript: 5.4.5 - vue-tsc: 1.8.27(typescript@5.4.5) + magic-string: 0.30.17 + typescript: 5.7.2 + vue-tsc: 1.8.27(typescript@5.7.2) optionalDependencies: - vite: 5.2.12(@types/node@20.11.24) + vite: 5.4.11(@types/node@22.10.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dynamic-import@1.5.0: - dependencies: - acorn: 8.12.0 - es-module-lexer: 1.5.3 - fast-glob: 3.3.1 - magic-string: 0.30.10 - - vite-plugin-singlefile@2.0.1(rollup@4.18.0)(vite@5.2.12(@types/node@20.11.24)): - dependencies: - micromatch: 4.0.5 - rollup: 4.18.0 - vite: 5.2.12(@types/node@20.11.24) - - vite-plugin-singlefile@2.0.1(rollup@4.18.0)(vite@5.2.6(@types/node@20.11.24)): + vite-plugin-dynamic-import@1.6.0: dependencies: - micromatch: 4.0.5 - rollup: 4.18.0 - vite: 5.2.6(@types/node@20.11.24) + acorn: 8.14.0 + es-module-lexer: 1.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.17 - vite@5.2.12(@types/node@20.11.24): + vite-plugin-singlefile@2.1.0(rollup@4.29.1)(vite@5.4.11(@types/node@22.10.2)): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.18.0 - optionalDependencies: - '@types/node': 20.11.24 - fsevents: 2.3.3 + micromatch: 4.0.8 + rollup: 4.29.1 + vite: 5.4.11(@types/node@22.10.2) - vite@5.2.6(@types/node@20.11.24): + vite@5.4.11(@types/node@22.10.2): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.18.0 + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.29.1 optionalDependencies: - '@types/node': 20.11.24 + '@types/node': 22.10.2 fsevents: 2.3.3 - vitest@1.4.0(@types/node@20.11.24): + vitest@1.6.0(@types/node@22.10.2): dependencies: - '@vitest/expect': 1.4.0 - '@vitest/runner': 1.4.0 - '@vitest/snapshot': 1.4.0 - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.0 execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.10 + local-pkg: 0.5.1 + magic-string: 0.30.17 pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 + picocolors: 1.1.1 + std-env: 3.8.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.2.12(@types/node@20.11.24) - vite-node: 1.4.0(@types/node@20.11.24) - why-is-node-running: 2.2.2 + vite: 5.4.11(@types/node@22.10.2) + vite-node: 1.6.0(@types/node@22.10.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vitest@2.1.8(@types/node@22.10.2): + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@22.10.2) + vite-node: 2.1.8(@types/node@22.10.2) + why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.11.24 + '@types/node': 22.10.2 transitivePeerDependencies: - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color @@ -10391,25 +10148,17 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - vue-tsc@1.8.27(typescript@5.4.5): + vue-tsc@1.8.27(typescript@5.7.2): dependencies: '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.4.5) - semver: 7.6.0 - typescript: 5.4.5 + '@vue/language-core': 1.8.27(typescript@5.7.2) + semver: 7.6.3 + typescript: 5.7.2 wcwidth@1.0.1: dependencies: defaults: 1.0.4 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -10418,43 +10167,21 @@ snapshots: is-string: 1.1.1 is-symbol: 1.1.1 - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 - which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 - function.prototype.name: 1.1.6 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.0.10 is-regex: 1.2.1 - is-weakref: 1.0.2 + is-weakref: 1.1.0 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.17 - - which-collection@1.0.1: - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: @@ -10463,15 +10190,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.13: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - - which-typed-array@1.1.17: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -10484,11 +10203,13 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wordwrap@1.0.0: {} wrap-ansi@6.2.0: @@ -10515,13 +10236,13 @@ snapshots: yallist@4.0.0: {} - yaml@2.4.5: {} + yaml@2.6.1: {} yn@3.1.1: {} yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yocto-queue@1.1.1: {} z-schema@5.0.5: dependencies: @@ -10531,4 +10252,6 @@ snapshots: optionalDependencies: commander: 9.5.0 - zod@3.23.8: {} + zod@3.24.1: {} + + zwitch@2.0.4: {} diff --git a/turbo.json b/turbo.json index af27610..6edc4f3 100644 --- a/turbo.json +++ b/turbo.json @@ -4,7 +4,18 @@ "tasks": { "build": { "dependsOn": ["^build"], - "outputs": [".next/**", "!.next/cache/**"] + "outputs": [ + ".next/**", + "!.next/cache/**", + "dist/**", + "**/dist/**" + ] + }, + "@repo/utils#build": { + "outputs": [] + }, + "@repo/config#build": { + "outputs": [] }, "lint": { "dependsOn": ["^lint"]