From b10f28ff43ba45ed43e268e8d20c9d7715eb7fdc Mon Sep 17 00:00:00 2001 From: Rodney Leviton Date: Tue, 1 Oct 2024 20:55:41 +1000 Subject: [PATCH] Add passThroughProps option --- .vscode/settings.json | 6 +- .../ui/section-wrapper/section-wrapper.ts | 12 +-- packages/docs/src/pages/tailwind-css.mdx | 5 +- packages/lib/src/__tests__/recast.test.tsx | 67 ++++++++++++++- packages/lib/src/recast.tsx | 49 +++++++++-- packages/recast-tailwind-plugin/README.md | 5 +- packages/sandbox/app/components/button.tsx | 84 +++++++++++++++---- .../app/components/section-wrapper/index.ts | 1 + .../section-wrapper/section-wrapper.ts | 36 ++++++++ .../sandbox/app/components/stack/index.ts | 1 + .../sandbox/app/components/stack/stack.ts | 45 ++++++++++ packages/sandbox/app/page.tsx | 17 ++-- packages/theme/components/ui/switch/switch.ts | 4 +- pnpm-lock.yaml | 84 +++++++------------ 14 files changed, 321 insertions(+), 95 deletions(-) create mode 100644 packages/sandbox/app/components/section-wrapper/index.ts create mode 100644 packages/sandbox/app/components/section-wrapper/section-wrapper.ts create mode 100644 packages/sandbox/app/components/stack/index.ts create mode 100644 packages/sandbox/app/components/stack/stack.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 384b785..0daa4c7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,13 @@ { - "eslint.runtime": "node", "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, "css.lint.unknownAtRules": "ignore", "tailwindCSS.experimental.classRegex": [ - ["recast\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"] + [ + "recast\\(([^)]*)\\)", + "(? { }, }, }, - cn, + { mergeFn: cn }, ); const { container: container1 } = render(); @@ -692,4 +692,69 @@ describe("recast function", () => { ; }); }); + + describe("passThroughProps functionality", () => { + type RecastClasses = { + className: string; + cls: Record; + }; + + const TestComponent: React.FC<{ + className?: string; + size?: string; + disabled?: boolean; + recastClasses?: RecastClasses; + children?: React.ReactNode; + }> = ({ className, size, disabled, recastClasses, children }) => ( +
+ {children} + {JSON.stringify(recastClasses)} +
+ ); + + const styles = { + variants: { + size: { sm: "text-sm", md: "text-md", lg: "text-lg" }, + }, + modifiers: { + disabled: "opacity-50", + }, + }; + + it("does not pass through props by default", () => { + const ThemedComponent = recast(TestComponent, styles); + render( + + Test + , + ); + const component = screen.getByTestId("test-component"); + expect(component).not.toHaveAttribute("data-size"); + expect(component).not.toHaveAttribute("data-disabled"); + }); + + it("passes through specified props when configured", () => { + const ThemedComponent = recast(TestComponent, styles, { passThroughProps: ["size", "disabled"] }); + render( + + Test + , + ); + const component = screen.getByTestId("test-component"); + expect(component).toHaveAttribute("data-size", "lg"); + expect(component).toHaveAttribute("data-disabled", "true"); + }); + + it("only passes through specified props", () => { + const ThemedComponent = recast(TestComponent, styles, { passThroughProps: ["size"] }); + render( + + Test + , + ); + const component = screen.getByTestId("test-component"); + expect(component).toHaveAttribute("data-size", "lg"); + expect(component).not.toHaveAttribute("data-disabled"); + }); + }); }); diff --git a/packages/lib/src/recast.tsx b/packages/lib/src/recast.tsx index e61c824..287f7ed 100644 --- a/packages/lib/src/recast.tsx +++ b/packages/lib/src/recast.tsx @@ -14,6 +14,23 @@ import type { import { getRecastClasses } from "./utils/getRecastClasses.js"; import { omit, isEmptyObject, isString, isNonNullObject } from "./utils/common.js"; +/** + * Configuration options for the recast function. + */ +type RecastConfig = { + /** + * An array of prop names that should be passed through to the base component. + * These can include both variant and modifier props. + */ + passThroughProps?: (keyof V | keyof M)[]; + + /** + * Optional function to merge classNames. + * If not provided, Recast uses a default merging strategy. + */ + mergeFn?: MergeFn; +}; + /** * Creates a new component with theming capabilities. * @@ -23,7 +40,7 @@ import { omit, isEmptyObject, isString, isNonNullObject } from "./utils/common.j * @template B - The breakpoint options * @param {React.ComponentType

} Component - The base component to add theming to * @param {RecastStyles, B>} styles - The styles to apply to the component - * @param {MergeFn} [mergeFn] - Optional function to merge props + * @param {RecastConfig} [config] - Optional configuration for recast * @returns {RecastComponent} A new component with theming capabilities */ export function recast< @@ -31,10 +48,12 @@ export function recast< V extends { [K in keyof V]: { [S in keyof V[K]]: string | string[] } }, M extends { [K in keyof M]: string | string[] }, B extends keyof RecastBreakpoints | never = never, ->(Component: React.ComponentType

, styles: RecastStyles, B>, mergeFn?: MergeFn) { - type Props = Omit | keyof ExtractModifierProps> & - ExtractVariantProps & - ExtractModifierProps & { className?: string }; +>(Component: React.ComponentType

, styles: RecastStyles, B>, config: RecastConfig = {}) { + type BaseProps = Omit | keyof ExtractModifierProps>; + type VariantProps = ExtractVariantProps; + type ModifierProps = ExtractModifierProps; + + type Props = BaseProps & VariantProps & ModifierProps & { className?: string }; const processModifiers = (props: Record): RelaxedModifierProps => { const modifierKeys = Object.keys(styles.modifiers || {}); @@ -76,13 +95,29 @@ export function recast< breakpoints: styles.breakpoints, }); - const mergedClassName = mergeFn - ? mergeFn(recastClassesClassName, className) + const mergedClassName = config?.mergeFn + ? config.mergeFn(recastClassesClassName, className) : `${recastClassesClassName} ${className || ""}`.trim(); + type PassThroughProp = keyof V | keyof M | keyof P; + + function getPassThroughValue(prop: PassThroughProp): unknown { + return props[prop]; + } + + const passThroughProps = config.passThroughProps + ? Object.fromEntries( + config.passThroughProps + .filter((prop) => prop in props) + .map((prop) => [prop, getPassThroughValue(prop)]) + .filter(([, value]) => value !== undefined), + ) + : {}; + return ( & { asChild?: boolean; + block?: boolean; + george?: string; + size?: string; }; const Component = forwardRef( - ({ asChild = false, ...props }, ref) => { + ({ block, size, george, asChild = false, ...props }, ref) => { const Comp = asChild ? Slot : "button"; + console.log(block); + console.log(george); + console.log(size); + return ; } ); Component.displayName = "ButtonPrimitive"; -export const Button = recast(Component, { - defaults: { - variants: { variant: "primary", size: "md" }, - }, - base: ["flex", "items-center", "justify-center", "p-8"], - variants: { - variant: { - primary: "bg-blue-500 text-white", - secondary: ["bg-red-500", "text-white"], - tertiary: ["bg-green-500", "text-white"], +export const Button = recast( + Component, + { + defaults: { + variants: { variant: "primary", size: "md" }, + }, + base: ["flex", "items-center", "justify-center", "p-8"], + variants: { + /** + * Defines the intent of the button. + */ + variant: { + primary: "bg-blue-500 text-white", + secondary: [ + "bg-red-500", + "text-white", + "text-sm", + "flex", + "items-center", + "justify-center", + "p-8", + ], + tertiary: ["bg-green-500", "text-white"], + }, + /** + * Defines the size of the button. + */ + size: { + /** Small size - typically used for compact layouts */ + tiny: "text-sm", + /** Medium size - the default size for most contexts */ + md: "text-base", + /** Large size - used for emphasis or calls to action */ + huge: "text-2xl", + }, + george: { + /** Button A */ + sms: "max-w-4xl", + /** B */ + md: "max-w-6xl", + /** C */ + lg: "max-w-7xl", + }, }, - size: { - sm: "text-sm", - md: "text-md", - lg: "text-2xl", + modifiers: { + /** Large size - used for emphasis or calls to action */ + block: "w-full", }, + conditionals: [ + /** This condional is really cool. */ + { + variants: { size: "tiny", variant: ["primary", "secondary"] }, + modifiers: ["block"], + className: "border-4 border-blue-500 text-white", + }, + ], + breakpoints: ["sm", "md", "lg"], }, - breakpoints: ["sm", "md", "lg"], -}); + { + passThroughProps: ["size", "george"], + } +); diff --git a/packages/sandbox/app/components/section-wrapper/index.ts b/packages/sandbox/app/components/section-wrapper/index.ts new file mode 100644 index 0000000..319bbe0 --- /dev/null +++ b/packages/sandbox/app/components/section-wrapper/index.ts @@ -0,0 +1 @@ +export * from "./section-wrapper"; diff --git a/packages/sandbox/app/components/section-wrapper/section-wrapper.ts b/packages/sandbox/app/components/section-wrapper/section-wrapper.ts new file mode 100644 index 0000000..9c3a6b5 --- /dev/null +++ b/packages/sandbox/app/components/section-wrapper/section-wrapper.ts @@ -0,0 +1,36 @@ +"use client"; + +import { SectionWrapperPrimitive } from "@rpxl/recast-primitives"; +import { recast } from "@rpxl/recast"; + +export const SectionWrapperNew = recast(SectionWrapperPrimitive, { + defaults: { variants: { george: "md" } }, + base: { + root: "flex w-full justify-center overflow-hidden", + inner: "relative w-full px-4", + }, + variants: { + kevin: { + /** E */ + arnold: { root: ["bg-red-500 text-sm"], inner: "max-w-4xl" }, + /** F */ + baxter: { root: ["bg-red-500 text-sm"], inner: "max-w-6xl" }, + /** G */ + smith: { root: ["bg-red-500 text-sm"], inner: "max-w-7xl" }, + }, + george: { + /** SectionWrapper A */ + sms: { inner: "max-w-4xl" }, + /** B */ + md: { inner: "max-w-6xl" }, + /** C */ + lg: { inner: "max-w-7xl" }, + }, + }, + modifiers: { + /** Slim container override (672px) */ + slim: { + inner: "!max-w-2xl", + }, + }, +}); diff --git a/packages/sandbox/app/components/stack/index.ts b/packages/sandbox/app/components/stack/index.ts new file mode 100644 index 0000000..dc9eefd --- /dev/null +++ b/packages/sandbox/app/components/stack/index.ts @@ -0,0 +1 @@ +export * from "./stack"; diff --git a/packages/sandbox/app/components/stack/stack.ts b/packages/sandbox/app/components/stack/stack.ts new file mode 100644 index 0000000..200a60d --- /dev/null +++ b/packages/sandbox/app/components/stack/stack.ts @@ -0,0 +1,45 @@ +import { StackPrimitive } from "@rpxl/recast-primitives"; +import { recast } from "@rpxl/recast"; + +/** + * Stack Component + * + * This component is created using the recast function, which enhances the StackPrimitive + * with additional styling and variant options. + * + * @component + */ +export const Stack = recast(StackPrimitive, { + /** + * Default variant settings + * @property {Object} defaults - The default variant settings + * @property {Object} defaults.variants - The default variants + * @property {string} defaults.variants.size - The default size variant (set to "md") + */ + defaults: { variants: { size: "md" } }, + + /** + * Base styles applied to all instances of the Stack component + * @property {string} base - The base CSS classes + */ + base: "flex flex-col", + + /** + * Variant styles that can be applied to the Stack component + * @property {Object} variants - The available variants + * @property {Object} variants.size - Size variants affecting the gap between stack items + */ + variants: { + size: { + /** No gap between items */ + none: "gap-0", // No gap between items + /** Extra small gap (0.25rem or 4px in Tailwind's default scale) */ + xs: "gap-1", // + sm: "gap-2", // Small gap (0.5rem or 8px) + md: "gap-2", // Medium gap (0.5rem or 8px, same as sm in this case) + lg: "gap-8", // Large gap (2rem or 32px) + xl: "gap-16", // Extra large gap (4rem or 64px) + xxl: "gap-24", // Extra extra large gap (6rem or 96px) + }, + }, +}); diff --git a/packages/sandbox/app/page.tsx b/packages/sandbox/app/page.tsx index a05371c..45b1357 100644 --- a/packages/sandbox/app/page.tsx +++ b/packages/sandbox/app/page.tsx @@ -1,18 +1,25 @@ import { Button } from "./components/button"; +import { SectionWrapperNew } from "./components/section-wrapper"; export default function Page() { return (

- {/* */} + + - {/* */}
); } diff --git a/packages/theme/components/ui/switch/switch.ts b/packages/theme/components/ui/switch/switch.ts index 56b7db5..174cc8a 100644 --- a/packages/theme/components/ui/switch/switch.ts +++ b/packages/theme/components/ui/switch/switch.ts @@ -10,7 +10,7 @@ export const Switch = recast(SwitchPrimitive, { "transition-all", "backdrop-blur", "bg-primary-300/5", - "data-[state=checked]:bg-primary-500/10", + // "data-[state=checked]:bg-primary-500/10", "cursor-pointer", "disabled:cursor-not-allowed", "disabled:opacity-50", @@ -28,7 +28,7 @@ export const Switch = recast(SwitchPrimitive, { thumb: [ "bg-primary-300/5", "transition-all", - "data-[state=checked]:bg-primary-300/20", + // "data-[state=checked]:bg-primary-300/20", "block", "data-[state=checked]:translate-x-full", "data-[state=unchecked]:translate-x-0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46d57e6..0641a52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -361,6 +361,18 @@ importers: specifier: ^0.34.0 version: 0.34.6(jsdom@25.0.0) + packages/recast-vscode-plugin: + devDependencies: + '@types/node': + specifier: ^20 + version: 20.16.5 + '@types/vscode': + specifier: ^1.93.0 + version: 1.93.0 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + packages/sandbox: dependencies: '@radix-ui/react-slot': @@ -1668,8 +1680,8 @@ packages: peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -1790,7 +1802,7 @@ packages: '@radix-ui/react-use-controllable-state@1.1.0': resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: - '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2103,6 +2115,9 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/vscode@1.93.0': + resolution: {integrity: sha512-kUK6jAHSR5zY8ps42xuW89NLcBpw1kOabah7yv38J8MyiYuOHxLQBi0e7zeXbQgVefDy/mZZetqEFC+Fl5eIEQ==} + '@typescript-eslint/eslint-plugin@6.21.0': resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -7482,6 +7497,8 @@ snapshots: '@types/unist@3.0.2': {} + '@types/vscode@1.93.0': {} + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.10.0 @@ -8634,7 +8651,7 @@ snapshots: eslint-compat-utils@0.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - semver: 7.6.0 + semver: 7.6.3 eslint-config-next@14.1.0(eslint@8.57.0)(typescript@5.6.2): dependencies: @@ -8663,8 +8680,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -8687,13 +8704,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -8706,13 +8723,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -8744,17 +8761,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 @@ -8766,25 +8772,25 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -8833,34 +8839,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: '@babel/runtime': 7.24.1