From b12d97c627454c3b198a3118b3092eac3df78f88 Mon Sep 17 00:00:00 2001 From: SutuSebastian Date: Mon, 25 Nov 2024 12:55:00 +0200 Subject: [PATCH] chore: init --- .changeset/README.md | 8 ++ .changeset/config.json | 16 +++ .editorconfig | 10 ++ .eslintrc.cjs | 30 +++++ .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 40 ++++++ .github/ISSUE_TEMPLATE/feature_request.md | 19 +++ .github/actions/setup/action.yml | 14 +++ .github/workflows/ci.yml | 85 +++++++++++++ .github/workflows/release.yml | 28 +++++ .gitignore | 3 + .vscode/extensions.json | 9 ++ .vscode/settings.json | 8 ++ CONTRIBUTING.md | 143 ++++++++++++++++++++++ README.md | 142 ++++++++++++++++++++- bun.lockb | Bin 0 -> 217388 bytes package.json | 90 ++++++++++++++ prettier.config.cjs | 14 +++ src/index.test.tsx | 104 ++++++++++++++++ src/index.ts | 67 ++++++++++ tsconfig.json | 19 +++ tsup.config.ts | 9 ++ vitest.config.ts | 7 ++ 23 files changed, 865 insertions(+), 1 deletion(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json create mode 100644 .editorconfig create mode 100644 .eslintrc.cjs create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/actions/setup/action.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CONTRIBUTING.md create mode 100755 bun.lockb create mode 100644 package.json create mode 100644 prettier.config.cjs create mode 100644 src/index.test.tsx create mode 100644 src/index.ts create mode 100644 tsconfig.json create mode 100644 tsup.config.ts create mode 100644 vitest.config.ts diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..0b95d68 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": [ + "@changesets/changelog-github", + { + "repo": "stainless-code/react-memo" + } + ], + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ae10a5c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d0e9fce --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,30 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + "plugin:react/jsx-runtime", + "plugin:react/recommended", + "prettier", + ], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + plugins: ["@typescript-eslint", "react"], + settings: { + react: { + version: "detect", + }, + }, + rules: { + "@typescript-eslint/no-explicit-any": "off", + }, +}; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..b3092ae --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [SutuSebastian] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..9b77ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "" +labels: "" +assignees: "" +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] + +**Smartphone (please complete the following information):** + +- Device: [e.g. iPhone6] +- OS: [e.g. iOS8.1] +- Browser [e.g. stock browser, safari] +- Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..2bc5d5f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "" +labels: "" +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 0000000..0464b8e --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,14 @@ +name: Setup +description: Setup Bun and install packages + +runs: + using: composite + steps: + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install packages + shell: bash + run: bun install diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e53f191 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,85 @@ +name: CI + +on: + pull_request: + branches: + - main + +jobs: + format: + if: github.event.pull_request.head.ref != 'changeset-release/main' + name: ๐Ÿ’… Format + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Run format + run: bun run format:check + + lint: + if: github.event.pull_request.head.ref != 'changeset-release/main' + name: ๐Ÿ•ต Lint + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Run lint + run: bun run lint + + typecheck: + if: github.event.pull_request.head.ref != 'changeset-release/main' + name: โœ… Typecheck + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Run typecheck + run: bun run typecheck + + test: + if: github.event.pull_request.head.ref != 'changeset-release/main' + name: ๐Ÿงช Test + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Run test + run: bun run test + + build: + if: github.event.pull_request.head.ref != 'changeset-release/main' + name: ๐Ÿงฐ Build + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Run build + run: bun run build + + status-check: + if: github.event.pull_request.head.ref == 'changeset-release/main' + name: ๐Ÿ“‹ Status check + runs-on: ubuntu-latest + steps: + - name: Report Success + run: echo "Marking all checks as successful for changeset-release/main branch." diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..3443314 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,28 @@ +name: Release + +on: + push: + branches: + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Create Release Pull Request or Publish to NPM + id: changesets + uses: changesets/action@v1 + with: + publish: bun run release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ac9d097 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +dist +node_modules diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..099bae3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "DavidAnson.vscode-markdownlint", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "oven.bun-vscode", + "yoavbls.pretty-ts-errors" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2ed5998 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8abb1f9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,143 @@ +# Contributing to @stainless-code/react-memo + +Thank you for your interest in contributing to **@stainless-code/react-memo**! Your contributions are greatly appreciated, whether it's fixing a bug, adding a feature, improving documentation, or providing feedback. + +## Table of Contents + +- [Contributing to @stainless-code/react-memo](#contributing-to-stainless-codereact-memo) + - [Table of Contents](#table-of-contents) + - [Getting Started](#getting-started) + - [Development Workflow](#development-workflow) + - [Build the project](#build-the-project) + - [Start development mode](#start-development-mode) + - [Scripts Overview](#scripts-overview) + - [Testing](#testing) + - [Code Style](#code-style) + - [Submitting a Pull Request](#submitting-a-pull-request) + - [Thank You!](#thank-you) + +--- + +## Getting Started + +1. Fork the repository on GitHub: + [https://github.com/stainless-code/react-memo](https://github.com/stainless-code/react-memo) + +2. Clone your fork locally: + + ```bash + git clone https://github.com//react-memo.git + cd react-memo + ``` + +3. Install dependencies: + + ```bash + bun install + ``` + + Make sure you have [Bun](https://bun.sh/) installed, or use an alternative package manager (`npm`, `yarn`, or `pnpm`). + +--- + +## Development Workflow + +### Build the project + +Run the build process to compile the library: + +```bash +bun run build +``` + +This will generate the compiled output in the `dist` directory. + +### Start development mode + +To watch for changes and rebuild automatically during development: + +```bash +bun run dev +``` + +--- + +## Scripts Overview + +The following scripts are available in the `package.json` file: + +| Script | Command | Description | +| -------------- | -------------------------- | ----------------------------------------------- | +| `build` | `tsup` | Builds the project. | +| `clean` | `rimraf dist node_modules` | Cleans the output and dependencies. | +| `dev` | `tsup --watch` | Starts a development build watcher. | +| `format` | `prettier . --write` | Formats code using Prettier. | +| `format:check` | `prettier . --check` | Checks code formatting without modifying files. | +| `lint` | `eslint .` | Lints the project for code quality. | +| `lint:fix` | `eslint . --fix` | Fixes linting issues automatically. | +| `test` | `vitest run` | Runs all tests using Vitest. | +| `typecheck` | `tsc` | Verifies TypeScript type definitions. | +| `release` | `changeset publish` | Publishes a new release. | +| `version` | `changeset version` | Prepares a version update with Changesets. | + +--- + +## Testing + +We use [Vitest](https://vitest.dev/) for testing. To run the tests: + +```bash +bun run test +``` + +To run tests in watch mode: + +```bash +bun run test -- --watch +``` + +Please ensure all tests pass before submitting a pull request. + +--- + +## Code Style + +We follow strict coding standards enforced by Prettier and ESLint. + +- Run `bun run lint` to check for linting issues. +- Run `bun run lint:fix` to automatically fix issues. +- Run `bun run format` to format the codebase. + +Before submitting your changes, ensure your code passes linting and formatting checks. + +--- + +## Submitting a Pull Request + +1. Create a feature branch: + + ```bash + git checkout -b my-feature-branch + ``` + +2. Make your changes and commit them: + + ```bash + git add . + git commit -m "feat: add my feature" + ``` + +3. Push your changes to your fork: + + ```bash + git push origin my-feature-branch + ``` + +4. Open a pull request on GitHub to the `main` branch of the upstream repository: + [https://github.com/stainless-code/react-memo/pulls](https://github.com/stainless-code/react-memo/pulls) + +--- + +## Thank You! + +Your contributions are valued and appreciated! If you encounter any issues or need guidance, feel free to open an issue or contact us at [sebastian.sutu@stainless-code.com](mailto:sebastian.sutu@stainless-code.com). diff --git a/README.md b/README.md index ccc72a5..726e5fe 100644 --- a/README.md +++ b/README.md @@ -1 +1,141 @@ -# react-memo \ No newline at end of file +# @stainless-code/react-memo + +A utility library to simplify and enhance memoization for React functional components using `React.memo`. + +## Features + +- Simplify memoization with `React.memo`. +- Fine-grained control over dependency-based re-renders. +- Support for one-time memoization where components never re-render. +- Fully type-safe with TypeScript. + +## Installation + +### npm + +```bash +npm install @stainless-code/react-memo +``` + +### yarn + +```bash +yarn add @stainless-code/react-memo +``` + +### pnpm + +```bash +pnpm add @stainless-code/react-memo +``` + +### bun + +```bash +bun add @stainless-code/react-memo +``` + +## Usage + +Enhance your React components with precise memoization: + +```tsx +import { withMemo, withMemoOnce } from "@stainless-code/react-memo"; +import React from "react"; + +const MyComponent: React.FC<{ value: number; onClick: () => void }> = ({ + value, + onClick, +}) => ; + +// Memoize based on specific dependencies +const MemoizedComponent = withMemo(MyComponent, ["value"]); + +// Memoize the component to never re-render +const MemoizedOnceComponent = withMemoOnce(MyComponent); + +export default function App() { + return ( + <> + console.log("Clicked!")} /> + console.log("Clicked again!")} + /> + + ); +} +``` + +## Typesafety + +### Example: Type Mismatch (Fails) + +If the `dependencyProps` contain keys that don't exist on the component's props, TypeScript will throw an error: + +```tsx +import { withMemo } from "@stainless-code/react-memo"; +import React from "react"; + +const MyComponent: React.FC<{ value: number; onClick: () => void }> = ({ + value, + onClick, +}) => ; + +// โŒ TypeScript Error: "nonExistentProp" does not exist on the props of MyComponent. +const MemoizedComponent = withMemo(MyComponent, ["value", "nonExistentProp"]); + +export default MemoizedComponent; +``` + +### Example: Type Match (Succeeds) + +If the `dependencyProps` accurately reflect the keys of the component's props, TypeScript ensures everything works smoothly: + +```tsx +import { withMemo } from "@stainless-code/react-memo"; +import React from "react"; + +const MyComponent: React.FC<{ value: number; onClick: () => void }> = ({ + value, + onClick, +}) => ; + +// โœ… TypeScript passes: "value" and "onClick" are valid props for MyComponent. +const MemoizedComponent = withMemo(MyComponent, ["value", "onClick"]); + +export default MemoizedComponent; +``` + +## API + +### `withMemo` + +Enhance a functional component with memoization, allowing re-renders only when specific dependencies or props change. + +| Parameter | Type | Default | Description | +| ------------------ | ------------- | ----------- | -------------------------------------------------------------------------------- | +| `Component` | `React.FC` | Required | The React functional component to memoize. | +| `dependencyProps?` | `(keyof T)[]` | `undefined` | An array of prop names to check for changes. If omitted, all props are compared. | + +Returns a `React.MemoExoticComponent` that wraps the input component. + +### `withMemoOnce` + +Memoize a functional component such that it never re-renders, regardless of prop changes. + +| Parameter | Type | Default | Description | +| ----------- | ------------- | -------- | ------------------------------------------ | +| `Component` | `React.FC` | Required | The React functional component to memoize. | + +Returns a `React.MemoExoticComponent` that wraps the input component. + +## Contributing + +Feel free to submit issues or pull requests to improve the library. Every bit of help is appreciated. ๐Ÿ’– + +[Read the contribution guidelines](./CONTRIBUTING.md). + +## License + +[MIT](./LICENSE) diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..af7d931e5444bd5e0debc3c852aca124fab1658c GIT binary patch literal 217388 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 M#|Jz5`I5CJsP&0n7^)Xs<&LWS(jdF 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ⓈP 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 icW8dR+=16", + "react-dom": ">=16" + }, + "clean-package": { + "remove": [ + "devDependencies", + "clean-package" + ], + "replace": { + "scripts": { + "postpublish": "clean-package restore" + } + } + } +} diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..06093b5 --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,14 @@ +/** @type {import('prettier').Config} */ +module.exports = { + plugins: [ + "prettier-plugin-packagejson", + "@ianvs/prettier-plugin-sort-imports", + ], + // sort-imports + importOrder: [ + "", + "", + "^~/(.*)$", + "^[.]", + ], +}; diff --git a/src/index.test.tsx b/src/index.test.tsx new file mode 100644 index 0000000..8689dee --- /dev/null +++ b/src/index.test.tsx @@ -0,0 +1,104 @@ +import { render } from "@testing-library/react"; +import React from "react"; +import { describe, expect, it, vi } from "vitest"; +import { withMemo, withMemoOnce } from "./index"; + +// A simple functional component for testing +const TestComponent: React.FC<{ value: number; onClick: () => void }> = ({ + value, + onClick, +}) => ; + +describe("withMemo", () => { + it("should re-render when a dependency prop changes", () => { + const MemoizedComponent = withMemo(TestComponent, ["value"]); + + const onClickMock = vi.fn(); + const { rerender, container } = render( + , + ); + + // Initial render + expect(container.textContent).toBe("1"); + + // Rerender with different "value" prop + rerender(); + expect(container.textContent).toBe("2"); + }); + + it("should not re-render when a non-dependency prop changes", () => { + const MemoizedComponent = withMemo(TestComponent, ["value"]); + + const onClickMock1 = vi.fn(); + const onClickMock2 = vi.fn(); + const { rerender, container } = render( + , + ); + + // Initial render + expect(container.textContent).toBe("1"); + + // Rerender with the same "value" but different "onClick" + rerender(); + expect(container.textContent).toBe("1"); + }); + + it("should re-render when no dependency props are provided and any prop changes", () => { + const MemoizedComponent = withMemo(TestComponent); + + const onClickMock1 = vi.fn(); + const onClickMock2 = vi.fn(); + const { rerender, container } = render( + , + ); + + // Initial render + expect(container.textContent).toBe("1"); + + // Rerender with a different "value" + rerender(); + expect(container.textContent).toBe("2"); + + // Rerender with a different "onClick" + rerender(); + expect(container.textContent).toBe("2"); + }); + + it("should not throw an error but will compare undefined values", () => { + // @ts-expect-error intended + const MemoizedComponent = withMemo(TestComponent, ["invalidProp"]); + + const { rerender, container } = render( + {}} />, + ); + + expect(container.textContent).toBe("1"); + + // Rerendering will not change the displayed value because "invalidProp" doesn't affect rendering + rerender( {}} />); + expect(container.textContent).toBe("1"); // No re-render triggered. + }); +}); + +describe("withMemoOnce", () => { + it("should not re-render regardless of prop changes", () => { + const MemoizedOnceComponent = withMemoOnce(TestComponent); + + const onClickMock1 = vi.fn(); + const onClickMock2 = vi.fn(); + const { rerender, container } = render( + , + ); + + // Initial render + expect(container.textContent).toBe("1"); + + // Attempt to rerender with different "value" + rerender(); + expect(container.textContent).toBe("1"); + + // Attempt to rerender with different "onClick" + rerender(); + expect(container.textContent).toBe("1"); + }); +}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..11b41ab --- /dev/null +++ b/src/index.ts @@ -0,0 +1,67 @@ +import { memo } from "react"; + +/** + * A higher-order function that enhances a React functional component with `React.memo` for memoization. + * + * - If `dependencyProps` is provided, the component will only re-render if any of the specified props in the + * `dependencyProps` array have changed. + * - If `dependencyProps` is not provided, all props will be tested for equality to determine if the component + * should re-render. + * + * Equality checks are performed using `JSON.stringify` for deep comparison, and direct reference comparison for functions. + * + * @template T - The props type of the wrapped component. + * @param {React.FC} Component - The React functional component to be memoized. + * @param {(keyof T)[]} [dependencyProps] - An optional array of prop names to check for equality. If not provided, all props are compared. + * @returns {React.MemoExoticComponent>} A memoized version of the provided component. + */ +export function withMemo( + Component: React.FC, + dependencyProps?: (keyof T)[], +): React.MemoExoticComponent> { + return memo(Component, (prevProps, nextProps) => { + let isEqual = true; + + const allProps = Object.keys(prevProps) as (keyof T)[]; + const propsLength = dependencyProps + ? dependencyProps.length + : allProps.length; + + for (let i = 0; i < propsLength; i++) { + const propName = dependencyProps ? dependencyProps[i] : allProps[i]; + const prevProp = prevProps[propName]; + const nextProp = nextProps[propName]; + + // compare equality between functions + if (typeof prevProp === "function") { + if (prevProp !== nextProp) { + isEqual = false; + break; + } + } + + // compare equality between primitives, arrays, objects... + if (JSON.stringify(prevProp) !== JSON.stringify(nextProp)) { + isEqual = false; + break; + } + } + + return isEqual; + }); +} + +/** + * A higher-order function that enhances a React functional component with `React.memo` for one-time memoization. + * + * The wrapped component will never re-render, regardless of prop changes. + * + * @template T - The props type of the wrapped component. + * @param {React.FC} Component - The React functional component to be memoized. + * @returns {React.MemoExoticComponent>} A memoized version of the provided component that will not re-render. + */ +export function withMemoOnce( + Component: React.FC, +): React.MemoExoticComponent> { + return memo(Component, () => true); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5209c86 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "strict": true, + "declaration": false, + "noEmitOnError": true, + "noEmit": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "module": "ESNext", + "target": "ESNext", + "esModuleInterop": true, + "isolatedModules": true, + "lib": ["esnext", "dom"], + "skipLibCheck": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "jsx": "react-jsx" + } +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..db09caf --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entryPoints: ["src/index.ts"], + format: ["cjs", "esm"], + dts: true, + outDir: "dist", + clean: true, +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..9f6250a --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "jsdom", + }, +});