From 9108122d0005e61bb21b78507a538ecfd087eada Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Mon, 11 May 2026 09:16:41 +0200 Subject: [PATCH] feat(generators): core-ui-component template files (component + stories + test + barrel) --- .../component.stories.tsx.hbs | 13 +++++++++++ .../core-ui-component/component.test.tsx.hbs | 23 +++++++++++++++++++ .../core-ui-component/component.tsx.hbs | 11 +++++++++ .../templates/core-ui-component/index.ts.hbs | 1 + 4 files changed, 48 insertions(+) create mode 100644 turbo/generators/templates/core-ui-component/component.stories.tsx.hbs create mode 100644 turbo/generators/templates/core-ui-component/component.test.tsx.hbs create mode 100644 turbo/generators/templates/core-ui-component/component.tsx.hbs create mode 100644 turbo/generators/templates/core-ui-component/index.ts.hbs diff --git a/turbo/generators/templates/core-ui-component/component.stories.tsx.hbs b/turbo/generators/templates/core-ui-component/component.stories.tsx.hbs new file mode 100644 index 0000000..1adfab9 --- /dev/null +++ b/turbo/generators/templates/core-ui-component/component.stories.tsx.hbs @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { {{pascalCase name}} } from "./{{kebabCase name}}"; + +const meta = { + title: "{{tierTitle}}/{{pascalCase name}}", + component: {{pascalCase name}}, + tags: ["autodocs"], +} satisfies Meta; +export default meta; + +type Story = StoryObj; + +export const Default: Story = { args: {} }; diff --git a/turbo/generators/templates/core-ui-component/component.test.tsx.hbs b/turbo/generators/templates/core-ui-component/component.test.tsx.hbs new file mode 100644 index 0000000..3070868 --- /dev/null +++ b/turbo/generators/templates/core-ui-component/component.test.tsx.hbs @@ -0,0 +1,23 @@ +import { describe, it, expect } from "vitest"; +import { createRef } from "react"; +import { renderWithProviders } from "@repo/core-testing/react"; +import { screen } from "@testing-library/react"; +import { {{pascalCase name}} } from "./{{kebabCase name}}"; + +describe("{{pascalCase name}}", () => { + it("renders without crashing", () => { + renderWithProviders(<{{pascalCase name}} data-testid="root" />); + expect(screen.getByTestId("root")).toBeInTheDocument(); + }); + + it("applies a passed className alongside its own", () => { + renderWithProviders(<{{pascalCase name}} data-testid="root" className="custom" />); + expect(screen.getByTestId("root")).toHaveClass("custom"); + }); + + it("forwards ref to the underlying element", () => { + const ref = createRef(); + renderWithProviders(<{{pascalCase name}} ref={ref} />); + expect(ref.current).toBeInstanceOf(HTMLDivElement); + }); +}); diff --git a/turbo/generators/templates/core-ui-component/component.tsx.hbs b/turbo/generators/templates/core-ui-component/component.tsx.hbs new file mode 100644 index 0000000..72f77a4 --- /dev/null +++ b/turbo/generators/templates/core-ui-component/component.tsx.hbs @@ -0,0 +1,11 @@ +import { forwardRef, type HTMLAttributes } from "react"; +import { cn } from "../../lib/utils"; + +export interface {{pascalCase name}}Props extends HTMLAttributes {} + +export const {{pascalCase name}} = forwardRef( + ({ className, ...props }, ref) => ( +
+ ), +); +{{pascalCase name}}.displayName = "{{pascalCase name}}"; diff --git a/turbo/generators/templates/core-ui-component/index.ts.hbs b/turbo/generators/templates/core-ui-component/index.ts.hbs new file mode 100644 index 0000000..0a068fc --- /dev/null +++ b/turbo/generators/templates/core-ui-component/index.ts.hbs @@ -0,0 +1 @@ +export { {{pascalCase name}}, type {{pascalCase name}}Props } from "./{{kebabCase name}}";