From 5f3256e52314c5de2bc325056c5148dfffbee8d8 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:16:09 +0530 Subject: [PATCH 01/40] Add migration plan --- TYPESCRIPT_MIGRATION_PLAN.md | 1433 ++++++++++++++++++++++++++++++++++ 1 file changed, 1433 insertions(+) create mode 100644 TYPESCRIPT_MIGRATION_PLAN.md diff --git a/TYPESCRIPT_MIGRATION_PLAN.md b/TYPESCRIPT_MIGRATION_PLAN.md new file mode 100644 index 000000000..8c200b673 --- /dev/null +++ b/TYPESCRIPT_MIGRATION_PLAN.md @@ -0,0 +1,1433 @@ +# TypeScript Migration Plan for Xola UI Kit + +## Executive Summary + +This document outlines a comprehensive, phased approach to migrate the Xola UI Kit from PropTypes to TypeScript. The migration will convert ~370 JavaScript/JSX files to TypeScript while ensuring Storybook continues to function properly. + +--- + +## Current State Analysis + +### Codebase Overview +- **Total Files**: ~370 JS/JSX files in src/ +- **Components**: 67 component files (.jsx) +- **Icons**: 229 icon files (.jsx) +- **Stories**: ~52 Storybook story files (.stories.js) +- **PropTypes Usage**: 381 lines with PropTypes declarations +- **defaultProps Usage**: 8 instances +- **React Version**: 17.0.2 +- **Build Tool**: Vite 3.0.8 +- **Storybook Version**: 6.5.10 +- **TypeScript**: Already in devDependencies (v4.9.5) but not configured + +### Key Patterns Identified +1. **Component Patterns**: + - Functional components with PropTypes + - forwardRef usage for input components + - Compound components (Modal.Header, Tabs.Tab, Sidebar.Menu, etc.) + - Higher-order component pattern (createIcon helper) + - Custom prop validators + +2. **PropTypes Patterns**: + - Basic types: string, bool, func, node, number + - oneOf for enums + - oneOfType for union types + - Custom validators (e.g., Button icon validator) + - Spread PropTypes from parent components + - isRequired flags + +3. **File Types**: + - Components: PropTypes needed → TypeScript interfaces + - Helpers: No PropTypes → Type annotations only + - Hooks: No PropTypes → TypeScript generics + - Icons: Simple PropTypes → Generic icon props interface + +### Build & Deployment Considerations +- CI/CD with GitHub Actions (ESLint checks) +- Published as two packages: @xola/ui-kit and @xola/icons +- Builds to UMD and ESM formats via Vite +- Type definitions file (index.d.ts) exists but needs regeneration +- Storybook needs TypeScript support + +--- + +## Migration Strategy + +### Approach: Incremental, Bottom-Up Migration + +We'll use an incremental migration strategy starting from the most fundamental pieces (helpers, hooks, utilities) and working up to complex components. This approach: +- Minimizes risk by keeping the codebase functional at all times +- Allows testing at each phase +- Provides immediate value as types are added +- Enables team members to learn TypeScript gradually + +--- + +## Phase 1: Foundation Setup + +### 1.1 Configure TypeScript + +**Files to Create/Modify:** +- `tsconfig.json` (new) +- `tsconfig.build.json` (new, for build-specific settings) +- `package.json` (update scripts) + +**TypeScript Configuration Strategy:** +```json +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "node", + "jsx": "react", + "declaration": true, + "declarationMap": true, + "outDir": "./dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "noUnusedLocals": false, // Start lenient, tighten later + "noUnusedParameters": false, // Start lenient, tighten later + "allowJs": true, // Critical for incremental migration + "checkJs": false, // Don't check JS files initially + "isolatedModules": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "build", "dist", "storybook-static"] +} +``` + +**Key Configuration Decisions:** +- `allowJs: true` - Essential for incremental migration +- `checkJs: false` - Avoid errors in unmigrated JS files +- `strict: true` - Enforce best practices from the start +- `jsx: "react"` - Match current React 17 usage +- `declaration: true` - Auto-generate .d.ts files + +### 1.2 Update Build Configuration + +**Vite Configuration (`vite.config.js` → `vite.config.ts`):** +```typescript +import path from "path"; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import dts from "vite-plugin-dts"; +import pkg from "./package.json"; + +const dependencies = Object.keys(pkg.dependencies); +const devDependencies = Object.keys(pkg.devDependencies); + +export default defineConfig({ + plugins: [ + react(), + dts({ + insertTypesEntry: true, + include: ["src/**/*"], + exclude: ["src/**/*.stories.*", "src/**/*.test.*"], + }), + ], + build: { + outDir: "build", + lib: { + entry: path.resolve(__dirname, "src/index.ts"), + name: "XolaUIKit", + }, + rollupOptions: { + external: [...dependencies, ...devDependencies], + }, + }, +}); +``` + +**Required Vite Plugins:** +- `@vitejs/plugin-react` - React support +- `vite-plugin-dts` - Auto-generate TypeScript declarations + +### 1.3 Configure Storybook for TypeScript + +**Files to Update:** +- `.storybook/main.js` → `.storybook/main.ts` +- `.storybook/preview.js` → `.storybook/preview.tsx` + +**Storybook Main Config:** +```typescript +import type { StorybookConfig } from "@storybook/react/types"; + +const config: StorybookConfig = { + stories: ["../src/**/*.stories.@(js|jsx|ts|tsx|mdx)"], + core: { + disableTelemetry: true, + }, + addons: [ + "@storybook/addon-postcss", + "@storybook/addon-links", + "storybook-css-modules-preset", + "storybook-addon-designs", + { + name: "@storybook/addon-essentials", + options: { + backgrounds: false, + }, + }, + ], + typescript: { + check: false, // Use tsc separately for type checking + reactDocgen: "react-docgen-typescript", + reactDocgenTypescriptOptions: { + shouldExtractLiteralValuesFromEnum: true, + propFilter: (prop) => { + if (prop.parent) { + return !prop.parent.fileName.includes("node_modules"); + } + return true; + }, + }, + }, +}; + +export default config; +``` + +### 1.4 Update ESLint Configuration + +**Install TypeScript ESLint packages:** +```bash +npm install --save-dev @typescript-eslint/parser @typescript-eslint/eslint-plugin +``` + +**Update ESLint to support TypeScript:** +- Work with @xola/jslint to add TypeScript support OR +- Create local ESLint override for .ts/.tsx files + +### 1.5 Update Package Scripts + +**package.json script updates:** +```json +{ + "scripts": { + "prepare": "node scripts/prepare && vite build", + "type-check": "tsc --noEmit", + "type-check:watch": "tsc --noEmit --watch", + "build": "npm run type-check && npm run prepare && vite build", + "lint": "xola-lint src --ext .js,.jsx,.ts,.tsx --ignore src/stories", + "lint:fix": "xola-lint src --ext .js,.jsx,.ts,.tsx --fix --ignore src/stories" + } +} +``` + +**Estimated Time**: 1-2 days +**Risk Level**: Medium (configuration issues may arise) +**Testing**: Ensure build and Storybook still work with empty TypeScript support + +--- + +## Phase 2: Create Type Definitions Foundation + +### 2.1 Define Common Types and Interfaces + +**Create `src/types/index.ts`:** +```typescript +import { ComponentPropsWithoutRef, ElementType, ReactNode } from "react"; + +// Common size types used across components +export type Size = "tiny" | "small" | "medium" | "large" | "huge"; + +// Common color types used across components +export type Color = "primary" | "secondary" | "success" | "warning" | "caution" | "danger"; + +// Common variant types +export type Variant = "standard" | "outline" | "link"; + +// Polymorphic component props helper +export type PolymorphicComponentProps = P & + Omit, keyof P> & { + as?: T; + }; + +// Common props shared across components +export interface CommonComponentProps { + className?: string; + children?: ReactNode; +} + +// Icon props +export interface IconProps extends ComponentPropsWithoutRef<"svg"> { + size?: "tiny" | "small" | "medium" | "large"; + className?: string; +} +``` + +### 2.2 Create Migration Utility Types + +**Create `src/types/migration.ts`:** +```typescript +// Utility type for components still being migrated +export type TODO_MIGRATE = any; + +// Use this for complex types during migration +export type FIXME = any; +``` + +**Estimated Time**: 1 day +**Risk Level**: Low +**Testing**: Types should compile without errors + +--- + +## Phase 3: Migrate Helpers and Utilities (No Components) + +### Priority: High | Complexity: Low | Impact: Foundation for other files + +### 3.1 Migrate Helper Files + +**Files to Migrate** (in order): +1. `src/helpers/avatar.ts` (+ update test file) +2. `src/helpers/browser.ts` +3. `src/helpers/children.ts` +4. `src/helpers/currency.ts` +5. `src/helpers/date.ts` +6. `src/helpers/numbers.ts` +7. `src/helpers/phone.ts` + +**Example Migration - numbers.js → numbers.ts:** + +Before: +```javascript +export const almostZero = (number) => { + const absAmount = Math.abs(number); + return absAmount >= 0 && absAmount <= 0.001; +}; +``` + +After: +```typescript +export const almostZero = (number: number): boolean => { + const absAmount = Math.abs(number); + return absAmount >= 0 && absAmount <= 0.001; +}; + +export const numberFormat = ( + amount: number, + currency: string | null = null, + locale: string = getUserLocale(), + maximumFractionDigits: number = 2, + isCompact: boolean = false, + isNarrowSymbolForm: boolean = false, +): string => { + // ... implementation +}; + +export const roundNumber = (currency: string, amount: number): number => { + // ... implementation +}; + +export const compactNumber = (value: number, locale: string = getUserLocale()): string => { + // ... implementation +}; +``` + +**Migration Pattern for Helpers:** +1. Rename `.js` → `.ts` +2. Add parameter types +3. Add return types +4. Update any imports in test files +5. Run `npm run type-check` to verify + +**Estimated Time**: 2-3 days +**Risk Level**: Low +**Testing**: Run existing Jest tests, verify type checking passes + +### 3.2 Migrate Hook Files + +**Files to Migrate:** +1. `src/hooks/useId.ts` +2. `src/hooks/useIsClient.ts` +3. `src/hooks/useViewportHeight.ts` + +**Example Migration - useId.js → useId.ts:** + +Before: +```javascript +export const useId = (prefix) => { + const { generateId } = useContext(Context); + const [id] = useState(() => `${prefix}-${generateId()}`); + return id; +}; +``` + +After: +```typescript +export const useId = (prefix: string): string => { + const { generateId } = useContext(Context); + const [id] = useState(() => `${prefix}-${generateId()}`); + return id; +}; +``` + +**Estimated Time**: 1 day +**Risk Level**: Low +**Testing**: Type checking + existing usage in components + +--- + +## Phase 4: Migrate Icon Components + +### Priority: High | Complexity: Low | Impact: Used everywhere + +### 4.1 Migrate Icon Helper + +**File: `src/icons/src/helpers/icon.jsx` → `icon.tsx`** + +Before: +```javascript +export const createIcon = (Icon) => { + const IconContainer = ({ size = "small", className, ...rest }) => { + return ; + }; + + IconContainer.propTypes = { + size: PropTypes.oneOf(Object.keys(iconSizes)), + className: PropTypes.string, + }; + + return IconContainer; +}; +``` + +After: +```typescript +import { IconProps } from "../../../types"; + +export const createIcon = (Icon: React.ComponentType>) => { + const IconContainer = ({ size = "small", className, ...rest }: IconProps) => { + return ; + }; + + return IconContainer; +}; +``` + +### 4.2 Migrate Icon Components (229 files) + +**Strategy**: Use a script or find-replace pattern since icons follow the same pattern + +**Files**: `src/icons/src/*.jsx` → `*.tsx` + +**Migration Pattern:** +1. Rename `.jsx` → `.tsx` +2. Remove PropTypes import +3. Add IconProps type from createIcon helper +4. Verify no custom PropTypes exist + +**Script Approach:** +```bash +# Find all icon files +find src/icons/src -name "*.jsx" -type f | while read file; do + # Rename to .tsx + mv "$file" "${file%.jsx}.tsx" +done +``` + +Then manually: +- Remove `import PropTypes from "prop-types";` +- Update createIcon to provide types automatically + +**Estimated Time**: 2-3 days (mostly automated) +**Risk Level**: Low (highly repetitive pattern) +**Testing**: Storybook icons page, visual regression with Chromatic + +--- + +## Phase 5: Migrate Simple Components + +### Priority: High | Complexity: Low-Medium | Impact: Foundation for complex components + +### 5.1 Migrate Atomic Components (No Dependencies) + +**Migration Order:** +1. `src/components/Avatar.jsx` → `Avatar.tsx` +2. `src/components/Badge.jsx` → `Badge.tsx` +3. `src/components/Tag.jsx` → `Tag.tsx` +4. `src/components/Logo.jsx` → `Logo.tsx` +5. `src/components/Key.jsx` → `Key.tsx` +6. `src/components/Spinner.jsx` → `Spinner.tsx` +7. `src/components/Skeleton.jsx` → `Skeleton.tsx` +8. `src/components/Counter.jsx` → `Counter.tsx` +9. `src/components/Breadcrumb.jsx` → `Breadcrumb.tsx` +10. `src/components/Breakdown.jsx` → `Breakdown.tsx` + +**Example Migration - Avatar.jsx → Avatar.tsx:** + +Before: +```javascript +export const Avatar = ({ className, name, color = "bg-primary-lighter", size = "large", ...rest }) => { + // ... implementation +}; + +Avatar.propTypes = { + className: PropTypes.string, + color: PropTypes.string, + name: PropTypes.string, + size: PropTypes.oneOf(Object.keys(sizes)), +}; +``` + +After: +```typescript +const sizes = { + tiny: "h-7 w-7 text-base", + small: "h-10 w-10 text-base", + medium: "h-12 w-12 text-md", + large: "h-15 w-15 text-xl", +} as const; + +type AvatarSize = keyof typeof sizes; + +export interface AvatarProps extends React.HTMLAttributes { + className?: string; + name?: string; + color?: string; + size?: AvatarSize; +} + +export const Avatar = ({ className, name, color = "bg-primary-lighter", size = "large", ...rest }: AvatarProps) => { + // ... implementation +}; +``` + +**Migration Checklist per Component:** +- [ ] Create interface for props +- [ ] Define const objects with `as const` for type inference +- [ ] Extract union types from const objects (e.g., `keyof typeof sizes`) +- [ ] Replace PropTypes with TypeScript interface +- [ ] Remove PropTypes import +- [ ] Remove defaultProps (use default parameters instead) +- [ ] Update any JSDoc comments to TSDoc format +- [ ] Test component in Storybook + +**Estimated Time**: 5-7 days +**Risk Level**: Medium +**Testing**: Each component's Storybook story + +--- + +## Phase 6: Migrate Form Components + +### Priority: High | Complexity: Medium | Impact: Critical UI components + +### 6.1 Migrate Base Form Components + +**Migration Order:** +1. `src/components/Forms/Label.jsx` → `Label.tsx` +2. `src/components/Forms/BaseInput.jsx` → `BaseInput.tsx` (uses forwardRef) +3. `src/components/Forms/Input.jsx` → `Input.tsx` (depends on BaseInput) +4. `src/components/Forms/Textarea.jsx` → `Textarea.tsx` (depends on BaseInput) +5. `src/components/Forms/FormGroup.jsx` → `FormGroup.tsx` + +**Example Migration - BaseInput with forwardRef:** + +Before: +```javascript +export const BaseInput = forwardRef( + ({ as: Tag, size = "medium", isError, className, isRequired, value, prefix, suffix, ...rest }, ref) => { + // ... implementation + } +); + +BaseInput.propTypes = { + as: PropTypes.oneOfType([PropTypes.string, PropTypes.elementType]), + size: PropTypes.oneOf(Object.keys(sizes)), + className: PropTypes.string, + isError: PropTypes.bool, + isRequired: PropTypes.bool, + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + prefix: PropTypes.string, + suffix: PropTypes.string, +}; + +BaseInput.defaultProps = { + as: "input", + size: "medium", + className: "", + isError: false, + isRequired: false, +}; +``` + +After: +```typescript +import { forwardRef, ElementType, ComponentPropsWithoutRef } from "react"; +import { PolymorphicComponentProps } from "../../types"; + +const sizes = { + small: "px-3 py-1.5 text-sm leading-sm", + medium: "px-3 py-2.5 text-base leading-base", + large: "px-5 py-3.5 text-md leading-md", +} as const; + +type BaseInputSize = keyof typeof sizes; + +interface BaseInputOwnProps { + size?: BaseInputSize; + isError?: boolean; + isRequired?: boolean; + value?: string | number; + prefix?: string; + suffix?: string; +} + +export type BaseInputProps = PolymorphicComponentProps; + +export const BaseInput = forwardRef( + ( + { + as, + size = "medium", + isError = false, + className, + isRequired = false, + value, + prefix, + suffix, + ...rest + }: BaseInputProps, + ref: React.ForwardedRef + ) => { + const Tag = as || "input"; + // ... implementation + } +) as ( + props: BaseInputProps & { ref?: React.ForwardedRef } +) => React.ReactElement; +``` + +### 6.2 Migrate Complex Form Components + +**Files:** +1. `src/components/Forms/Checkbox.jsx` → `Checkbox.tsx` +2. `src/components/Forms/Switch.jsx` → `Switch.tsx` +3. `src/components/Forms/Select.jsx` → `Select.tsx` +4. `src/components/Forms/ComboBox.jsx` → `ComboBox.tsx` +5. `src/components/Forms/RangeSlider.jsx` → `RangeSlider.tsx` +6. `src/components/Forms/InlineValuePopover.jsx` → `InlineValuePopover.tsx` +7. `src/components/Forms/ValuePopoverText.jsx` → `ValuePopoverText.tsx` + +**Special Considerations:** +- ComboBox uses Downshift library - ensure types are imported +- Select uses react-select - import types from '@types/react-select' +- RangeSlider uses nouislider-react - may need custom type declarations + +**Estimated Time**: 7-10 days +**Risk Level**: Medium-High (complex components with third-party dependencies) +**Testing**: Full form testing in Storybook, manual interaction testing + +--- + +## Phase 7: Migrate Button Components + +### Priority: High | Complexity: Medium | Impact: Most used component + +**Files:** +1. `src/components/Buttons/Button.jsx` → `Button.tsx` +2. `src/components/Buttons/SubmitButton.jsx` → `SubmitButton.tsx` +3. `src/components/Buttons/ToggleButton.jsx` → `ToggleButton.tsx` +4. `src/components/Buttons/ButtonGroup.jsx` → `ButtonGroup.tsx` + +**Example Migration - Button with Custom Validator:** + +Before: +```javascript +Button.propTypes = { + color: PropTypes.oneOf(Object.keys(colors.outline)), + variant: PropTypes.oneOf(Object.keys(colors)), + size: PropTypes.oneOf(Object.keys(sizes)), + className: PropTypes.string, + children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), + icon(props, ...rest) { + if (props.icon && !props.children) { + return new Error("You are using an icon without specifying children..."); + } + return PropTypes.element(props, ...rest); + }, + iconPlacement: PropTypes.string, +}; +``` + +After: +```typescript +const colors = { + standard: { /* ... */ }, + outline: { /* ... */ }, + link: { /* ... */ }, +} as const; + +const sizes = { + tiny: "px-2 py-0.5 text-xs leading-xs", + small: "px-3 py-2 h-7.5 text-sm leading-sm", + medium: "px-4.5 py-3 h-10 text-base leading-base", + large: "px-6 py-4 h-[50px] text-md leading-md", +} as const; + +type ButtonVariant = keyof typeof colors; +type ButtonColor = keyof typeof colors.outline; +type ButtonSize = keyof typeof sizes; + +export interface ButtonProps { + as?: T; + variant?: ButtonVariant; + color?: ButtonColor; + size?: ButtonSize; + icon?: React.ReactElement; + iconPlacement?: "left" | "right"; + className?: string; + children: React.ReactNode; // Required - enforced by TypeScript +} + +export const Button = ({ + as, + variant = "standard", + color = "primary", + size = "medium", + icon, + iconPlacement = "left", + className, + children, + ...rest +}: ButtonProps & Omit, keyof ButtonProps>) => { + const Tag = (as || "button") as ElementType; + + // Runtime validation if icon is present without children + if (process.env.NODE_ENV !== "production") { + if (icon && !children) { + console.error("UI Kit: You are using an icon without specifying children..."); + } + } + + return ( + + {/* ... */} + + ); +}; +``` + +**Estimated Time**: 3-4 days +**Risk Level**: Medium +**Testing**: Extensive Storybook stories testing all variants + +--- + +## Phase 8: Migrate Complex Components with Compound Patterns + +### Priority: Medium | Complexity: High | Impact: Complex but isolated + +### 8.1 Migrate Modal Component + +**Files:** +- `src/components/Modal.jsx` → `Modal.tsx` + +**Compound Component Pattern in TypeScript:** + +```typescript +const sizes = { /* ... */ } as const; +const positions = { /* ... */ } as const; + +type ModalSize = keyof typeof sizes; +type ModalPosition = keyof typeof positions; + +export interface ModalProps { + size?: ModalSize; + position?: ModalPosition; + isOpen: boolean; + shouldCloseOnOutsideClick?: boolean; + onClose: () => void; + children: React.ReactNode; + className?: string; +} + +export const Modal = ({ /* ... */ }: ModalProps) => { + // ... implementation +}; + +// Subcomponents +interface ModalHeaderProps { + children: React.ReactNode; + description?: string; + className?: string; +} + +const Header = ({ children, description, className, ...rest }: ModalHeaderProps) => { + // ... implementation +}; + +Header.displayName = "Modal.Header"; + +interface ModalBodyProps extends React.HTMLAttributes {} + +const Body = ({ className, ...rest }: ModalBodyProps) => { + // ... implementation +}; + +Body.displayName = "Modal.Body"; + +interface ModalFooterProps extends React.HTMLAttributes {} + +const Footer = ({ className, ...rest }: ModalFooterProps) => { + // ... implementation +}; + +Footer.displayName = "Modal.Footer"; + +// Attach subcomponents +Modal.Header = Header; +Modal.Body = Body; +Modal.Footer = Footer; + +// Export with proper typing +export type { ModalHeaderProps, ModalBodyProps, ModalFooterProps }; +``` + +### 8.2 Migrate Tab Components + +**Files:** +- `src/components/Tabs/Tabs.jsx` → `Tabs.tsx` +- `src/components/Tabs/Tabs.Tab.jsx` → `Tabs.Tab.tsx` +- `src/components/Tabs/Tabs.Panel.jsx` → `Tabs.Panel.tsx` +- `src/components/Tabs/index.js` → `index.ts` + +### 8.3 Migrate Sidebar Components + +**Files:** +- `src/components/Sidebar/Sidebar.jsx` → `Sidebar.tsx` +- `src/components/Sidebar/Sidebar.Account.jsx` → `Sidebar.Account.tsx` +- `src/components/Sidebar/Sidebar.Button.jsx` → `Sidebar.Button.tsx` +- `src/components/Sidebar/Sidebar.Footer.jsx` → `Sidebar.Footer.tsx` +- `src/components/Sidebar/Sidebar.Heading.jsx` → `Sidebar.Heading.tsx` +- `src/components/Sidebar/Sidebar.Link.jsx` → `Sidebar.Link.tsx` +- `src/components/Sidebar/Sidebar.Menu.jsx` → `Sidebar.Menu.tsx` +- `src/components/Sidebar/index.js` → `index.ts` + +### 8.4 Migrate Other Complex Components + +**Files:** +1. `src/components/Popover/` (directory) +2. `src/components/DatePicker/` (directory) +3. `src/components/Dot/` (directory) +4. `src/components/Table.jsx` → `Table.tsx` +5. `src/components/Tooltip.jsx` → `Tooltip.tsx` +6. `src/components/Drawer.jsx` → `Drawer.tsx` +7. `src/components/Alert.jsx` → `Alert.tsx` + +**Estimated Time**: 10-14 days +**Risk Level**: High (complex component logic) +**Testing**: Comprehensive Storybook testing, interaction testing, visual regression + +--- + +## Phase 9: Migrate Remaining Components + +### Priority: Medium | Complexity: Medium | Impact: Completion + +**Files:** +1. `src/components/Animation/` (FadeIn, SlideDown) +2. `src/components/Charts/` (Chart options) +3. `src/components/Search.jsx` → `Search.tsx` +4. `src/components/HeaderToolbar.jsx` → `HeaderToolbar.tsx` +5. `src/components/GooglePlacesAutocomplete.jsx` → `GooglePlacesAutocomplete.tsx` +6. `src/components/ImageUpload.jsx` → `ImageUpload.tsx` +7. `src/components/Screens/Login.jsx` → `Login.tsx` +8. `src/components/Utilities/` (Currency, Phone, Number) + +**Estimated Time**: 5-7 days +**Risk Level**: Medium +**Testing**: Individual Storybook stories + +--- + +## Phase 10: Migrate Stories to TypeScript + +### Priority: Low | Complexity: Low | Impact: Better dev experience + +**Strategy:** +- Migrate stories incrementally as components are migrated +- Use TypeScript story format with typed args + +**Example Migration:** + +Before (Button.stories.js): +```javascript +const ButtonStories = { + title: "Forms & Fields/Buttons/Button", + component: Button, + args: { + as: "button", + size: "medium", + }, + argTypes: { + size: { + options: ["tiny", "small", "medium", "large"], + control: { type: "select" }, + }, + }, +}; + +export default ButtonStories; + +export const Default = (props) => ; +``` + +After (Button.stories.tsx): +```typescript +import { Meta, StoryObj } from "@storybook/react"; +import { Button, ButtonProps } from "../.."; + +const meta: Meta = { + title: "Forms & Fields/Buttons/Button", + component: Button, + args: { + as: "button", + size: "medium", + }, + argTypes: { + size: { + options: ["tiny", "small", "medium", "large"], + control: { type: "select" }, + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: "Default", + }, +}; + +export const Colors: Story = { + render: () => ( +
+ + + {/* ... */} +
+ ), +}; +``` + +**Estimated Time**: 5-7 days (can be done in parallel with components) +**Risk Level**: Low +**Testing**: Storybook should render correctly + +--- + +## Phase 11: Update Entry Points and Exports + +### Priority: High | Complexity: Medium | Impact: Package consumers + +### 11.1 Update Main Entry Point + +**File: `src/index.js` → `src/index.ts`** + +Before: +```javascript +// Components +export { FadeIn } from "./components/Animation/FadeIn"; +export { SlideDown } from "./components/Animation/SlideDown"; +export { Button } from "./components/Buttons/Button"; +// ... 70+ more exports +``` + +After: +```typescript +// Components +export { FadeIn } from "./components/Animation/FadeIn"; +export { SlideDown } from "./components/Animation/SlideDown"; +export { Button } from "./components/Buttons/Button"; +export type { ButtonProps } from "./components/Buttons/Button"; +// ... export types for all components + +// Export common types +export type { Size, Color, Variant } from "./types"; +``` + +### 11.2 Update Package Exports + +**File: `package.json`** + +Before: +```json +{ + "main": "build/ui-kit.umd.js", + "module": "build/ui-kit.mjs", + "types": "index.d.ts" +} +``` + +After: +```json +{ + "main": "build/ui-kit.umd.js", + "module": "build/ui-kit.mjs", + "types": "build/index.d.ts", + "exports": { + ".": { + "import": "./build/ui-kit.mjs", + "require": "./build/ui-kit.umd.js", + "types": "./build/index.d.ts" + }, + "./package.json": "./package.json" + } +} +``` + +### 11.3 Remove PropTypes Dependency + +**After all components are migrated:** + +```bash +npm uninstall prop-types +``` + +Update package.json to remove prop-types from dependencies. + +**Estimated Time**: 2-3 days +**Risk Level**: High (breaks if types are incorrect) +**Testing**: Build package, test in consuming applications + +--- + +## Phase 12: Cleanup and Optimization + +### Priority: Medium | Complexity: Low | Impact: Code quality + +### 12.1 Enable Stricter TypeScript Settings + +**Update tsconfig.json:** +```json +{ + "compilerOptions": { + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowJs": false, // No more JS files + } +} +``` + +### 12.2 Add Type Documentation + +**Create `docs/TYPESCRIPT.md`:** +- Document common type patterns +- Explain polymorphic component pattern +- Provide migration examples for consumers + +### 12.3 Update CI/CD Pipeline + +**Update `.github/workflows/` files:** +```yaml +- name: Type Check + run: npm run type-check + +- name: Build + run: npm run build +``` + +### 12.4 Audit and Fix Type Issues + +- Run `npm run type-check` to find any remaining `any` types +- Replace TODO_MIGRATE and FIXME types with proper types +- Add JSDoc/TSDoc comments for complex types + +**Estimated Time**: 3-5 days +**Risk Level**: Low +**Testing**: Full CI/CD pipeline run + +--- + +## Testing Strategy + +### Per-Phase Testing + +After each phase: +1. **Type Checking**: Run `npm run type-check` - must pass with no errors +2. **Build**: Run `npm run build` - must successfully build +3. **Storybook**: Run `npm run storybook` - all stories must render +4. **Visual Regression**: Run Chromatic to detect visual changes +5. **Unit Tests**: Run `npm test` - all tests must pass +6. **Integration**: Test in a consuming application + +### Final Testing Checklist + +Before considering migration complete: +- [ ] All TypeScript errors resolved +- [ ] Build produces valid UMD and ESM bundles +- [ ] Type declarations (.d.ts) are generated correctly +- [ ] Storybook renders all components +- [ ] All Jest tests pass +- [ ] Chromatic visual regression tests pass +- [ ] Package installs correctly in test project +- [ ] Type inference works in consuming applications +- [ ] No PropTypes references remain in codebase +- [ ] Documentation updated +- [ ] CI/CD pipeline passes + +--- + +## Risk Mitigation + +### High-Risk Areas + +1. **forwardRef Components** + - **Risk**: Complex TypeScript patterns for forwardRef with generic types + - **Mitigation**: Test thoroughly, use proven patterns from @types/react examples + +2. **Third-Party Library Types** + - **Risk**: Missing or incompatible type definitions + - **Mitigation**: Install @types packages, create custom declarations if needed + +3. **Polymorphic Components (as prop)** + - **Risk**: Complex generic types that are hard to get right + - **Mitigation**: Use proven utility types, test with multiple element types + +4. **Breaking Changes for Consumers** + - **Risk**: Type changes break existing consumer code + - **Mitigation**: Semantic versioning, deprecation warnings, migration guide + +5. **Build Configuration** + - **Risk**: Vite or Storybook config issues with TypeScript + - **Mitigation**: Test early, follow official docs, use community plugins + +### Rollback Strategy + +If critical issues arise: +1. Each phase is self-contained +2. Git branches for each major phase +3. Can rollback to previous phase +4. Can keep JS files alongside TS during migration (`allowJs: true`) + +--- + +## Timeline Estimate + +| Phase | Description | Estimated Time | Dependencies | +|-------|-------------|----------------|--------------| +| 1 | Foundation Setup | 1-2 days | None | +| 2 | Type Definitions | 1 day | Phase 1 | +| 3 | Helpers & Utilities | 2-3 days | Phase 2 | +| 4 | Icon Components | 2-3 days | Phase 2 | +| 5 | Simple Components | 5-7 days | Phase 2, 3 | +| 6 | Form Components | 7-10 days | Phase 5 | +| 7 | Button Components | 3-4 days | Phase 2 | +| 8 | Complex Compound Components | 10-14 days | Phase 5, 6, 7 | +| 9 | Remaining Components | 5-7 days | Phase 8 | +| 10 | Stories Migration | 5-7 days | Parallel with 5-9 | +| 11 | Entry Points & Exports | 2-3 days | All previous | +| 12 | Cleanup & Optimization | 3-5 days | Phase 11 | + +**Total Estimated Time: 46-66 days (9-13 weeks)** + +**Note**: This is for full-time work on migration. Adjust based on: +- Team size +- Part-time availability +- Learning curve for TypeScript +- Other project priorities + +--- + +## Resource Requirements + +### Team Skills Needed +- Strong TypeScript knowledge +- React 17 experience +- Understanding of generic types and utility types +- Experience with Vite and Storybook +- Understanding of npm package publishing + +### Tools Required +- Node.js v16 +- TypeScript 4.9+ +- Vite with TypeScript support +- Storybook 6 with TypeScript support +- ESLint with TypeScript parser + +### Documentation Resources +- TypeScript Handbook: https://www.typescriptlang.org/docs/ +- React TypeScript Cheatsheet: https://react-typescript-cheatsheet.netlify.app/ +- Vite TypeScript Guide: https://vitejs.dev/guide/features.html#typescript +- Storybook TypeScript: https://storybook.js.org/docs/react/configure/typescript + +--- + +## Post-Migration Benefits + +### For Developers +- Type safety and autocomplete in IDEs +- Catch errors at compile time +- Better refactoring support +- Self-documenting code through types +- Improved developer experience + +### For Consumers +- Full TypeScript support +- Autocomplete for all props +- Type checking in consuming applications +- Better documentation through types +- Reduced runtime errors + +### For Maintenance +- Easier to onboard new developers +- Reduced bugs from type mismatches +- Better tooling support +- Safer refactoring +- Living documentation + +--- + +## Success Criteria + +The migration will be considered successful when: + +1. ✅ All source files migrated from .js/.jsx to .ts/.tsx +2. ✅ Zero TypeScript errors with strict mode enabled +3. ✅ PropTypes package completely removed +4. ✅ All Storybook stories work correctly +5. ✅ Build produces valid type declarations +6. ✅ All tests pass (Jest + Chromatic) +7. ✅ Package successfully consumed in test project with full types +8. ✅ CI/CD pipeline includes type checking +9. ✅ Documentation updated +10. ✅ No breaking changes for consumers (or clearly documented) + +--- + +## Alternative Approaches Considered + +### Approach 1: Big Bang Migration +**Description**: Convert everything at once +**Pros**: Faster completion, no mixed codebase +**Cons**: High risk, difficult to test, blocks development +**Decision**: Rejected - too risky for large codebase + +### Approach 2: Parallel Codebase +**Description**: Maintain JS and TS versions separately +**Pros**: No disruption to existing code +**Cons**: Double maintenance, confusing for developers +**Decision**: Rejected - not sustainable + +### Approach 3: Top-Down (Components First) +**Description**: Start with high-level components +**Pros**: Visible progress quickly +**Cons**: Dependency issues, helpers need migration first +**Decision**: Rejected - creates dependency problems + +### Chosen Approach: Bottom-Up Incremental +**Description**: Start with helpers, work up to complex components +**Pros**: Low risk, testable at each step, maintains working codebase +**Cons**: Slower visible progress +**Decision**: Selected - best balance of risk and progress + +--- + +## Appendix A: PropTypes to TypeScript Mapping Reference + +| PropTypes | TypeScript | Notes | +|-----------|------------|-------| +| `PropTypes.string` | `string` | Direct mapping | +| `PropTypes.number` | `number` | Direct mapping | +| `PropTypes.bool` | `boolean` | Direct mapping | +| `PropTypes.func` | `() => void` or specific function signature | Be specific | +| `PropTypes.node` | `React.ReactNode` | Includes elements, strings, numbers, etc. | +| `PropTypes.element` | `React.ReactElement` | Only React elements | +| `PropTypes.array` | `any[]` or `T[]` | Use specific array types | +| `PropTypes.object` | `object` or specific interface | Define proper interfaces | +| `PropTypes.oneOf(['a', 'b'])` | `'a' \| 'b'` | Union of literals | +| `PropTypes.oneOfType([...])` | `T \| U` | Union types | +| `PropTypes.arrayOf(PropTypes.string)` | `string[]` | Typed arrays | +| `PropTypes.shape({...})` | `interface {...}` | Define interface | +| `PropTypes.any` | `any` | Avoid when possible | +| `.isRequired` | Remove `?` from property | Required by default | +| Optional prop | `prop?: Type` | Use `?` for optional | + +--- + +## Appendix B: Common TypeScript Patterns for This Codebase + +### Pattern 1: Size/Color Enums from Objects +```typescript +const sizes = { + small: "...", + medium: "...", + large: "...", +} as const; + +type Size = keyof typeof sizes; +``` + +### Pattern 2: Extending HTML Element Props +```typescript +interface ButtonProps extends React.ButtonHTMLAttributes { + variant?: "primary" | "secondary"; + // ... other custom props +} +``` + +### Pattern 3: Polymorphic Components +```typescript +type PolymorphicComponentProps = P & + Omit, keyof P> & { + as?: T; + }; + +interface ButtonOwnProps { + variant?: "primary" | "secondary"; +} + +type ButtonProps = + PolymorphicComponentProps; +``` + +### Pattern 4: ForwardRef Components +```typescript +interface InputProps { + value?: string; + onChange?: (value: string) => void; +} + +export const Input = forwardRef( + ({ value, onChange, ...rest }, ref) => { + return ; + } +); +``` + +### Pattern 5: Compound Components +```typescript +export const Modal = (props: ModalProps) => { /* ... */ }; + +interface ModalHeaderProps { /* ... */ } +const Header = (props: ModalHeaderProps) => { /* ... */ }; +Header.displayName = "Modal.Header"; + +Modal.Header = Header; + +// Export types +export type { ModalProps, ModalHeaderProps }; +``` + +--- + +## Appendix C: Common Pitfalls and Solutions + +### Pitfall 1: defaultProps with TypeScript +**Problem**: defaultProps is deprecated in React with TypeScript +**Solution**: Use default parameter values +```typescript +// ❌ Don't +Component.defaultProps = { size: "medium" }; + +// ✅ Do +const Component = ({ size = "medium" }: Props) => { /* ... */ }; +``` + +### Pitfall 2: Spreading Props with TypeScript +**Problem**: Type errors when spreading props +**Solution**: Use proper rest/spread with TypeScript +```typescript +interface Props extends React.HTMLAttributes { + custom?: string; +} + +const Component = ({ custom, ...rest }: Props) => { + return
; +}; +``` + +### Pitfall 3: Event Handlers +**Problem**: Event type errors +**Solution**: Use specific React event types +```typescript +// ✅ Correct +const handleClick = (event: React.MouseEvent) => { + // ... +}; + +const handleChange = (event: React.ChangeEvent) => { + // ... +}; +``` + +### Pitfall 4: Children Type +**Problem**: Children prop type confusion +**Solution**: Use React.ReactNode for most cases +```typescript +interface Props { + children: React.ReactNode; // Most flexible + // or + children: React.ReactElement; // Only React elements + // or + children: string; // Only strings +} +``` + +### Pitfall 5: Generic Components +**Problem**: Losing type inference with generics +**Solution**: Use proper generic constraints +```typescript +// ✅ Maintains type inference +function Component(props: { value: T }) { + return
{props.value}
; +} +``` + +--- + +## Questions for Clarification + +Before beginning implementation, please clarify: + +1. **Timeline Flexibility**: Is the 9-13 week estimate acceptable, or is there a hard deadline? + +2. **Team Resources**: How many developers will work on this migration? Full-time or part-time? + +3. **Breaking Changes**: Are we targeting a major version bump (v3.0.0) that allows breaking changes? + +4. **Consumer Applications**: Which applications currently consume this package? Can we coordinate migration timing with them? + +5. **TypeScript Version**: Should we upgrade from TypeScript 4.9.5 to 5.x during this migration? + +6. **React Version**: Will we upgrade to React 18 during or after this migration? + +7. **Testing Priority**: How important is maintaining 100% backward compatibility vs. accepting some breaking changes for better types? + +8. **Storybook**: Should we also upgrade Storybook from v6 to v7/v8 as part of this effort? + +9. **Documentation**: How much TypeScript-specific documentation do you want? + +10. **Migration of Consumers**: Should this plan include guidance for applications that consume this package? + +--- + +## Conclusion + +This migration plan provides a comprehensive, phased approach to converting the Xola UI Kit from PropTypes to TypeScript. The bottom-up strategy minimizes risk while providing continuous value at each phase. With proper execution and testing, this migration will result in a more maintainable, type-safe, and developer-friendly component library. + +The estimated 9-13 weeks accounts for thorough testing and quality assurance at each phase. However, the incremental nature of this plan allows for adjustments based on team capacity and project priorities. + +Next steps: +1. Review and approve this plan +2. Answer clarification questions +3. Set up initial TypeScript configuration (Phase 1) +4. Begin migration with helpers and utilities (Phase 3) From e048b0cf70ef3f41df9d33602083c78d1c6b65a7 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:21:57 +0530 Subject: [PATCH 02/40] Add Copilot & Claude Instructions --- .github/copilot-instructions.md | 45 +++++ .../general-coding.instructions.md.md | 64 ++++++++ CLAUDE.md | 154 ++++++++++++++++++ 3 files changed, 263 insertions(+) create mode 100644 .github/copilot-instructions.md create mode 100644 .github/instructions/general-coding.instructions.md.md create mode 100644 CLAUDE.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..e19f40659 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,45 @@ +> ⚠️ **Copilot Instructions File:** +> This file is **ONLY** for Copilot Pull Request review. +> Not for general documentation, onboarding, or other automation. + +## Copilot Pull Request Review Guide + +### Tech Stack + +- React v17 +- TypeScript v4.7 +- Tailwind CSS v3 + +### General Guidelines + +- Apply [general coding guidelines](./instructions/general-coding.instructions.md) to all code. +- Refer to [immutable data](./instructions/general-coding.instructions.md#immutable-data) for using `const`, `readonly`. +- Use `useMount` from `ahooks` instead of `useEffect([])`. +- Use `useModal` for modal state. +- Highlight browser compatibility or performance issues with solutions. +- Review the code for memory leaks and GC issues, especially when hooks are involved. Check for missing cleanup in `useEffect` (event listeners, timers, subscriptions), unclosed intervals/timeouts, and circular references in dependencies. +- Check for missing/incorrect TypeScript types. +- Ensure Tailwind classes follow best practices. +- Flag custom CSS that can be replaced by Tailwind. +- Validate component/file organization for clarity. +- Do not use `props: any`; destructure and type all props. +- Highlight any `useEffect` usage which has an `if` condition with multiple conditions and if those conditions can be extracted outside the effect to simplify the effect's dependencies +- Disallow functions that are declared in a scope which captures less than 3 variables from the outer scope. This rule can be skipped if the method is outside a React component + +### High Confidence Rules + +3. Follow React hooks rules strictly. +4. Do not use React.FC type; always create a props interface. +7. Do not suppress `react-hooks/exhaustive-deps` ESLint rule. +8. Tag `@rushi` in PR if any `.github` files are changed. +9. Tag `@rushi` if any ESLint configuration is changed +10. Do not allow more than 5 levels of indenting in a React component's JSX. +11. Minimize the use of `useEffect` and `useState`; favor derived state and memoization when possible. + +### Other Review Points + +- Confirm React Hooks are used correctly and avoid anti-patterns. +- Validate Tailwind usage and avoid deprecated patterns. +- Reference this file and line number in review comments if you use any of these instructions (add at end of comment, two blank lines above). +- Only summarize the pull request the first time Copilot is invoked. Every subsequent review should only summarize the changes since the last review +- Do not give feedback on accessability diff --git a/.github/instructions/general-coding.instructions.md.md b/.github/instructions/general-coding.instructions.md.md new file mode 100644 index 000000000..ff2dc0ff0 --- /dev/null +++ b/.github/instructions/general-coding.instructions.md.md @@ -0,0 +1,64 @@ +--- +applyTo: "**/*.ts,**/*.tsx,**/*.jsx" +--- + +Assume this is an app based on **React v17, Typescript v4.7, Tailwind CSS v3**. Always provide code examples in TypeScript. + +Answer all questions in the style of a friendly colleague, using informal language. Minimize explanations but provide enough context to understand the code + +Answer all questions in less than 1000 characters, and words of no more than 12 characters. + +## TypeScript Guidelines + +- Use camelCase for variables; prefer arrow functions. +- Always use TypeScript, not plain JS. +- Favor functional programming and type safety. +- Use `interface` for data structures, props, and state (use `type` only if very short). +- Prefer immutable data (`const`, `readonly`). +- Use optional chaining (`?.`) and nullish coalescing (`??`). +- Use guard statements for readability. +- Use `lodash` for utility functions if shorter. +- Use relative imports. + +## React Guidelines + +- Use functional components and hooks. +- No React.FC; always define a props interface. +- Keep components small and focused. +- Minimize the use of `useEffect` and `useState`; favor derived state and memoization when possible. +- Avoid effects unless needed; use `useMount` from `ahooks` instead of `useEffect([])`. +- Use `useMemo` and `useCallback` for performance, but avoid premature optimization. +- Functions returning JSX must be components. +- Follow the pattern: `const ComponentName = ({ prop1 }: Props) => { ... }`. +- Highlight browser compatibility or performance issues with solutions. +- Never indent JSX >5 levels. + +## Style Guidelines + +- Use Tailwind v3 for styling. +- Avoid custom CSS and inline styles. +- No dark mode support needed. + +## Linting & Formatting + +- Run `npm run lint` for ESLint. +- Use Prettier: `npm run format`. + +## Naming & Patterns + +- Prefix event handlers with 'handle' (e.g., `handleClick`). +- Prefix booleans with verbs (`isLoading`, `hasError`). +- Prefix custom hooks with 'use' (`useAuth`). +- Favor named exports. +- Avoid `any`/`unknown` for props and function arguments. +- Use `React.memo` for memoization. +- Use `useCallback` for functions passed as props. +- Use `useMemo` for expensive computations. +- Avoid inline function definitions in JSX/render. +- Use short-circuit and ternary for conditional rendering. +- Lift state up to share between components. +- Use context for intermediate state sharing. +- Use early returns for errors; avoid deep nesting. +- Place happy path last in functions. +- Avoid unnecessary else statements; use if-return. +- Use guard clauses for preconditions/invalid states. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..6ef5f140c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,154 @@ +# AGENTS.md + +## Project Overview + +Xola UI Kit is a React 17-based component library for Xola products, published as `@xola/ui-kit` and `@xola/icons`. It provides a comprehensive set of UI components, icons, and utilities, built with Vite and Storybook. The codebase is being migrated from PropTypes to TypeScript for improved type safety and developer experience. + +- **Tech Stack:** React 17, Vite, Storybook, TypeScript, ESLint +- **Build Outputs:** UMD and ESM formats +- **Testing:** Jest, Chromatic, Storybook + +## Setup Commands + +- Install dependencies: + ```zsh + npm install + ``` +- Start development server: + ```zsh + ```zsh + npm run storybook + ``` + + npm run type-check + npm run type-check:watch + ``` +- Linting: + ```zsh + npm run lint:fix + ``` +- Build: + npm run build + ``` +- Hot reload/watch mode is enabled by default in Vite (`npm run dev`). +- Run all tests: + ```zsh + npm test + npm run type-check + ``` +- Visual regression: + - Use Jest coverage tools if configured +- Storybook stories are in `src/stories/` and alongside components + + - Hooks: `src/hooks/` + - Types: `src/types/` +- **Naming conventions:** + - Components: PascalCase + - Files: match component name + - Types: PascalCase +- **Import/export:** Prefer named exports; export types alongside components + +## Build and Deployment + +- Build command: + ```zsh + npm run build + ``` +- Output directory: `build/` +- Type declarations: `build/index.d.ts` +- Package exports configured in `package.json` +- CI/CD: GitHub Actions (type check, lint, build) + +## Pull Request Guidelines + +- Title format: `[component] Brief description` +- Required checks: `npm run lint`, `npm run type-check`, `npm test` +- Review: At least one approval required +- Commit message: Use clear, descriptive messages + +## Security Considerations + +- No secrets or sensitive data in repo +- Use npm for dependency management +- Audit dependencies regularly + +## Debugging and Troubleshooting + +- Common issues: + - TypeScript errors: run `npm run type-check` + - Build errors: check Vite config and dependencies + - Storybook issues: check `.storybook/` config +- Logging: Use browser console for runtime errors + +## Monorepo Instructions + +- Not a monorepo, but icons are published as a separate package +- If splitting further, add AGENTS.md to subprojects + +## Additional Notes + +- Migration plan is in `TYPESCRIPT_MIGRATION_PLAN.md` +- Follow incremental migration strategy: helpers → hooks → icons → components → stories +- Remove PropTypes after migration +- Update documentation in `docs/` as needed + +## Success Criteria + +- All source files migrated to TypeScript +- Zero TypeScript errors with strict mode +- PropTypes removed +- Storybook and build work +- All tests pass +- Type declarations generated +- CI/CD pipeline passes +- Documentation updated + +## Code Style Guidelines + +- **Language:** TypeScript (migrating from JS/JSX) +- **Linting:** ESLint with @typescript-eslint +- **Formatting:** Prettier (if configured) +- **File organization:** + - Components: `src/components/` + - Helpers: `src/helpers/` + - Hooks: `src/hooks/` + - Icons: `src/icons/` + - Types: `src/types/` +- **Naming conventions:** + - Components: PascalCase + - Files: match component name + - Types: PascalCase +- **Import/export:** Prefer named exports; export types alongside components + +## Agent Coding and Review Guidelines (from .github/copilot-instructions.md) + +- Apply general coding guidelines and prefer immutable data (`const`, `readonly`). +- Use `useMount` from `ahooks` instead of `useEffect([])`. +- Use `useModal` for modal state management. +- Highlight browser compatibility or performance issues and suggest solutions. +- Review for memory leaks and garbage collection issues, especially with hooks. Ensure cleanup in `useEffect` (event listeners, timers, subscriptions), and avoid unclosed intervals/timeouts and circular references. +- Always check for missing or incorrect TypeScript types. +- Ensure Tailwind CSS classes follow best practices; replace custom CSS with Tailwind where possible. +- Validate component/file organization for clarity. +- Do not use `props: any`; always destructure and type all props. +- Simplify `useEffect` dependencies by extracting complex conditions outside the effect. +- Disallow functions declared in a scope capturing less than 3 variables from the outer scope (unless outside a React component). + +### High Confidence Rules +3. Strictly follow React hooks rules. +4. Do not use React.FC type; always create a props interface. +7. Never suppress `react-hooks/exhaustive-deps` ESLint rule. +8. Tag `@rushi` in PR if any `.github` or ESLint config files are changed. +9. Do not allow more than 5 levels of indenting in a React component's JSX. +10. Minimize use of `useEffect` and `useState`; favor derived state and memoization. + +### Other Review Points +- Confirm React Hooks are used correctly and avoid anti-patterns. +- Validate Tailwind usage and avoid deprecated patterns. +- Reference `.github/copilot-instructions.md` and line number in review comments if you use any of these instructions. +- Only summarize the pull request the first time Copilot is invoked; subsequent reviews should only summarize changes since the last review. +- Do not give feedback on accessibility. + +--- + +This file is symlinked as `CLAUDE.md` for compatibility with agent tools. From 896584b3850c9a73415ee494d2f54035fc394ad2 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:23:05 +0530 Subject: [PATCH 03/40] Configure TypeScript foundation for incremental migration Set up TypeScript configuration and build tooling to enable incremental migration from PropTypes to TypeScript without breaking existing code. Changes: - Add tsconfig.json with lenient settings (allowJs: true, checkJs: false) - Add tsconfig.build.json for build-specific type generation - Install TypeScript build dependencies (@vitejs/plugin-react, vite-plugin-dts) - Convert Vite config to TypeScript with DTS plugin for auto-generating .d.ts files - Convert Storybook config to TypeScript with react-docgen-typescript support - Add type-check and type-check:watch npm scripts - Configure Storybook to accept both .js/.jsx and .ts/.tsx story files This completes Phase 1 of the TypeScript migration plan. Build and type declaration generation confirmed working. --- .storybook/main.js | 18 - .storybook/main.ts | 38 + .storybook/preview.js | 26 - .storybook/preview.tsx | 30 + package-lock.json | 2815 ++++++++++++++++++++++++++++++++++------ package.json | 9 +- tsconfig.build.json | 28 + tsconfig.json | 63 + vite.config.js | 22 - vite.config.ts | 47 + 10 files changed, 2623 insertions(+), 473 deletions(-) delete mode 100644 .storybook/main.js create mode 100644 .storybook/main.ts delete mode 100644 .storybook/preview.js create mode 100644 .storybook/preview.tsx create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json delete mode 100644 vite.config.js create mode 100644 vite.config.ts diff --git a/.storybook/main.js b/.storybook/main.js deleted file mode 100644 index 1ec1f38f2..000000000 --- a/.storybook/main.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - stories: ["../src/**/*.stories.@(js|jsx|mdx)"], - core: { - disableTelemetry: true, - }, - addons: [ - "@storybook/addon-postcss", - "@storybook/addon-links", - "storybook-css-modules-preset", - "storybook-addon-designs", - { - name: "@storybook/addon-essentials", - options: { - backgrounds: false, - }, - }, - ], -}; diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 000000000..9b76dbca5 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,38 @@ +import type { StorybookConfig } from "@storybook/react/types"; + +const config: StorybookConfig = { + // Support both .js/.jsx and .ts/.tsx story files during migration + stories: ["../src/**/*.stories.@(js|jsx|ts|tsx|mdx)"], + core: { + disableTelemetry: true, + }, + addons: [ + "@storybook/addon-postcss", + "@storybook/addon-links", + "storybook-css-modules-preset", + "storybook-addon-designs", + { + name: "@storybook/addon-essentials", + options: { + backgrounds: false, + }, + }, + ], + // TypeScript configuration for Storybook + typescript: { + check: false, // We'll use tsc separately for type checking + reactDocgen: "react-docgen-typescript", + reactDocgenTypescriptOptions: { + shouldExtractLiteralValuesFromEnum: true, + propFilter: (prop) => { + // Filter out props from node_modules + if (prop.parent) { + return !prop.parent.fileName.includes("node_modules"); + } + return true; + }, + }, + }, +}; + +export default config; diff --git a/.storybook/preview.js b/.storybook/preview.js deleted file mode 100644 index b4b650349..000000000 --- a/.storybook/preview.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from "react"; -import { Provider } from "../src"; -import xola from "./xola"; -import "../index.css"; - -export const parameters = { - actions: { argTypesRegex: "^on[A-Z].*" }, - docs: { - theme: xola, - }, - options: { - storySort: { - method: "alphabetical", - order: ["Introduction", "Components"], - includeName: true, - }, - }, -}; - -export const decorators = [ - (Story) => ( - - - - ), -]; diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx new file mode 100644 index 000000000..c7aa98fb8 --- /dev/null +++ b/.storybook/preview.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import type { Preview } from "@storybook/react"; +import { Provider } from "../src"; +import xola from "./xola"; +import "../index.css"; + +const preview: Preview = { + parameters: { + actions: { argTypesRegex: "^on[A-Z].*" }, + docs: { + theme: xola, + }, + options: { + storySort: { + method: "alphabetical", + order: ["Introduction", "Components"], + includeName: true, + }, + }, + }, + decorators: [ + (Story) => ( + + + + ), + ], +}; + +export default preview; diff --git a/package-lock.json b/package-lock.json index 04cb3c337..52c3346bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,11 @@ "@storybook/addons": "^6.5.10", "@storybook/react": "^6.5.10", "@storybook/theming": "^6.5.10", + "@types/react": "^17.0.90", + "@types/react-dom": "^17.0.26", + "@vitejs/plugin-react": "^2.2.0", "@xola/jslint": "^2.1.2", + "ajv": "^8.17.1", "autoprefixer": "^10.4.5", "babel-jest": "^27.2.0", "babel-loader": "^8.2.2", @@ -57,7 +61,8 @@ "storybook-css-modules-preset": "^1.1.1", "tailwindcss": "^3.1.8", "typescript": "^4.9.5", - "vite": "^3.0.8" + "vite": "^3.0.8", + "vite-plugin-dts": "^1.7.3" }, "engines": { "node": ">=16" @@ -72,45 +77,48 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.15.0", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.15.5", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", - "convert-source-map": "^1.7.0", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -120,16 +128,22 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -160,22 +174,36 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.4", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", @@ -265,6 +293,14 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", @@ -290,27 +326,26 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -332,9 +367,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "engines": { "node": ">=6.9.0" } @@ -406,25 +441,25 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -445,36 +480,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.15.4", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "dependencies": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.28.5" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1432,6 +1456,36 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", @@ -1786,48 +1840,42 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2056,6 +2104,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2089,6 +2153,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2184,6 +2254,27 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", @@ -3457,33 +3548,28 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -3499,16 +3585,14 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3630,6 +3714,251 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.55.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.2.tgz", + "integrity": "sha512-1jlWO4qmgqYoVUcyh+oXYRztZde/pAi7cSVzBz/rc+S7CoVzDasy8QE13dx6sLG4VRo8SfkkLbFORR6tBw4uGQ==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.32.2", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.19.5", + "@rushstack/ts-command-line": "5.1.5", + "diff": "~8.0.2", + "lodash": "~4.17.15", + "minimatch": "10.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz", + "integrity": "sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@microsoft/api-extractor/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz", + "integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -3770,6 +4099,28 @@ } } }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -3805,6 +4156,258 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.66.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.66.1.tgz", + "integrity": "sha512-ker69cVKAoar7MMtDFZC4CzcDxjwqIhFzqEnYI5NRN/8M3om6saWCVx/A7vL2t/jFCJsnzQplRDqA7c78pytng==", + "dev": true, + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", + "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "dev": true, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", + "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.5.tgz", + "integrity": "sha512-6k5tpdB88G0K7QrH/3yfKO84HK9ggftfUZ51p7fePyCE7+RLLHkWZbID9OFWbXuna+eeCFE7AkKnRMHMxNbz7Q==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "5.19.1", + "@rushstack/problem-matcher": "0.1.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/terminal/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@rushstack/terminal/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/terminal/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.5.tgz", + "integrity": "sha512-YmrFTFUdHXblYSa+Xc9OO9FsL/XFcckZy0ycQ6q7VSBsVs5P0uD9vcges5Q9vctGlVdu27w+Ct6IuJ458V0cTQ==", + "dev": true, + "dependencies": { + "@rushstack/terminal": "0.19.5", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", @@ -8689,6 +9292,51 @@ "node": ">= 6" } }, + "node_modules/@ts-morph/common": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.18.1.tgz", + "integrity": "sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ts-morph/common/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.1.16", "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", @@ -8906,12 +9554,22 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.20", - "integrity": "sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA==", + "version": "17.0.90", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.90.tgz", + "integrity": "sha512-P9beVR/x06U9rCJzSxtENnOr4BrbJ6VrsrDTc+73TtHv9XHhryXKbjGRB+6oooB2r0G/pQkD/S4dHo/7jUfwFw==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@types/scheduler": "^0.16", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.26", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", + "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", + "dev": true, + "peerDependencies": { + "@types/react": "^17.0.0" } }, "node_modules/@types/react-transition-group": { @@ -9272,6 +9930,36 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -9637,20 +10325,35 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", @@ -9660,6 +10363,23 @@ "ajv": ">=5.0.0" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-keywords": { "version": "3.5.2", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", @@ -9735,6 +10455,7 @@ "node_modules/ansi-styles": { "version": "3.2.1", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -9745,13 +10466,15 @@ "node_modules/ansi-styles/node_modules/color-convert": { "version": "1.9.3", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/ansi-styles/node_modules/color-name": { "version": "1.1.3", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "node_modules/ansi-to-html": { "version": "0.6.15", @@ -10783,6 +11506,15 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.3.tgz", + "integrity": "sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/better-opn": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", @@ -11185,9 +11917,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -11204,10 +11936,11 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -11498,9 +12231,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001525", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", - "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", "dev": true, "funding": [ { @@ -11551,6 +12284,7 @@ "node_modules/chalk": { "version": "2.4.2", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -11936,6 +12670,12 @@ "node": ">= 0.12.0" } }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "node_modules/collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", @@ -11989,6 +12729,15 @@ "color-support": "bin.js" } }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", @@ -12870,9 +13619,9 @@ "dev": true }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" }, "node_modules/currently-unhandled": { "version": "0.4.1", @@ -12915,7 +13664,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -13434,6 +14182,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "27.0.6", "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", @@ -13693,9 +14450,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.5.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", + "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", "dev": true }, "node_modules/elliptic": { @@ -14407,8 +15164,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -14423,6 +15181,7 @@ "node_modules/escape-string-regexp": { "version": "1.0.5", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -15268,6 +16027,22 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -15378,6 +16153,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/eslint/node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -15557,6 +16338,12 @@ "node": ">=8.3.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", @@ -16038,16 +16825,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -16080,6 +16867,22 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fastq": { "version": "1.13.0", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", @@ -16167,6 +16970,28 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -16525,6 +17350,22 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -16581,6 +17422,12 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -17190,6 +18037,7 @@ "node_modules/has": { "version": "1.0.3", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -17209,6 +18057,7 @@ "node_modules/has-flag": { "version": "3.0.0", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, "engines": { "node": ">=4" } @@ -17889,6 +18738,15 @@ "node": ">=4" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/import-local": { "version": "3.0.2", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", @@ -18273,11 +19131,14 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21437,6 +22298,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "node_modules/js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -21542,14 +22409,14 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-better-errors": { @@ -21563,8 +22430,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { @@ -21643,6 +22511,12 @@ "node": ">= 8" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, "node_modules/lazy-universal-dotenv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", @@ -21863,6 +22737,20 @@ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -22000,6 +22888,18 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -22658,8 +23558,7 @@ }, "node_modules/ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multimatch": { "version": "4.0.0", @@ -22893,9 +23792,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, "node_modules/normalize-package-data": { @@ -23816,10 +24715,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -24099,6 +24997,28 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/postcss-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/postcss-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/postcss-loader/node_modules/schema-utils": { "version": "3.1.1", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", @@ -25018,6 +25938,28 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/raw-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/raw-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/raw-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -25860,6 +26802,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -25872,17 +26823,20 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -26416,6 +27370,28 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/screenfull": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", @@ -26921,6 +27897,13 @@ "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, "node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", @@ -27300,6 +28283,15 @@ } ] }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-length": { "version": "4.0.2", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", @@ -27520,6 +28512,7 @@ "node_modules/supports-color": { "version": "5.5.0", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -27781,6 +28774,22 @@ "node": ">=0.4.0" } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/terser-webpack-plugin/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -27840,6 +28849,12 @@ "node": ">= 10.13.0" } }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/terser-webpack-plugin/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -28085,13 +29100,6 @@ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -28249,6 +29257,16 @@ "node": ">=6.10" } }, + "node_modules/ts-morph": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", + "integrity": "sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.18.0", + "code-block-writer": "^11.0.3" + } + }, "node_modules/ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", @@ -28845,9 +29863,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "dev": true, "funding": [ { @@ -28864,8 +29882,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -28926,6 +29944,28 @@ } } }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/url-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -29116,6 +30156,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validator": { + "version": "13.15.23", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", + "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -29214,6 +30263,42 @@ } } }, + "node_modules/vite-plugin-dts": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-1.7.3.tgz", + "integrity": "sha512-u3t45p6fTbzUPMkwYe0ESwuUeiRMlwdPfD3dRyDKUwLe2WmEYcFyVp2o9/ke2EMrM51lQcmNWdV9eLcgjD1/ng==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor": "^7.33.5", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.53.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.6.0", + "ts-morph": "17.0.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": ">=2.9.0" + } + }, + "node_modules/vite-plugin-dts/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -29758,6 +30843,22 @@ "node": ">=0.4.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/webpack/node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -29917,6 +31018,12 @@ "node": ">=4" } }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/webpack/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -31356,6 +32463,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", @@ -31369,51 +32506,62 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { - "version": "7.15.0", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true }, "@babel/core": { - "version": "7.15.5", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", - "convert-source-map": "^1.7.0", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } } }, "@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "requires": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -31435,14 +32583,33 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.15.4", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { @@ -31510,6 +32677,11 @@ "@babel/types": "^7.23.0" } }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + }, "@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", @@ -31529,24 +32701,23 @@ } }, "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" } }, "@babel/helper-optimise-call-expression": { @@ -31559,9 +32730,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" }, "@babel/helper-remap-async-to-generator": { "version": "7.15.4", @@ -31612,19 +32783,19 @@ } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" }, "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true }, "@babel/helper-wrap-function": { @@ -31639,31 +32810,23 @@ } }, "@babel/helpers": { - "version": "7.15.4", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" } }, - "@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.28.5" } }, - "@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true - }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.15.4", "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", @@ -32257,6 +33420,24 @@ "@babel/plugin-transform-react-jsx": "^7.22.5" } }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, "@babel/plugin-transform-react-pure-annotations": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", @@ -32511,42 +33692,36 @@ } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" } }, "@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" } }, "@base2/pretty-print-object": { @@ -32714,6 +33889,18 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -32738,6 +33925,12 @@ "argparse": "^2.0.1" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -32809,6 +34002,21 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true + }, + "@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "requires": { + "@isaacs/balanced-match": "^4.0.1" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", @@ -33766,27 +34974,28 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/source-map": { "version": "0.3.5", @@ -33799,16 +35008,14 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -33904,6 +35111,192 @@ "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", "dev": true }, + "@microsoft/api-extractor": { + "version": "7.55.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.2.tgz", + "integrity": "sha512-1jlWO4qmgqYoVUcyh+oXYRztZde/pAi7cSVzBz/rc+S7CoVzDasy8QE13dx6sLG4VRo8SfkkLbFORR6tBw4uGQ==", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.32.2", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.19.5", + "@rushstack/ts-command-line": "5.1.5", + "diff": "~8.0.2", + "lodash": "~4.17.15", + "minimatch": "10.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "requires": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + } + }, + "ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + } + }, + "fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "requires": { + "@isaacs/brace-expansion": "^5.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true + } + } + }, + "@microsoft/api-extractor-model": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz", + "integrity": "sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "requires": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + } + }, + "ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + } + }, + "fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz", + "integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -33993,6 +35386,24 @@ "source-map": "^0.7.3" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -34016,6 +35427,181 @@ "version": "2.10.1", "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==" }, + "@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "dependencies": { + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } + }, + "@rushstack/node-core-library": { + "version": "3.66.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.66.1.tgz", + "integrity": "sha512-ker69cVKAoar7MMtDFZC4CzcDxjwqIhFzqEnYI5NRN/8M3om6saWCVx/A7vL2t/jFCJsnzQplRDqA7c78pytng==", + "dev": true, + "requires": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@rushstack/problem-matcher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", + "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "dev": true + }, + "@rushstack/rig-package": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", + "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", + "dev": true, + "requires": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "@rushstack/terminal": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.5.tgz", + "integrity": "sha512-6k5tpdB88G0K7QrH/3yfKO84HK9ggftfUZ51p7fePyCE7+RLLHkWZbID9OFWbXuna+eeCFE7AkKnRMHMxNbz7Q==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "5.19.1", + "@rushstack/problem-matcher": "0.1.1", + "supports-color": "~8.1.1" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "requires": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + } + }, + "ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + } + }, + "fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@rushstack/ts-command-line": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.5.tgz", + "integrity": "sha512-YmrFTFUdHXblYSa+Xc9OO9FsL/XFcckZy0ycQ6q7VSBsVs5P0uD9vcges5Q9vctGlVdu27w+Ct6IuJ458V0cTQ==", + "dev": true, + "requires": { + "@rushstack/terminal": "0.19.5", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, "@sinonjs/commons": { "version": "1.8.3", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", @@ -37410,6 +38996,50 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@ts-morph/common": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.18.1.tgz", + "integrity": "sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==", + "dev": true, + "requires": { + "fast-glob": "^3.2.12", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + } + } + }, + "@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "@types/babel__core": { "version": "7.1.16", "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", @@ -37629,14 +39259,21 @@ "dev": true }, "@types/react": { - "version": "17.0.20", - "integrity": "sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA==", + "version": "17.0.90", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.90.tgz", + "integrity": "sha512-P9beVR/x06U9rCJzSxtENnOr4BrbJ6VrsrDTc+73TtHv9XHhryXKbjGRB+6oooB2r0G/pQkD/S4dHo/7jUfwFw==", "requires": { "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@types/scheduler": "^0.16", + "csstype": "^3.2.2" } }, + "@types/react-dom": { + "version": "17.0.26", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", + "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", + "dev": true + }, "@types/react-transition-group": { "version": "4.4.3", "integrity": "sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg==", @@ -37891,6 +39528,29 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" + }, + "dependencies": { + "react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true + } + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -38221,22 +39881,38 @@ } }, "ajv": { - "version": "6.12.6", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" } }, + "ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true + }, "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, "ajv-keywords": { "version": "3.5.2", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", @@ -38287,6 +39963,7 @@ "ansi-styles": { "version": "3.2.1", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" }, @@ -38294,13 +39971,15 @@ "color-convert": { "version": "1.9.3", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true } } }, @@ -39070,6 +40749,12 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "baseline-browser-mapping": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.3.tgz", + "integrity": "sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA==", + "dev": true + }, "better-opn": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", @@ -39387,15 +41072,16 @@ } }, "browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" } }, "bser": { @@ -39622,9 +41308,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001525", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", - "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", "dev": true }, "capture-exit": { @@ -39651,6 +41337,7 @@ "chalk": { "version": "2.4.2", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -39934,6 +41621,12 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", @@ -39974,6 +41667,12 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", @@ -40694,9 +42393,9 @@ } }, "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" }, "currently-unhandled": { "version": "0.4.1", @@ -40733,7 +42432,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -41116,6 +42814,12 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true + }, "diff-sequences": { "version": "27.0.6", "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", @@ -41335,9 +43039,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.5.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", + "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", "dev": true }, "elliptic": { @@ -41803,8 +43507,9 @@ "optional": true }, "escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -41815,7 +43520,8 @@ }, "escape-string-regexp": { "version": "1.0.5", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "2.0.0", @@ -41884,6 +43590,18 @@ "text-table": "^0.2.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -41958,6 +43676,12 @@ "argparse": "^2.0.1" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -42613,6 +44337,12 @@ "c8": "^7.6.0" } }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "esutils": { "version": "2.0.3", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", @@ -42995,16 +44725,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "dependencies": { "glob-parent": { @@ -43033,6 +44763,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true + }, "fastq": { "version": "1.13.0", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", @@ -43107,6 +44843,24 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -43385,6 +45139,18 @@ "tapable": "^1.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -43423,6 +45189,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -43881,6 +45653,7 @@ "has": { "version": "1.0.3", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -43893,7 +45666,8 @@ }, "has-flag": { "version": "3.0.0", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-glob": { "version": "1.0.0", @@ -44393,6 +46167,12 @@ } } }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, "import-local": { "version": "3.0.2", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", @@ -44656,11 +46436,11 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-data-descriptor": { @@ -47000,6 +48780,12 @@ } } }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -47078,9 +48864,9 @@ } }, "jsesc": { - "version": "2.5.2", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -47093,8 +48879,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-traverse": { - "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -47150,6 +48937,12 @@ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "dev": true }, + "kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, "lazy-universal-dotenv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", @@ -47324,6 +49117,18 @@ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -47427,6 +49232,15 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -47948,8 +49762,7 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multimatch": { "version": "4.0.0", @@ -48152,9 +49965,9 @@ } }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, "normalize-package-data": { @@ -48855,10 +50668,9 @@ } }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", @@ -49028,6 +50840,24 @@ "semver": "^7.3.4" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { "version": "3.1.1", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", @@ -49705,6 +51535,24 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -50353,6 +52201,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -50365,11 +52219,11 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -50779,6 +52633,26 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "screenfull": { @@ -51208,6 +53082,12 @@ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", @@ -51536,6 +53416,12 @@ } } }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, "string-length": { "version": "4.0.2", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", @@ -51692,6 +53578,7 @@ "supports-color": { "version": "5.5.0", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -51898,6 +53785,18 @@ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -51942,6 +53841,12 @@ "supports-color": "^7.0.0" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -52129,10 +54034,6 @@ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -52254,6 +54155,16 @@ "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true }, + "ts-morph": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", + "integrity": "sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==", + "dev": true, + "requires": { + "@ts-morph/common": "~0.18.0", + "code-block-writer": "^11.0.3" + } + }, "ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", @@ -52690,13 +54601,13 @@ "optional": true }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" } }, "uri-js": { @@ -52742,6 +54653,24 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -52881,6 +54810,12 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "13.15.23", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", + "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -52928,6 +54863,35 @@ "rollup": "^2.79.1" } }, + "vite-plugin-dts": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-1.7.3.tgz", + "integrity": "sha512-u3t45p6fTbzUPMkwYe0ESwuUeiRMlwdPfD3dRyDKUwLe2WmEYcFyVp2o9/ke2EMrM51lQcmNWdV9eLcgjD1/ng==", + "dev": true, + "requires": { + "@microsoft/api-extractor": "^7.33.5", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.53.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.6.0", + "ts-morph": "17.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -53279,6 +55243,18 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -53414,6 +55390,12 @@ "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -54454,6 +56436,27 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, + "z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "requires": { + "commander": "^9.4.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true + } + } + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/package.json b/package.json index 3fd2f8004..e4ec84078 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,8 @@ "build": "npm run prepare && vite build", "clean": "rm -rf node_modules/.vite", "build:storybook": "npm run prepare && build-storybook -s public", + "type-check": "tsc --noEmit", + "type-check:watch": "tsc --noEmit --watch", "lint": "xola-lint src --ignore src/stories", "lint:fix": "xola-lint src --fix --ignore src/stories", "lint:report": "xola-lint src --ignore src/stories --reporter=json src > eslint_report.json", @@ -66,7 +68,11 @@ "@storybook/addons": "^6.5.10", "@storybook/react": "^6.5.10", "@storybook/theming": "^6.5.10", + "@types/react": "^17.0.90", + "@types/react-dom": "^17.0.26", + "@vitejs/plugin-react": "^2.2.0", "@xola/jslint": "^2.1.2", + "ajv": "^8.17.1", "autoprefixer": "^10.4.5", "babel-jest": "^27.2.0", "babel-loader": "^8.2.2", @@ -81,7 +87,8 @@ "storybook-css-modules-preset": "^1.1.1", "tailwindcss": "^3.1.8", "typescript": "^4.9.5", - "vite": "^3.0.8" + "vite": "^3.0.8", + "vite-plugin-dts": "^1.7.3" }, "peerDependencies": { "autoprefixer": "^10.3.1", diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 000000000..c6202e755 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,28 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + /* Override for build */ + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": false, + "noEmit": false, + "outDir": "./build" + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "build", + "dist", + "storybook-static", + "**/*.test.js", + "**/*.test.ts", + "**/*.test.tsx", + "**/*.stories.js", + "**/*.stories.jsx", + "**/*.stories.ts", + "**/*.stories.tsx", + "src/stories/**/*" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..75ec87c8b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,63 @@ +{ + "compilerOptions": { + /* Language and Environment */ + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "jsx": "react", + + /* Modules */ + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + + /* Emit */ + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./dist", + "removeComments": false, + + /* Interop Constraints */ + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + + /* Type Checking - Starting Lenient for Incremental Migration */ + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + + /* Start lenient, will tighten later */ + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": true, + + /* Critical for Incremental Migration */ + "allowJs": true, + "checkJs": false, + + /* Completeness */ + "skipLibCheck": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "build", + "dist", + "storybook-static", + "**/*.test.js", + "**/*.test.ts", + "**/*.test.tsx", + "**/*.stories.js", + "**/*.stories.jsx" + ] +} diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index 7dc53c750..000000000 --- a/vite.config.js +++ /dev/null @@ -1,22 +0,0 @@ -import path from "path"; -import { defineConfig } from "vite"; -import pkg from "./package.json"; - -const dependencies = Object.keys(pkg.dependencies); -const devDependencies = Object.keys(pkg.devDependencies); - -export default defineConfig({ - build: { - outDir: "build", - - lib: { - entry: path.resolve(__dirname, "src/index.js"), - name: "XolaUIKit", - }, - - rollupOptions: { - // Make sure none of the dependencies are bundled. - external: [...dependencies, ...devDependencies], - }, - }, -}); diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..dce5dd3c3 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,47 @@ +import path from "path"; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import dts from "vite-plugin-dts"; +import pkg from "./package.json"; + +const dependencies = Object.keys(pkg.dependencies); +const devDependencies = Object.keys(pkg.devDependencies); + +export default defineConfig({ + plugins: [ + react(), + dts({ + insertTypesEntry: true, + include: ["src/**/*"], + exclude: [ + "src/**/*.stories.*", + "src/**/*.test.*", + "src/stories/**/*", + ], + // Use tsconfig.build.json for declaration generation + tsConfigFilePath: "./tsconfig.build.json", + }), + ], + build: { + outDir: "build", + + lib: { + // Support both .js and .ts during migration + entry: path.resolve(__dirname, "src/index.js"), + name: "XolaUIKit", + formats: ["es", "umd"], + }, + + rollupOptions: { + // Make sure none of the dependencies are bundled. + external: [...dependencies, ...devDependencies], + output: { + // Provide global variables to use in the UMD build for externalized deps + globals: { + react: "React", + "react-dom": "ReactDOM", + }, + }, + }, + }, +}); From ce7207de8ad9f98e40ff5a4f50e47eb8c173a27d Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:27:21 +0530 Subject: [PATCH 04/40] Add TypeScript type definitions foundation Create common type definitions that will be reused throughout the TypeScript migration process. Changes: - Add src/types/index.ts with shared types: * Size, Color, Variant union types for consistent component props * PolymorphicComponentProps helper for components with 'as' prop * IconProps interface for icon components * CommonComponentProps for shared component properties * Helper types for ref forwarding and children handling - Add src/types/migration.ts with temporary migration helpers: * TODO_MIGRATE type for gradual migration placeholders * FIXME type for complex cases during migration These type definitions follow the project's coding guidelines and will be imported by components as they are migrated in subsequent phases. This completes Phase 2 of the TypeScript migration plan. --- src/types/index.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ src/types/migration.ts | 8 ++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/types/index.ts create mode 100644 src/types/migration.ts diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 000000000..c03685dff --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,42 @@ +import { ComponentPropsWithoutRef, ElementType, ReactNode } from "react"; + +// Common size types used across components +export type Size = "tiny" | "small" | "medium" | "large" | "huge"; + +// Common color types used across components +export type Color = "primary" | "secondary" | "success" | "warning" | "caution" | "danger"; + +// Common variant types for buttons and similar components +export type Variant = "standard" | "outline" | "link"; + +// Polymorphic component props helper for components that accept an 'as' prop +// This allows components to be rendered as different HTML elements while maintaining type safety +export type PolymorphicComponentProps = P & + Omit, keyof P> & { + as?: T; + }; + +// Common props shared across most UI components +export interface CommonComponentProps { + className?: string; + children?: ReactNode; +} + +// Icon component props interface +export interface IconProps extends ComponentPropsWithoutRef<"svg"> { + size?: "tiny" | "small" | "medium" | "large"; + className?: string; +} + +// Helper type for ref forwarding with polymorphic components +export type PolymorphicRef = ComponentPropsWithoutRef["ref"]; + +// Helper type for components with required children +export interface ComponentWithChildren { + children: ReactNode; +} + +// Helper type for components with optional children +export interface ComponentWithOptionalChildren { + children?: ReactNode; +} diff --git a/src/types/migration.ts b/src/types/migration.ts new file mode 100644 index 000000000..818a8ab28 --- /dev/null +++ b/src/types/migration.ts @@ -0,0 +1,8 @@ +// Temporary types used during the PropTypes to TypeScript migration +// These types will be replaced with proper types in later phases + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type TODO_MIGRATE = any; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type FIXME = any; From dfa56ed1f7a16de114462d5aae4d97087dcf7021 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:32:35 +0530 Subject: [PATCH 05/40] Migrate helper utilities to TypeScript Convert all helper utility functions from JavaScript to TypeScript by adding proper type annotations for parameters and return values. Changes: - Migrate src/helpers/avatar.ts: Add types for name parameter (optional string) - Migrate src/helpers/browser.ts: Add boolean return types for browser detection - Migrate src/helpers/children.ts: Add React type annotations for child filtering - Migrate src/helpers/currency.ts: Add string types for currency codes - Migrate src/helpers/date.ts: Add dayjs.Dayjs and Date types with proper overloads - Migrate src/helpers/numbers.ts: Add number/string types for formatting functions - Migrate src/helpers/phone.ts: Add string types for phone formatting - Install @types/google-libphonenumber for phone library types All helper files now have full type safety and compile without errors. Test files remain in JavaScript (will be addressed in future if needed). This completes Phase 3 of the TypeScript migration plan. --- package-lock.json | 13 ++++++++++++ package.json | 1 + src/helpers/{avatar.js => avatar.ts} | 2 +- src/helpers/browser.js | 18 ---------------- src/helpers/browser.ts | 15 +++++++++++++ src/helpers/children.js | 9 -------- src/helpers/children.ts | 19 +++++++++++++++++ src/helpers/{currency.js => currency.ts} | 9 ++++++-- src/helpers/{date.js => date.ts} | 27 ++++++++++++------------ src/helpers/{numbers.js => numbers.ts} | 27 +++++++++++++----------- src/helpers/{phone.js => phone.ts} | 14 +++--------- 11 files changed, 87 insertions(+), 67 deletions(-) rename src/helpers/{avatar.js => avatar.ts} (83%) delete mode 100644 src/helpers/browser.js create mode 100644 src/helpers/browser.ts delete mode 100644 src/helpers/children.js create mode 100644 src/helpers/children.ts rename src/helpers/{currency.js => currency.ts} (69%) rename src/helpers/{date.js => date.ts} (69%) rename src/helpers/{numbers.js => numbers.ts} (61%) rename src/helpers/{phone.js => phone.ts} (68%) diff --git a/package-lock.json b/package-lock.json index 52c3346bd..eb589b876 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "@storybook/addons": "^6.5.10", "@storybook/react": "^6.5.10", "@storybook/theming": "^6.5.10", + "@types/google-libphonenumber": "^7.4.30", "@types/react": "^17.0.90", "@types/react-dom": "^17.0.26", "@vitejs/plugin-react": "^2.2.0", @@ -9406,6 +9407,12 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/google-libphonenumber": { + "version": "7.4.30", + "resolved": "https://registry.npmjs.org/@types/google-libphonenumber/-/google-libphonenumber-7.4.30.tgz", + "integrity": "sha512-Td1X1ayRxePEm6/jPHUBs2tT6TzW1lrVB6ZX7ViPGellyzO/0xMNi+wx5nH6jEitjznq276VGIqjK5qAju0XVw==", + "dev": true + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", @@ -39111,6 +39118,12 @@ } } }, + "@types/google-libphonenumber": { + "version": "7.4.30", + "resolved": "https://registry.npmjs.org/@types/google-libphonenumber/-/google-libphonenumber-7.4.30.tgz", + "integrity": "sha512-Td1X1ayRxePEm6/jPHUBs2tT6TzW1lrVB6ZX7ViPGellyzO/0xMNi+wx5nH6jEitjznq276VGIqjK5qAju0XVw==", + "dev": true + }, "@types/graceful-fs": { "version": "4.1.5", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", diff --git a/package.json b/package.json index e4ec84078..479a85602 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "@storybook/addons": "^6.5.10", "@storybook/react": "^6.5.10", "@storybook/theming": "^6.5.10", + "@types/google-libphonenumber": "^7.4.30", "@types/react": "^17.0.90", "@types/react-dom": "^17.0.26", "@vitejs/plugin-react": "^2.2.0", diff --git a/src/helpers/avatar.js b/src/helpers/avatar.ts similarity index 83% rename from src/helpers/avatar.js rename to src/helpers/avatar.ts index 4a1b6d738..f89f8eeeb 100644 --- a/src/helpers/avatar.js +++ b/src/helpers/avatar.ts @@ -1,4 +1,4 @@ -export const getInitials = (name) => { +export const getInitials = (name?: string): string => { let initials = "N/A"; const pieces = typeof name === "string" && name.match(/\b\w/g); diff --git a/src/helpers/browser.js b/src/helpers/browser.js deleted file mode 100644 index 9f7f3de94..000000000 --- a/src/helpers/browser.js +++ /dev/null @@ -1,18 +0,0 @@ -// eslint-disable-next-line no-undef -export const isOSX = typeof window === "undefined" ? false : window.navigator.userAgent.includes("Macintosh"); - -export const isIosBrowser = () => { - // eslint-disable-next-line no-undef - if (typeof window === "undefined" || !window.navigator) return false; - - // eslint-disable-next-line no-undef - const ua = window.navigator.userAgent; - const indexOS = !!/ipad/i.test(ua) || !!/iphone/i.test(ua); - const webkit = !!/webkit/i.test(ua); - - // Additional check for iPad with iOS 13+ - // eslint-disable-next-line no-undef - const indexPad = !!/macintosh/i.test(ua) && navigator.maxTouchPoints > 1; - - return (indexOS && webkit) || indexPad; -}; diff --git a/src/helpers/browser.ts b/src/helpers/browser.ts new file mode 100644 index 000000000..532a3fba7 --- /dev/null +++ b/src/helpers/browser.ts @@ -0,0 +1,15 @@ +export const isOSX: boolean = typeof window === "undefined" ? false : window.navigator.userAgent.includes("Macintosh"); + +export const isIosBrowser = (): boolean => { + if (typeof window === "undefined" || !window.navigator) { + return false; + } + + const ua = window.navigator.userAgent; + const indexOS = !!/ipad/i.test(ua) || !!/iphone/i.test(ua); + const webkit = !!/webkit/i.test(ua); + + const indexPad = !!/macintosh/i.test(ua) && navigator.maxTouchPoints > 1; + + return (indexOS && webkit) || indexPad; +}; diff --git a/src/helpers/children.js b/src/helpers/children.js deleted file mode 100644 index d1a69fc2b..000000000 --- a/src/helpers/children.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Children } from "react"; - -export const getChildrenByType = (children, type) => { - return Children.toArray(children).filter((child) => child.type === type); -}; - -export const getChildByType = (children, type) => { - return Children.toArray(children).find((child) => child.type === type) ?? null; -}; diff --git a/src/helpers/children.ts b/src/helpers/children.ts new file mode 100644 index 000000000..a673251fd --- /dev/null +++ b/src/helpers/children.ts @@ -0,0 +1,19 @@ +import { Children, ReactNode, ReactElement, JSXElementConstructor } from "react"; + +export const getChildrenByType = ( + children: ReactNode, + type: JSXElementConstructor | string, +): ReactElement[] => { + return Children.toArray(children).filter( + (child): child is ReactElement => (child as ReactElement).type === type, + ); +}; + +export const getChildByType = ( + children: ReactNode, + type: JSXElementConstructor | string, +): ReactElement | null => { + return ( + (Children.toArray(children).find((child) => (child as ReactElement).type === type) as ReactElement) ?? null + ); +}; diff --git a/src/helpers/currency.js b/src/helpers/currency.ts similarity index 69% rename from src/helpers/currency.js rename to src/helpers/currency.ts index 3f01210cc..267cf163e 100644 --- a/src/helpers/currency.js +++ b/src/helpers/currency.ts @@ -4,11 +4,16 @@ const userLocale = getUserLocale(); const zeroDecimalCurrencies = new Set(["JPY", "CLP", "KRW", "LAK", "PYG", "VND", "VUV"]); -export const isZeroDecimal = (currency) => { +export const isZeroDecimal = (currency: string): boolean => { return zeroDecimalCurrencies.has(currency); }; -export const getSymbol = (currency, locale = userLocale, amount = 0, isNarrowSymbolForm = false) => { +export const getSymbol = ( + currency: string, + locale: string = userLocale, + amount: number = 0, + isNarrowSymbolForm: boolean = false, +): string => { const string = new Intl.NumberFormat(locale, { style: "currency", currency, diff --git a/src/helpers/date.js b/src/helpers/date.ts similarity index 69% rename from src/helpers/date.js rename to src/helpers/date.ts index 8ec12435e..e65f1306d 100644 --- a/src/helpers/date.js +++ b/src/helpers/date.ts @@ -1,4 +1,4 @@ -import dayjs, { isDayjs } from "dayjs"; +import dayjs, { Dayjs, isDayjs } from "dayjs"; import customParseFormat from "dayjs/plugin/customParseFormat"; import LocalizedFormat from "dayjs/plugin/localizedFormat"; import quarterOfYear from "dayjs/plugin/quarterOfYear"; @@ -13,9 +13,9 @@ dayjs.extend(timezone); export const DateFormat = { DATE_ISO: "YYYY-MM-DD", -}; +} as const; -export const isValidTimeZoneName = (timezoneName) => { +export const isValidTimeZoneName = (timezoneName: string): boolean => { try { dayjs.tz(new Date(), timezoneName); } catch { @@ -25,20 +25,20 @@ export const isValidTimeZoneName = (timezoneName) => { return true; }; -export const formatDate = (date, format = DateFormat.DATE_ISO) => { +export const formatDate = (date: Date | Dayjs | string, format: string = DateFormat.DATE_ISO): string => { return dayjs(date).format(format); }; -export const formatTime = (time, format = "h:mm a") => { - const stringTime = String(time).padStart(4, 0); // 700 to 0700 +export const formatTime = (time: string | number, format: string = "h:mm a"): string => { + const stringTime = String(time).padStart(4, "0"); return dayjs(stringTime, "hhmm").format(format); }; -export const dateFromObjectId = (id) => { +export const dateFromObjectId = (id: string): Dayjs => { return dayjs(new Date(Number.parseInt(id.slice(0, 8), 16) * 1000)); }; -export const now = (date, timezone) => { +export const now = (date?: Date | Dayjs | string | number, timezone?: string): Dayjs => { if (!date) { return timezone ? dayjs().tz(timezone).startOf("day") : dayjs(); } @@ -53,7 +53,6 @@ export const now = (date, timezone) => { } if (isDayjs(date)) { - // We do this late because under some conditions this is expensive (see: X2-9122) return date; } @@ -64,9 +63,9 @@ export const now = (date, timezone) => { return timezone ? dayjs().tz(timezone) : dayjs(); }; -const padNumber = (value) => value.toString().padStart(2, "0"); +const padNumber = (value: number): string => value.toString().padStart(2, "0"); -export const dateToString = (date) => { +export const dateToString = (date: Date): string => { const dateString = `${date.getFullYear()}-${padNumber(date.getMonth() + 1)}-${padNumber(date.getDate())}`; const timeString = `${padNumber(date.getHours())}:${padNumber(date.getMinutes())}:${padNumber(date.getSeconds())}`; return `${dateString} ${timeString}`; @@ -75,7 +74,7 @@ export const dateToString = (date) => { const DayTimeStart = "T00:00:00"; const DayTimeEnd = "T23:59:59"; -export const toDate = (date, isStartDate = true) => { +export const toDate = (date: Date | Dayjs | string, isStartDate: boolean = true): Date => { const suffix = isStartDate ? DayTimeStart : DayTimeEnd; if (isDayjs(date)) { @@ -85,9 +84,9 @@ export const toDate = (date, isStartDate = true) => { return new Date(formatDate(date) + suffix); }; -export const isSame = (date1, date2, unit = "day") => { +export const isSame = (date1: Date | Dayjs, date2: Date | Dayjs, unit: string = "day"): boolean => { if (isDayjs(date1) && isDayjs(date2)) { - return date1.isSame(date2, unit); + return date1.isSame(date2, unit as any); } return false; diff --git a/src/helpers/numbers.js b/src/helpers/numbers.ts similarity index 61% rename from src/helpers/numbers.js rename to src/helpers/numbers.ts index ee1dadf98..96c89151b 100644 --- a/src/helpers/numbers.js +++ b/src/helpers/numbers.ts @@ -4,22 +4,26 @@ import { isZeroDecimal } from "./currency"; const userLocale = getUserLocale(); -export const almostZero = (number) => { +export const almostZero = (number: number): boolean => { const absAmount = Math.abs(number); return absAmount >= 0 && absAmount <= 0.001; }; export const numberFormat = ( - amount, - currency = null, - locale = userLocale, - maximumFractionDigits = 2, - isCompact = false, - isNarrowSymbolForm = false, -) => { + amount: number, + currency: string | null = null, + locale: string = userLocale, + maximumFractionDigits: number = 2, + isCompact: boolean = false, + isNarrowSymbolForm: boolean = false, +): string => { const style = currency ? "currency" : "decimal"; - const params = { style, minimumFractionDigits: maximumFractionDigits, maximumFractionDigits }; + const params: Intl.NumberFormatOptions = { + style, + minimumFractionDigits: maximumFractionDigits, + maximumFractionDigits, + }; if (currency) { params.currency = currency; @@ -29,14 +33,13 @@ export const numberFormat = ( return isCompact ? compactNumber(amount, locale) : new Intl.NumberFormat(locale, params).format(amount); }; -export const roundNumber = (currency, amount) => { +export const roundNumber = (currency: string, amount: number): number => { let number = Number(amount); if (isZeroDecimal(currency)) { return round(number); } - // It's done this odd way to ensure JS rounds numbers the same way as PHP if (round(number, 3) === round(number, 4)) { number = round(number, 3); } @@ -44,6 +47,6 @@ export const roundNumber = (currency, amount) => { return round(number, 2); }; -export const compactNumber = (value, locale = userLocale) => { +export const compactNumber = (value: number, locale: string = userLocale): string => { return new Intl.NumberFormat(locale, { notation: "compact", maximumFractionDigits: 2 }).format(value); }; diff --git a/src/helpers/phone.js b/src/helpers/phone.ts similarity index 68% rename from src/helpers/phone.js rename to src/helpers/phone.ts index 52091c308..cc7eef77e 100644 --- a/src/helpers/phone.js +++ b/src/helpers/phone.ts @@ -3,7 +3,7 @@ import phoneLib from "google-libphonenumber"; const PNF = phoneLib.PhoneNumberFormat; const phoneUtil = phoneLib.PhoneNumberUtil.getInstance(); -export const getRegionCode = (number, countryCode = "US") => { +export const getRegionCode = (number: string, countryCode: string = "US"): string | undefined => { try { const phoneObject = phoneUtil.parseAndKeepRawInput(number, countryCode); @@ -15,30 +15,22 @@ export const getRegionCode = (number, countryCode = "US") => { /** * Formats the Phone Number for provided country code - * - * @param number {string} - * @param countryCode {string} - * - * @return {string} */ -export const formatPhoneNumber = (number, countryCode = "US") => { +export const formatPhoneNumber = (number: string, countryCode: string = "US"): string => { try { let phoneObject = phoneUtil.parseAndKeepRawInput(number, countryCode); const regionCode = phoneUtil.getRegionCodeForNumber(phoneObject); if (regionCode && regionCode !== countryCode) { - // If the region code is different than what was passed in, reparse according to that format phoneObject = phoneUtil.parseAndKeepRawInput(number, regionCode); } - // Parse number for display in the region's format - let formattedNumber; + let formattedNumber: string; if (regionCode) { const format = regionCode === countryCode ? PNF.NATIONAL : PNF.INTERNATIONAL; formattedNumber = phoneUtil.format(phoneObject, format); } else { - // If we didn't detect a region, don't guess and return the original thing formattedNumber = number; } From 35eca465ff1ce3d31be0d12b6a2d28aa9985e25d Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:39:31 +0530 Subject: [PATCH 06/40] Migrate custom React hooks to TypeScript Convert all custom React hooks from JavaScript to TypeScript by adding proper type annotations for parameters and return values. Changes: - Migrate src/hooks/useId.ts: Add string type for prefix parameter and return - Migrate src/hooks/useIsClient.ts: Add boolean return type - Migrate src/hooks/useViewportHeight.ts: Add number return type for viewport height All hook files now have full type safety and compile without errors. Type inference works correctly when these hooks are used in components. This completes Phase 4 of the TypeScript migration plan. --- src/hooks/{useId.js => useId.ts} | 2 +- src/hooks/{useIsClient.js => useIsClient.ts} | 2 +- src/hooks/{useViewportHeight.js => useViewportHeight.ts} | 8 +------- 3 files changed, 3 insertions(+), 9 deletions(-) rename src/hooks/{useId.js => useId.ts} (85%) rename src/hooks/{useIsClient.js => useIsClient.ts} (80%) rename src/hooks/{useViewportHeight.js => useViewportHeight.ts} (58%) diff --git a/src/hooks/useId.js b/src/hooks/useId.ts similarity index 85% rename from src/hooks/useId.js rename to src/hooks/useId.ts index 205adbcd8..869297d7e 100644 --- a/src/hooks/useId.js +++ b/src/hooks/useId.ts @@ -2,7 +2,7 @@ import { useContext, useState } from "react"; import { Context } from "../components/Provider"; // TODO: Can be removed once the project is upgraded to React 18 -export const useId = (prefix) => { +export const useId = (prefix: string): string => { const { generateId } = useContext(Context); const [id] = useState(() => `${prefix}-${generateId()}`); return id; diff --git a/src/hooks/useIsClient.js b/src/hooks/useIsClient.ts similarity index 80% rename from src/hooks/useIsClient.js rename to src/hooks/useIsClient.ts index 1211eac19..1978a8fee 100644 --- a/src/hooks/useIsClient.js +++ b/src/hooks/useIsClient.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; -export const useIsClient = () => { +export const useIsClient = (): boolean => { const [isClient, setIsClient] = useState(false); useEffect(() => { diff --git a/src/hooks/useViewportHeight.js b/src/hooks/useViewportHeight.ts similarity index 58% rename from src/hooks/useViewportHeight.js rename to src/hooks/useViewportHeight.ts index 4ea31c6db..2de790136 100644 --- a/src/hooks/useViewportHeight.js +++ b/src/hooks/useViewportHeight.ts @@ -1,24 +1,18 @@ import { useEffect, useState } from "react"; -export const useViewportHeight = () => { +export const useViewportHeight = (): number => { const [viewportHeight, setViewportHeight] = useState(0); useEffect(() => { const detectViewportHeight = () => { - // Use window.innerHeight for a more accurate viewport height - // eslint-disable-next-line no-undef setViewportHeight(window.innerHeight); }; - // Detect height on mount detectViewportHeight(); - // Optional: Re-detect on orientation change for mobile devices - // eslint-disable-next-line no-undef window.addEventListener("orientationchange", detectViewportHeight); return () => { - // eslint-disable-next-line no-undef window.removeEventListener("orientationchange", detectViewportHeight); }; }, []); From e2fbc1e3ddb45b13eba225cf140cf85ab752d988 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:44:01 +0530 Subject: [PATCH 07/40] Migrate icon components to TypeScript Convert icon helper and all 228 icon component files from JavaScript to TypeScript by migrating the createIcon pattern and batch-renaming all icon files. Changes: - Migrate src/icons/src/helpers/icon.tsx with proper TypeScript types * Remove PropTypes, add FC and ComponentPropsWithoutRef types * IconProps interface with size and className * Type-safe icon size from iconSizes object - Migrate src/icons/src/helpers/iconSizes.ts with as const - Batch rename 228 icon .jsx files to .tsx: * Main icon files (200+) * CreditCards icons (6 files) * Logos icons (8 files) * MobileStore icons (2 files) * images directory (9 files) * Tutorials icons (3 files) All icon components now use TypeScript and benefit from type inference through the createIcon wrapper. PropTypes have been replaced with TypeScript types at the helper level, providing type safety for all icons. Build succeeds and declaration files are generated. Some pre-existing .tsx files have type warnings (will be addressed in cleanup phase). This completes Phase 5 of the TypeScript migration plan. --- .../src/{AccountIcon.jsx => AccountIcon.tsx} | 0 .../src/{AddNoteIcon.jsx => AddNoteIcon.tsx} | 0 .../{AddSquareIcon.jsx => AddSquareIcon.tsx} | 0 .../src/{AnnounceIcon.jsx => AnnounceIcon.tsx} | 0 src/icons/src/{AppIcon.jsx => AppIcon.tsx} | 0 .../src/{ArchiveIcon.jsx => ArchiveIcon.tsx} | 0 .../src/{ArrowCcwIcon.jsx => ArrowCcwIcon.tsx} | 0 .../src/{ArrowCwIcon.jsx => ArrowCwIcon.tsx} | 0 .../{ArrowDownIcon.jsx => ArrowDownIcon.tsx} | 0 .../{ArrowRightIcon.jsx => ArrowRightIcon.tsx} | 0 ...wTopRightIcon.jsx => ArrowTopRightIcon.tsx} | 0 .../src/{ArrowUpIcon.jsx => ArrowUpIcon.tsx} | 0 src/icons/src/{AtIcon.jsx => AtIcon.tsx} | 0 .../src/{BalloonIcon.jsx => BalloonIcon.tsx} | 0 .../{BankCheckIcon.jsx => BankCheckIcon.tsx} | 0 .../src/{BarGraphIcon.jsx => BarGraphIcon.tsx} | 0 src/icons/src/{BellIcon.jsx => BellIcon.tsx} | 0 src/icons/src/{BookIcon.jsx => BookIcon.tsx} | 0 .../src/{BookmarkIcon.jsx => BookmarkIcon.tsx} | 0 src/icons/src/{BoxIcon.jsx => BoxIcon.tsx} | 0 .../{BriefcaseIcon.jsx => BriefcaseIcon.tsx} | 0 .../{ButtonCodeIcon.jsx => ButtonCodeIcon.tsx} | 0 src/icons/src/{CakeIcon.jsx => CakeIcon.tsx} | 0 ...CalendarDayIcon.jsx => CalendarDayIcon.tsx} | 0 .../src/{CalendarIcon.jsx => CalendarIcon.tsx} | 0 ...lendarListIcon.jsx => CalendarListIcon.tsx} | 0 ...ndarMonthIcon.jsx => CalendarMonthIcon.tsx} | 0 ...lendarWeekIcon.jsx => CalendarWeekIcon.tsx} | 0 .../src/{CapacityIcon.jsx => CapacityIcon.tsx} | 0 .../src/{CardAltIcon.jsx => CardAltIcon.tsx} | 0 src/icons/src/{CardIcon.jsx => CardIcon.tsx} | 0 src/icons/src/{CartIcon.jsx => CartIcon.tsx} | 0 src/icons/src/{CashIcon.jsx => CashIcon.tsx} | 0 src/icons/src/{CheckIcon.jsx => CheckIcon.tsx} | 0 .../src/{CheckboxIcon.jsx => CheckboxIcon.tsx} | 0 .../{ChecklistIcon.jsx => ChecklistIcon.tsx} | 0 ...ChevronDownIcon.jsx => ChevronDownIcon.tsx} | 0 ...ChevronLeftIcon.jsx => ChevronLeftIcon.tsx} | 0 ...evronRightIcon.jsx => ChevronRightIcon.tsx} | 0 .../{ChevronUpIcon.jsx => ChevronUpIcon.tsx} | 0 src/icons/src/{ChipIcon.jsx => ChipIcon.tsx} | 0 ...illedIcon.jsx => CircleCheckFilledIcon.tsx} | 0 ...CircleCheckIcon.jsx => CircleCheckIcon.tsx} | 0 ...CircleCrossIcon.jsx => CircleCrossIcon.tsx} | 0 ...CircleCrownIcon.jsx => CircleCrownIcon.tsx} | 0 ...rcleDollarIcon.jsx => CircleDollarIcon.tsx} | 0 .../{CircleDotIcon.jsx => CircleDotIcon.tsx} | 0 ...InfinityIcon.jsx => CircleInfinityIcon.tsx} | 0 .../{CircleInfoIcon.jsx => CircleInfoIcon.tsx} | 0 .../{CircleKeyIcon.jsx => CircleKeyIcon.tsx} | 0 .../src/{CircleNotch.jsx => CircleNotch.tsx} | 0 ...CirclePauseIcon.jsx => CirclePauseIcon.tsx} | 0 .../{CirclePlusIcon.jsx => CirclePlusIcon.tsx} | 0 ...SubtractIcon.jsx => CircleSubtractIcon.tsx} | 0 .../{ClipboardIcon.jsx => ClipboardIcon.tsx} | 0 .../src/{ClockAltIcon.jsx => ClockAltIcon.tsx} | 0 src/icons/src/{ClockIcon.jsx => ClockIcon.tsx} | 0 ...ClockManualIcon.jsx => ClockManualIcon.tsx} | 0 src/icons/src/{CloseIcon.jsx => CloseIcon.tsx} | 0 .../src/{CollapseIcon.jsx => CollapseIcon.tsx} | 0 .../{CollectionIcon.jsx => CollectionIcon.tsx} | 0 .../{CommentAltIcon.jsx => CommentAltIcon.tsx} | 0 .../src/{CommentIcon.jsx => CommentIcon.tsx} | 0 .../src/{CompassIcon.jsx => CompassIcon.tsx} | 0 src/icons/src/{CopyIcon.jsx => CopyIcon.tsx} | 0 .../src/{CouponIcon.jsx => CouponIcon.tsx} | 0 .../CreditCards/{AmexIcon.jsx => AmexIcon.tsx} | 0 .../{DinersClubIcon.jsx => DinersClubIcon.tsx} | 0 .../{DiscoverIcon.jsx => DiscoverIcon.tsx} | 0 .../{MaestroIcon.jsx => MaestroIcon.tsx} | 0 .../{MasterCardIcon.jsx => MasterCardIcon.tsx} | 0 .../CreditCards/{VisaIcon.jsx => VisaIcon.tsx} | 0 src/icons/src/{CrmIcon.jsx => CrmIcon.tsx} | 0 src/icons/src/{CrownIcon.jsx => CrownIcon.tsx} | 0 .../{DashboardIcon.jsx => DashboardIcon.tsx} | 0 .../src/{DecreaseIcon.jsx => DecreaseIcon.tsx} | 0 .../src/{DepositIcon.jsx => DepositIcon.tsx} | 0 .../src/{DisabledIcon.jsx => DisabledIcon.tsx} | 0 .../src/{DisputeIcon.jsx => DisputeIcon.tsx} | 0 ...DoubleCheckIcon.jsx => DoubleCheckIcon.tsx} | 0 .../{DownArrowIcon.jsx => DownArrowIcon.tsx} | 0 .../src/{DownloadIcon.jsx => DownloadIcon.tsx} | 0 .../src/{DropdownIcon.jsx => DropdownIcon.tsx} | 0 .../src/{DumbbellIcon.jsx => DumbbellIcon.tsx} | 0 .../{DuplicateIcon.jsx => DuplicateIcon.tsx} | 0 .../src/{DurationIcon.jsx => DurationIcon.tsx} | 0 src/icons/src/{EditIcon.jsx => EditIcon.tsx} | 0 .../src/{EditNoteIcon.jsx => EditNoteIcon.tsx} | 0 .../{EditNotesIcon.jsx => EditNotesIcon.tsx} | 0 .../src/{EllipsisIcon.jsx => EllipsisIcon.tsx} | 0 ...ailCheckedIcon.jsx => EmailCheckedIcon.tsx} | 0 src/icons/src/{EmailIcon.jsx => EmailIcon.tsx} | 0 ...EmailResendIcon.jsx => EmailResendIcon.tsx} | 0 .../{EmailSendIcon.jsx => EmailSendIcon.tsx} | 0 ...hecklistIcon.jsx => EmptyChecklistIcon.tsx} | 0 .../{EquipmentIcon.jsx => EquipmentIcon.tsx} | 0 .../src/{ExportIcon.jsx => ExportIcon.tsx} | 0 .../{EyeClosedIcon.jsx => EyeClosedIcon.tsx} | 0 src/icons/src/{EyeIcon.jsx => EyeIcon.tsx} | 0 ...FaceNeutralIcon.jsx => FaceNeutralIcon.tsx} | 0 .../src/{FaceSadIcon.jsx => FaceSadIcon.tsx} | 0 .../{FaceSmileIcon.jsx => FaceSmileIcon.tsx} | 0 ...tBulbIcon.jsx => FeedbackLightBulbIcon.tsx} | 0 .../src/{FilterIcon.jsx => FilterIcon.tsx} | 0 .../{FilterIconOld.jsx => FilterIconOld.tsx} | 0 src/icons/src/{FlagIcon.jsx => FlagIcon.tsx} | 0 .../src/{FlexFee2Icon.jsx => FlexFee2Icon.tsx} | 0 .../src/{FlexFeeIcon.jsx => FlexFeeIcon.tsx} | 0 src/icons/src/{FoodIcon.jsx => FoodIcon.tsx} | 0 src/icons/src/{ForkIcon.jsx => ForkIcon.tsx} | 0 src/icons/src/{GiftIcon.jsx => GiftIcon.tsx} | 0 src/icons/src/{GlobeIcon.jsx => GlobeIcon.tsx} | 0 src/icons/src/{HandIcon.jsx => HandIcon.tsx} | 0 .../{HandshakeIcon.jsx => HandshakeIcon.tsx} | 0 .../{HelpCenterIcon.jsx => HelpCenterIcon.tsx} | 0 src/icons/src/{HouseIcon.jsx => HouseIcon.tsx} | 0 src/icons/src/{ImageIcon.jsx => ImageIcon.tsx} | 0 .../src/{InfinityIcon.jsx => InfinityIcon.tsx} | 0 .../src/{InvoiceIcon.jsx => InvoiceIcon.tsx} | 0 src/icons/src/{KeyIcon.jsx => KeyIcon.tsx} | 0 src/icons/src/{KioskIcon.jsx => KioskIcon.tsx} | 0 src/icons/src/{LabelIcon.jsx => LabelIcon.tsx} | 0 src/icons/src/{LightIcon.jsx => LightIcon.tsx} | 0 .../{LightningIcon.jsx => LightningIcon.tsx} | 0 src/icons/src/{LinkIcon.jsx => LinkIcon.tsx} | 0 src/icons/src/{LockIcon.jsx => LockIcon.tsx} | 0 .../{FacebookIcon.jsx => FacebookIcon.tsx} | 0 .../{InstagramIcon.jsx => InstagramIcon.tsx} | 0 .../{SnapchatIcon.jsx => SnapchatIcon.tsx} | 0 .../Logos/{TikTokIcon.jsx => TikTokIcon.tsx} | 0 ...TripadvisorIcon.jsx => TripadvisorIcon.tsx} | 0 .../Logos/{TwitterIcon.jsx => TwitterIcon.tsx} | 0 src/icons/src/Logos/{XIcon.jsx => XIcon.tsx} | 0 .../src/Logos/{YelpIcon.jsx => YelpIcon.tsx} | 0 .../src/{LogoutIcon.jsx => LogoutIcon.tsx} | 0 src/icons/src/{MagicIcon.jsx => MagicIcon.tsx} | 0 .../src/{MedicalIcon.jsx => MedicalIcon.tsx} | 0 .../{MegaphoneIcon.jsx => MegaphoneIcon.tsx} | 0 src/icons/src/{MenuIcon.jsx => MenuIcon.tsx} | 0 src/icons/src/{MinusIcon.jsx => MinusIcon.tsx} | 0 ...hecklistIcon.jsx => MixedChecklistIcon.tsx} | 0 .../src/{MobileIcon.jsx => MobileIcon.tsx} | 0 .../{AppStoreBadge.jsx => AppStoreBadge.tsx} | 0 ...PlayMarketBadge.jsx => PlayMarketBadge.tsx} | 0 .../src/{MoneyAddIcon.jsx => MoneyAddIcon.tsx} | 0 .../{MoneyBackIcon.jsx => MoneyBackIcon.tsx} | 0 src/icons/src/{MoneyIcon.jsx => MoneyIcon.tsx} | 0 .../src/{MountainIcon.jsx => MountainIcon.tsx} | 0 src/icons/src/{MouseIcon.jsx => MouseIcon.tsx} | 0 src/icons/src/{PassIcon.jsx => PassIcon.tsx} | 0 src/icons/src/{PauseIcon.jsx => PauseIcon.tsx} | 0 src/icons/src/{PenIcon.jsx => PenIcon.tsx} | 0 src/icons/src/{PhoneIcon.jsx => PhoneIcon.tsx} | 0 .../src/{PhotosIcon.jsx => PhotosIcon.tsx} | 0 .../{PiggyBankIcon.jsx => PiggyBankIcon.tsx} | 0 src/icons/src/{PinIcon.jsx => PinIcon.tsx} | 0 src/icons/src/{PipeIcon.jsx => PipeIcon.tsx} | 0 src/icons/src/{PlayIcon.jsx => PlayIcon.tsx} | 0 src/icons/src/{PlusIcon.jsx => PlusIcon.tsx} | 0 .../src/{PolicyIcon.jsx => PolicyIcon.tsx} | 0 src/icons/src/{PrintIcon.jsx => PrintIcon.tsx} | 0 .../src/{ProductsIcon.jsx => ProductsIcon.tsx} | 0 .../src/{QuestionIcon.jsx => QuestionIcon.tsx} | 0 ...tionnaireIcon.jsx => QuestionnaireIcon.tsx} | 0 .../src/{ReceiptIcon.jsx => ReceiptIcon.tsx} | 0 ...ptionBellIcon.jsx => ReceptionBellIcon.tsx} | 0 ...oneyIcon.jsx => ReceptionBellMoneyIcon.tsx} | 0 .../src/{RefreshIcon.jsx => RefreshIcon.tsx} | 0 .../src/{RefundIcon.jsx => RefundIcon.tsx} | 0 .../src/{RosterIcon.jsx => RosterIcon.tsx} | 0 ...dedSquareIcon.jsx => RoundedSquareIcon.tsx} | 0 src/icons/src/{RulerIcon.jsx => RulerIcon.tsx} | 0 .../{SearchAltIcon.jsx => SearchAltIcon.tsx} | 0 .../src/{SearchIcon.jsx => SearchIcon.tsx} | 0 src/icons/src/{SendIcon.jsx => SendIcon.tsx} | 0 .../src/{SeniorIcon.jsx => SeniorIcon.tsx} | 0 .../src/{SeniorV2Icon.jsx => SeniorV2Icon.tsx} | 0 .../src/{SeniorV3Icon.jsx => SeniorV3Icon.tsx} | 0 .../src/{ServiceIcon.jsx => ServiceIcon.tsx} | 0 .../src/{SettingsIcon.jsx => SettingsIcon.tsx} | 0 .../src/{ShapesIcon.jsx => ShapesIcon.tsx} | 0 src/icons/src/{ShareIcon.jsx => ShareIcon.tsx} | 0 src/icons/src/{ShirtIcon.jsx => ShirtIcon.tsx} | 0 ...ShoppingBagIcon.jsx => ShoppingBagIcon.tsx} | 0 ...litPaymentIcon.jsx => SplitPaymentIcon.tsx} | 0 src/icons/src/{StackIcon.jsx => StackIcon.tsx} | 0 .../{StarFilledIcon.jsx => StarFilledIcon.tsx} | 0 src/icons/src/{StarIcon.jsx => StarIcon.tsx} | 0 ...StoreCreditIcon.jsx => StoreCreditIcon.tsx} | 0 src/icons/src/{TableIcon.jsx => TableIcon.tsx} | 0 src/icons/src/{TaxIcon.jsx => TaxIcon.tsx} | 0 .../{ThumbsDownIcon.jsx => ThumbsDownIcon.tsx} | 0 .../src/{ThumbsUpIcon.jsx => ThumbsUpIcon.tsx} | 0 .../src/{TicketIcon.jsx => TicketIcon.tsx} | 0 ...sferArrowIcon.jsx => TransferArrowIcon.tsx} | 0 ...TranslationIcon.jsx => TranslationIcon.tsx} | 0 src/icons/src/{TrashIcon.jsx => TrashIcon.tsx} | 0 ...alsBadgeIcon.jsx => TutorialsBadgeIcon.tsx} | 0 ...sButtonIcon.jsx => TutorialsButtonIcon.tsx} | 0 ...sSquareIcon.jsx => TutorialsSquareIcon.tsx} | 0 .../src/{UnlinkIcon.jsx => UnlinkIcon.tsx} | 0 .../src/{UserAddIcon.jsx => UserAddIcon.tsx} | 0 ...UserChangedIcon.jsx => UserChangedIcon.tsx} | 0 src/icons/src/{UserIcon.jsx => UserIcon.tsx} | 0 ...erSubtractIcon.jsx => UserSubtractIcon.tsx} | 0 ...rifiedTickIcon.jsx => VerifiedTickIcon.tsx} | 0 .../src/{VeteranIcon.jsx => VeteranIcon.tsx} | 0 .../{ViewNotesIcon.jsx => ViewNotesIcon.tsx} | 0 .../src/{VoucherIcon.jsx => VoucherIcon.tsx} | 0 .../src/{WaitlistIcon.jsx => WaitlistIcon.tsx} | 0 ...gDiamondIcon.jsx => WarningDiamondIcon.tsx} | 0 ...ingFilledIcon.jsx => WarningFilledIcon.tsx} | 0 .../src/{WarningIcon.jsx => WarningIcon.tsx} | 0 ...riangleIcon.jsx => WarningTriangleIcon.tsx} | 0 .../src/{WeightIcon.jsx => WeightIcon.tsx} | 0 src/icons/src/{WifiIcon.jsx => WifiIcon.tsx} | 0 src/icons/src/{WriteIcon.jsx => WriteIcon.tsx} | 0 .../src/{XolaBotIcon.jsx => XolaBotIcon.tsx} | 0 src/icons/src/{XrayIcon.jsx => XrayIcon.tsx} | 0 src/icons/src/helpers/icon.jsx | 17 ----------------- src/icons/src/helpers/icon.tsx | 18 ++++++++++++++++++ src/icons/src/helpers/iconSizes.js | 6 ------ src/icons/src/helpers/iconSizes.ts | 6 ++++++ ...rcleCrossImage.jsx => CircleCrossImage.tsx} | 0 ...CirclePlusImage.jsx => CirclePlusImage.tsx} | 0 .../{ComputerImage.jsx => ComputerImage.tsx} | 0 .../src/images/{EmvImage.jsx => EmvImage.tsx} | 0 .../{ExpediaImage.jsx => ExpediaImage.tsx} | 0 .../{VerifoneImage.jsx => VerifoneImage.tsx} | 0 .../src/images/{XolaLogo.jsx => XolaLogo.tsx} | 0 .../{XolaLogoCircle.jsx => XolaLogoCircle.tsx} | 0 .../{XolaLogoSimple.jsx => XolaLogoSimple.tsx} | 0 232 files changed, 24 insertions(+), 23 deletions(-) rename src/icons/src/{AccountIcon.jsx => AccountIcon.tsx} (100%) rename src/icons/src/{AddNoteIcon.jsx => AddNoteIcon.tsx} (100%) rename src/icons/src/{AddSquareIcon.jsx => AddSquareIcon.tsx} (100%) rename src/icons/src/{AnnounceIcon.jsx => AnnounceIcon.tsx} (100%) rename src/icons/src/{AppIcon.jsx => AppIcon.tsx} (100%) rename src/icons/src/{ArchiveIcon.jsx => ArchiveIcon.tsx} (100%) rename src/icons/src/{ArrowCcwIcon.jsx => ArrowCcwIcon.tsx} (100%) rename src/icons/src/{ArrowCwIcon.jsx => ArrowCwIcon.tsx} (100%) rename src/icons/src/{ArrowDownIcon.jsx => ArrowDownIcon.tsx} (100%) rename src/icons/src/{ArrowRightIcon.jsx => ArrowRightIcon.tsx} (100%) rename src/icons/src/{ArrowTopRightIcon.jsx => ArrowTopRightIcon.tsx} (100%) rename src/icons/src/{ArrowUpIcon.jsx => ArrowUpIcon.tsx} (100%) rename src/icons/src/{AtIcon.jsx => AtIcon.tsx} (100%) rename src/icons/src/{BalloonIcon.jsx => BalloonIcon.tsx} (100%) rename src/icons/src/{BankCheckIcon.jsx => BankCheckIcon.tsx} (100%) rename src/icons/src/{BarGraphIcon.jsx => BarGraphIcon.tsx} (100%) rename src/icons/src/{BellIcon.jsx => BellIcon.tsx} (100%) rename src/icons/src/{BookIcon.jsx => BookIcon.tsx} (100%) rename src/icons/src/{BookmarkIcon.jsx => BookmarkIcon.tsx} (100%) rename src/icons/src/{BoxIcon.jsx => BoxIcon.tsx} (100%) rename src/icons/src/{BriefcaseIcon.jsx => BriefcaseIcon.tsx} (100%) rename src/icons/src/{ButtonCodeIcon.jsx => ButtonCodeIcon.tsx} (100%) rename src/icons/src/{CakeIcon.jsx => CakeIcon.tsx} (100%) rename src/icons/src/{CalendarDayIcon.jsx => CalendarDayIcon.tsx} (100%) rename src/icons/src/{CalendarIcon.jsx => CalendarIcon.tsx} (100%) rename src/icons/src/{CalendarListIcon.jsx => CalendarListIcon.tsx} (100%) rename src/icons/src/{CalendarMonthIcon.jsx => CalendarMonthIcon.tsx} (100%) rename src/icons/src/{CalendarWeekIcon.jsx => CalendarWeekIcon.tsx} (100%) rename src/icons/src/{CapacityIcon.jsx => CapacityIcon.tsx} (100%) rename src/icons/src/{CardAltIcon.jsx => CardAltIcon.tsx} (100%) rename src/icons/src/{CardIcon.jsx => CardIcon.tsx} (100%) rename src/icons/src/{CartIcon.jsx => CartIcon.tsx} (100%) rename src/icons/src/{CashIcon.jsx => CashIcon.tsx} (100%) rename src/icons/src/{CheckIcon.jsx => CheckIcon.tsx} (100%) rename src/icons/src/{CheckboxIcon.jsx => CheckboxIcon.tsx} (100%) rename src/icons/src/{ChecklistIcon.jsx => ChecklistIcon.tsx} (100%) rename src/icons/src/{ChevronDownIcon.jsx => ChevronDownIcon.tsx} (100%) rename src/icons/src/{ChevronLeftIcon.jsx => ChevronLeftIcon.tsx} (100%) rename src/icons/src/{ChevronRightIcon.jsx => ChevronRightIcon.tsx} (100%) rename src/icons/src/{ChevronUpIcon.jsx => ChevronUpIcon.tsx} (100%) rename src/icons/src/{ChipIcon.jsx => ChipIcon.tsx} (100%) rename src/icons/src/{CircleCheckFilledIcon.jsx => CircleCheckFilledIcon.tsx} (100%) rename src/icons/src/{CircleCheckIcon.jsx => CircleCheckIcon.tsx} (100%) rename src/icons/src/{CircleCrossIcon.jsx => CircleCrossIcon.tsx} (100%) rename src/icons/src/{CircleCrownIcon.jsx => CircleCrownIcon.tsx} (100%) rename src/icons/src/{CircleDollarIcon.jsx => CircleDollarIcon.tsx} (100%) rename src/icons/src/{CircleDotIcon.jsx => CircleDotIcon.tsx} (100%) rename src/icons/src/{CircleInfinityIcon.jsx => CircleInfinityIcon.tsx} (100%) rename src/icons/src/{CircleInfoIcon.jsx => CircleInfoIcon.tsx} (100%) rename src/icons/src/{CircleKeyIcon.jsx => CircleKeyIcon.tsx} (100%) rename src/icons/src/{CircleNotch.jsx => CircleNotch.tsx} (100%) rename src/icons/src/{CirclePauseIcon.jsx => CirclePauseIcon.tsx} (100%) rename src/icons/src/{CirclePlusIcon.jsx => CirclePlusIcon.tsx} (100%) rename src/icons/src/{CircleSubtractIcon.jsx => CircleSubtractIcon.tsx} (100%) rename src/icons/src/{ClipboardIcon.jsx => ClipboardIcon.tsx} (100%) rename src/icons/src/{ClockAltIcon.jsx => ClockAltIcon.tsx} (100%) rename src/icons/src/{ClockIcon.jsx => ClockIcon.tsx} (100%) rename src/icons/src/{ClockManualIcon.jsx => ClockManualIcon.tsx} (100%) rename src/icons/src/{CloseIcon.jsx => CloseIcon.tsx} (100%) rename src/icons/src/{CollapseIcon.jsx => CollapseIcon.tsx} (100%) rename src/icons/src/{CollectionIcon.jsx => CollectionIcon.tsx} (100%) rename src/icons/src/{CommentAltIcon.jsx => CommentAltIcon.tsx} (100%) rename src/icons/src/{CommentIcon.jsx => CommentIcon.tsx} (100%) rename src/icons/src/{CompassIcon.jsx => CompassIcon.tsx} (100%) rename src/icons/src/{CopyIcon.jsx => CopyIcon.tsx} (100%) rename src/icons/src/{CouponIcon.jsx => CouponIcon.tsx} (100%) rename src/icons/src/CreditCards/{AmexIcon.jsx => AmexIcon.tsx} (100%) rename src/icons/src/CreditCards/{DinersClubIcon.jsx => DinersClubIcon.tsx} (100%) rename src/icons/src/CreditCards/{DiscoverIcon.jsx => DiscoverIcon.tsx} (100%) rename src/icons/src/CreditCards/{MaestroIcon.jsx => MaestroIcon.tsx} (100%) rename src/icons/src/CreditCards/{MasterCardIcon.jsx => MasterCardIcon.tsx} (100%) rename src/icons/src/CreditCards/{VisaIcon.jsx => VisaIcon.tsx} (100%) rename src/icons/src/{CrmIcon.jsx => CrmIcon.tsx} (100%) rename src/icons/src/{CrownIcon.jsx => CrownIcon.tsx} (100%) rename src/icons/src/{DashboardIcon.jsx => DashboardIcon.tsx} (100%) rename src/icons/src/{DecreaseIcon.jsx => DecreaseIcon.tsx} (100%) rename src/icons/src/{DepositIcon.jsx => DepositIcon.tsx} (100%) rename src/icons/src/{DisabledIcon.jsx => DisabledIcon.tsx} (100%) rename src/icons/src/{DisputeIcon.jsx => DisputeIcon.tsx} (100%) rename src/icons/src/{DoubleCheckIcon.jsx => DoubleCheckIcon.tsx} (100%) rename src/icons/src/{DownArrowIcon.jsx => DownArrowIcon.tsx} (100%) rename src/icons/src/{DownloadIcon.jsx => DownloadIcon.tsx} (100%) rename src/icons/src/{DropdownIcon.jsx => DropdownIcon.tsx} (100%) rename src/icons/src/{DumbbellIcon.jsx => DumbbellIcon.tsx} (100%) rename src/icons/src/{DuplicateIcon.jsx => DuplicateIcon.tsx} (100%) rename src/icons/src/{DurationIcon.jsx => DurationIcon.tsx} (100%) rename src/icons/src/{EditIcon.jsx => EditIcon.tsx} (100%) rename src/icons/src/{EditNoteIcon.jsx => EditNoteIcon.tsx} (100%) rename src/icons/src/{EditNotesIcon.jsx => EditNotesIcon.tsx} (100%) rename src/icons/src/{EllipsisIcon.jsx => EllipsisIcon.tsx} (100%) rename src/icons/src/{EmailCheckedIcon.jsx => EmailCheckedIcon.tsx} (100%) rename src/icons/src/{EmailIcon.jsx => EmailIcon.tsx} (100%) rename src/icons/src/{EmailResendIcon.jsx => EmailResendIcon.tsx} (100%) rename src/icons/src/{EmailSendIcon.jsx => EmailSendIcon.tsx} (100%) rename src/icons/src/{EmptyChecklistIcon.jsx => EmptyChecklistIcon.tsx} (100%) rename src/icons/src/{EquipmentIcon.jsx => EquipmentIcon.tsx} (100%) rename src/icons/src/{ExportIcon.jsx => ExportIcon.tsx} (100%) rename src/icons/src/{EyeClosedIcon.jsx => EyeClosedIcon.tsx} (100%) rename src/icons/src/{EyeIcon.jsx => EyeIcon.tsx} (100%) rename src/icons/src/{FaceNeutralIcon.jsx => FaceNeutralIcon.tsx} (100%) rename src/icons/src/{FaceSadIcon.jsx => FaceSadIcon.tsx} (100%) rename src/icons/src/{FaceSmileIcon.jsx => FaceSmileIcon.tsx} (100%) rename src/icons/src/{FeedbackLightBulbIcon.jsx => FeedbackLightBulbIcon.tsx} (100%) rename src/icons/src/{FilterIcon.jsx => FilterIcon.tsx} (100%) rename src/icons/src/{FilterIconOld.jsx => FilterIconOld.tsx} (100%) rename src/icons/src/{FlagIcon.jsx => FlagIcon.tsx} (100%) rename src/icons/src/{FlexFee2Icon.jsx => FlexFee2Icon.tsx} (100%) rename src/icons/src/{FlexFeeIcon.jsx => FlexFeeIcon.tsx} (100%) rename src/icons/src/{FoodIcon.jsx => FoodIcon.tsx} (100%) rename src/icons/src/{ForkIcon.jsx => ForkIcon.tsx} (100%) rename src/icons/src/{GiftIcon.jsx => GiftIcon.tsx} (100%) rename src/icons/src/{GlobeIcon.jsx => GlobeIcon.tsx} (100%) rename src/icons/src/{HandIcon.jsx => HandIcon.tsx} (100%) rename src/icons/src/{HandshakeIcon.jsx => HandshakeIcon.tsx} (100%) rename src/icons/src/{HelpCenterIcon.jsx => HelpCenterIcon.tsx} (100%) rename src/icons/src/{HouseIcon.jsx => HouseIcon.tsx} (100%) rename src/icons/src/{ImageIcon.jsx => ImageIcon.tsx} (100%) rename src/icons/src/{InfinityIcon.jsx => InfinityIcon.tsx} (100%) rename src/icons/src/{InvoiceIcon.jsx => InvoiceIcon.tsx} (100%) rename src/icons/src/{KeyIcon.jsx => KeyIcon.tsx} (100%) rename src/icons/src/{KioskIcon.jsx => KioskIcon.tsx} (100%) rename src/icons/src/{LabelIcon.jsx => LabelIcon.tsx} (100%) rename src/icons/src/{LightIcon.jsx => LightIcon.tsx} (100%) rename src/icons/src/{LightningIcon.jsx => LightningIcon.tsx} (100%) rename src/icons/src/{LinkIcon.jsx => LinkIcon.tsx} (100%) rename src/icons/src/{LockIcon.jsx => LockIcon.tsx} (100%) rename src/icons/src/Logos/{FacebookIcon.jsx => FacebookIcon.tsx} (100%) rename src/icons/src/Logos/{InstagramIcon.jsx => InstagramIcon.tsx} (100%) rename src/icons/src/Logos/{SnapchatIcon.jsx => SnapchatIcon.tsx} (100%) rename src/icons/src/Logos/{TikTokIcon.jsx => TikTokIcon.tsx} (100%) rename src/icons/src/Logos/{TripadvisorIcon.jsx => TripadvisorIcon.tsx} (100%) rename src/icons/src/Logos/{TwitterIcon.jsx => TwitterIcon.tsx} (100%) rename src/icons/src/Logos/{XIcon.jsx => XIcon.tsx} (100%) rename src/icons/src/Logos/{YelpIcon.jsx => YelpIcon.tsx} (100%) rename src/icons/src/{LogoutIcon.jsx => LogoutIcon.tsx} (100%) rename src/icons/src/{MagicIcon.jsx => MagicIcon.tsx} (100%) rename src/icons/src/{MedicalIcon.jsx => MedicalIcon.tsx} (100%) rename src/icons/src/{MegaphoneIcon.jsx => MegaphoneIcon.tsx} (100%) rename src/icons/src/{MenuIcon.jsx => MenuIcon.tsx} (100%) rename src/icons/src/{MinusIcon.jsx => MinusIcon.tsx} (100%) rename src/icons/src/{MixedChecklistIcon.jsx => MixedChecklistIcon.tsx} (100%) rename src/icons/src/{MobileIcon.jsx => MobileIcon.tsx} (100%) rename src/icons/src/MobileStore/{AppStoreBadge.jsx => AppStoreBadge.tsx} (100%) rename src/icons/src/MobileStore/{PlayMarketBadge.jsx => PlayMarketBadge.tsx} (100%) rename src/icons/src/{MoneyAddIcon.jsx => MoneyAddIcon.tsx} (100%) rename src/icons/src/{MoneyBackIcon.jsx => MoneyBackIcon.tsx} (100%) rename src/icons/src/{MoneyIcon.jsx => MoneyIcon.tsx} (100%) rename src/icons/src/{MountainIcon.jsx => MountainIcon.tsx} (100%) rename src/icons/src/{MouseIcon.jsx => MouseIcon.tsx} (100%) rename src/icons/src/{PassIcon.jsx => PassIcon.tsx} (100%) rename src/icons/src/{PauseIcon.jsx => PauseIcon.tsx} (100%) rename src/icons/src/{PenIcon.jsx => PenIcon.tsx} (100%) rename src/icons/src/{PhoneIcon.jsx => PhoneIcon.tsx} (100%) rename src/icons/src/{PhotosIcon.jsx => PhotosIcon.tsx} (100%) rename src/icons/src/{PiggyBankIcon.jsx => PiggyBankIcon.tsx} (100%) rename src/icons/src/{PinIcon.jsx => PinIcon.tsx} (100%) rename src/icons/src/{PipeIcon.jsx => PipeIcon.tsx} (100%) rename src/icons/src/{PlayIcon.jsx => PlayIcon.tsx} (100%) rename src/icons/src/{PlusIcon.jsx => PlusIcon.tsx} (100%) rename src/icons/src/{PolicyIcon.jsx => PolicyIcon.tsx} (100%) rename src/icons/src/{PrintIcon.jsx => PrintIcon.tsx} (100%) rename src/icons/src/{ProductsIcon.jsx => ProductsIcon.tsx} (100%) rename src/icons/src/{QuestionIcon.jsx => QuestionIcon.tsx} (100%) rename src/icons/src/{QuestionnaireIcon.jsx => QuestionnaireIcon.tsx} (100%) rename src/icons/src/{ReceiptIcon.jsx => ReceiptIcon.tsx} (100%) rename src/icons/src/{ReceptionBellIcon.jsx => ReceptionBellIcon.tsx} (100%) rename src/icons/src/{ReceptionBellMoneyIcon.jsx => ReceptionBellMoneyIcon.tsx} (100%) rename src/icons/src/{RefreshIcon.jsx => RefreshIcon.tsx} (100%) rename src/icons/src/{RefundIcon.jsx => RefundIcon.tsx} (100%) rename src/icons/src/{RosterIcon.jsx => RosterIcon.tsx} (100%) rename src/icons/src/{RoundedSquareIcon.jsx => RoundedSquareIcon.tsx} (100%) rename src/icons/src/{RulerIcon.jsx => RulerIcon.tsx} (100%) rename src/icons/src/{SearchAltIcon.jsx => SearchAltIcon.tsx} (100%) rename src/icons/src/{SearchIcon.jsx => SearchIcon.tsx} (100%) rename src/icons/src/{SendIcon.jsx => SendIcon.tsx} (100%) rename src/icons/src/{SeniorIcon.jsx => SeniorIcon.tsx} (100%) rename src/icons/src/{SeniorV2Icon.jsx => SeniorV2Icon.tsx} (100%) rename src/icons/src/{SeniorV3Icon.jsx => SeniorV3Icon.tsx} (100%) rename src/icons/src/{ServiceIcon.jsx => ServiceIcon.tsx} (100%) rename src/icons/src/{SettingsIcon.jsx => SettingsIcon.tsx} (100%) rename src/icons/src/{ShapesIcon.jsx => ShapesIcon.tsx} (100%) rename src/icons/src/{ShareIcon.jsx => ShareIcon.tsx} (100%) rename src/icons/src/{ShirtIcon.jsx => ShirtIcon.tsx} (100%) rename src/icons/src/{ShoppingBagIcon.jsx => ShoppingBagIcon.tsx} (100%) rename src/icons/src/{SplitPaymentIcon.jsx => SplitPaymentIcon.tsx} (100%) rename src/icons/src/{StackIcon.jsx => StackIcon.tsx} (100%) rename src/icons/src/{StarFilledIcon.jsx => StarFilledIcon.tsx} (100%) rename src/icons/src/{StarIcon.jsx => StarIcon.tsx} (100%) rename src/icons/src/{StoreCreditIcon.jsx => StoreCreditIcon.tsx} (100%) rename src/icons/src/{TableIcon.jsx => TableIcon.tsx} (100%) rename src/icons/src/{TaxIcon.jsx => TaxIcon.tsx} (100%) rename src/icons/src/{ThumbsDownIcon.jsx => ThumbsDownIcon.tsx} (100%) rename src/icons/src/{ThumbsUpIcon.jsx => ThumbsUpIcon.tsx} (100%) rename src/icons/src/{TicketIcon.jsx => TicketIcon.tsx} (100%) rename src/icons/src/{TransferArrowIcon.jsx => TransferArrowIcon.tsx} (100%) rename src/icons/src/{TranslationIcon.jsx => TranslationIcon.tsx} (100%) rename src/icons/src/{TrashIcon.jsx => TrashIcon.tsx} (100%) rename src/icons/src/Tutorials/{TutorialsBadgeIcon.jsx => TutorialsBadgeIcon.tsx} (100%) rename src/icons/src/Tutorials/{TutorialsButtonIcon.jsx => TutorialsButtonIcon.tsx} (100%) rename src/icons/src/Tutorials/{TutorialsSquareIcon.jsx => TutorialsSquareIcon.tsx} (100%) rename src/icons/src/{UnlinkIcon.jsx => UnlinkIcon.tsx} (100%) rename src/icons/src/{UserAddIcon.jsx => UserAddIcon.tsx} (100%) rename src/icons/src/{UserChangedIcon.jsx => UserChangedIcon.tsx} (100%) rename src/icons/src/{UserIcon.jsx => UserIcon.tsx} (100%) rename src/icons/src/{UserSubtractIcon.jsx => UserSubtractIcon.tsx} (100%) rename src/icons/src/{VerifiedTickIcon.jsx => VerifiedTickIcon.tsx} (100%) rename src/icons/src/{VeteranIcon.jsx => VeteranIcon.tsx} (100%) rename src/icons/src/{ViewNotesIcon.jsx => ViewNotesIcon.tsx} (100%) rename src/icons/src/{VoucherIcon.jsx => VoucherIcon.tsx} (100%) rename src/icons/src/{WaitlistIcon.jsx => WaitlistIcon.tsx} (100%) rename src/icons/src/{WarningDiamondIcon.jsx => WarningDiamondIcon.tsx} (100%) rename src/icons/src/{WarningFilledIcon.jsx => WarningFilledIcon.tsx} (100%) rename src/icons/src/{WarningIcon.jsx => WarningIcon.tsx} (100%) rename src/icons/src/{WarningTriangleIcon.jsx => WarningTriangleIcon.tsx} (100%) rename src/icons/src/{WeightIcon.jsx => WeightIcon.tsx} (100%) rename src/icons/src/{WifiIcon.jsx => WifiIcon.tsx} (100%) rename src/icons/src/{WriteIcon.jsx => WriteIcon.tsx} (100%) rename src/icons/src/{XolaBotIcon.jsx => XolaBotIcon.tsx} (100%) rename src/icons/src/{XrayIcon.jsx => XrayIcon.tsx} (100%) delete mode 100644 src/icons/src/helpers/icon.jsx create mode 100644 src/icons/src/helpers/icon.tsx delete mode 100644 src/icons/src/helpers/iconSizes.js create mode 100644 src/icons/src/helpers/iconSizes.ts rename src/icons/src/images/{CircleCrossImage.jsx => CircleCrossImage.tsx} (100%) rename src/icons/src/images/{CirclePlusImage.jsx => CirclePlusImage.tsx} (100%) rename src/icons/src/images/{ComputerImage.jsx => ComputerImage.tsx} (100%) rename src/icons/src/images/{EmvImage.jsx => EmvImage.tsx} (100%) rename src/icons/src/images/{ExpediaImage.jsx => ExpediaImage.tsx} (100%) rename src/icons/src/images/{VerifoneImage.jsx => VerifoneImage.tsx} (100%) rename src/icons/src/images/{XolaLogo.jsx => XolaLogo.tsx} (100%) rename src/icons/src/images/{XolaLogoCircle.jsx => XolaLogoCircle.tsx} (100%) rename src/icons/src/images/{XolaLogoSimple.jsx => XolaLogoSimple.tsx} (100%) diff --git a/src/icons/src/AccountIcon.jsx b/src/icons/src/AccountIcon.tsx similarity index 100% rename from src/icons/src/AccountIcon.jsx rename to src/icons/src/AccountIcon.tsx diff --git a/src/icons/src/AddNoteIcon.jsx b/src/icons/src/AddNoteIcon.tsx similarity index 100% rename from src/icons/src/AddNoteIcon.jsx rename to src/icons/src/AddNoteIcon.tsx diff --git a/src/icons/src/AddSquareIcon.jsx b/src/icons/src/AddSquareIcon.tsx similarity index 100% rename from src/icons/src/AddSquareIcon.jsx rename to src/icons/src/AddSquareIcon.tsx diff --git a/src/icons/src/AnnounceIcon.jsx b/src/icons/src/AnnounceIcon.tsx similarity index 100% rename from src/icons/src/AnnounceIcon.jsx rename to src/icons/src/AnnounceIcon.tsx diff --git a/src/icons/src/AppIcon.jsx b/src/icons/src/AppIcon.tsx similarity index 100% rename from src/icons/src/AppIcon.jsx rename to src/icons/src/AppIcon.tsx diff --git a/src/icons/src/ArchiveIcon.jsx b/src/icons/src/ArchiveIcon.tsx similarity index 100% rename from src/icons/src/ArchiveIcon.jsx rename to src/icons/src/ArchiveIcon.tsx diff --git a/src/icons/src/ArrowCcwIcon.jsx b/src/icons/src/ArrowCcwIcon.tsx similarity index 100% rename from src/icons/src/ArrowCcwIcon.jsx rename to src/icons/src/ArrowCcwIcon.tsx diff --git a/src/icons/src/ArrowCwIcon.jsx b/src/icons/src/ArrowCwIcon.tsx similarity index 100% rename from src/icons/src/ArrowCwIcon.jsx rename to src/icons/src/ArrowCwIcon.tsx diff --git a/src/icons/src/ArrowDownIcon.jsx b/src/icons/src/ArrowDownIcon.tsx similarity index 100% rename from src/icons/src/ArrowDownIcon.jsx rename to src/icons/src/ArrowDownIcon.tsx diff --git a/src/icons/src/ArrowRightIcon.jsx b/src/icons/src/ArrowRightIcon.tsx similarity index 100% rename from src/icons/src/ArrowRightIcon.jsx rename to src/icons/src/ArrowRightIcon.tsx diff --git a/src/icons/src/ArrowTopRightIcon.jsx b/src/icons/src/ArrowTopRightIcon.tsx similarity index 100% rename from src/icons/src/ArrowTopRightIcon.jsx rename to src/icons/src/ArrowTopRightIcon.tsx diff --git a/src/icons/src/ArrowUpIcon.jsx b/src/icons/src/ArrowUpIcon.tsx similarity index 100% rename from src/icons/src/ArrowUpIcon.jsx rename to src/icons/src/ArrowUpIcon.tsx diff --git a/src/icons/src/AtIcon.jsx b/src/icons/src/AtIcon.tsx similarity index 100% rename from src/icons/src/AtIcon.jsx rename to src/icons/src/AtIcon.tsx diff --git a/src/icons/src/BalloonIcon.jsx b/src/icons/src/BalloonIcon.tsx similarity index 100% rename from src/icons/src/BalloonIcon.jsx rename to src/icons/src/BalloonIcon.tsx diff --git a/src/icons/src/BankCheckIcon.jsx b/src/icons/src/BankCheckIcon.tsx similarity index 100% rename from src/icons/src/BankCheckIcon.jsx rename to src/icons/src/BankCheckIcon.tsx diff --git a/src/icons/src/BarGraphIcon.jsx b/src/icons/src/BarGraphIcon.tsx similarity index 100% rename from src/icons/src/BarGraphIcon.jsx rename to src/icons/src/BarGraphIcon.tsx diff --git a/src/icons/src/BellIcon.jsx b/src/icons/src/BellIcon.tsx similarity index 100% rename from src/icons/src/BellIcon.jsx rename to src/icons/src/BellIcon.tsx diff --git a/src/icons/src/BookIcon.jsx b/src/icons/src/BookIcon.tsx similarity index 100% rename from src/icons/src/BookIcon.jsx rename to src/icons/src/BookIcon.tsx diff --git a/src/icons/src/BookmarkIcon.jsx b/src/icons/src/BookmarkIcon.tsx similarity index 100% rename from src/icons/src/BookmarkIcon.jsx rename to src/icons/src/BookmarkIcon.tsx diff --git a/src/icons/src/BoxIcon.jsx b/src/icons/src/BoxIcon.tsx similarity index 100% rename from src/icons/src/BoxIcon.jsx rename to src/icons/src/BoxIcon.tsx diff --git a/src/icons/src/BriefcaseIcon.jsx b/src/icons/src/BriefcaseIcon.tsx similarity index 100% rename from src/icons/src/BriefcaseIcon.jsx rename to src/icons/src/BriefcaseIcon.tsx diff --git a/src/icons/src/ButtonCodeIcon.jsx b/src/icons/src/ButtonCodeIcon.tsx similarity index 100% rename from src/icons/src/ButtonCodeIcon.jsx rename to src/icons/src/ButtonCodeIcon.tsx diff --git a/src/icons/src/CakeIcon.jsx b/src/icons/src/CakeIcon.tsx similarity index 100% rename from src/icons/src/CakeIcon.jsx rename to src/icons/src/CakeIcon.tsx diff --git a/src/icons/src/CalendarDayIcon.jsx b/src/icons/src/CalendarDayIcon.tsx similarity index 100% rename from src/icons/src/CalendarDayIcon.jsx rename to src/icons/src/CalendarDayIcon.tsx diff --git a/src/icons/src/CalendarIcon.jsx b/src/icons/src/CalendarIcon.tsx similarity index 100% rename from src/icons/src/CalendarIcon.jsx rename to src/icons/src/CalendarIcon.tsx diff --git a/src/icons/src/CalendarListIcon.jsx b/src/icons/src/CalendarListIcon.tsx similarity index 100% rename from src/icons/src/CalendarListIcon.jsx rename to src/icons/src/CalendarListIcon.tsx diff --git a/src/icons/src/CalendarMonthIcon.jsx b/src/icons/src/CalendarMonthIcon.tsx similarity index 100% rename from src/icons/src/CalendarMonthIcon.jsx rename to src/icons/src/CalendarMonthIcon.tsx diff --git a/src/icons/src/CalendarWeekIcon.jsx b/src/icons/src/CalendarWeekIcon.tsx similarity index 100% rename from src/icons/src/CalendarWeekIcon.jsx rename to src/icons/src/CalendarWeekIcon.tsx diff --git a/src/icons/src/CapacityIcon.jsx b/src/icons/src/CapacityIcon.tsx similarity index 100% rename from src/icons/src/CapacityIcon.jsx rename to src/icons/src/CapacityIcon.tsx diff --git a/src/icons/src/CardAltIcon.jsx b/src/icons/src/CardAltIcon.tsx similarity index 100% rename from src/icons/src/CardAltIcon.jsx rename to src/icons/src/CardAltIcon.tsx diff --git a/src/icons/src/CardIcon.jsx b/src/icons/src/CardIcon.tsx similarity index 100% rename from src/icons/src/CardIcon.jsx rename to src/icons/src/CardIcon.tsx diff --git a/src/icons/src/CartIcon.jsx b/src/icons/src/CartIcon.tsx similarity index 100% rename from src/icons/src/CartIcon.jsx rename to src/icons/src/CartIcon.tsx diff --git a/src/icons/src/CashIcon.jsx b/src/icons/src/CashIcon.tsx similarity index 100% rename from src/icons/src/CashIcon.jsx rename to src/icons/src/CashIcon.tsx diff --git a/src/icons/src/CheckIcon.jsx b/src/icons/src/CheckIcon.tsx similarity index 100% rename from src/icons/src/CheckIcon.jsx rename to src/icons/src/CheckIcon.tsx diff --git a/src/icons/src/CheckboxIcon.jsx b/src/icons/src/CheckboxIcon.tsx similarity index 100% rename from src/icons/src/CheckboxIcon.jsx rename to src/icons/src/CheckboxIcon.tsx diff --git a/src/icons/src/ChecklistIcon.jsx b/src/icons/src/ChecklistIcon.tsx similarity index 100% rename from src/icons/src/ChecklistIcon.jsx rename to src/icons/src/ChecklistIcon.tsx diff --git a/src/icons/src/ChevronDownIcon.jsx b/src/icons/src/ChevronDownIcon.tsx similarity index 100% rename from src/icons/src/ChevronDownIcon.jsx rename to src/icons/src/ChevronDownIcon.tsx diff --git a/src/icons/src/ChevronLeftIcon.jsx b/src/icons/src/ChevronLeftIcon.tsx similarity index 100% rename from src/icons/src/ChevronLeftIcon.jsx rename to src/icons/src/ChevronLeftIcon.tsx diff --git a/src/icons/src/ChevronRightIcon.jsx b/src/icons/src/ChevronRightIcon.tsx similarity index 100% rename from src/icons/src/ChevronRightIcon.jsx rename to src/icons/src/ChevronRightIcon.tsx diff --git a/src/icons/src/ChevronUpIcon.jsx b/src/icons/src/ChevronUpIcon.tsx similarity index 100% rename from src/icons/src/ChevronUpIcon.jsx rename to src/icons/src/ChevronUpIcon.tsx diff --git a/src/icons/src/ChipIcon.jsx b/src/icons/src/ChipIcon.tsx similarity index 100% rename from src/icons/src/ChipIcon.jsx rename to src/icons/src/ChipIcon.tsx diff --git a/src/icons/src/CircleCheckFilledIcon.jsx b/src/icons/src/CircleCheckFilledIcon.tsx similarity index 100% rename from src/icons/src/CircleCheckFilledIcon.jsx rename to src/icons/src/CircleCheckFilledIcon.tsx diff --git a/src/icons/src/CircleCheckIcon.jsx b/src/icons/src/CircleCheckIcon.tsx similarity index 100% rename from src/icons/src/CircleCheckIcon.jsx rename to src/icons/src/CircleCheckIcon.tsx diff --git a/src/icons/src/CircleCrossIcon.jsx b/src/icons/src/CircleCrossIcon.tsx similarity index 100% rename from src/icons/src/CircleCrossIcon.jsx rename to src/icons/src/CircleCrossIcon.tsx diff --git a/src/icons/src/CircleCrownIcon.jsx b/src/icons/src/CircleCrownIcon.tsx similarity index 100% rename from src/icons/src/CircleCrownIcon.jsx rename to src/icons/src/CircleCrownIcon.tsx diff --git a/src/icons/src/CircleDollarIcon.jsx b/src/icons/src/CircleDollarIcon.tsx similarity index 100% rename from src/icons/src/CircleDollarIcon.jsx rename to src/icons/src/CircleDollarIcon.tsx diff --git a/src/icons/src/CircleDotIcon.jsx b/src/icons/src/CircleDotIcon.tsx similarity index 100% rename from src/icons/src/CircleDotIcon.jsx rename to src/icons/src/CircleDotIcon.tsx diff --git a/src/icons/src/CircleInfinityIcon.jsx b/src/icons/src/CircleInfinityIcon.tsx similarity index 100% rename from src/icons/src/CircleInfinityIcon.jsx rename to src/icons/src/CircleInfinityIcon.tsx diff --git a/src/icons/src/CircleInfoIcon.jsx b/src/icons/src/CircleInfoIcon.tsx similarity index 100% rename from src/icons/src/CircleInfoIcon.jsx rename to src/icons/src/CircleInfoIcon.tsx diff --git a/src/icons/src/CircleKeyIcon.jsx b/src/icons/src/CircleKeyIcon.tsx similarity index 100% rename from src/icons/src/CircleKeyIcon.jsx rename to src/icons/src/CircleKeyIcon.tsx diff --git a/src/icons/src/CircleNotch.jsx b/src/icons/src/CircleNotch.tsx similarity index 100% rename from src/icons/src/CircleNotch.jsx rename to src/icons/src/CircleNotch.tsx diff --git a/src/icons/src/CirclePauseIcon.jsx b/src/icons/src/CirclePauseIcon.tsx similarity index 100% rename from src/icons/src/CirclePauseIcon.jsx rename to src/icons/src/CirclePauseIcon.tsx diff --git a/src/icons/src/CirclePlusIcon.jsx b/src/icons/src/CirclePlusIcon.tsx similarity index 100% rename from src/icons/src/CirclePlusIcon.jsx rename to src/icons/src/CirclePlusIcon.tsx diff --git a/src/icons/src/CircleSubtractIcon.jsx b/src/icons/src/CircleSubtractIcon.tsx similarity index 100% rename from src/icons/src/CircleSubtractIcon.jsx rename to src/icons/src/CircleSubtractIcon.tsx diff --git a/src/icons/src/ClipboardIcon.jsx b/src/icons/src/ClipboardIcon.tsx similarity index 100% rename from src/icons/src/ClipboardIcon.jsx rename to src/icons/src/ClipboardIcon.tsx diff --git a/src/icons/src/ClockAltIcon.jsx b/src/icons/src/ClockAltIcon.tsx similarity index 100% rename from src/icons/src/ClockAltIcon.jsx rename to src/icons/src/ClockAltIcon.tsx diff --git a/src/icons/src/ClockIcon.jsx b/src/icons/src/ClockIcon.tsx similarity index 100% rename from src/icons/src/ClockIcon.jsx rename to src/icons/src/ClockIcon.tsx diff --git a/src/icons/src/ClockManualIcon.jsx b/src/icons/src/ClockManualIcon.tsx similarity index 100% rename from src/icons/src/ClockManualIcon.jsx rename to src/icons/src/ClockManualIcon.tsx diff --git a/src/icons/src/CloseIcon.jsx b/src/icons/src/CloseIcon.tsx similarity index 100% rename from src/icons/src/CloseIcon.jsx rename to src/icons/src/CloseIcon.tsx diff --git a/src/icons/src/CollapseIcon.jsx b/src/icons/src/CollapseIcon.tsx similarity index 100% rename from src/icons/src/CollapseIcon.jsx rename to src/icons/src/CollapseIcon.tsx diff --git a/src/icons/src/CollectionIcon.jsx b/src/icons/src/CollectionIcon.tsx similarity index 100% rename from src/icons/src/CollectionIcon.jsx rename to src/icons/src/CollectionIcon.tsx diff --git a/src/icons/src/CommentAltIcon.jsx b/src/icons/src/CommentAltIcon.tsx similarity index 100% rename from src/icons/src/CommentAltIcon.jsx rename to src/icons/src/CommentAltIcon.tsx diff --git a/src/icons/src/CommentIcon.jsx b/src/icons/src/CommentIcon.tsx similarity index 100% rename from src/icons/src/CommentIcon.jsx rename to src/icons/src/CommentIcon.tsx diff --git a/src/icons/src/CompassIcon.jsx b/src/icons/src/CompassIcon.tsx similarity index 100% rename from src/icons/src/CompassIcon.jsx rename to src/icons/src/CompassIcon.tsx diff --git a/src/icons/src/CopyIcon.jsx b/src/icons/src/CopyIcon.tsx similarity index 100% rename from src/icons/src/CopyIcon.jsx rename to src/icons/src/CopyIcon.tsx diff --git a/src/icons/src/CouponIcon.jsx b/src/icons/src/CouponIcon.tsx similarity index 100% rename from src/icons/src/CouponIcon.jsx rename to src/icons/src/CouponIcon.tsx diff --git a/src/icons/src/CreditCards/AmexIcon.jsx b/src/icons/src/CreditCards/AmexIcon.tsx similarity index 100% rename from src/icons/src/CreditCards/AmexIcon.jsx rename to src/icons/src/CreditCards/AmexIcon.tsx diff --git a/src/icons/src/CreditCards/DinersClubIcon.jsx b/src/icons/src/CreditCards/DinersClubIcon.tsx similarity index 100% rename from src/icons/src/CreditCards/DinersClubIcon.jsx rename to src/icons/src/CreditCards/DinersClubIcon.tsx diff --git a/src/icons/src/CreditCards/DiscoverIcon.jsx b/src/icons/src/CreditCards/DiscoverIcon.tsx similarity index 100% rename from src/icons/src/CreditCards/DiscoverIcon.jsx rename to src/icons/src/CreditCards/DiscoverIcon.tsx diff --git a/src/icons/src/CreditCards/MaestroIcon.jsx b/src/icons/src/CreditCards/MaestroIcon.tsx similarity index 100% rename from src/icons/src/CreditCards/MaestroIcon.jsx rename to src/icons/src/CreditCards/MaestroIcon.tsx diff --git a/src/icons/src/CreditCards/MasterCardIcon.jsx b/src/icons/src/CreditCards/MasterCardIcon.tsx similarity index 100% rename from src/icons/src/CreditCards/MasterCardIcon.jsx rename to src/icons/src/CreditCards/MasterCardIcon.tsx diff --git a/src/icons/src/CreditCards/VisaIcon.jsx b/src/icons/src/CreditCards/VisaIcon.tsx similarity index 100% rename from src/icons/src/CreditCards/VisaIcon.jsx rename to src/icons/src/CreditCards/VisaIcon.tsx diff --git a/src/icons/src/CrmIcon.jsx b/src/icons/src/CrmIcon.tsx similarity index 100% rename from src/icons/src/CrmIcon.jsx rename to src/icons/src/CrmIcon.tsx diff --git a/src/icons/src/CrownIcon.jsx b/src/icons/src/CrownIcon.tsx similarity index 100% rename from src/icons/src/CrownIcon.jsx rename to src/icons/src/CrownIcon.tsx diff --git a/src/icons/src/DashboardIcon.jsx b/src/icons/src/DashboardIcon.tsx similarity index 100% rename from src/icons/src/DashboardIcon.jsx rename to src/icons/src/DashboardIcon.tsx diff --git a/src/icons/src/DecreaseIcon.jsx b/src/icons/src/DecreaseIcon.tsx similarity index 100% rename from src/icons/src/DecreaseIcon.jsx rename to src/icons/src/DecreaseIcon.tsx diff --git a/src/icons/src/DepositIcon.jsx b/src/icons/src/DepositIcon.tsx similarity index 100% rename from src/icons/src/DepositIcon.jsx rename to src/icons/src/DepositIcon.tsx diff --git a/src/icons/src/DisabledIcon.jsx b/src/icons/src/DisabledIcon.tsx similarity index 100% rename from src/icons/src/DisabledIcon.jsx rename to src/icons/src/DisabledIcon.tsx diff --git a/src/icons/src/DisputeIcon.jsx b/src/icons/src/DisputeIcon.tsx similarity index 100% rename from src/icons/src/DisputeIcon.jsx rename to src/icons/src/DisputeIcon.tsx diff --git a/src/icons/src/DoubleCheckIcon.jsx b/src/icons/src/DoubleCheckIcon.tsx similarity index 100% rename from src/icons/src/DoubleCheckIcon.jsx rename to src/icons/src/DoubleCheckIcon.tsx diff --git a/src/icons/src/DownArrowIcon.jsx b/src/icons/src/DownArrowIcon.tsx similarity index 100% rename from src/icons/src/DownArrowIcon.jsx rename to src/icons/src/DownArrowIcon.tsx diff --git a/src/icons/src/DownloadIcon.jsx b/src/icons/src/DownloadIcon.tsx similarity index 100% rename from src/icons/src/DownloadIcon.jsx rename to src/icons/src/DownloadIcon.tsx diff --git a/src/icons/src/DropdownIcon.jsx b/src/icons/src/DropdownIcon.tsx similarity index 100% rename from src/icons/src/DropdownIcon.jsx rename to src/icons/src/DropdownIcon.tsx diff --git a/src/icons/src/DumbbellIcon.jsx b/src/icons/src/DumbbellIcon.tsx similarity index 100% rename from src/icons/src/DumbbellIcon.jsx rename to src/icons/src/DumbbellIcon.tsx diff --git a/src/icons/src/DuplicateIcon.jsx b/src/icons/src/DuplicateIcon.tsx similarity index 100% rename from src/icons/src/DuplicateIcon.jsx rename to src/icons/src/DuplicateIcon.tsx diff --git a/src/icons/src/DurationIcon.jsx b/src/icons/src/DurationIcon.tsx similarity index 100% rename from src/icons/src/DurationIcon.jsx rename to src/icons/src/DurationIcon.tsx diff --git a/src/icons/src/EditIcon.jsx b/src/icons/src/EditIcon.tsx similarity index 100% rename from src/icons/src/EditIcon.jsx rename to src/icons/src/EditIcon.tsx diff --git a/src/icons/src/EditNoteIcon.jsx b/src/icons/src/EditNoteIcon.tsx similarity index 100% rename from src/icons/src/EditNoteIcon.jsx rename to src/icons/src/EditNoteIcon.tsx diff --git a/src/icons/src/EditNotesIcon.jsx b/src/icons/src/EditNotesIcon.tsx similarity index 100% rename from src/icons/src/EditNotesIcon.jsx rename to src/icons/src/EditNotesIcon.tsx diff --git a/src/icons/src/EllipsisIcon.jsx b/src/icons/src/EllipsisIcon.tsx similarity index 100% rename from src/icons/src/EllipsisIcon.jsx rename to src/icons/src/EllipsisIcon.tsx diff --git a/src/icons/src/EmailCheckedIcon.jsx b/src/icons/src/EmailCheckedIcon.tsx similarity index 100% rename from src/icons/src/EmailCheckedIcon.jsx rename to src/icons/src/EmailCheckedIcon.tsx diff --git a/src/icons/src/EmailIcon.jsx b/src/icons/src/EmailIcon.tsx similarity index 100% rename from src/icons/src/EmailIcon.jsx rename to src/icons/src/EmailIcon.tsx diff --git a/src/icons/src/EmailResendIcon.jsx b/src/icons/src/EmailResendIcon.tsx similarity index 100% rename from src/icons/src/EmailResendIcon.jsx rename to src/icons/src/EmailResendIcon.tsx diff --git a/src/icons/src/EmailSendIcon.jsx b/src/icons/src/EmailSendIcon.tsx similarity index 100% rename from src/icons/src/EmailSendIcon.jsx rename to src/icons/src/EmailSendIcon.tsx diff --git a/src/icons/src/EmptyChecklistIcon.jsx b/src/icons/src/EmptyChecklistIcon.tsx similarity index 100% rename from src/icons/src/EmptyChecklistIcon.jsx rename to src/icons/src/EmptyChecklistIcon.tsx diff --git a/src/icons/src/EquipmentIcon.jsx b/src/icons/src/EquipmentIcon.tsx similarity index 100% rename from src/icons/src/EquipmentIcon.jsx rename to src/icons/src/EquipmentIcon.tsx diff --git a/src/icons/src/ExportIcon.jsx b/src/icons/src/ExportIcon.tsx similarity index 100% rename from src/icons/src/ExportIcon.jsx rename to src/icons/src/ExportIcon.tsx diff --git a/src/icons/src/EyeClosedIcon.jsx b/src/icons/src/EyeClosedIcon.tsx similarity index 100% rename from src/icons/src/EyeClosedIcon.jsx rename to src/icons/src/EyeClosedIcon.tsx diff --git a/src/icons/src/EyeIcon.jsx b/src/icons/src/EyeIcon.tsx similarity index 100% rename from src/icons/src/EyeIcon.jsx rename to src/icons/src/EyeIcon.tsx diff --git a/src/icons/src/FaceNeutralIcon.jsx b/src/icons/src/FaceNeutralIcon.tsx similarity index 100% rename from src/icons/src/FaceNeutralIcon.jsx rename to src/icons/src/FaceNeutralIcon.tsx diff --git a/src/icons/src/FaceSadIcon.jsx b/src/icons/src/FaceSadIcon.tsx similarity index 100% rename from src/icons/src/FaceSadIcon.jsx rename to src/icons/src/FaceSadIcon.tsx diff --git a/src/icons/src/FaceSmileIcon.jsx b/src/icons/src/FaceSmileIcon.tsx similarity index 100% rename from src/icons/src/FaceSmileIcon.jsx rename to src/icons/src/FaceSmileIcon.tsx diff --git a/src/icons/src/FeedbackLightBulbIcon.jsx b/src/icons/src/FeedbackLightBulbIcon.tsx similarity index 100% rename from src/icons/src/FeedbackLightBulbIcon.jsx rename to src/icons/src/FeedbackLightBulbIcon.tsx diff --git a/src/icons/src/FilterIcon.jsx b/src/icons/src/FilterIcon.tsx similarity index 100% rename from src/icons/src/FilterIcon.jsx rename to src/icons/src/FilterIcon.tsx diff --git a/src/icons/src/FilterIconOld.jsx b/src/icons/src/FilterIconOld.tsx similarity index 100% rename from src/icons/src/FilterIconOld.jsx rename to src/icons/src/FilterIconOld.tsx diff --git a/src/icons/src/FlagIcon.jsx b/src/icons/src/FlagIcon.tsx similarity index 100% rename from src/icons/src/FlagIcon.jsx rename to src/icons/src/FlagIcon.tsx diff --git a/src/icons/src/FlexFee2Icon.jsx b/src/icons/src/FlexFee2Icon.tsx similarity index 100% rename from src/icons/src/FlexFee2Icon.jsx rename to src/icons/src/FlexFee2Icon.tsx diff --git a/src/icons/src/FlexFeeIcon.jsx b/src/icons/src/FlexFeeIcon.tsx similarity index 100% rename from src/icons/src/FlexFeeIcon.jsx rename to src/icons/src/FlexFeeIcon.tsx diff --git a/src/icons/src/FoodIcon.jsx b/src/icons/src/FoodIcon.tsx similarity index 100% rename from src/icons/src/FoodIcon.jsx rename to src/icons/src/FoodIcon.tsx diff --git a/src/icons/src/ForkIcon.jsx b/src/icons/src/ForkIcon.tsx similarity index 100% rename from src/icons/src/ForkIcon.jsx rename to src/icons/src/ForkIcon.tsx diff --git a/src/icons/src/GiftIcon.jsx b/src/icons/src/GiftIcon.tsx similarity index 100% rename from src/icons/src/GiftIcon.jsx rename to src/icons/src/GiftIcon.tsx diff --git a/src/icons/src/GlobeIcon.jsx b/src/icons/src/GlobeIcon.tsx similarity index 100% rename from src/icons/src/GlobeIcon.jsx rename to src/icons/src/GlobeIcon.tsx diff --git a/src/icons/src/HandIcon.jsx b/src/icons/src/HandIcon.tsx similarity index 100% rename from src/icons/src/HandIcon.jsx rename to src/icons/src/HandIcon.tsx diff --git a/src/icons/src/HandshakeIcon.jsx b/src/icons/src/HandshakeIcon.tsx similarity index 100% rename from src/icons/src/HandshakeIcon.jsx rename to src/icons/src/HandshakeIcon.tsx diff --git a/src/icons/src/HelpCenterIcon.jsx b/src/icons/src/HelpCenterIcon.tsx similarity index 100% rename from src/icons/src/HelpCenterIcon.jsx rename to src/icons/src/HelpCenterIcon.tsx diff --git a/src/icons/src/HouseIcon.jsx b/src/icons/src/HouseIcon.tsx similarity index 100% rename from src/icons/src/HouseIcon.jsx rename to src/icons/src/HouseIcon.tsx diff --git a/src/icons/src/ImageIcon.jsx b/src/icons/src/ImageIcon.tsx similarity index 100% rename from src/icons/src/ImageIcon.jsx rename to src/icons/src/ImageIcon.tsx diff --git a/src/icons/src/InfinityIcon.jsx b/src/icons/src/InfinityIcon.tsx similarity index 100% rename from src/icons/src/InfinityIcon.jsx rename to src/icons/src/InfinityIcon.tsx diff --git a/src/icons/src/InvoiceIcon.jsx b/src/icons/src/InvoiceIcon.tsx similarity index 100% rename from src/icons/src/InvoiceIcon.jsx rename to src/icons/src/InvoiceIcon.tsx diff --git a/src/icons/src/KeyIcon.jsx b/src/icons/src/KeyIcon.tsx similarity index 100% rename from src/icons/src/KeyIcon.jsx rename to src/icons/src/KeyIcon.tsx diff --git a/src/icons/src/KioskIcon.jsx b/src/icons/src/KioskIcon.tsx similarity index 100% rename from src/icons/src/KioskIcon.jsx rename to src/icons/src/KioskIcon.tsx diff --git a/src/icons/src/LabelIcon.jsx b/src/icons/src/LabelIcon.tsx similarity index 100% rename from src/icons/src/LabelIcon.jsx rename to src/icons/src/LabelIcon.tsx diff --git a/src/icons/src/LightIcon.jsx b/src/icons/src/LightIcon.tsx similarity index 100% rename from src/icons/src/LightIcon.jsx rename to src/icons/src/LightIcon.tsx diff --git a/src/icons/src/LightningIcon.jsx b/src/icons/src/LightningIcon.tsx similarity index 100% rename from src/icons/src/LightningIcon.jsx rename to src/icons/src/LightningIcon.tsx diff --git a/src/icons/src/LinkIcon.jsx b/src/icons/src/LinkIcon.tsx similarity index 100% rename from src/icons/src/LinkIcon.jsx rename to src/icons/src/LinkIcon.tsx diff --git a/src/icons/src/LockIcon.jsx b/src/icons/src/LockIcon.tsx similarity index 100% rename from src/icons/src/LockIcon.jsx rename to src/icons/src/LockIcon.tsx diff --git a/src/icons/src/Logos/FacebookIcon.jsx b/src/icons/src/Logos/FacebookIcon.tsx similarity index 100% rename from src/icons/src/Logos/FacebookIcon.jsx rename to src/icons/src/Logos/FacebookIcon.tsx diff --git a/src/icons/src/Logos/InstagramIcon.jsx b/src/icons/src/Logos/InstagramIcon.tsx similarity index 100% rename from src/icons/src/Logos/InstagramIcon.jsx rename to src/icons/src/Logos/InstagramIcon.tsx diff --git a/src/icons/src/Logos/SnapchatIcon.jsx b/src/icons/src/Logos/SnapchatIcon.tsx similarity index 100% rename from src/icons/src/Logos/SnapchatIcon.jsx rename to src/icons/src/Logos/SnapchatIcon.tsx diff --git a/src/icons/src/Logos/TikTokIcon.jsx b/src/icons/src/Logos/TikTokIcon.tsx similarity index 100% rename from src/icons/src/Logos/TikTokIcon.jsx rename to src/icons/src/Logos/TikTokIcon.tsx diff --git a/src/icons/src/Logos/TripadvisorIcon.jsx b/src/icons/src/Logos/TripadvisorIcon.tsx similarity index 100% rename from src/icons/src/Logos/TripadvisorIcon.jsx rename to src/icons/src/Logos/TripadvisorIcon.tsx diff --git a/src/icons/src/Logos/TwitterIcon.jsx b/src/icons/src/Logos/TwitterIcon.tsx similarity index 100% rename from src/icons/src/Logos/TwitterIcon.jsx rename to src/icons/src/Logos/TwitterIcon.tsx diff --git a/src/icons/src/Logos/XIcon.jsx b/src/icons/src/Logos/XIcon.tsx similarity index 100% rename from src/icons/src/Logos/XIcon.jsx rename to src/icons/src/Logos/XIcon.tsx diff --git a/src/icons/src/Logos/YelpIcon.jsx b/src/icons/src/Logos/YelpIcon.tsx similarity index 100% rename from src/icons/src/Logos/YelpIcon.jsx rename to src/icons/src/Logos/YelpIcon.tsx diff --git a/src/icons/src/LogoutIcon.jsx b/src/icons/src/LogoutIcon.tsx similarity index 100% rename from src/icons/src/LogoutIcon.jsx rename to src/icons/src/LogoutIcon.tsx diff --git a/src/icons/src/MagicIcon.jsx b/src/icons/src/MagicIcon.tsx similarity index 100% rename from src/icons/src/MagicIcon.jsx rename to src/icons/src/MagicIcon.tsx diff --git a/src/icons/src/MedicalIcon.jsx b/src/icons/src/MedicalIcon.tsx similarity index 100% rename from src/icons/src/MedicalIcon.jsx rename to src/icons/src/MedicalIcon.tsx diff --git a/src/icons/src/MegaphoneIcon.jsx b/src/icons/src/MegaphoneIcon.tsx similarity index 100% rename from src/icons/src/MegaphoneIcon.jsx rename to src/icons/src/MegaphoneIcon.tsx diff --git a/src/icons/src/MenuIcon.jsx b/src/icons/src/MenuIcon.tsx similarity index 100% rename from src/icons/src/MenuIcon.jsx rename to src/icons/src/MenuIcon.tsx diff --git a/src/icons/src/MinusIcon.jsx b/src/icons/src/MinusIcon.tsx similarity index 100% rename from src/icons/src/MinusIcon.jsx rename to src/icons/src/MinusIcon.tsx diff --git a/src/icons/src/MixedChecklistIcon.jsx b/src/icons/src/MixedChecklistIcon.tsx similarity index 100% rename from src/icons/src/MixedChecklistIcon.jsx rename to src/icons/src/MixedChecklistIcon.tsx diff --git a/src/icons/src/MobileIcon.jsx b/src/icons/src/MobileIcon.tsx similarity index 100% rename from src/icons/src/MobileIcon.jsx rename to src/icons/src/MobileIcon.tsx diff --git a/src/icons/src/MobileStore/AppStoreBadge.jsx b/src/icons/src/MobileStore/AppStoreBadge.tsx similarity index 100% rename from src/icons/src/MobileStore/AppStoreBadge.jsx rename to src/icons/src/MobileStore/AppStoreBadge.tsx diff --git a/src/icons/src/MobileStore/PlayMarketBadge.jsx b/src/icons/src/MobileStore/PlayMarketBadge.tsx similarity index 100% rename from src/icons/src/MobileStore/PlayMarketBadge.jsx rename to src/icons/src/MobileStore/PlayMarketBadge.tsx diff --git a/src/icons/src/MoneyAddIcon.jsx b/src/icons/src/MoneyAddIcon.tsx similarity index 100% rename from src/icons/src/MoneyAddIcon.jsx rename to src/icons/src/MoneyAddIcon.tsx diff --git a/src/icons/src/MoneyBackIcon.jsx b/src/icons/src/MoneyBackIcon.tsx similarity index 100% rename from src/icons/src/MoneyBackIcon.jsx rename to src/icons/src/MoneyBackIcon.tsx diff --git a/src/icons/src/MoneyIcon.jsx b/src/icons/src/MoneyIcon.tsx similarity index 100% rename from src/icons/src/MoneyIcon.jsx rename to src/icons/src/MoneyIcon.tsx diff --git a/src/icons/src/MountainIcon.jsx b/src/icons/src/MountainIcon.tsx similarity index 100% rename from src/icons/src/MountainIcon.jsx rename to src/icons/src/MountainIcon.tsx diff --git a/src/icons/src/MouseIcon.jsx b/src/icons/src/MouseIcon.tsx similarity index 100% rename from src/icons/src/MouseIcon.jsx rename to src/icons/src/MouseIcon.tsx diff --git a/src/icons/src/PassIcon.jsx b/src/icons/src/PassIcon.tsx similarity index 100% rename from src/icons/src/PassIcon.jsx rename to src/icons/src/PassIcon.tsx diff --git a/src/icons/src/PauseIcon.jsx b/src/icons/src/PauseIcon.tsx similarity index 100% rename from src/icons/src/PauseIcon.jsx rename to src/icons/src/PauseIcon.tsx diff --git a/src/icons/src/PenIcon.jsx b/src/icons/src/PenIcon.tsx similarity index 100% rename from src/icons/src/PenIcon.jsx rename to src/icons/src/PenIcon.tsx diff --git a/src/icons/src/PhoneIcon.jsx b/src/icons/src/PhoneIcon.tsx similarity index 100% rename from src/icons/src/PhoneIcon.jsx rename to src/icons/src/PhoneIcon.tsx diff --git a/src/icons/src/PhotosIcon.jsx b/src/icons/src/PhotosIcon.tsx similarity index 100% rename from src/icons/src/PhotosIcon.jsx rename to src/icons/src/PhotosIcon.tsx diff --git a/src/icons/src/PiggyBankIcon.jsx b/src/icons/src/PiggyBankIcon.tsx similarity index 100% rename from src/icons/src/PiggyBankIcon.jsx rename to src/icons/src/PiggyBankIcon.tsx diff --git a/src/icons/src/PinIcon.jsx b/src/icons/src/PinIcon.tsx similarity index 100% rename from src/icons/src/PinIcon.jsx rename to src/icons/src/PinIcon.tsx diff --git a/src/icons/src/PipeIcon.jsx b/src/icons/src/PipeIcon.tsx similarity index 100% rename from src/icons/src/PipeIcon.jsx rename to src/icons/src/PipeIcon.tsx diff --git a/src/icons/src/PlayIcon.jsx b/src/icons/src/PlayIcon.tsx similarity index 100% rename from src/icons/src/PlayIcon.jsx rename to src/icons/src/PlayIcon.tsx diff --git a/src/icons/src/PlusIcon.jsx b/src/icons/src/PlusIcon.tsx similarity index 100% rename from src/icons/src/PlusIcon.jsx rename to src/icons/src/PlusIcon.tsx diff --git a/src/icons/src/PolicyIcon.jsx b/src/icons/src/PolicyIcon.tsx similarity index 100% rename from src/icons/src/PolicyIcon.jsx rename to src/icons/src/PolicyIcon.tsx diff --git a/src/icons/src/PrintIcon.jsx b/src/icons/src/PrintIcon.tsx similarity index 100% rename from src/icons/src/PrintIcon.jsx rename to src/icons/src/PrintIcon.tsx diff --git a/src/icons/src/ProductsIcon.jsx b/src/icons/src/ProductsIcon.tsx similarity index 100% rename from src/icons/src/ProductsIcon.jsx rename to src/icons/src/ProductsIcon.tsx diff --git a/src/icons/src/QuestionIcon.jsx b/src/icons/src/QuestionIcon.tsx similarity index 100% rename from src/icons/src/QuestionIcon.jsx rename to src/icons/src/QuestionIcon.tsx diff --git a/src/icons/src/QuestionnaireIcon.jsx b/src/icons/src/QuestionnaireIcon.tsx similarity index 100% rename from src/icons/src/QuestionnaireIcon.jsx rename to src/icons/src/QuestionnaireIcon.tsx diff --git a/src/icons/src/ReceiptIcon.jsx b/src/icons/src/ReceiptIcon.tsx similarity index 100% rename from src/icons/src/ReceiptIcon.jsx rename to src/icons/src/ReceiptIcon.tsx diff --git a/src/icons/src/ReceptionBellIcon.jsx b/src/icons/src/ReceptionBellIcon.tsx similarity index 100% rename from src/icons/src/ReceptionBellIcon.jsx rename to src/icons/src/ReceptionBellIcon.tsx diff --git a/src/icons/src/ReceptionBellMoneyIcon.jsx b/src/icons/src/ReceptionBellMoneyIcon.tsx similarity index 100% rename from src/icons/src/ReceptionBellMoneyIcon.jsx rename to src/icons/src/ReceptionBellMoneyIcon.tsx diff --git a/src/icons/src/RefreshIcon.jsx b/src/icons/src/RefreshIcon.tsx similarity index 100% rename from src/icons/src/RefreshIcon.jsx rename to src/icons/src/RefreshIcon.tsx diff --git a/src/icons/src/RefundIcon.jsx b/src/icons/src/RefundIcon.tsx similarity index 100% rename from src/icons/src/RefundIcon.jsx rename to src/icons/src/RefundIcon.tsx diff --git a/src/icons/src/RosterIcon.jsx b/src/icons/src/RosterIcon.tsx similarity index 100% rename from src/icons/src/RosterIcon.jsx rename to src/icons/src/RosterIcon.tsx diff --git a/src/icons/src/RoundedSquareIcon.jsx b/src/icons/src/RoundedSquareIcon.tsx similarity index 100% rename from src/icons/src/RoundedSquareIcon.jsx rename to src/icons/src/RoundedSquareIcon.tsx diff --git a/src/icons/src/RulerIcon.jsx b/src/icons/src/RulerIcon.tsx similarity index 100% rename from src/icons/src/RulerIcon.jsx rename to src/icons/src/RulerIcon.tsx diff --git a/src/icons/src/SearchAltIcon.jsx b/src/icons/src/SearchAltIcon.tsx similarity index 100% rename from src/icons/src/SearchAltIcon.jsx rename to src/icons/src/SearchAltIcon.tsx diff --git a/src/icons/src/SearchIcon.jsx b/src/icons/src/SearchIcon.tsx similarity index 100% rename from src/icons/src/SearchIcon.jsx rename to src/icons/src/SearchIcon.tsx diff --git a/src/icons/src/SendIcon.jsx b/src/icons/src/SendIcon.tsx similarity index 100% rename from src/icons/src/SendIcon.jsx rename to src/icons/src/SendIcon.tsx diff --git a/src/icons/src/SeniorIcon.jsx b/src/icons/src/SeniorIcon.tsx similarity index 100% rename from src/icons/src/SeniorIcon.jsx rename to src/icons/src/SeniorIcon.tsx diff --git a/src/icons/src/SeniorV2Icon.jsx b/src/icons/src/SeniorV2Icon.tsx similarity index 100% rename from src/icons/src/SeniorV2Icon.jsx rename to src/icons/src/SeniorV2Icon.tsx diff --git a/src/icons/src/SeniorV3Icon.jsx b/src/icons/src/SeniorV3Icon.tsx similarity index 100% rename from src/icons/src/SeniorV3Icon.jsx rename to src/icons/src/SeniorV3Icon.tsx diff --git a/src/icons/src/ServiceIcon.jsx b/src/icons/src/ServiceIcon.tsx similarity index 100% rename from src/icons/src/ServiceIcon.jsx rename to src/icons/src/ServiceIcon.tsx diff --git a/src/icons/src/SettingsIcon.jsx b/src/icons/src/SettingsIcon.tsx similarity index 100% rename from src/icons/src/SettingsIcon.jsx rename to src/icons/src/SettingsIcon.tsx diff --git a/src/icons/src/ShapesIcon.jsx b/src/icons/src/ShapesIcon.tsx similarity index 100% rename from src/icons/src/ShapesIcon.jsx rename to src/icons/src/ShapesIcon.tsx diff --git a/src/icons/src/ShareIcon.jsx b/src/icons/src/ShareIcon.tsx similarity index 100% rename from src/icons/src/ShareIcon.jsx rename to src/icons/src/ShareIcon.tsx diff --git a/src/icons/src/ShirtIcon.jsx b/src/icons/src/ShirtIcon.tsx similarity index 100% rename from src/icons/src/ShirtIcon.jsx rename to src/icons/src/ShirtIcon.tsx diff --git a/src/icons/src/ShoppingBagIcon.jsx b/src/icons/src/ShoppingBagIcon.tsx similarity index 100% rename from src/icons/src/ShoppingBagIcon.jsx rename to src/icons/src/ShoppingBagIcon.tsx diff --git a/src/icons/src/SplitPaymentIcon.jsx b/src/icons/src/SplitPaymentIcon.tsx similarity index 100% rename from src/icons/src/SplitPaymentIcon.jsx rename to src/icons/src/SplitPaymentIcon.tsx diff --git a/src/icons/src/StackIcon.jsx b/src/icons/src/StackIcon.tsx similarity index 100% rename from src/icons/src/StackIcon.jsx rename to src/icons/src/StackIcon.tsx diff --git a/src/icons/src/StarFilledIcon.jsx b/src/icons/src/StarFilledIcon.tsx similarity index 100% rename from src/icons/src/StarFilledIcon.jsx rename to src/icons/src/StarFilledIcon.tsx diff --git a/src/icons/src/StarIcon.jsx b/src/icons/src/StarIcon.tsx similarity index 100% rename from src/icons/src/StarIcon.jsx rename to src/icons/src/StarIcon.tsx diff --git a/src/icons/src/StoreCreditIcon.jsx b/src/icons/src/StoreCreditIcon.tsx similarity index 100% rename from src/icons/src/StoreCreditIcon.jsx rename to src/icons/src/StoreCreditIcon.tsx diff --git a/src/icons/src/TableIcon.jsx b/src/icons/src/TableIcon.tsx similarity index 100% rename from src/icons/src/TableIcon.jsx rename to src/icons/src/TableIcon.tsx diff --git a/src/icons/src/TaxIcon.jsx b/src/icons/src/TaxIcon.tsx similarity index 100% rename from src/icons/src/TaxIcon.jsx rename to src/icons/src/TaxIcon.tsx diff --git a/src/icons/src/ThumbsDownIcon.jsx b/src/icons/src/ThumbsDownIcon.tsx similarity index 100% rename from src/icons/src/ThumbsDownIcon.jsx rename to src/icons/src/ThumbsDownIcon.tsx diff --git a/src/icons/src/ThumbsUpIcon.jsx b/src/icons/src/ThumbsUpIcon.tsx similarity index 100% rename from src/icons/src/ThumbsUpIcon.jsx rename to src/icons/src/ThumbsUpIcon.tsx diff --git a/src/icons/src/TicketIcon.jsx b/src/icons/src/TicketIcon.tsx similarity index 100% rename from src/icons/src/TicketIcon.jsx rename to src/icons/src/TicketIcon.tsx diff --git a/src/icons/src/TransferArrowIcon.jsx b/src/icons/src/TransferArrowIcon.tsx similarity index 100% rename from src/icons/src/TransferArrowIcon.jsx rename to src/icons/src/TransferArrowIcon.tsx diff --git a/src/icons/src/TranslationIcon.jsx b/src/icons/src/TranslationIcon.tsx similarity index 100% rename from src/icons/src/TranslationIcon.jsx rename to src/icons/src/TranslationIcon.tsx diff --git a/src/icons/src/TrashIcon.jsx b/src/icons/src/TrashIcon.tsx similarity index 100% rename from src/icons/src/TrashIcon.jsx rename to src/icons/src/TrashIcon.tsx diff --git a/src/icons/src/Tutorials/TutorialsBadgeIcon.jsx b/src/icons/src/Tutorials/TutorialsBadgeIcon.tsx similarity index 100% rename from src/icons/src/Tutorials/TutorialsBadgeIcon.jsx rename to src/icons/src/Tutorials/TutorialsBadgeIcon.tsx diff --git a/src/icons/src/Tutorials/TutorialsButtonIcon.jsx b/src/icons/src/Tutorials/TutorialsButtonIcon.tsx similarity index 100% rename from src/icons/src/Tutorials/TutorialsButtonIcon.jsx rename to src/icons/src/Tutorials/TutorialsButtonIcon.tsx diff --git a/src/icons/src/Tutorials/TutorialsSquareIcon.jsx b/src/icons/src/Tutorials/TutorialsSquareIcon.tsx similarity index 100% rename from src/icons/src/Tutorials/TutorialsSquareIcon.jsx rename to src/icons/src/Tutorials/TutorialsSquareIcon.tsx diff --git a/src/icons/src/UnlinkIcon.jsx b/src/icons/src/UnlinkIcon.tsx similarity index 100% rename from src/icons/src/UnlinkIcon.jsx rename to src/icons/src/UnlinkIcon.tsx diff --git a/src/icons/src/UserAddIcon.jsx b/src/icons/src/UserAddIcon.tsx similarity index 100% rename from src/icons/src/UserAddIcon.jsx rename to src/icons/src/UserAddIcon.tsx diff --git a/src/icons/src/UserChangedIcon.jsx b/src/icons/src/UserChangedIcon.tsx similarity index 100% rename from src/icons/src/UserChangedIcon.jsx rename to src/icons/src/UserChangedIcon.tsx diff --git a/src/icons/src/UserIcon.jsx b/src/icons/src/UserIcon.tsx similarity index 100% rename from src/icons/src/UserIcon.jsx rename to src/icons/src/UserIcon.tsx diff --git a/src/icons/src/UserSubtractIcon.jsx b/src/icons/src/UserSubtractIcon.tsx similarity index 100% rename from src/icons/src/UserSubtractIcon.jsx rename to src/icons/src/UserSubtractIcon.tsx diff --git a/src/icons/src/VerifiedTickIcon.jsx b/src/icons/src/VerifiedTickIcon.tsx similarity index 100% rename from src/icons/src/VerifiedTickIcon.jsx rename to src/icons/src/VerifiedTickIcon.tsx diff --git a/src/icons/src/VeteranIcon.jsx b/src/icons/src/VeteranIcon.tsx similarity index 100% rename from src/icons/src/VeteranIcon.jsx rename to src/icons/src/VeteranIcon.tsx diff --git a/src/icons/src/ViewNotesIcon.jsx b/src/icons/src/ViewNotesIcon.tsx similarity index 100% rename from src/icons/src/ViewNotesIcon.jsx rename to src/icons/src/ViewNotesIcon.tsx diff --git a/src/icons/src/VoucherIcon.jsx b/src/icons/src/VoucherIcon.tsx similarity index 100% rename from src/icons/src/VoucherIcon.jsx rename to src/icons/src/VoucherIcon.tsx diff --git a/src/icons/src/WaitlistIcon.jsx b/src/icons/src/WaitlistIcon.tsx similarity index 100% rename from src/icons/src/WaitlistIcon.jsx rename to src/icons/src/WaitlistIcon.tsx diff --git a/src/icons/src/WarningDiamondIcon.jsx b/src/icons/src/WarningDiamondIcon.tsx similarity index 100% rename from src/icons/src/WarningDiamondIcon.jsx rename to src/icons/src/WarningDiamondIcon.tsx diff --git a/src/icons/src/WarningFilledIcon.jsx b/src/icons/src/WarningFilledIcon.tsx similarity index 100% rename from src/icons/src/WarningFilledIcon.jsx rename to src/icons/src/WarningFilledIcon.tsx diff --git a/src/icons/src/WarningIcon.jsx b/src/icons/src/WarningIcon.tsx similarity index 100% rename from src/icons/src/WarningIcon.jsx rename to src/icons/src/WarningIcon.tsx diff --git a/src/icons/src/WarningTriangleIcon.jsx b/src/icons/src/WarningTriangleIcon.tsx similarity index 100% rename from src/icons/src/WarningTriangleIcon.jsx rename to src/icons/src/WarningTriangleIcon.tsx diff --git a/src/icons/src/WeightIcon.jsx b/src/icons/src/WeightIcon.tsx similarity index 100% rename from src/icons/src/WeightIcon.jsx rename to src/icons/src/WeightIcon.tsx diff --git a/src/icons/src/WifiIcon.jsx b/src/icons/src/WifiIcon.tsx similarity index 100% rename from src/icons/src/WifiIcon.jsx rename to src/icons/src/WifiIcon.tsx diff --git a/src/icons/src/WriteIcon.jsx b/src/icons/src/WriteIcon.tsx similarity index 100% rename from src/icons/src/WriteIcon.jsx rename to src/icons/src/WriteIcon.tsx diff --git a/src/icons/src/XolaBotIcon.jsx b/src/icons/src/XolaBotIcon.tsx similarity index 100% rename from src/icons/src/XolaBotIcon.jsx rename to src/icons/src/XolaBotIcon.tsx diff --git a/src/icons/src/XrayIcon.jsx b/src/icons/src/XrayIcon.tsx similarity index 100% rename from src/icons/src/XrayIcon.jsx rename to src/icons/src/XrayIcon.tsx diff --git a/src/icons/src/helpers/icon.jsx b/src/icons/src/helpers/icon.jsx deleted file mode 100644 index 8409e64ae..000000000 --- a/src/icons/src/helpers/icon.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import clsx from "clsx"; -import PropTypes from "prop-types"; -import React from "react"; -import { iconSizes } from "./iconSizes"; - -export const createIcon = (Icon) => { - const IconContainer = ({ size = "small", className, ...rest }) => { - return ; - }; - - IconContainer.propTypes = { - size: PropTypes.oneOf(Object.keys(iconSizes)), - className: PropTypes.string, - }; - - return IconContainer; -}; diff --git a/src/icons/src/helpers/icon.tsx b/src/icons/src/helpers/icon.tsx new file mode 100644 index 000000000..8d5b42c66 --- /dev/null +++ b/src/icons/src/helpers/icon.tsx @@ -0,0 +1,18 @@ +import clsx from "clsx"; +import React, { ComponentPropsWithoutRef, FC } from "react"; +import { iconSizes } from "./iconSizes"; + +type IconSize = keyof typeof iconSizes; + +interface IconProps extends ComponentPropsWithoutRef<"svg"> { + size?: IconSize; + className?: string; +} + +export const createIcon = (Icon: FC>) => { + const IconContainer: FC = ({ size = "small", className, ...rest }) => { + return ; + }; + + return IconContainer; +}; diff --git a/src/icons/src/helpers/iconSizes.js b/src/icons/src/helpers/iconSizes.js deleted file mode 100644 index 5297977a0..000000000 --- a/src/icons/src/helpers/iconSizes.js +++ /dev/null @@ -1,6 +0,0 @@ -export const iconSizes = { - tiny: "w-3 h-3", // 12 px - small: "w-3.5 h-3.5", // 14px - medium: "w-4.5 h-4.5", // 18px - large: "w-6 h-6", // 24px -}; diff --git a/src/icons/src/helpers/iconSizes.ts b/src/icons/src/helpers/iconSizes.ts new file mode 100644 index 000000000..e88c7b4e0 --- /dev/null +++ b/src/icons/src/helpers/iconSizes.ts @@ -0,0 +1,6 @@ +export const iconSizes = { + tiny: "w-3 h-3", + small: "w-3.5 h-3.5", + medium: "w-4.5 h-4.5", + large: "w-6 h-6", +} as const; diff --git a/src/icons/src/images/CircleCrossImage.jsx b/src/icons/src/images/CircleCrossImage.tsx similarity index 100% rename from src/icons/src/images/CircleCrossImage.jsx rename to src/icons/src/images/CircleCrossImage.tsx diff --git a/src/icons/src/images/CirclePlusImage.jsx b/src/icons/src/images/CirclePlusImage.tsx similarity index 100% rename from src/icons/src/images/CirclePlusImage.jsx rename to src/icons/src/images/CirclePlusImage.tsx diff --git a/src/icons/src/images/ComputerImage.jsx b/src/icons/src/images/ComputerImage.tsx similarity index 100% rename from src/icons/src/images/ComputerImage.jsx rename to src/icons/src/images/ComputerImage.tsx diff --git a/src/icons/src/images/EmvImage.jsx b/src/icons/src/images/EmvImage.tsx similarity index 100% rename from src/icons/src/images/EmvImage.jsx rename to src/icons/src/images/EmvImage.tsx diff --git a/src/icons/src/images/ExpediaImage.jsx b/src/icons/src/images/ExpediaImage.tsx similarity index 100% rename from src/icons/src/images/ExpediaImage.jsx rename to src/icons/src/images/ExpediaImage.tsx diff --git a/src/icons/src/images/VerifoneImage.jsx b/src/icons/src/images/VerifoneImage.tsx similarity index 100% rename from src/icons/src/images/VerifoneImage.jsx rename to src/icons/src/images/VerifoneImage.tsx diff --git a/src/icons/src/images/XolaLogo.jsx b/src/icons/src/images/XolaLogo.tsx similarity index 100% rename from src/icons/src/images/XolaLogo.jsx rename to src/icons/src/images/XolaLogo.tsx diff --git a/src/icons/src/images/XolaLogoCircle.jsx b/src/icons/src/images/XolaLogoCircle.tsx similarity index 100% rename from src/icons/src/images/XolaLogoCircle.jsx rename to src/icons/src/images/XolaLogoCircle.tsx diff --git a/src/icons/src/images/XolaLogoSimple.jsx b/src/icons/src/images/XolaLogoSimple.tsx similarity index 100% rename from src/icons/src/images/XolaLogoSimple.jsx rename to src/icons/src/images/XolaLogoSimple.tsx From a2fcc6e0d011f2081394f22bef0d64b9c4dfb853 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 17:53:48 +0530 Subject: [PATCH 08/40] Migrate simple components to TypeScript (Phase 6) Convert 10 atomic components from JavaScript to TypeScript, completing Phase 6 of the TypeScript migration plan. Components migrated: - Avatar: Added AvatarSize type from iconSizes keys - Badge: Added BadgeColor and BadgeSize types, icon as ReactElement - Tag: Added TagColor and TagSize types, onClose callback - Logo: Added LogoSize type, extends img attributes, static sizes property - Key: Simple component with char prop, keyMap for OS-specific symbols - Spinner: Added SpinnerColor and SpinnerSize types - Skeleton: Added typed classNames object and CSSProperties for style - Counter: Simple wrapper component - Breadcrumb: Compound component with Breadcrumb.Item sub-component - Breakdown: Complex compound component with Context for currency/locale * Item, SubtotalItem, and Separator sub-components * Properly typed CurrencyContext Migration patterns applied: - Use "as const" on size/color objects for literal type inference - Create union types using "keyof typeof" pattern - Extend appropriate HTML element attributes (HTMLDivElement, HTMLSpanElement, etc.) - Replace PropTypes with TypeScript interfaces - Use default parameters instead of defaultProps - Compound components use Object.assign pattern - Context properly typed with createContext() Additional files: - Created Skeleton.module.css.d.ts for CSS module type declaration - Fixed Currency component usage by adding missing props Build succeeds with declaration file generation. No TypeScript errors in Phase 6 components. This completes Phase 6 of the TypeScript migration plan. --- src/components/{Avatar.jsx => Avatar.tsx} | 21 +-- src/components/{Badge.jsx => Badge.tsx} | 34 ++--- .../{Breadcrumb.jsx => Breadcrumb.tsx} | 42 ++++-- .../{Breakdown.jsx => Breakdown.tsx} | 131 +++++++++++------- src/components/{Counter.jsx => Counter.tsx} | 11 +- src/components/{Key.jsx => Key.tsx} | 32 ++--- src/components/Logo.jsx | 21 --- src/components/Logo.tsx | 21 +++ src/components/Skeleton.module.css.d.ts | 5 + src/components/{Skeleton.jsx => Skeleton.tsx} | 30 ++-- src/components/{Spinner.jsx => Spinner.tsx} | 26 ++-- src/components/{Tag.jsx => Tag.tsx} | 30 ++-- 12 files changed, 232 insertions(+), 172 deletions(-) rename src/components/{Avatar.jsx => Avatar.tsx} (70%) rename src/components/{Badge.jsx => Badge.tsx} (67%) rename src/components/{Breadcrumb.jsx => Breadcrumb.tsx} (56%) rename src/components/{Breakdown.jsx => Breakdown.tsx} (50%) rename src/components/{Counter.jsx => Counter.tsx} (67%) rename src/components/{Key.jsx => Key.tsx} (68%) delete mode 100644 src/components/Logo.jsx create mode 100644 src/components/Logo.tsx create mode 100644 src/components/Skeleton.module.css.d.ts rename src/components/{Skeleton.jsx => Skeleton.tsx} (60%) rename src/components/{Spinner.jsx => Spinner.tsx} (65%) rename src/components/{Tag.jsx => Tag.tsx} (73%) diff --git a/src/components/Avatar.jsx b/src/components/Avatar.tsx similarity index 70% rename from src/components/Avatar.jsx rename to src/components/Avatar.tsx index cc3391904..90481343f 100644 --- a/src/components/Avatar.jsx +++ b/src/components/Avatar.tsx @@ -1,5 +1,4 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; import { getInitials } from "../helpers/avatar"; @@ -8,9 +7,18 @@ const sizes = { small: "h-10 w-10 text-base", medium: "h-12 w-12 text-md", large: "h-15 w-15 text-xl", -}; +} as const; + +type AvatarSize = keyof typeof sizes; + +export interface AvatarProps extends React.HTMLAttributes { + className?: string; + name?: string; + color?: string; + size?: AvatarSize; +} -export const Avatar = ({ className, name, color = "bg-primary-lighter", size = "large", ...rest }) => { +export const Avatar = ({ className, name, color = "bg-primary-lighter", size = "large", ...rest }: AvatarProps) => { const classes = clsx( "ui-avatar", "inline-flex items-center justify-center rounded-full text-black leading-none", @@ -25,10 +33,3 @@ export const Avatar = ({ className, name, color = "bg-primary-lighter", size = "
); }; - -Avatar.propTypes = { - className: PropTypes.string, - color: PropTypes.string, - name: PropTypes.string, - size: PropTypes.oneOf(Object.keys(sizes)), -}; diff --git a/src/components/Badge.jsx b/src/components/Badge.tsx similarity index 67% rename from src/components/Badge.jsx rename to src/components/Badge.tsx index 5ec597be0..dcc912044 100644 --- a/src/components/Badge.jsx +++ b/src/components/Badge.tsx @@ -1,5 +1,4 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React, { cloneElement } from "react"; const colors = { @@ -11,21 +10,32 @@ const colors = { danger: "bg-danger-lightish text-danger-dark", problem: "bg-warning text-white", critical: "bg-danger text-white", -}; +} as const; const sizes = { - small: "px-2 py-0.75 h-5 text-sm leading-sm", // 20px - medium: "px-3 py-1.5 h-7.5 text-base leading-base", // 30px - large: "px-3.5 py-0.75 h-10 text-lg leading-lg", // 40px -}; + small: "px-2 py-0.75 h-5 text-sm leading-sm", + medium: "px-3 py-1.5 h-7.5 text-base leading-base", + large: "px-3.5 py-0.75 h-10 text-lg leading-lg", +} as const; const iconSizes = { small: "w-3 h-3", medium: "w-4 h-4", large: "w-5 h-5 mr-1.5", -}; +} as const; + +type BadgeColor = keyof typeof colors; +type BadgeSize = keyof typeof sizes; -export const Badge = ({ color = "primary", size = "small", icon, className, children, ...rest }) => { +export interface BadgeProps extends React.HTMLAttributes { + color?: BadgeColor; + size?: BadgeSize; + icon?: React.ReactElement; + className?: string; + children: React.ReactNode; +} + +export const Badge = ({ color = "primary", size = "small", icon, className, children, ...rest }: BadgeProps) => { return ( ); }; - -Badge.propTypes = { - className: PropTypes.string, - color: PropTypes.oneOf(Object.keys(colors)), - size: PropTypes.oneOf(Object.keys(sizes)), - icon: PropTypes.element, - children: PropTypes.node.isRequired, -}; diff --git a/src/components/Breadcrumb.jsx b/src/components/Breadcrumb.tsx similarity index 56% rename from src/components/Breadcrumb.jsx rename to src/components/Breadcrumb.tsx index 14ae1b857..e58766254 100644 --- a/src/components/Breadcrumb.jsx +++ b/src/components/Breadcrumb.tsx @@ -1,8 +1,23 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React, { Children } from "react"; -export const Breadcrumb = ({ className, classNames = {}, separator = "/", children, ...rest }) => { +export interface BreadcrumbProps extends React.HTMLAttributes { + className?: string; + classNames?: { + item?: string; + separator?: string; + }; + separator?: string; + children?: React.ReactNode; +} + +const BreadcrumbComponent = ({ + className, + classNames = {}, + separator = "/", + children, + ...rest +}: BreadcrumbProps) => { const count = Children.count(children) - 1; return ( @@ -24,14 +39,13 @@ export const Breadcrumb = ({ className, classNames = {}, separator = "/", childr ); }; -Breadcrumb.propTypes = { - className: PropTypes.string, - classNames: PropTypes.object, - separator: PropTypes.string, - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), -}; +export interface BreadcrumbItemProps extends React.HTMLAttributes { + className?: string; + onClick?: () => void; + children: React.ReactNode; +} -Breadcrumb.Item = ({ className, onClick, children }) => { +const BreadcrumbItem = ({ className, onClick, children }: BreadcrumbItemProps) => { return (
{ ); }; -Breadcrumb.Item.displayName = "Breadcrumb.Item"; +BreadcrumbItem.displayName = "Breadcrumb.Item"; -Breadcrumb.Item.propTypes = { - className: PropTypes.string, - onClick: PropTypes.func, - children: PropTypes.node.isRequired, -}; +export const Breadcrumb = Object.assign(BreadcrumbComponent, { + Item: BreadcrumbItem, +}); diff --git a/src/components/Breakdown.jsx b/src/components/Breakdown.tsx similarity index 50% rename from src/components/Breakdown.jsx rename to src/components/Breakdown.tsx index f8d1ba156..f918955a7 100644 --- a/src/components/Breakdown.jsx +++ b/src/components/Breakdown.tsx @@ -1,6 +1,5 @@ import clsx from "clsx"; import { isNumber } from "lodash"; -import PropTypes from "prop-types"; import React, { createContext, useContext, useMemo } from "react"; import { Currency } from "./Utilities/Currency"; @@ -13,11 +12,25 @@ const colors = { success: "text-success", danger: "text-danger", caution: "text-caution", -}; +} as const; + +type BreakdownColor = keyof typeof colors; + +interface CurrencyContextValue { + currency?: string; + locale?: string; +} -const CurrencyContext = createContext(); +const CurrencyContext = createContext(undefined); -export const Breakdown = ({ children, className, currency, locale, ...rest }) => { +export interface BreakdownProps extends React.TableHTMLAttributes { + children?: React.ReactNode; + className?: string; + currency: string; + locale?: string; +} + +const BreakdownComponent = ({ children, className, currency, locale, ...rest }: BreakdownProps) => { const value = useMemo(() => ({ currency, locale }), [currency, locale]); return ( @@ -28,12 +41,21 @@ export const Breakdown = ({ children, className, currency, locale, ...rest }) => ); }; -Breakdown.propTypes = { - children: PropTypes.node, - className: PropTypes.string, - currency: PropTypes.string.isRequired, - locale: PropTypes.string, -}; +export interface BreakdownItemProps extends React.HTMLAttributes { + children?: React.ReactNode; + info?: React.ReactNode; + methodIcon?: React.ReactNode; + secondary?: React.ReactNode; + value?: React.ReactNode; + className?: string; + classNames?: { + key?: string; + children?: string; + info?: string; + value?: string; + }; + color?: BreakdownColor; +} const BreakdownItem = ({ info, @@ -42,12 +64,13 @@ const BreakdownItem = ({ value, color = "default", className, - classNames = { key: "", children: "", info: "", value: "" }, + classNames = {}, children, ...rest -}) => { - // When BreakdownItem is directly used without outer component, the context would be `undefined` - const { currency, locale } = useContext(CurrencyContext) ?? {}; +}: BreakdownItemProps) => { + const context = useContext(CurrencyContext); + const currency = context?.currency; + const locale = context?.locale; return ( @@ -64,7 +87,13 @@ const BreakdownItem = ({ {isNumber(value) ? ( - + {value} ) : ( @@ -75,30 +104,33 @@ const BreakdownItem = ({ ); }; -BreakdownItem.propTypes = { - children: PropTypes.node, - info: PropTypes.node, - methodIcon: PropTypes.node, - secondary: PropTypes.node, - value: PropTypes.node, - className: PropTypes.string, - classNames: PropTypes.object, - color: PropTypes.oneOf(Object.keys(colors)), -}; - -Breakdown.Item = BreakdownItem; -Breakdown.Item.displayName = "Breakdown.Item"; +BreakdownItem.displayName = "Breakdown.Item"; + +export interface BreakdownSubtotalItemProps extends React.HTMLAttributes { + children?: React.ReactNode; + info?: React.ReactNode; + value?: React.ReactNode; + className?: string; + classNames?: { + children?: string; + info?: string; + value?: string; + }; + color?: BreakdownColor; +} const BreakdownSubtotalItem = ({ info, value, color = "black", className, - classNames = { children: "", info: "", value: "" }, + classNames = {}, children, ...rest -}) => { - const { currency, locale } = useContext(CurrencyContext) ?? {}; +}: BreakdownSubtotalItemProps) => { + const context = useContext(CurrencyContext); + const currency = context?.currency; + const locale = context?.locale; return ( @@ -106,27 +138,27 @@ const BreakdownSubtotalItem = ({ {info} - - {value} + + {value ?? 0} ); }; -BreakdownSubtotalItem.propTypes = { - children: PropTypes.node, - info: PropTypes.node, - value: PropTypes.node, - className: PropTypes.string, - classNames: PropTypes.object, - color: PropTypes.oneOf(Object.keys(colors)), -}; +BreakdownSubtotalItem.displayName = "Breakdown.SubtotalItem"; -Breakdown.SubtotalItem = BreakdownSubtotalItem; -Breakdown.SubtotalItem.displayName = "Breakdown.SubtotalItem"; +export interface BreakdownSeparatorProps extends React.HTMLAttributes { + className?: string; +} -const BreakdownSeparator = ({ className, ...rest }) => { +const BreakdownSeparator = ({ className, ...rest }: BreakdownSeparatorProps) => { return ( @@ -134,9 +166,10 @@ const BreakdownSeparator = ({ className, ...rest }) => { ); }; -BreakdownSeparator.propTypes = { - className: PropTypes.string, -}; +BreakdownSeparator.displayName = "Breakdown.Separator"; -Breakdown.Separator = BreakdownSeparator; -Breakdown.Separator.displayName = "Breakdown.Separator"; +export const Breakdown = Object.assign(BreakdownComponent, { + Item: BreakdownItem, + SubtotalItem: BreakdownSubtotalItem, + Separator: BreakdownSeparator, +}); diff --git a/src/components/Counter.jsx b/src/components/Counter.tsx similarity index 67% rename from src/components/Counter.jsx rename to src/components/Counter.tsx index db4251e29..33861d771 100644 --- a/src/components/Counter.jsx +++ b/src/components/Counter.tsx @@ -1,8 +1,11 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; -export const Counter = ({ className, ...rest }) => { +export interface CounterProps extends React.HTMLAttributes { + className?: string; +} + +export const Counter = ({ className, ...rest }: CounterProps) => { return ( { /> ); }; - -Counter.propTypes = { - className: PropTypes.string, -}; diff --git a/src/components/Key.jsx b/src/components/Key.tsx similarity index 68% rename from src/components/Key.jsx rename to src/components/Key.tsx index 5cc6c241e..37a717e7a 100644 --- a/src/components/Key.jsx +++ b/src/components/Key.tsx @@ -1,9 +1,21 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; import { isOSX } from "../helpers/browser"; -export const Key = ({ char, className, ...rest }) => { +const keyMap: Record = { + cmd: isOSX ? "⌘" : "ctrl", + option: isOSX ? "⌥" : "win", + ctrl: isOSX ? "ctrl" : "ctrl", + up: "↑", + down: "↓", +}; + +export interface KeyProps extends React.HTMLAttributes { + char: string; + className?: string; +} + +export const Key = ({ char, className, ...rest }: KeyProps) => { const key = keyMap[char] ?? char; return ( @@ -20,19 +32,3 @@ export const Key = ({ char, className, ...rest }) => {
); }; - -/** - * Since initial devs are Mac based, we define the shortcuts in Mac and translate them to windows - */ -const keyMap = { - cmd: isOSX ? "⌘" : "ctrl", - option: isOSX ? "⌥" : "win", - ctrl: isOSX ? "ctrl" : "ctrl", - up: "↑", - down: "↓", -}; - -Key.propTypes = { - char: PropTypes.string.isRequired, - className: PropTypes.string, -}; diff --git a/src/components/Logo.jsx b/src/components/Logo.jsx deleted file mode 100644 index 953cc8e80..000000000 --- a/src/components/Logo.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import clsx from "clsx"; -import PropTypes from "prop-types"; -import React from "react"; - -const sizes = { - small: "w-10 h-10", - medium: "w-16 h-16", - large: "w-20 h-20", -}; - -export const Logo = ({ className, size = "small", ...rest }) => { - return ; -}; - -Logo.sizes = sizes; - -Logo.propTypes = { - className: PropTypes.string, - src: PropTypes.string.isRequired, - size: PropTypes.string, -}; diff --git a/src/components/Logo.tsx b/src/components/Logo.tsx new file mode 100644 index 000000000..246771ad2 --- /dev/null +++ b/src/components/Logo.tsx @@ -0,0 +1,21 @@ +import clsx from "clsx"; +import React from "react"; + +const sizes = { + small: "w-10 h-10", + medium: "w-16 h-16", + large: "w-20 h-20", +} as const; + +type LogoSize = keyof typeof sizes; + +export interface LogoProps extends React.ImgHTMLAttributes { + className?: string; + size?: LogoSize; +} + +const LogoComponent = ({ className, size = "small", ...rest }: LogoProps) => { + return ; +}; + +export const Logo = Object.assign(LogoComponent, { sizes }); diff --git a/src/components/Skeleton.module.css.d.ts b/src/components/Skeleton.module.css.d.ts new file mode 100644 index 000000000..fa72a9f51 --- /dev/null +++ b/src/components/Skeleton.module.css.d.ts @@ -0,0 +1,5 @@ +declare const styles: { + readonly shimmer: string; +}; + +export default styles; diff --git a/src/components/Skeleton.jsx b/src/components/Skeleton.tsx similarity index 60% rename from src/components/Skeleton.jsx rename to src/components/Skeleton.tsx index 1059921a4..e2d570e7a 100644 --- a/src/components/Skeleton.jsx +++ b/src/components/Skeleton.tsx @@ -1,9 +1,27 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; import styles from "./Skeleton.module.css"; -export const Skeleton = ({ style, height = 300, shouldAnimate = true, children, classNames = {}, ...rest }) => { +export interface SkeletonProps extends React.HTMLAttributes { + style?: React.CSSProperties; + height?: number | string; + shouldAnimate?: boolean; + classNames?: { + container?: string; + shimmer?: string; + text?: string; + }; + children?: React.ReactNode; +} + +export const Skeleton = ({ + style, + height = 300, + shouldAnimate = true, + children, + classNames = {}, + ...rest +}: SkeletonProps) => { return (
); }; - -Skeleton.propTypes = { - style: PropTypes.object, - height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - shouldAnimate: PropTypes.bool, - classNames: PropTypes.object, - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), -}; diff --git a/src/components/Spinner.jsx b/src/components/Spinner.tsx similarity index 65% rename from src/components/Spinner.jsx rename to src/components/Spinner.tsx index 3e72c7c9a..ab10b6351 100644 --- a/src/components/Spinner.jsx +++ b/src/components/Spinner.tsx @@ -1,5 +1,4 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; import { CircleNotch } from "../icons"; @@ -10,18 +9,27 @@ const colors = { success: "text-success", danger: "text-danger", caution: "text-caution", - current: null, // TODO: Consider setting this as the default value. -}; + current: null, +} as const; const sizes = { tiny: "w-4 h-4", small: "w-7 h-7", medium: "w-10 h-10", large: "w-14 h-14", - current: "w-[1em] h-[1em]", // TODO: Consider setting this as the default value. -}; + current: "w-[1em] h-[1em]", +} as const; + +type SpinnerColor = keyof typeof colors; +type SpinnerSize = keyof typeof sizes; -export const Spinner = ({ className, size = "small", color = "secondary", ...rest }) => { +export interface SpinnerProps extends React.SVGProps { + className?: string; + size?: SpinnerSize; + color?: SpinnerColor; +} + +export const Spinner = ({ className, size = "small", color = "secondary", ...rest }: SpinnerProps) => { return ( ); }; - -Spinner.propTypes = { - className: PropTypes.string, - size: PropTypes.string, - color: PropTypes.string, -}; diff --git a/src/components/Tag.jsx b/src/components/Tag.tsx similarity index 73% rename from src/components/Tag.jsx rename to src/components/Tag.tsx index 3be2f285f..35b6ea0fc 100644 --- a/src/components/Tag.jsx +++ b/src/components/Tag.tsx @@ -1,5 +1,4 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; import { CloseIcon } from "../icons"; @@ -10,19 +9,28 @@ const colors = { warning: "bg-warning-lighter text-black border border-warning", danger: "bg-danger-lighter text-black border border-danger", caution: "bg-caution-lighter text-black border border-caution", -}; +} as const; const sizes = { small: "px-1 py-0.75 text-sm leading-3.5", medium: "px-2 py-1 text-base leading-3.5", large: "px-2 py-1.5 text-base leading-4", -}; +} as const; + +type TagColor = keyof typeof colors; +type TagSize = keyof typeof sizes; -// Dashboard - height 25 Padding 6, 8Purchases - 20 padding 3,4 +export interface TagProps extends React.HTMLAttributes { + color?: TagColor; + size?: TagSize; + onClose?: () => void; + className?: string; + children: React.ReactNode; +} -export const Tag = ({ color = "primary", size = "small", onClose, className, children, ...rest }) => { - const handleClose = (e) => { - e.stopPropagation(); // Stop from bubbling to the click handler for the tag itself +export const Tag = ({ color = "primary", size = "small", onClose, className, children, ...rest }: TagProps) => { + const handleClose = (e: React.MouseEvent) => { + e.stopPropagation(); onClose?.(); }; @@ -43,11 +51,3 @@ export const Tag = ({ color = "primary", size = "small", onClose, className, chi ); }; - -Tag.propTypes = { - color: PropTypes.oneOf(Object.keys(colors)), - size: PropTypes.oneOf(Object.keys(sizes)), - onClose: PropTypes.func, - className: PropTypes.string, - children: PropTypes.node.isRequired, -}; From d28c6fc7a66a7ec7a17c5dd77a67a2ea2fb9d573 Mon Sep 17 00:00:00 2001 From: Rushi Vishavadia Date: Sat, 6 Dec 2025 18:05:15 +0530 Subject: [PATCH 09/40] Migrate form components to TypeScript (Phase 7) Convert 13 form components and 1 dependency component from JavaScript to TypeScript, completing Phase 7 of the TypeScript migration plan. Components migrated: - Dot: Simple dot indicator with color and size variants (BaseInput dependency) - Label: Form label with isDisabled and isError states - BaseInput: Complex polymorphic base input with forwardRef, prefix/suffix support - Input: Text input wrapper extending BaseInput - Textarea: Textarea wrapper with auto-resize support (TextareaAutosize) - FormGroup: Simple form group container - Checkbox: Checkbox with label and CSS module styling - Switch: Toggle switch with HeadlessUI integration and compound pattern * Switch.Group and Switch.Label sub-components - Select: Select dropdown extending BaseInput - ComboBox: Complex dropdown using react-select with custom components - RangeSlider: Range slider using nouislider-react - InlineValuePopover: Inline value editor with popover - ValuePopoverText: Value display with error tooltip Migration patterns applied: - forwardRef with proper generic types for HTMLInputElement - Polymorphic components with ElementType `as` prop - Omit<> utility to avoid type conflicts between custom and HTML element props - [key: string]: any for accepting arbitrary additional props in BaseInput - CSS module type declarations for Checkbox.module.css - HeadlessUI component integration with proper Switch types - react-select Props type extension for ComboBox - Compound components using Object.assign pattern - Added className prop to Tooltip and Popover calls (for .jsx dependencies) Additional files: - Created Checkbox.module.css.d.ts for CSS module type declaration Build succeeds with declaration file generation. All form components compile and integrate properly with existing JSX dependencies (Tooltip, Popover). This completes Phase 7 of the TypeScript migration plan. --- src/components/Dot/{Dot.jsx => Dot.tsx} | 21 ++++---- .../Forms/{BaseInput.jsx => BaseInput.tsx} | 49 ++++++++--------- src/components/Forms/Checkbox.module.css.d.ts | 5 ++ .../Forms/{Checkbox.jsx => Checkbox.tsx} | 19 +++---- .../Forms/{ComboBox.jsx => ComboBox.tsx} | 31 ++++++----- src/components/Forms/FormGroup.jsx | 11 ---- src/components/Forms/FormGroup.tsx | 10 ++++ ...aluePopover.jsx => InlineValuePopover.tsx} | 26 +++++++-- src/components/Forms/Input.jsx | 20 ------- src/components/Forms/Input.tsx | 17 ++++++ src/components/Forms/{Label.jsx => Label.tsx} | 15 +++--- .../{RangeSlider.jsx => RangeSlider.tsx} | 45 ++++++++-------- src/components/Forms/Select.jsx | 8 --- src/components/Forms/Select.tsx | 12 +++++ .../Forms/{Switch.jsx => Switch.tsx} | 53 +++++++++++-------- src/components/Forms/Textarea.jsx | 39 -------------- src/components/Forms/Textarea.tsx | 37 +++++++++++++ ...uePopoverText.jsx => ValuePopoverText.tsx} | 9 +++- 18 files changed, 227 insertions(+), 200 deletions(-) rename src/components/Dot/{Dot.jsx => Dot.tsx} (68%) rename src/components/Forms/{BaseInput.jsx => BaseInput.tsx} (73%) create mode 100644 src/components/Forms/Checkbox.module.css.d.ts rename src/components/Forms/{Checkbox.jsx => Checkbox.tsx} (80%) rename src/components/Forms/{ComboBox.jsx => ComboBox.tsx} (66%) delete mode 100644 src/components/Forms/FormGroup.jsx create mode 100644 src/components/Forms/FormGroup.tsx rename src/components/Forms/{InlineValuePopover.jsx => InlineValuePopover.tsx} (71%) delete mode 100644 src/components/Forms/Input.jsx create mode 100644 src/components/Forms/Input.tsx rename src/components/Forms/{Label.jsx => Label.tsx} (68%) rename src/components/Forms/{RangeSlider.jsx => RangeSlider.tsx} (72%) delete mode 100644 src/components/Forms/Select.jsx create mode 100644 src/components/Forms/Select.tsx rename src/components/Forms/{Switch.jsx => Switch.tsx} (65%) delete mode 100644 src/components/Forms/Textarea.jsx create mode 100644 src/components/Forms/Textarea.tsx rename src/components/Forms/{ValuePopoverText.jsx => ValuePopoverText.tsx} (59%) diff --git a/src/components/Dot/Dot.jsx b/src/components/Dot/Dot.tsx similarity index 68% rename from src/components/Dot/Dot.jsx rename to src/components/Dot/Dot.tsx index 16ebafd89..acdcae4f5 100644 --- a/src/components/Dot/Dot.jsx +++ b/src/components/Dot/Dot.tsx @@ -1,5 +1,4 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; const colors = { @@ -9,16 +8,25 @@ const colors = { warning: "bg-warning", danger: "bg-danger", caution: "bg-caution", -}; +} as const; const sizes = { small: "h-1 w-1", medium: "h-1.5 w-1.5", large: "h-2 w-2", xlarge: "h-8 w-8", -}; +} as const; + +type DotColor = keyof typeof colors; +type DotSize = keyof typeof sizes; -export const Dot = ({ color = "primary", size = "medium", className, ...rest }) => { +export interface DotProps extends React.HTMLAttributes { + color?: DotColor; + size?: DotSize; + className?: string; +} + +export const Dot = ({ color = "primary", size = "medium", className, ...rest }: DotProps) => { return ( ); }; - -Dot.propTypes = { - className: PropTypes.string, - color: PropTypes.oneOf(Object.keys(colors)), -}; diff --git a/src/components/Forms/BaseInput.jsx b/src/components/Forms/BaseInput.tsx similarity index 73% rename from src/components/Forms/BaseInput.jsx rename to src/components/Forms/BaseInput.tsx index 4b7601c77..579116905 100644 --- a/src/components/Forms/BaseInput.jsx +++ b/src/components/Forms/BaseInput.tsx @@ -1,17 +1,30 @@ import clsx from "clsx"; import { isEmpty, isString } from "lodash"; -import PropTypes from "prop-types"; -import React, { forwardRef } from "react"; +import React, { ElementType, forwardRef } from "react"; import { Dot } from "../Dot/Dot"; const sizes = { - small: "px-3 py-1.5 text-sm leading-sm", // 30px - medium: "px-3 py-2.5 text-base leading-base", // 40px - large: "px-5 py-3.5 text-md leading-md", // 50px -}; + small: "px-3 py-1.5 text-sm leading-sm", + medium: "px-3 py-2.5 text-base leading-base", + large: "px-5 py-3.5 text-md leading-md", +} as const; -export const BaseInput = forwardRef( - ({ as: Tag, size = "medium", isError, className, isRequired, value, prefix, suffix, ...rest }, ref) => { +type BaseInputSize = keyof typeof sizes; + +export interface BaseInputProps { + as?: ElementType; + size?: BaseInputSize; + isError?: boolean; + className?: string; + isRequired?: boolean; + value?: string | number; + prefix?: string; + suffix?: string; + [key: string]: any; +} + +export const BaseInput = forwardRef>( + ({ as: Tag = "input", size = "medium", isError, className, isRequired, value, prefix, suffix, ...rest }, ref) => { const stringValue = () => { if (!isString(value)) return undefined; @@ -71,22 +84,4 @@ export const BaseInput = forwardRef( }, ); -BaseInput.propTypes = { - as: PropTypes.oneOfType([PropTypes.string, PropTypes.elementType]), - size: PropTypes.oneOf(Object.keys(sizes)), - className: PropTypes.string, - isError: PropTypes.bool, - isRequired: PropTypes.bool, - // eslint-disable-next-line react/require-default-props - value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - prefix: PropTypes.string, // eslint-disable-line react/require-default-props - suffix: PropTypes.string, // eslint-disable-line react/require-default-props -}; - -BaseInput.defaultProps = { - as: "input", - size: "medium", - className: "", - isError: false, - isRequired: false, -}; +BaseInput.displayName = "BaseInput"; diff --git a/src/components/Forms/Checkbox.module.css.d.ts b/src/components/Forms/Checkbox.module.css.d.ts new file mode 100644 index 000000000..f694f1b2c --- /dev/null +++ b/src/components/Forms/Checkbox.module.css.d.ts @@ -0,0 +1,5 @@ +declare const styles: { + readonly checkbox: string; +}; + +export default styles; diff --git a/src/components/Forms/Checkbox.jsx b/src/components/Forms/Checkbox.tsx similarity index 80% rename from src/components/Forms/Checkbox.jsx rename to src/components/Forms/Checkbox.tsx index 1143e5daa..8ca850297 100644 --- a/src/components/Forms/Checkbox.jsx +++ b/src/components/Forms/Checkbox.tsx @@ -1,10 +1,18 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; import { useId } from "../../hooks/useId"; import styles from "./Checkbox.module.css"; -export const Checkbox = ({ label, className, classNames = {}, ...rest }) => { +export interface CheckboxProps extends React.InputHTMLAttributes { + label: React.ReactNode; + className?: string; + classNames?: { + checkbox?: string; + label?: string; + }; +} + +export const Checkbox = ({ label, className, classNames = {}, ...rest }: CheckboxProps) => { const id = useId("checkbox"); return ( @@ -32,10 +40,3 @@ export const Checkbox = ({ label, className, classNames = {}, ...rest }) => {
); }; - -Checkbox.propTypes = { - label: PropTypes.node.isRequired, - className: PropTypes.string, - classNames: PropTypes.shape({ checkbox: PropTypes.string, label: PropTypes.string }), - onChange: PropTypes.func, -}; diff --git a/src/components/Forms/ComboBox.jsx b/src/components/Forms/ComboBox.tsx similarity index 66% rename from src/components/Forms/ComboBox.jsx rename to src/components/Forms/ComboBox.tsx index 86096bf05..5876f6157 100644 --- a/src/components/Forms/ComboBox.jsx +++ b/src/components/Forms/ComboBox.tsx @@ -1,14 +1,18 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React, { useEffect, useRef, useState } from "react"; -import Select, { components } from "react-select"; +import ReactSelect, { Props as SelectProps, components, MultiValueGenericProps } from "react-select"; import CreatableSelect from "react-select/creatable"; import "./ComboBox.css"; import { Tooltip } from "../Tooltip"; -// TODO: Common parameters should be defined in stories like `options` and `defaultValue` -export const ComboBox = ({ isCreatable = false, className, isError, ...rest }) => { - const SelectType = isCreatable ? CreatableSelect : Select; +export interface ComboBoxProps extends SelectProps { + isCreatable?: boolean; + className?: string; + isError?: boolean; +} + +export const ComboBox = ({ isCreatable = false, className, isError, ...rest }: ComboBoxProps) => { + const SelectType = isCreatable ? CreatableSelect : ReactSelect; return ( null, MultiValueLabel: CustomMultiValue, } - : null + : undefined } {...rest} /> @@ -29,27 +33,22 @@ export const ComboBox = ({ isCreatable = false, className, isError, ...rest }) = const { MultiValueLabel } = components; -const CustomMultiValue = (props) => { - const labelRef = useRef(null); +const CustomMultiValue = (props: MultiValueGenericProps) => { + const labelRef = useRef(null); const [isTooltipDisabled, setIsTooltipDisabled] = useState(true); useEffect(() => { - if (labelRef.current) { - const isOverflowing = labelRef.current.offsetWidth > labelRef.current.offsetParent.offsetWidth; + if (labelRef.current && labelRef.current.offsetParent) { + const isOverflowing = labelRef.current.offsetWidth > labelRef.current.offsetParent.clientWidth; setIsTooltipDisabled(!isOverflowing); } }, [props.data.label]); return ( - {props.data.label}
}> + {props.data.label}} className=""> {props.data.label} ); }; - -ComboBox.propTypes = { - className: PropTypes.string, - isError: PropTypes.bool, -}; diff --git a/src/components/Forms/FormGroup.jsx b/src/components/Forms/FormGroup.jsx deleted file mode 100644 index e94c1e29a..000000000 --- a/src/components/Forms/FormGroup.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import clsx from "clsx"; -import PropTypes from "prop-types"; -import React from "react"; - -export const FormGroup = ({ className, ...rest }) => { - return
; -}; - -FormGroup.propTypes = { - className: PropTypes.string, -}; diff --git a/src/components/Forms/FormGroup.tsx b/src/components/Forms/FormGroup.tsx new file mode 100644 index 000000000..71a86d83e --- /dev/null +++ b/src/components/Forms/FormGroup.tsx @@ -0,0 +1,10 @@ +import clsx from "clsx"; +import React from "react"; + +export interface FormGroupProps extends React.HTMLAttributes { + className?: string; +} + +export const FormGroup = ({ className, ...rest }: FormGroupProps) => { + return
; +}; diff --git a/src/components/Forms/InlineValuePopover.jsx b/src/components/Forms/InlineValuePopover.tsx similarity index 71% rename from src/components/Forms/InlineValuePopover.jsx rename to src/components/Forms/InlineValuePopover.tsx index af912e4c1..81eae919d 100644 --- a/src/components/Forms/InlineValuePopover.jsx +++ b/src/components/Forms/InlineValuePopover.tsx @@ -4,6 +4,22 @@ import { DownArrowIcon } from "../.."; import { Popover } from "../Popover/Popover"; import { ValuePopoverText } from "./ValuePopoverText"; +export interface InlineValuePopoverProps { + text?: React.ReactNode; + isOpen?: boolean; + showArrow?: boolean; + autoSelectOnClick?: boolean; + onClick?: (e: React.MouseEvent) => void; + onClickOutside?: () => void; + classNames?: { + text?: string; + textField?: string; + children?: string; + }; + children?: React.ReactNode; + error?: React.ReactNode | null; +} + export const InlineValuePopover = ({ text, isOpen = false, @@ -15,13 +31,13 @@ export const InlineValuePopover = ({ children, error = null, ...rest -}) => { - const ref = useRef(); - const handleClick = (e) => { +}: InlineValuePopoverProps) => { + const ref = useRef(null); + const handleClick = (e: React.MouseEvent) => { setTimeout(() => { // This may technically belong in Seller app, but the most common use case for this component here is // to use inputs, so we'll provide some helpers for that - const popoverInput = ref?.current.querySelector("select,textarea,input"); + const popoverInput = ref?.current?.querySelector("select,textarea,input") as HTMLInputElement | null; if (!popoverInput) return; popoverInput.focus(); @@ -34,7 +50,7 @@ export const InlineValuePopover = ({ }; return ( - + { - return ( - - ); -}); - -Input.propTypes = { - ...BaseInput.propTypes, - type: PropTypes.string, -}; - -Input.defaultProps = { - ...BaseInput.defaultProps, - type: "text", -}; diff --git a/src/components/Forms/Input.tsx b/src/components/Forms/Input.tsx new file mode 100644 index 000000000..e539370e5 --- /dev/null +++ b/src/components/Forms/Input.tsx @@ -0,0 +1,17 @@ +import clsx from "clsx"; +import React, { forwardRef } from "react"; +import { BaseInput, BaseInputProps } from "./BaseInput"; + +export interface InputProps + extends BaseInputProps, + Omit, keyof BaseInputProps> { + type?: string; +} + +export const Input = forwardRef(({ className, type = "text", value, ...rest }, ref) => { + return ( + + ); +}); + +Input.displayName = "Input"; diff --git a/src/components/Forms/Label.jsx b/src/components/Forms/Label.tsx similarity index 68% rename from src/components/Forms/Label.jsx rename to src/components/Forms/Label.tsx index f13b2be55..59c4def5b 100644 --- a/src/components/Forms/Label.jsx +++ b/src/components/Forms/Label.tsx @@ -1,8 +1,13 @@ import clsx from "clsx"; -import PropTypes from "prop-types"; import React from "react"; -export const Label = ({ isDisabled = false, isError = false, className, ...rest }) => { +export interface LabelProps extends React.LabelHTMLAttributes { + isDisabled?: boolean; + isError?: boolean; + className?: string; +} + +export const Label = ({ isDisabled = false, isError = false, className, ...rest }: LabelProps) => { return (