From 778038014fdafa4990c2837056b5ed00a982df41 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Fri, 29 Aug 2025 17:12:17 +0800 Subject: [PATCH 01/27] Updated STAN --- .lefthook/pre-commit/branch-naming-policy | 0 .stan/system/.docs.meta.json | 2 +- .stan/system/stan.project.template.md | 1 - README.md | 3 ++- 4 files changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 .lefthook/pre-commit/branch-naming-policy delete mode 100644 .stan/system/stan.project.template.md diff --git a/.lefthook/pre-commit/branch-naming-policy b/.lefthook/pre-commit/branch-naming-policy old mode 100644 new mode 100755 diff --git a/.stan/system/.docs.meta.json b/.stan/system/.docs.meta.json index 39a8c86..0c2cd82 100644 --- a/.stan/system/.docs.meta.json +++ b/.stan/system/.docs.meta.json @@ -1,3 +1,3 @@ { - "version": "0.4.0" + "version": "0.5.3" } \ No newline at end of file diff --git a/.stan/system/stan.project.template.md b/.stan/system/stan.project.template.md deleted file mode 100644 index 69aa626..0000000 --- a/.stan/system/stan.project.template.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/README.md b/README.md index 7ba67c8..dfff2c3 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ Given that your underlying library is solid, wrapping it into a CLI is fairly st 1. The `bin` field in [`package.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/package.json) must specifically reference each of these compiled CLI commands. On installation, you can then execute your CLI command like this: ```bash -> npx mycli # if installed localy +> npx mycli # if installed locally > mycli # if installed globally @@ -262,3 +262,4 @@ Also note that this template generates [API Documentation](#api-documentation) w --- Built for you with ❤️ on Bali! Find more great tools & templates on [my GitHub Profile](https://github.com/karmaniverous). + From 06c2075731626f1bb3208010a74e46435fb9cf73 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Fri, 29 Aug 2025 17:16:52 +0800 Subject: [PATCH 02/27] feat: convert to React 18 component template When: 2025-08-29T00:00:00Z Why: Provide a ready-to-use React component library scaffold with ESM-only build, tests, and a browser playground, while removing the previous CLI-oriented template pieces. What changed: - package.json: rename, add peer deps (react, react-dom), add dev deps (React, Vite, Testing Library), ESM-only exports, sideEffects: false, remove CLI bin, add dev/preview scripts. - rollup.config.ts: ESM-only output; remove CJS/IIFE and CLI builds; externalize react/jsx-runtime. - tsconfig.json: enable DOM libs and react-jsx runtime. - eslint.config.js: include *.test.tsx in vitest lint context. - src/index.ts: export HelloWorld component. - src/components/HelloWorld.tsx: new hello-world component. - src/components/HelloWorld.test.tsx: new tests using Testing Library. - playground/*: new Vite playground (vite.config.ts, index.html, src/main.tsx, src/App.tsx). - .stan/system/stan.project.md: record durable project rules. - .stan/system/stan.todo.md: update plan with completed items and next up. - Remove legacy CLI and foo: delete src/cli/mycli/*, src/foo.ts, src/foo.test.ts, src/util/packageName.ts. --- .stan/system/stan.project.md | 40 +++++++++++++++ .stan/system/stan.todo.md | 17 +++++++ eslint.config.js | 5 +- package.json | 70 +++++++++++++-------------- playground/index.html | 12 +++++ playground/src/App.tsx | 10 ++++ playground/src/main.tsx | 14 ++++++ playground/vite.config.ts | 11 +++++ rollup.config.ts | 78 ++---------------------------- src/cli/mycli/fooCommand.ts | 13 ----- src/cli/mycli/index.ts | 14 ------ src/components/HelloWorld.test.tsx | 17 +++++++ src/components/HelloWorld.tsx | 22 +++++++++ src/foo.test.ts | 13 ----- src/foo.ts | 24 --------- src/index.ts | 2 +- src/util/packageName.ts | 10 ---- tsconfig.json | 10 ++-- 18 files changed, 191 insertions(+), 191 deletions(-) create mode 100644 .stan/system/stan.project.md create mode 100644 .stan/system/stan.todo.md create mode 100644 playground/index.html create mode 100644 playground/src/App.tsx create mode 100644 playground/src/main.tsx create mode 100644 playground/vite.config.ts delete mode 100644 src/cli/mycli/fooCommand.ts delete mode 100644 src/cli/mycli/index.ts create mode 100644 src/components/HelloWorld.test.tsx create mode 100644 src/components/HelloWorld.tsx delete mode 100644 src/foo.test.ts delete mode 100644 src/foo.ts delete mode 100644 src/util/packageName.ts diff --git a/.stan/system/stan.project.md b/.stan/system/stan.project.md new file mode 100644 index 0000000..b1f8d0a --- /dev/null +++ b/.stan/system/stan.project.md @@ -0,0 +1,40 @@ +# stan.project.md — Project-specific requirements + +When updated: 2025-08-29T00:00:00Z + +Repository goal +- Provide a ready-to-use template for building and publishing React 18 + component libraries using TypeScript. + +Baseline decisions +- React + - Target React 18. + - Use the modern “react-jsx” runtime. +- Build outputs + - ESM-only. No CJS or IIFE bundles. + - ship types (.d.ts). +- Dependencies + - react and react-dom are peerDependencies (>=18). + - Also present as devDependencies for local development and playground. + - Mark package as "sideEffects": false (no global CSS side-effects). +- Linting + - TS-only rules; no react-specific eslint plugins for now. +- Testing + - Vitest with happy-dom environment (project default). + - @testing-library/react and @testing-library/jest-dom for component tests. +- Dev preview + - Vite playground under /playground for interactive browser viewing. + - Playground is excluded from npm package (files: ["dist"]). +- Source layout + - Components under src/components. + - Public entry at src/index.ts re-exports components. +- Removed legacy pieces + - CLI example and related build logic removed. + - No IIFE browser bundle. +- Docs + - Keep TypeDoc for API docs; entry remains src/index.ts. + +Operational notes +- Rollup marks react and react/jsx-runtime as externals. +- Keep release and docs scripts; they may be adjusted later as needed. +- Consider adding Storybook or Ladle later if richer docs are required. diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md new file mode 100644 index 0000000..f9e8a85 --- /dev/null +++ b/.stan/system/stan.todo.md @@ -0,0 +1,17 @@ +When updated: 2025-08-29T00:00:00Z + +Next up +- Refresh README to reflect React component template workflow (build, + test, Vite playground usage). +- Optionally add story tooling (Storybook or Ladle) if docs scale up. +- Consider pruning unused devDependencies flagged by knip. + +Completed (recent) +- Converted template to React 18 with react-jsx runtime. +- Switched to ESM-only build; removed CJS/IIFE and CLI scaffold. +- Added Vite playground under /playground for browser preview. +- Added HelloWorld component + tests (Testing Library). +- Marked react/react-dom as peerDependencies; set sideEffects: false. +- Updated rollup config to externalize react & react/jsx-runtime. +- Kept TypeDoc; preserved Vitest + happy-dom environment. +- Updated package/repository metadata placeholders. diff --git a/eslint.config.js b/eslint.config.js index 916cdb7..08df7f9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -25,11 +25,10 @@ export default tseslint.config( prettierConfig, { ...vitestPlugin.configs.recommended, - files: ['**/*.test.ts'], + files: ['**/*.test.ts', '**/*.test.tsx'], }, { - languageOptions: { - parserOptions: { + languageOptions: { parserOptions: { project: true, tsconfigRootDir, }, diff --git a/package.json b/package.json index dfd5572..b9faa1f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,5 @@ { "author": "Jason Williscroft", - "bin": { - "mycli": "./dist/cli/mycli/index.js" - }, "auto-changelog": { "output": "CHANGELOG.md", "unreleased": true, @@ -10,27 +7,28 @@ "hideCredit": true }, "bugs": { - "url": "https://github.com/karmaniverous/npm-package-template-ts/issues" + "url": "https://github.com/your-org/react-component-template/issues" }, "dependencies": { - "@karmaniverous/stan": "^0.1.0", - "commander": "^14.0.0" + "@karmaniverous/stan": "^0.1.0" }, - "description": "A feature-rich NPM package template for TypeScript projects.", + "description": "A React component library template for TypeScript projects.", "devDependencies": { - "@commander-js/extra-typings": "^14.0.0", "@dotenvx/dotenvx": "^1.49.0", "@eslint/js": "^9.33.0", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", - "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", "@types/eslint__js": "^9.14.0", "@types/eslint-config-prettier": "^6.11.3", "@types/fs-extra": "^11.0.4", "@types/node": "^24.3.0", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.0.0", "@vitest/coverage-v8": "^3.2.4", "auto-changelog": "^2.5.0", "concurrently": "^9.2.0", @@ -51,51 +49,51 @@ "rollup-plugin-dts": "^6.2.3", "tar": "^7.4.3", "tslib": "^2.8.1", - "tsx": "^4.20.4", "typedoc": "^0.28.10", "typedoc-plugin-mdn-links": "^5.0.8", "typedoc-plugin-replace-text": "^4.2.0", "typescript": "^5.9.2", "typescript-eslint": "^8.40.0", - "vitest": "^3.2.4" + "vite": "^5.4.0", + "@vitejs/plugin-react": "^4.3.1", + "vitest": "^3.2.4", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "engines": { "node": ">=20" }, "exports": { ".": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/mjs/index.js" - }, - "require": { - "types": "./dist/index.d.ts", - "default": "./dist/cjs/index.js" - } + "types": "./dist/index.d.ts", + "default": "./dist/mjs/index.js" } }, "files": [ "dist" ], - "homepage": "https://github.com/karmaniverous/npm-package-template-ts#readme", + "homepage": "https://github.com/your-org/react-component-template#readme", "keywords": [ - "eslint", - "lefthook", - "npm", - "prettier", + "react", + "component", + "typescript", "rollup", + "vite", + "vitest", "template", - "typescript", - "vitest" + "eslint", + "prettier" ], "license": "BSD-3-Clause", - "main": "dist/cjs/index.js", "module": "dist/mjs/index.js", - "name": "@karmaniverous/npm-package-template-ts", + "name": "@your-scope/react-component-template", + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, "publishConfig": { "access": "public" - }, - "release-it": { + }, "release-it": { "git": { "changelog": "npx auto-changelog --unreleased-only --stdout --template https://raw.githubusercontent.com/release-it/release-it/main/templates/changelog-compact.hbs", "commitMessage": "chore: release v${version}", @@ -128,11 +126,10 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/karmaniverous/npm-package-template-ts.git" + "url": "git+https://github.com/your-org/react-component-template.git" }, "scripts": { - "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", - "changelog": "auto-changelog", + "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", "changelog": "auto-changelog", "diagrams": "cd diagrams/src && plantuml -tpng -o ../out -r .", "docs": "typedoc", "knip": "knip", @@ -144,9 +141,12 @@ "stan:build": "rimraf stan.dist && rollup --config stan.rollup.config.ts --configPlugin @rollup/plugin-typescript && rimraf stan.dist", "stan:docs": "typedoc --emit none", "test": "vitest --run --coverage", - "typecheck": "tsc" + "typecheck": "tsc", + "dev": "vite --config playground/vite.config.ts", + "preview": "vite preview --config playground/vite.config.ts" }, + "sideEffects": false, "type": "module", "types": "dist/index.d.ts", "version": "0.6.13" -} +} \ No newline at end of file diff --git a/playground/index.html b/playground/index.html new file mode 100644 index 0000000..b8187a5 --- /dev/null +++ b/playground/index.html @@ -0,0 +1,12 @@ + + + + + + React Component Playground + + +
+ + + diff --git a/playground/src/App.tsx b/playground/src/App.tsx new file mode 100644 index 0000000..57a5188 --- /dev/null +++ b/playground/src/App.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { HelloWorld } from '../../src/components/HelloWorld'; + +export default function App() { + return ( +
+ +
+ ); +} diff --git a/playground/src/main.tsx b/playground/src/main.tsx new file mode 100644 index 0000000..a18c91a --- /dev/null +++ b/playground/src/main.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App'; + +const container = document.getElementById('root'); +if (!container) { + throw new Error('Root element #root not found'); +} +const root = createRoot(container); +root.render( + + + , +); diff --git a/playground/vite.config.ts b/playground/vite.config.ts new file mode 100644 index 0000000..70874b2 --- /dev/null +++ b/playground/vite.config.ts @@ -0,0 +1,11 @@ +import { fileURLToPath } from 'node:url'; +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + root: fileURLToPath(new URL('.', import.meta.url)), + plugins: [react()], + server: { + open: true, + }, +}); diff --git a/rollup.config.ts b/rollup.config.ts index 3e26cd5..f7a4efc 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -4,26 +4,17 @@ import aliasPlugin, { type Alias } from '@rollup/plugin-alias'; import commonjsPlugin from '@rollup/plugin-commonjs'; import jsonPlugin from '@rollup/plugin-json'; import { nodeResolve } from '@rollup/plugin-node-resolve'; -import terserPlugin from '@rollup/plugin-terser'; import typescriptPlugin from '@rollup/plugin-typescript'; -import fs from 'fs-extra'; -import type { InputOptions, OutputOptions, RollupOptions } from 'rollup'; +import type { InputOptions, RollupOptions } from 'rollup'; import dtsPlugin from 'rollup-plugin-dts'; const require = createRequire(import.meta.url); type Package = Record | undefined>; const pkg = require('./package.json') as Package; -import { packageName } from './src/util/packageName'; - const outputPath = `dist`; -const commonPlugins = [ - commonjsPlugin(), - jsonPlugin(), - nodeResolve(), - typescriptPlugin(), -]; +const commonPlugins = [commonjsPlugin(), jsonPlugin(), nodeResolve(), typescriptPlugin()]; const commonAliases: Alias[] = []; @@ -33,18 +24,13 @@ const commonInputOptions: InputOptions = { ...Object.keys((pkg as unknown as Package).dependencies ?? {}), ...Object.keys((pkg as unknown as Package).peerDependencies ?? {}), 'tslib', + 'react/jsx-runtime', ], plugins: [aliasPlugin({ entries: commonAliases }), ...commonPlugins], }; -const iifeCommonOutputOptions: OutputOptions = { - name: packageName ?? 'unknown', -}; - -const cliCommands = await fs.readdir('src/cli'); - const config: RollupOptions[] = [ - // ESM output. + // ESM output only. { ...commonInputOptions, output: [ @@ -57,47 +43,6 @@ const config: RollupOptions[] = [ ], }, - // IIFE output. - { - ...commonInputOptions, - plugins: [ - aliasPlugin({ - entries: commonAliases, - }), - commonPlugins, - ], - output: [ - { - ...iifeCommonOutputOptions, - extend: true, - file: `${outputPath}/index.iife.js`, - format: 'iife', - }, - - // Minified IIFE output. - { - ...iifeCommonOutputOptions, - extend: true, - file: `${outputPath}/index.iife.min.js`, - format: 'iife', - plugins: [terserPlugin()], - }, - ], - }, - - // CommonJS output. - { - ...commonInputOptions, - output: [ - { - dir: `${outputPath}/cjs`, - extend: true, - format: 'cjs', - preserveModules: true, - }, - ], - }, - // Type definitions output. { ...commonInputOptions, @@ -110,19 +55,6 @@ const config: RollupOptions[] = [ }, ], }, - - // CLI output. - ...cliCommands.map((c) => ({ - ...commonInputOptions, - input: `src/cli/${c}/index.ts`, - output: [ - { - dir: `${outputPath}/cli/${c}`, - extend: true, - format: 'esm', - }, - ], - })), ]; -export default config; +export default config; \ No newline at end of file diff --git a/src/cli/mycli/fooCommand.ts b/src/cli/mycli/fooCommand.ts deleted file mode 100644 index 032a3bd..0000000 --- a/src/cli/mycli/fooCommand.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Command } from '@commander-js/extra-typings'; - -import { foo } from '../../foo'; - -export const fooCommand = new Command() - .name('foo') - .description('Foos your bar.') - .enablePositionalOptions() - .passThroughOptions() - .option('-b, --bar ', 'Foo what?') - .action(({ bar }) => { - console.log(foo(bar)); - }); diff --git a/src/cli/mycli/index.ts b/src/cli/mycli/index.ts deleted file mode 100644 index 89035bf..0000000 --- a/src/cli/mycli/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env node - -import { Command } from '@commander-js/extra-typings'; - -import { fooCommand } from './fooCommand'; - -const cli = new Command() - .name('mycli') - .description('My CLI tool') - .enablePositionalOptions() - .passThroughOptions() - .addCommand(fooCommand); - -cli.parse(); diff --git a/src/components/HelloWorld.test.tsx b/src/components/HelloWorld.test.tsx new file mode 100644 index 0000000..451aea1 --- /dev/null +++ b/src/components/HelloWorld.test.tsx @@ -0,0 +1,17 @@ +import '@testing-library/jest-dom/vitest'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { HelloWorld } from './HelloWorld'; + +describe('HelloWorld', () => { + it('renders default greeting', () => { + render(); + expect(screen.getByText('Hello World')).toBeInTheDocument(); + }); + + it('renders custom greeting', () => { + render(); + expect(screen.getByText('Hello React')).toBeInTheDocument(); + }); +}); diff --git a/src/components/HelloWorld.tsx b/src/components/HelloWorld.tsx new file mode 100644 index 0000000..a3a6de4 --- /dev/null +++ b/src/components/HelloWorld.tsx @@ -0,0 +1,22 @@ +import React from 'react'; + +/** + * HelloWorldProps defines the props for the HelloWorld component. + */ +export type HelloWorldProps = { + /** + * Whom to greet. Defaults to "World". + */ + who?: string; +}; + +/** + * A simple Hello World React component. + * + * @remarks + * - Targets React 18 with the modern react-jsx runtime. + * - No styling is applied by default. + */ +export const HelloWorld: React.FC = ({ who = 'World' }) => { + return
Hello {who}
; +}; diff --git a/src/foo.test.ts b/src/foo.test.ts deleted file mode 100644 index c81dc66..0000000 --- a/src/foo.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { expect, suite, test } from 'vitest'; - -import { foo } from './'; - -suite('foo', () => { - test('should allow expression assertions', () => { - expect(true).toBe(true); - }); - - test('should prefix bar', () => { - expect(foo('bar')).toBe('foo bar'); - }); -}); diff --git a/src/foo.ts b/src/foo.ts deleted file mode 100644 index 5f786e3..0000000 --- a/src/foo.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * The kind of thing you could foo. - */ -export type FooTarget = string | undefined; - -/** - * Foos your bar! - * - * @param target - The target to foo. - * @returns Your fooed bar. - * - * @remarks - * This function is documented according to the TSDoc spec. Linting support is - * built into this template. TSDoc is similar to JSDoc, but is way less verbose - * as it can take advantage of TypeScript's type system. It also has better - * support for documenting generics and other TypeScript-specific features. - * - * @see {@link https://tsdoc.org/ | TSDoc} for more info! - */ -export const foo = (target: FooTarget) => { - console.debug(`fooing '${target ?? 'nothing'}'!`); - - return `foo ${target ?? 'nothing'}`; -}; diff --git a/src/index.ts b/src/index.ts index 69400e7..e772194 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,4 +4,4 @@ * @packageDocumentation */ -export { foo, type FooTarget } from './foo'; +export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; \ No newline at end of file diff --git a/src/util/packageName.ts b/src/util/packageName.ts deleted file mode 100644 index 8b6c592..0000000 --- a/src/util/packageName.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Get package scope & name from package.json. - -const npmPackageRegex = - /^(?:(?@[a-z0-9-~][a-z0-9-._~]*)\/)?(?[a-z0-9-~][a-z0-9-._~]*)$/; - -export const { packageScope, packageName } = - (process.env.npm_package_name?.match(npmPackageRegex)?.groups ?? {}) as { - packageScope?: string; - packageName?: string; - }; diff --git a/tsconfig.json b/tsconfig.json index 9379dbb..2409f9f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,11 +11,10 @@ "compilerOptions": { // [req-2] Enable modern JS features (top-level await, named groups). "target": "ES2022", - "lib": ["ES2022"], + "lib": ["ES2022", "DOM", "DOM.Iterable"], // [req-1] Do not type-check dependency .d.ts files (incl. node_modules). "skipLibCheck": true, - // Existing settings retained to satisfy [req-3] and [req-4]. "allowJs": true, "checkJs": true, @@ -30,8 +29,9 @@ "strict": true, "tsBuildInfoFile": "./.tsbuildinfo", // [req-4] Test environment globals. - "types": ["node", "vitest/globals"] + "types": ["node", "vitest/globals"], + // React JSX runtime + "jsx": "react-jsx" }, "exclude": ["coverage", "dist", "docs", "node_modules"], - "include": ["**/*"] -} + "include": ["**/*"]} From fede91a5d62a0b55d103e4849780ffedb715b179 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Fri, 29 Aug 2025 17:28:22 +0800 Subject: [PATCH 03/27] fix: clean lint and TS for React component template When: 2025-08-29T00:00:00Z Why: Lint and TypeScript errors were caused by playground code being scanned, missing jest-dom setup, and implicit any/unsafe return types. Also stan:build referenced a non-existent file. What changed: - eslint.config.js: ignore playground/**; include *.test.tsx in vitest rules; normalize parserOptions block. - tsconfig.json: add DOM libs, add @testing-library/jest-dom to types, restrict include to src/** and vitest setup/config, exclude playground. - vitest.config.ts: add setupFiles for jest-dom; created vitest.setup.ts to register matchers. - src/components/HelloWorld.tsx: remove React import (react-jsx); type return as JSX.Element to satisfy no-unsafe-return. - src/components/HelloWorld.test.tsx: sort imports, rely on global jest-dom setup. - stan.config.yml: map build to standard Rollup build. - package.json: remove stan:build script. - stan.project.md: document playground exclusions and jest-dom setup. - stan.todo.md: update plan with completed fixes and next actions. --- .lefthook/prepare-commit-msg/add-issue | 0 .stan/system/stan.project.md | 9 ++++++++- .stan/system/stan.todo.md | 10 +++++++++- eslint.config.js | 5 ++++- package.json | 4 +--- src/components/HelloWorld.test.tsx | 4 +--- src/components/HelloWorld.tsx | 6 ++---- stan.config.yml | 4 ++-- tsconfig.json | 6 ++++-- vitest.config.ts | 3 ++- vitest.setup.ts | 1 + 11 files changed, 34 insertions(+), 18 deletions(-) mode change 100644 => 100755 .lefthook/prepare-commit-msg/add-issue create mode 100644 vitest.setup.ts diff --git a/.lefthook/prepare-commit-msg/add-issue b/.lefthook/prepare-commit-msg/add-issue old mode 100644 new mode 100755 diff --git a/.stan/system/stan.project.md b/.stan/system/stan.project.md index b1f8d0a..1d62cc6 100644 --- a/.stan/system/stan.project.md +++ b/.stan/system/stan.project.md @@ -3,10 +3,12 @@ When updated: 2025-08-29T00:00:00Z Repository goal + - Provide a ready-to-use template for building and publishing React 18 component libraries using TypeScript. Baseline decisions + - React - Target React 18. - Use the modern “react-jsx” runtime. @@ -19,12 +21,15 @@ Baseline decisions - Mark package as "sideEffects": false (no global CSS side-effects). - Linting - TS-only rules; no react-specific eslint plugins for now. + - Ignore playground/\*\* from lint to avoid dev-only noise. - Testing - Vitest with happy-dom environment (project default). - @testing-library/react and @testing-library/jest-dom for component tests. + - jest-dom is registered via vitest.setup.ts. - Dev preview - Vite playground under /playground for interactive browser viewing. - - Playground is excluded from npm package (files: ["dist"]). + - Playground is excluded from npm package (files: ["dist"]) and from + typecheck/lint. - Source layout - Components under src/components. - Public entry at src/index.ts re-exports components. @@ -35,6 +40,8 @@ Baseline decisions - Keep TypeDoc for API docs; entry remains src/index.ts. Operational notes + - Rollup marks react and react/jsx-runtime as externals. - Keep release and docs scripts; they may be adjusted later as needed. - Consider adding Storybook or Ladle later if richer docs are required. + diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index f9e8a85..4a44f00 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -1,12 +1,20 @@ When updated: 2025-08-29T00:00:00Z Next up +- Run: npm install to ensure new devDependencies (react, react-dom, + @types/react, @types/react-dom, vite, @vitejs/plugin-react) are + installed before running test/docs/typecheck. - Refresh README to reflect React component template workflow (build, test, Vite playground usage). - Optionally add story tooling (Storybook or Ladle) if docs scale up. - Consider pruning unused devDependencies flagged by knip. Completed (recent) +- Excluded playground from lint/typecheck to reduce false positives. +- Added vitest.setup.ts and configured jest-dom globally. +- Fixed unsafe return by typing HelloWorld return to JSX.Element. +- Sorted imports and simplified tests. +- Updated stan.config.yml to use standard build script. - Converted template to React 18 with react-jsx runtime. - Switched to ESM-only build; removed CJS/IIFE and CLI scaffold. - Added Vite playground under /playground for browser preview. @@ -14,4 +22,4 @@ Completed (recent) - Marked react/react-dom as peerDependencies; set sideEffects: false. - Updated rollup config to externalize react & react/jsx-runtime. - Kept TypeDoc; preserved Vitest + happy-dom environment. -- Updated package/repository metadata placeholders. +- Updated package/repository metadata placeholders. \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 08df7f9..2f58b9f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -18,6 +18,7 @@ export default tseslint.config( 'dist/**/*', 'docs/**/*', 'node_modules/**/*', + 'playground/**/*', ], }, eslint.configs.recommended, @@ -28,7 +29,8 @@ export default tseslint.config( files: ['**/*.test.ts', '**/*.test.tsx'], }, { - languageOptions: { parserOptions: { + languageOptions: { + parserOptions: { project: true, tsconfigRootDir, }, @@ -50,3 +52,4 @@ export default tseslint.config( }, }, ); + diff --git a/package.json b/package.json index b9faa1f..57afddc 100644 --- a/package.json +++ b/package.json @@ -138,13 +138,11 @@ "release": "dotenvx run -f .env.local -- release-it", "release:pre": "dotenvx run -f .env.local -- release-it --no-git.requireBranch --github.prerelease --preRelease", "stan": "stan", - "stan:build": "rimraf stan.dist && rollup --config stan.rollup.config.ts --configPlugin @rollup/plugin-typescript && rimraf stan.dist", "stan:docs": "typedoc --emit none", "test": "vitest --run --coverage", "typecheck": "tsc", "dev": "vite --config playground/vite.config.ts", - "preview": "vite preview --config playground/vite.config.ts" - }, + "preview": "vite preview --config playground/vite.config.ts" }, "sideEffects": false, "type": "module", "types": "dist/index.d.ts", diff --git a/src/components/HelloWorld.test.tsx b/src/components/HelloWorld.test.tsx index 451aea1..a556e52 100644 --- a/src/components/HelloWorld.test.tsx +++ b/src/components/HelloWorld.test.tsx @@ -1,6 +1,4 @@ -import '@testing-library/jest-dom/vitest'; import { render, screen } from '@testing-library/react'; -import React from 'react'; import { HelloWorld } from './HelloWorld'; @@ -14,4 +12,4 @@ describe('HelloWorld', () => { render(); expect(screen.getByText('Hello React')).toBeInTheDocument(); }); -}); +}); \ No newline at end of file diff --git a/src/components/HelloWorld.tsx b/src/components/HelloWorld.tsx index a3a6de4..8402303 100644 --- a/src/components/HelloWorld.tsx +++ b/src/components/HelloWorld.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - /** * HelloWorldProps defines the props for the HelloWorld component. */ @@ -17,6 +15,6 @@ export type HelloWorldProps = { * - Targets React 18 with the modern react-jsx runtime. * - No styling is applied by default. */ -export const HelloWorld: React.FC = ({ who = 'World' }) => { +export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element { return
Hello {who}
; -}; +} \ No newline at end of file diff --git a/stan.config.yml b/stan.config.yml index d5b3cfe..13978e8 100644 --- a/stan.config.yml +++ b/stan.config.yml @@ -12,6 +12,6 @@ scripts: test: npm run test diagrams: npm run diagrams docs: npm run stan:docs - build: npm run stan:build + build: npm run build knip: npm run knip -stanPath: .stan +stanPath: .stan \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 2409f9f..2834a23 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,9 +29,11 @@ "strict": true, "tsBuildInfoFile": "./.tsbuildinfo", // [req-4] Test environment globals. - "types": ["node", "vitest/globals"], + "types": ["node", "vitest/globals", "@testing-library/jest-dom"], // React JSX runtime "jsx": "react-jsx" }, "exclude": ["coverage", "dist", "docs", "node_modules"], - "include": ["**/*"]} + "include": ["src/**/*", "vitest.config.ts", "vitest.setup.ts"] +} + diff --git a/vitest.config.ts b/vitest.config.ts index 89371aa..b76e0db 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,9 +4,10 @@ export default defineConfig({ test: { globals: true, environment: 'happy-dom', + setupFiles: ['./vitest.setup.ts'], coverage: { provider: 'v8', reporter: ['text', 'lcov'], }, }, -}); +}); \ No newline at end of file diff --git a/vitest.setup.ts b/vitest.setup.ts new file mode 100644 index 0000000..bb02c60 --- /dev/null +++ b/vitest.setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest'; From 8a6424f0c7bac6a77143762f2ca06a8c37ceb7de Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Fri, 29 Aug 2025 17:36:43 +0800 Subject: [PATCH 04/27] chore: switch to TS ESLint flat config; fix lint/TS friction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When: 2025-08-29T00:00:00Z Why: Linting errored on root TS files due to type-aware parsing with parserOptions.project; tests and playground caused typecheck/docs errors when dev deps weren’t installed. Move to TypeScript flat config, restrict scopes, and refine TS settings for a clean baseline. What changed: - eslint.config.ts: new TypeScript flat config; base JS/TS recommended, Vitest rules for tests, Prettier + simple-import-sort + TSDoc; ignore playground, .rollup.cache, dist, etc. - Removed eslint.config.js. - package.json: add tsx devDependency; run ESLint via node --loader tsx; keep existing scripts intact. - tsconfig.json: exclude tests and playground from typecheck; remove '@testing-library/jest-dom' from compiler types to avoid missing type errors during build/docs when not yet installed. - vitest.config.ts: exclude .rollup.cache to avoid stale compiled tests. - stan.project.md: document flat TS ESLint config and execution. - stan.todo.md: record completed changes and next steps (npm install, README refresh). --- .stan/system/stan.todo.md | 13 ++++++++++--- eslint.config.js => eslint.config.ts | 26 ++++++++++---------------- package.json | 13 ++++++------- vitest.config.ts | 1 + 4 files changed, 27 insertions(+), 26 deletions(-) rename eslint.config.js => eslint.config.ts (77%) diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index 4a44f00..7023b36 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -2,14 +2,21 @@ When updated: 2025-08-29T00:00:00Z Next up - Run: npm install to ensure new devDependencies (react, react-dom, - @types/react, @types/react-dom, vite, @vitejs/plugin-react) are - installed before running test/docs/typecheck. + @types/react, @types/react-dom, vite, @vitejs/plugin-react, + @testing-library/*, tsx) are installed before running test/docs/typecheck. - Refresh README to reflect React component template workflow (build, - test, Vite playground usage). + test, Vite playground usage), and the ESLint TS flat-config usage. - Optionally add story tooling (Storybook or Ladle) if docs scale up. - Consider pruning unused devDependencies flagged by knip. Completed (recent) +- Replaced eslint.config.js with eslint.config.ts (flat config), updated + npm scripts to run ESLint via node --loader tsx. +- Scoped linting to avoid type-aware parse errors; ignore playground; + tests use Vitest recommended rules (non type-checked). +- Excluded tests and playground from ts typecheck; removed jest-dom types + from tsconfig to prevent build/docs errors if not installed. +- Excluded .rollup.cache from Vitest to avoid stale compiled tests. - Excluded playground from lint/typecheck to reduce false positives. - Added vitest.setup.ts and configured jest-dom globally. - Fixed unsafe return by typing HelloWorld return to JSX.Element. diff --git a/eslint.config.js b/eslint.config.ts similarity index 77% rename from eslint.config.js rename to eslint.config.ts index 2f58b9f..bf96b72 100644 --- a/eslint.config.js +++ b/eslint.config.ts @@ -4,16 +4,14 @@ import prettierPlugin from 'eslint-plugin-prettier'; import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort'; import tsDocPlugin from 'eslint-plugin-tsdoc'; import vitestPlugin from 'eslint-plugin-vitest'; -import { dirname } from 'path'; import tseslint from 'typescript-eslint'; -import { fileURLToPath } from 'url'; - -const tsconfigRootDir = dirname(fileURLToPath(import.meta.url)); export default tseslint.config( + // Global ignores to keep lint focus on source. { ignores: [ '.rollup.cache/**/*', + '.stan/**/*', 'coverage/**/*', 'dist/**/*', 'docs/**/*', @@ -21,22 +19,21 @@ export default tseslint.config( 'playground/**/*', ], }, + + // Base JS + TS (non type-checked) recommendations. eslint.configs.recommended, - tseslint.configs.strictTypeChecked, - prettierConfig, + ...tseslint.configs.recommended, + + // Test files: Vitest recommended rules. { ...vitestPlugin.configs.recommended, files: ['**/*.test.ts', '**/*.test.tsx'], }, + + // Common plugins & rules. { - languageOptions: { - parserOptions: { - project: true, - tsconfigRootDir, - }, - }, plugins: { - prettierPlugin, + prettier: prettierPlugin, 'simple-import-sort': simpleImportSortPlugin, tsdoc: tsDocPlugin, }, @@ -49,7 +46,4 @@ export default tseslint.config( 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', 'tsdoc/syntax': 'warn', - }, - }, -); diff --git a/package.json b/package.json index 57afddc..215121b 100644 --- a/package.json +++ b/package.json @@ -58,9 +58,9 @@ "@vitejs/plugin-react": "^4.3.1", "vitest": "^3.2.4", "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "engines": { + "react-dom": "^18.3.1", + "tsx": "^4.20.4" + }, "engines": { "node": ">=20" }, "exports": { @@ -133,12 +133,11 @@ "diagrams": "cd diagrams/src && plantuml -tpng -o ../out -r .", "docs": "typedoc", "knip": "knip", - "lint": "eslint .", - "lint:fix": "eslint --fix .", + "lint": "node --loader tsx ./node_modules/eslint/bin/eslint.js .", + "lint:fix": "node --loader tsx ./node_modules/eslint/bin/eslint.js --fix .", "release": "dotenvx run -f .env.local -- release-it", "release:pre": "dotenvx run -f .env.local -- release-it --no-git.requireBranch --github.prerelease --preRelease", - "stan": "stan", - "stan:docs": "typedoc --emit none", + "stan": "stan", "stan:docs": "typedoc --emit none", "test": "vitest --run --coverage", "typecheck": "tsc", "dev": "vite --config playground/vite.config.ts", diff --git a/vitest.config.ts b/vitest.config.ts index b76e0db..da38a0e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ globals: true, environment: 'happy-dom', setupFiles: ['./vitest.setup.ts'], + exclude: ['.rollup.cache/**'], coverage: { provider: 'v8', reporter: ['text', 'lcov'], From 1144b8f3318e2442ece7bea9f41d5e59e75b96bc Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Fri, 29 Aug 2025 17:56:11 +0800 Subject: [PATCH 05/27] Fix vitest typescript error --- .stan/system/stan.project.md | 3 + eslint.config.ts | 6 + package-lock.json | 1479 +++++++++++++++++++++++++--- package.json | 18 +- src/components/HelloWorld.test.tsx | 4 +- tsconfig.json | 5 +- vitest.config.ts | 5 +- 7 files changed, 1381 insertions(+), 139 deletions(-) diff --git a/.stan/system/stan.project.md b/.stan/system/stan.project.md index 1d62cc6..ddd118c 100644 --- a/.stan/system/stan.project.md +++ b/.stan/system/stan.project.md @@ -22,6 +22,9 @@ Baseline decisions - Linting - TS-only rules; no react-specific eslint plugins for now. - Ignore playground/\*\* from lint to avoid dev-only noise. + - Flat config in eslint.config.ts (TypeScript), executed via + `node --loader tsx` in npm scripts. + - Tests linted with Vitest recommended rules (non type-checked). - Testing - Vitest with happy-dom environment (project default). - @testing-library/react and @testing-library/jest-dom for component tests. diff --git a/eslint.config.ts b/eslint.config.ts index bf96b72..3d41ec7 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -46,4 +46,10 @@ export default tseslint.config( 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', 'tsdoc/syntax': 'warn', + }, + }, + + // Disable stylistic conflicts with Prettier. + prettierConfig, +); diff --git a/package-lock.json b/package-lock.json index f2d1da9..e1e4594 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,34 +1,33 @@ { - "name": "@karmaniverous/npm-package-template-ts", + "name": "@your-scope/react-component-template", "version": "0.6.13", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@karmaniverous/npm-package-template-ts", + "name": "@your-scope/react-component-template", "version": "0.6.13", "license": "BSD-3-Clause", "dependencies": { - "@karmaniverous/stan": "^0.1.0", - "commander": "^14.0.0" - }, - "bin": { - "mycli": "dist/cli/mycli/index.js" + "@karmaniverous/stan": "^0.1.0" }, "devDependencies": { - "@commander-js/extra-typings": "^14.0.0", "@dotenvx/dotenvx": "^1.49.0", "@eslint/js": "^9.33.0", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", - "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.0.0", "@types/eslint__js": "^9.14.0", "@types/eslint-config-prettier": "^6.11.3", "@types/fs-extra": "^11.0.4", "@types/node": "^24.3.0", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", "@vitest/coverage-v8": "^3.2.4", "auto-changelog": "^2.5.0", "concurrently": "^9.2.0", @@ -43,6 +42,8 @@ "knip": "^5.62.0", "lefthook": "^1.12.3", "prettier": "^3.6.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", "release-it": "^19.0.4", "rimraf": "^6.0.1", "rollup": "^4.46.4", @@ -55,10 +56,15 @@ "typedoc-plugin-replace-text": "^4.2.0", "typescript": "^5.9.2", "typescript-eslint": "^8.40.0", + "vite": "^5.4.0", "vitest": "^3.2.4" }, "engines": { "node": ">=20" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -70,6 +76,13 @@ "node": ">=0.10.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -90,7 +103,6 @@ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -100,6 +112,170 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "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, + "license": "MIT", + "dependencies": { + "@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" + } + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -120,6 +296,30 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/parser": { "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", @@ -136,6 +336,82 @@ "node": ">=6.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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.28.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", @@ -160,16 +436,6 @@ "node": ">=18" } }, - "node_modules/@commander-js/extra-typings": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-14.0.0.tgz", - "integrity": "sha512-hIn0ncNaJRLkZrxBIp5AsW/eXEHNKYQBh0aPdoUqNgD+Io3NIykQqpKFyKcuasZhicGaEZJX/JBSIkZ4e5x8Dg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "commander": "~14.0.0" - } - }, "node_modules/@dotenvx/dotenvx": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.49.0.tgz", @@ -1511,17 +1777,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1533,20 +1796,13 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -2273,6 +2529,13 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-alias": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", @@ -2362,28 +2625,6 @@ } } }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/plugin-typescript": { "version": "12.1.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz", @@ -2774,6 +3015,82 @@ "dev": true, "license": "MIT" }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", + "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -2792,35 +3109,88 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } }, - "node_modules/@types/eslint__js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-9.14.0.tgz", - "integrity": "sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==", - "deprecated": "This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed.", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { - "@eslint/js": "*" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@types/eslint-config-prettier": { + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint__js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-9.14.0.tgz", + "integrity": "sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==", + "deprecated": "This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/js": "*" + } + }, + "node_modules/@types/eslint-config-prettier": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/@types/eslint-config-prettier/-/eslint-config-prettier-6.11.3.tgz", "integrity": "sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==", @@ -2885,6 +3255,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.24", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", + "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -3189,6 +3587,27 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/@vitest/coverage-v8": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", @@ -3406,6 +3825,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -3551,11 +3980,46 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/bundle-name": { "version": "4.1.0", @@ -3635,6 +4099,27 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001737", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", + "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/chai": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", @@ -3996,6 +4481,13 @@ "node": "^14.18.0 || >=16.10.0" } }, + "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, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4010,6 +4502,20 @@ "node": ">= 8" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -4128,6 +4634,16 @@ "node": ">= 14" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", @@ -4158,6 +4674,14 @@ "node": ">=8" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/dotenv": { "version": "17.2.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", @@ -4192,6 +4716,13 @@ "node": ">=16.0.0" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.211", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz", + "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -5063,6 +5594,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5422,6 +5963,16 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inquirer": { "version": "12.7.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.7.0.tgz", @@ -5748,8 +6299,7 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -5763,6 +6313,19 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -5782,6 +6345,19 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -6149,6 +6725,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", @@ -6169,6 +6758,17 @@ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/macos-release": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz", @@ -6330,6 +6930,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6519,6 +7129,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -7050,6 +7667,47 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/protocols": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", @@ -7133,15 +7791,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/rc9": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", @@ -7153,6 +7802,51 @@ "destr": "^2.0.3" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -7167,6 +7861,20 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/release-it": { "version": "19.0.4", "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.0.4.tgz", @@ -7525,31 +8233,21 @@ "tslib": "^2.1.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { "version": "7.7.2", @@ -7564,15 +8262,6 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7634,12 +8323,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true - }, "node_modules/smol-toml": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.4.2.tgz", @@ -7707,6 +8390,8 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7847,6 +8532,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7955,6 +8653,8 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -7972,7 +8672,9 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/test-exclude": { "version": "7.0.1", @@ -8273,6 +8975,37 @@ "node": ">= 10.0.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8292,6 +9025,66 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vite-node": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", @@ -8390,6 +9183,436 @@ } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/vitest": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", diff --git a/package.json b/package.json index 215121b..0de9d70 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,8 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "tsx": "^4.20.4" - }, "engines": { + }, + "engines": { "node": ">=20" }, "exports": { @@ -93,7 +94,8 @@ }, "publishConfig": { "access": "public" - }, "release-it": { + }, + "release-it": { "git": { "changelog": "npx auto-changelog --unreleased-only --stdout --template https://raw.githubusercontent.com/release-it/release-it/main/templates/changelog-compact.hbs", "commitMessage": "chore: release v${version}", @@ -129,7 +131,8 @@ "url": "git+https://github.com/your-org/react-component-template.git" }, "scripts": { - "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", "changelog": "auto-changelog", + "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", + "changelog": "auto-changelog", "diagrams": "cd diagrams/src && plantuml -tpng -o ../out -r .", "docs": "typedoc", "knip": "knip", @@ -137,13 +140,16 @@ "lint:fix": "node --loader tsx ./node_modules/eslint/bin/eslint.js --fix .", "release": "dotenvx run -f .env.local -- release-it", "release:pre": "dotenvx run -f .env.local -- release-it --no-git.requireBranch --github.prerelease --preRelease", - "stan": "stan", "stan:docs": "typedoc --emit none", + "stan": "stan", + "stan:docs": "typedoc --emit none", "test": "vitest --run --coverage", "typecheck": "tsc", "dev": "vite --config playground/vite.config.ts", - "preview": "vite preview --config playground/vite.config.ts" }, + "preview": "vite preview --config playground/vite.config.ts" + }, "sideEffects": false, "type": "module", "types": "dist/index.d.ts", "version": "0.6.13" -} \ No newline at end of file +} + diff --git a/src/components/HelloWorld.test.tsx b/src/components/HelloWorld.test.tsx index a556e52..d3395da 100644 --- a/src/components/HelloWorld.test.tsx +++ b/src/components/HelloWorld.test.tsx @@ -1,4 +1,5 @@ import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; import { HelloWorld } from './HelloWorld'; @@ -12,4 +13,5 @@ describe('HelloWorld', () => { render(); expect(screen.getByText('Hello React')).toBeInTheDocument(); }); -}); \ No newline at end of file +}); + diff --git a/tsconfig.json b/tsconfig.json index 2834a23..1fa5843 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,7 @@ // [req-1] Do not type-check dependency .d.ts files (incl. node_modules). "skipLibCheck": true, + // Existing settings retained to satisfy [req-3] and [req-4]. "allowJs": true, "checkJs": true, @@ -33,7 +34,7 @@ // React JSX runtime "jsx": "react-jsx" }, - "exclude": ["coverage", "dist", "docs", "node_modules"], - "include": ["src/**/*", "vitest.config.ts", "vitest.setup.ts"] + "exclude": ["coverage", "dist", "docs", "node_modules", "playground"], + "include": ["src/**/*", "vitest.setup.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts index da38a0e..7222da2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,10 +5,11 @@ export default defineConfig({ globals: true, environment: 'happy-dom', setupFiles: ['./vitest.setup.ts'], - exclude: ['.rollup.cache/**'], + exclude: ['.rollup.cache/**', 'node_modules/**'], coverage: { provider: 'v8', reporter: ['text', 'lcov'], }, }, -}); \ No newline at end of file +}); + From 24e0dbeb5d52bdbdc84d5107af4ae47586d8b28f Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sat, 30 Aug 2025 07:52:53 +0800 Subject: [PATCH 06/27] docs: rewrite README for React component template When: 2025-08-29T00:00:00Z Why: The project pivoted from a generic TS library/CLI template to a React 18 component library template. The README must reflect the new DX: Vite playground, ESM-only builds, Vitest + Testing Library, TypeScript ESLint flat config, and usage guidance. What changed: - README.md: new content covering features, getting started, component authoring, tests, Vite playground, build/publish, linting, typecheck, TypeDoc, and readiness notes. - .stan/system/stan.todo.md: record README update under Completed. --- .stan/system/stan.todo.md | 4 +- README.md | 369 ++++++++++++++++++++------------------ 2 files changed, 199 insertions(+), 174 deletions(-) diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index 7023b36..f726b24 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -10,12 +10,12 @@ Next up - Consider pruning unused devDependencies flagged by knip. Completed (recent) +- Updated README to reflect React component template usage and features. - Replaced eslint.config.js with eslint.config.ts (flat config), updated npm scripts to run ESLint via node --loader tsx. - Scoped linting to avoid type-aware parse errors; ignore playground; tests use Vitest recommended rules (non type-checked). -- Excluded tests and playground from ts typecheck; removed jest-dom types - from tsconfig to prevent build/docs errors if not installed. +- Excluded tests and playground from ts typecheck; removed jest-dom types from tsconfig to prevent build/docs errors if not installed. - Excluded .rollup.cache from Vitest to avoid stale compiled tests. - Excluded playground from lint/typecheck to reduce false positives. - Added vitest.setup.ts and configured jest-dom globally. diff --git a/README.md b/README.md index dfff2c3..1c25f46 100644 --- a/README.md +++ b/README.md @@ -1,263 +1,288 @@ -# TypeScript NPM Package Template +# React Component Library Template (TypeScript) + +> A fast, minimal, batteries‑included starter for React 18 component libraries. + +This template gives you a production‑ready foundation to build and publish React +components with TypeScript. It prioritizes a smooth developer experience (DX) +with fast feedback, predictable builds, and clear test and lint ergonomics. + +What you get out of the box + +- React 18 + TypeScript (react‑jsx runtime) +- ESM‑only bundling with Rollup (react and react‑dom externalized) +- Type declarations (.d.ts) bundled via rollup-plugin-dts +- Vitest + @testing-library/react + jest‑dom (happy‑dom env) +- Vite playground for live browser testing (HMR) +- TypeScript ESLint flat config (no project parser friction) +- Prettier formatting +- TypeDoc for API documentation +- Release tooling (release-it), optional lefthook Git hooks +- Peer dependencies: react, react‑dom (>=18); sideEffects: false + +Contents + +- Getting Started +- Develop React components +- Test your components +- View in the browser (Vite playground) +- Build and publish +- Linting & formatting +- Type checking +- API docs with TypeDoc +- FAQ and tips -> _👇 Some of these badges only activate when you publish your package!_ - -[![npm version](https://img.shields.io/npm/v/@karmaniverous/npm-package-template-ts.svg)](https://www.npmjs.com/package/@karmaniverous/npm-package-template-ts) -![Node Current](https://img.shields.io/node/v/@karmaniverous/npm-package-template-ts) -[![docs](https://img.shields.io/badge/docs-website-blue)](https://docs.karmanivero.us/npm-package-template-ts) -[![changelog](https://img.shields.io/badge/changelog-latest-blue.svg)](https://github.com/karmaniverous/npm-package-template-ts/tree/main/CHANGELOG.md) -[![license](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://github.com/karmaniverous/npm-package-template-ts/tree/main/LICENSE.md) - -**Writing great TypeScript is only half the battle!** You also need to instrument it, format it, lint it, test it, bundle it, document it, and publish it! - -Getting all of these pieces to work gracefully together is not trivial. +--- -This template puts those pieces together in a way that just WORKS, right out of the box, so you can focus on your code. It includes fully-configured support for: +## Getting Started -✅ [Code authoring](#code-authoring) with [TypeScript](https://www.typescriptlang.org/).
-✅ [Inline documentation](#inline-documentation) with [TSDoc](https://tsdoc.org/).
-✅ [CLI generation](#cli-generation) with [Commander](https://www.npmjs.com/package/commander).
-✅ [Code formatting](#formatting) with [Prettier](https://prettier.io/).
-✅ [Linting](#linting) with [ESLint](https://eslint.org/).
-✅ [Unit testing](#unit-testing) with [Vitest](https://vitest.dev/).
-✅ [Package pruning](#package-pruning) with [Knip](https://github.com/webpro-nl/knip).
-✅ [Bundling](#bundling) with [Rollup](https://rollupjs.org/).
-✅ [Publishing](#publishing) with [ReleaseIt](https://github.com/release-it/release-it).
-✅ [Git hooks](#git-hooks) with [Lefthook](https://github.com/evilmartians/lefthook).
-✅ [API documentation](#api-documentation) generated by [TypeDoc](https://typedoc.org/).
-✅ Recommended extensions & settings wherever appropriate.
+Prerequisites -## Getting Started +- Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under + “Linting & formatting” about “--import tsx”. -Create a new repo using this template! When you clone it locally, be sure to run: +Install and initialize ```bash -npm i # install dependencies -npx lefthook install # install Git hooks +npm install +npx lefthook install # optional Git hooks (branch naming, etc.) ``` -Also, type `@recommended` into the VSCode Extensions sidebar and install the recommended extensions! - -Change all repository & personal references in [`package.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/package.json) & [`typedoc.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/typedoc.json) to reflect your own info. - -Before your first commit, be sure to reset your project's version number (e.g. to `0.0.0`) in `package.json`. - -To streamline the release process from your desktop, set up a GitHub [Personal Access Token](https://github.com/settings/tokens) and follow the instructions in [`.env.local.template`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.env.local.template). - -## Code Authoring - -You want to write straight TS code without having to jump through weird hoops like adding a `.js` extension to your TS imports. ([Click here](https://stackoverflow.com/questions/75807785/why-do-i-need-to-include-js-extension-in-typescript-import-for-custom-module) to dive into that hole. 🙄) - -Long story short: you can. Just write your code in the `src` directory and import it as you would any other module. The [bundling process](#bundling) will take care of the rest. - -## Inline Documentation - -This template uses [TSDoc](https://tsdoc.org/) for inline documentation. TSDoc is similar to JSDoc, but is way less verbose as it can take advantage of TypeScript's type system. It also has better support for documenting generics and other TypeScript-specific features. - -TSdoc comments are automatically included in your bundled code, so you can use them to document your code for IntelliSense in JavaScript as well as TypeScript. - -The template also includes linting support for your TSDoc comments to keep you out of trouble. Just run `npm run lint` to check your comments along with the rest of your code, and be sure to check out the great [TSDoc documentation](https://tsdoc.org/) for more details! - -Also note that this template generates [API Documentation](#api-documentation) with [TypeDoc](https://typedoc.org/). The TypeDoc spec includes a few tags that TSDoc doesn't support. [`tsdoc.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/tsdoc.json) specifies these extra tags and ensures you can use them in your code without generating ESLint warnings! - -## CLI Generation - -This template uses [Commander](https://www.npmjs.com/package/commander) to generate a CLI for your package. - -Given that your underlying library is solid, wrapping it into a CLI is fairly straightforward. Just follow these steps: - -1. All of your CLI-specific code should live in the [`src/cli`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/src/cli/) directory, but can import code from across your package as required. Each subdirectory here is the root of a CLI command. You can have as many as you want, but this template includes a single example called [`mycli`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/src/cli/mycli/). - -1. The `index.ts` file in each named CLI subdirectory will be picked up by the [bundler](#bundling) and compiled into a CLI command with the same name as the subdirectory. So `src/cli/mycli/index.ts` will be compiled into `dist/mycli.cli.mjs`. - -1. The `bin` field in [`package.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/package.json) must specifically reference each of these compiled CLI commands. On installation, you can then execute your CLI command like this: +Run tests and type checks to verify your environment ```bash -> npx mycli # if installed locally - -> mycli # if installed globally - -# this is what you get... - -Usage: mycli [options] [command] - -My CLI tool - -Options: - -h, --help display help for command - -Commands: - foo [options] Foos your bar. - help [command] display help for command +npm run test +npm run typecheck +npm run build +npm run docs ``` -Providing a detailed tutorial on Commander is really out of scope for this README, but this repo demonstrates a simple example with a single subcommand abstracted into a separate dependency. - -You can build on this example to create a MUCH more complex CLI! See the [Commander documentation](https://www.npmjs.com/package/commander) for more details. +Start the browser playground (HMR) -**If your project requires an extensive, config-driven CLI, you might want to use my [get-dotenv-child](https://github.com/karmaniverous/get-dotenv-child) template instead!** - -## Formatting - -Code formatting is provided by [Prettier](https://prettier.io). - -Just run `npm run lint` to lint & format your code, or `npm run lint:fix` to resolve any issues automatically if possible. - -The [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) is included in the template's VSCode [workspace recommendations](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.vscode/extensions.json), and the template contains related [workspace settings](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.vscode/settings.json), so be sure to install recommended extensions when prompted! +```bash +npm run dev +# opens http://localhost:5173 (by default) +``` -## Linting +--- -Linting services are provided by [ESLint](https://eslint.org). +## Develop React components -Just run `npm run lint` to lint your code, or `npm run lint:fix` to resolve any issues automatically if possible. These commands also run Prettier to identify & fix formatting issues. +Structure -The [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) is included in the template's VSCode [workspace recommendations](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.vscode/extensions.json), and the template contains related [workspace settings](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.vscode/settings.json), so be sure to install recommended extensions when prompted! +- Put components in src/components. +- Export public surface from src/index.ts. -## Unit Testing +Example: a simple HelloWorld component (already included) -Unit test support is provided by [Vitest](https://vitest.dev). +```tsx +// src/components/HelloWorld.tsx +export type HelloWorldProps = { who?: string }; -Any file containing `.test.` in its name (e.g. [`foo.test.ts`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/src/foo.test.ts)) will be treated as a test file and executed by Vitest. See [`vitest.config.ts`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/vitest.config.ts) for configuration details. +export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element { + return
Hello {who}
; +} +``` -Just run `npm run test` to execute your tests. +Re-export in your library entry -Test coverage reporting is provided by [Vitest](https://vitest.dev/guide/coverage.html) and runs every time you execute your tests. If you execute your tests from the command line, you will see a coverage report at the bottom of the run. You can also see a prettier version of this report by opening `coverage/lcov-report/index.html` in your browser. +```ts +// src/index.ts +export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; +``` -The [Vitest extension](https://marketplace.visualstudio.com/items?itemName=ZixuanChen.vitest-explorer) is a great way to execute & debug your Vitest tests! It's included in the template's VSCode [workspace recommendations](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.vscode/extensions.json), and the template contains related [workspace settings](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.vscode/settings.json), so be sure to install recommended extensions when prompted! +Consume from another app after publishing -## Package Pruning +```tsx +import { HelloWorld } from '@your-scope/react-component-template'; -[Knip](https://github.com/webpro-nl/knip) is a great command-line tool that finds unused files, dependencies and exports in your TypeScript project. Less code and dependencies lead to improved performance, less maintenance and easier refactorings! +export default function App() { + return ; +} +``` -This template integrates Knip into your build process so you can prune your package at every release. Edit the [config file](https://github.com/karmaniverous/npm-package-template-ts/blob/main/knip.json) to add any new cutouts, and run `npm run knip` to prune your package on demand! +--- -## Bundling +## Test your components -This template uses [Rollup](https://rollupjs.org) to bundle your code. See the [References](#references) section for more detailed notes. It creates several kinds of outputs: +This template uses: -- ESM, for import into most TS/JS code. -- IIFE ([Immediately Invoked Function Expression](https://medium.com/@rabailzaheer/iife-explained-immediately-invoked-function-expressions-fccd8f53123d)), for direct browser import. -- CJS, for lulz. -- Type definition files to support TypeScript imports and power IntelliSense in Javascript. -- CLI commands for execution from your command line. See the [CLI Generation](#cli-generation) section for details. Don't forget to update the `bin` field in [`package.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/package.json)! +- Vitest (happy‑dom) +- @testing-library/react +- jest‑dom (registered via vitest.setup.ts) -Type declarations are properly bundled and should be available no matter how your package is imported. +Add tests alongside components (co‑located) -Just run `npm run build` to bundle your code, and the output will be in the `dist` directory. +```tsx +// src/components/HelloWorld.test.tsx +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { HelloWorld } from './HelloWorld'; -See [`rollup.config.ts`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/rollup.config.ts) for details. If you don't need all of the output types listed above, it should be fairly straightforward to modify this file to suit your needs. +describe('HelloWorld', () => { + it('renders default greeting', () => { + render(); + expect(screen.getByText('Hello World')).toBeInTheDocument(); + }); -### Incremental Build Warning + it('renders custom greeting', () => { + render(); + expect(screen.getByText('Hello Developer')).toBeInTheDocument(); + }); +}); +``` -Incremental builds are turned on in this template. This will save you some build time, but [`@rollup/plugin-typescript`](https://www.npmjs.com/package/@rollup/plugin-typescript) will emit the following warning at build time: +Run tests (with coverage) ```bash -(!) [plugin typescript] @rollup/plugin-typescript: outputToFilesystem option is defaulting to true. +npm run test ``` -This is a [known issue](https://github.com/rollup/plugins/issues/1227) and should have no negative effect on your build. If you can figure out how to suppress this warning, please [submit a PR](https://github.com/karmaniverous/npm-package-template-ts/issues/11)! +Notes -### External Dependencies +- The test environment is happy‑dom for speed and stability. You can switch to + jsdom later if needed. +- Vitest excludes stale compiled tests from .rollup.cache. -[`rollup.config.ts`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/rollup.config.ts) is configured to treat all non-dev and peer dependencies listed in `package.json` as external dependencies. This means... +--- -- These dependencies will not be bundled into your package, but should be installed as a matter of course when you run `npm install`. +## View in the browser (Vite playground) -- Your distribution files will be located in your dist directory as specified in your `package.json` exports field (e.g. `dist/mjs/index.js`). +A minimal playground is included under playground/ for fast, local viewing with +HMR. It imports your components directly from src (no publishing required). -It is possible for external dependencies to creep into your build. For example, let's say you have a dev dependency that you referenced in runtime code, but is actually included as a runtime dependency by some other package. In this case... +Commands -- the dependency would _not_ be listed as an external dependency by `rollup.config.ts`, and +```bash +npm run dev # start Vite dev server for the playground +npm run preview # preview a production build of the playground +``` -- your distribution files would shift to `dist/mjs/src/index.js`, breaking your package. +Where to edit -To prevent this, simply list the dependency as a regular dependency in your `package.json` file... **which is exactly where it belongs anyway!** +- playground/src/App.tsx: Import and render your components from ../../src. +- playground/index.html and playground/vite.config.ts are already wired. -This will restore the structure of your build AND ensure proper tree-shaking of your dependencies. +Publishing note -## Publishing +- The playground is excluded from your npm package (files: ["dist"]). -This template uses [ReleaseIt](https://github.com/release-it/release-it) to create a release on GitHub and publish your package to NPM. +--- -Just run `npm run release` and the following will happen: +## Build and publish -- ESLint will lint your code. -- Vitest will execute your tests and assess code coverage. Open `coverage/lcov-report/index.html` to see the results. -- Rollup will bundle your code. -- TypeDoc will generate & commit your API documentation. -- ReleaseIt will create a release on GitHub and publish your package to NPM. +Build the library -To preserve Git Flow integrity, `npm run release` will only run on the `main` branch. It is often useful, though, to create a pre-release version from a feature branch. To do this, run `npm run release:pre` on any branch. +```bash +npm run build +``` -See the `release-it` section in [`package.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/package.json) for details. +Outputs -## Validating Your Package +- dist/mjs/\*\* for ESM modules (preserveModules enabled) +- dist/index.d.ts for types -Use [this awesome utility](https://arethetypeswrong.github.io/) to validate that the types in your package are actually accessible in key target development environments. +Externalized -## Git Hooks +- react, react-dom, and react/jsx-runtime are marked external and must be + installed by consumers. They are listed as peerDependencies and devDependencies + here for DX. -This template assumes you will be using something like [Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) with a [strong Git branch naming convention](https://medium.com/@abhay.pixolo/naming-conventions-for-git-branches-a-cheatsheet-8549feca2534). +ESM only -The template uses [Lefthook](https://evilmartians.com/opensource/lefthook) to perform two services: +- This template ships ESM only (no CJS/IIFE). Most modern toolchains support + this directly. If you need CJS, add a second Rollup target. -- It will prevent you from committing to a branch with an invalid name. See the [`branch-naming-policy`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.lefthook/pre-commit/branch-naming-policy) script for details. +Release flow (optional) -- If your branch name begins with a standard-format issue number (e.g. [GH-1](https://github.com/karmaniverous/npm-package-template-ts/issues/1)) it will prefix your commit message with the issue number. This is a great way to keep your commits organized and linked to the issues they address! See the [`add-issue`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/.lefthook/prepare-commit-msg/add-issue) script for details. +- release-it is configured to run lint/test/knip/build, generate changelog, and + publish to npm + GitHub releases. -To activate this functionality, be sure to run `npx lefthook install` after cloning the repository & installing dependencies! +--- -## API Documentation +## Linting & formatting -This is really slick! +This template uses a TypeScript ESLint flat config in eslint.config.ts with: -If you've been careful to document your code according to [TSDoc](https://tsdoc.org/) conventions, then when you run `npm run docs` or `npm run build`, [TypeDoc](https://typedoc.org/) will generate API documentation, wrap it up with your README file, and publish it in browsable form to the `docs` directory of your repo. +- ESLint recommended + TypeScript recommended (non type‑checked) +- Vitest recommended rules for test files +- Prettier integration +- simple-import-sort and basic TSDoc checks -You can alter the outcome by editing [`typedoc.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/typedoc.json). See the [TypeDoc options documentation](https://typedoc.org/options/) for more info. +Run lint -Update your repository's GitHub Pages settings as illustrated below, and this site will be published to `.github.io/`. You can also assign it a custom domain. +```bash +npm run lint +npm run lint:fix +``` -![GitHub Pages Settings](./assets/github-pages-config.png) +Node 20.6+ note -If you already have a custom domain set up for a GitHub Pages site at `.github.io`, this documentation will appear at `/`. +- If you see “tsx must be loaded with --import instead of --loader”, update the + lint scripts to: -For example, see https://docs.karmanivero.us/npm-package-template-ts. +```json +{ + "lint": "node --import tsx ./node_modules/eslint/bin/eslint.js .", + "lint:fix": "node --import tsx ./node_modules/eslint/bin/eslint.js --fix ." +} +``` -Finally, note that this README file contains a link in the header to this documentation site that does NOT appear in the copy of the README on the documentation site's home page. +(Your current scripts may already work depending on Node version.) -This is accomplished with the [`typedoc-plugin-replace-text`](https://www.npmjs.com/package/typedoc-plugin-replace-text) TypeDoc plugin. It's already installed & configured in this template, and using it is really simple. Just enclose any Markdown you'd like to exclude from the documentation site in a pair of special Markdown comment tags like this: +--- -```md - +## Type checking -> [API Documentation](https://karmaniverous.github.io/npm-package-template-ts)! +TypeScript runs in check‑only mode (no emit): - +```bash +npm run typecheck ``` -Anything between these tags (as well as the tags themselves) will be excluded from the documentation site. Note that you can also use these tags to exclude content from your inline Typescript documenation! +Scoping -Some tips: +- Type checks focus on src/\*\* and test setup. Playground and test files are + excluded from typecheck to keep the build/docs pipeline friction‑free. -- When TypeDoc finds a relative link in your README to an asset in your repo, it will copy that asset to the `media` directory of the documentation site. This is fine for images, but you probably want source code links to continue to point to the source code file in its original location. To accomplish this, just use the full URL to the file instead of a relative link. +--- -> Do you know how to restrict this behavior to certain file extensions? [Start a discussion](https://github.com/karmaniverous/npm-package-template-ts/discussions) and let me know! +## API docs with TypeDoc -- The organization of your documentation site mostly reflects the organization of your code. So make full use of the [tags](https://typedoc.org/guides/tags/) supported by TypeDoc! +Generate docs from your TSDoc comments -- I added convenient links in [`typedoc.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/typedoc.json) to the project GitHub repository and my GitHub profile. You'll want to change these to reflect your own info. +```bash +npm run docs +``` -Also note that this template generates [API Documentation](#api-documentation) with [TypeDoc](https://typedoc.org/). The TypeDoc spec includes a few tags that TSDoc doesn't support. [`tsdoc.json`](https://github.com/karmaniverous/npm-package-template-ts/tree/main/tsdoc.json) specifies these extra tags and ensures you can use them in your code without generating ESLint warnings! +Output is written to docs/. You can host this via GitHub Pages or your preferred +static host. Additional behavior is configured in typedoc.json. -## References +--- -- [Building a TypeScript CLI with Node.js and Commander](https://blog.logrocket.com/building-typescript-cli-node-js-commander/) +## FAQ and tips + +- Why ESM only? + - Simpler outputs and smaller surface area. Add a CJS target in Rollup if you + must support CJS consumers. +- Where do I put styles? + - This template ships “sideEffects: false” and no CSS by default. Add your own + styling approach (CSS modules, CSS‑in‑JS, etc.) per component need. +- How do I add more components? + - Create new files under src/components, export from src/index.ts, add tests, + and render them in the playground during development. +- Can I use Storybook or Ladle? + - Yes — add it later if you need richer component docs/demos. The Vite + playground keeps things minimal to start. -- [Bundling TypeScript in different formats with rollup.js](https://datomarjanidze.medium.com/bundling-typescript-in-different-formats-with-rollup-js-3397b3a84e4e) +--- -- [Naming conventions for Git Branches — a Cheatsheet](https://medium.com/@abhay.pixolo/naming-conventions-for-git-branches-a-cheatsheet-8549feca2534) +## Status & readiness -- [TypeScript and NPM package.json exports the 2024 way](https://www.kravchyk.com/typescript-npm-package-json-exports/). Note that [this snippet](https://www.kravchyk.com/typescript-npm-package-json-exports/#:~:text=the%20types%20may%20need%20to%20be%20.d.cjs) is wrong; it should read _the types may need to be `.d.cts`_. That's how this template is implemented. Also note that we're just using a second (and third) `rollup` type declarations target instead of employing [rollup-plugin-copy](https://www.npmjs.com/package/rollup-plugin-copy) as suggested in the article. +- Build, docs, and typecheck pass. +- Tests pass with Vitest + Testing Library. +- Lint is configured with a TS flat config; if you’re on Node ≥ 20.6, consider + switching lint scripts from “--loader tsx” to “--import tsx” (see above). +- For a typical React 18 component workflow, this template is ready to use. --- From c8dee9f3163096dbf3ff2aea7ef971be75470e0e Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sat, 30 Aug 2025 16:54:54 +0800 Subject: [PATCH 07/27] Update docs --- docs/assets/highlight.css | 50 +++- docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/documents/CHANGELOG.html | 4 +- docs/functions/index.HelloWorld.html | 6 + docs/functions/index.foo.html | 9 - docs/hierarchy.html | 2 +- docs/index.html | 328 ++++++++++++++------------ docs/media/github-pages-config.png | Bin 261278 -> 0 bytes docs/modules.html | 2 +- docs/modules/index.html | 4 +- docs/sitemap.xml | 18 +- docs/types/index.FooTarget.html | 2 - docs/types/index.HelloWorldProps.html | 4 + 14 files changed, 254 insertions(+), 179 deletions(-) create mode 100644 docs/functions/index.HelloWorld.html delete mode 100644 docs/functions/index.foo.html delete mode 100644 docs/media/github-pages-config.png delete mode 100644 docs/types/index.FooTarget.html create mode 100644 docs/types/index.HelloWorldProps.html diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index cb695eb..59ea05f 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -7,10 +7,22 @@ --dark-hl-2: #CE9178; --light-hl-3: #008000; --dark-hl-3: #6A9955; - --light-hl-4: #0000FF; - --dark-hl-4: #569CD6; - --light-hl-5: #AF00DB; - --dark-hl-5: #C586C0; + --light-hl-4: #AF00DB; + --dark-hl-4: #C586C0; + --light-hl-5: #0000FF; + --dark-hl-5: #569CD6; + --light-hl-6: #267F99; + --dark-hl-6: #4EC9B0; + --light-hl-7: #001080; + --dark-hl-7: #9CDCFE; + --light-hl-8: #800000; + --dark-hl-8: #808080; + --light-hl-9: #800000; + --dark-hl-9: #569CD6; + --light-hl-10: #E50000; + --dark-hl-10: #9CDCFE; + --light-hl-11: #0451A5; + --dark-hl-11: #9CDCFE; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -22,6 +34,12 @@ --hl-3: var(--light-hl-3); --hl-4: var(--light-hl-4); --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); --code-background: var(--light-code-background); } } @@ -32,6 +50,12 @@ --hl-3: var(--dark-hl-3); --hl-4: var(--dark-hl-4); --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); --code-background: var(--dark-code-background); } } @@ -42,6 +66,12 @@ --hl-3: var(--light-hl-3); --hl-4: var(--light-hl-4); --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); --code-background: var(--light-code-background); } @@ -52,6 +82,12 @@ --hl-3: var(--dark-hl-3); --hl-4: var(--dark-hl-4); --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); --code-background: var(--dark-code-background); } @@ -61,4 +97,10 @@ .hl-3 { color: var(--hl-3); } .hl-4 { color: var(--hl-4); } .hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } pre, code { background: var(--code-background); } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index ec9aba8..cf18547 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJxdzkELgkAUBOD/8s5LmpVte4soO0RduokHcVdd0n2ib8GI/e9B0JpdZ5iPSV9AaiQQcDjvr8nxckuAQZdTDQIkFrZVhobAl4ua2gYYPLSRIPiK8zjkjnlFG6nGSWhR2kYNwSeebyMGRa0b2SsDIvXACfGe95WiCaFn5wlf/2HhbrvcRD9HSsRJKK0pSKP5KiXifB+vXeayN1N2V24=" \ No newline at end of file +window.navigationData = "eJxlzjELwjAQBeD/cnOwtWqN2USkHUTdHEoHaSIJpklpLlCR/nfBIbF1fffu41VvQDEgMDiU+3NxPF0KINDdUQIDbhvfCoMuCceFxFYDgacyHBhdUZqndCRBUYaLIQqt5V4Ll3zj6W9GoJFK814YYFUASqG1vdle82tvOxcpfHUBmpVmcLrbLjfZz6hYj9zDmwaVNf/kVMvXYz3WH0wQYeg=" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 9faf948..6e4723c 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/documents/CHANGELOG.html b/docs/documents/CHANGELOG.html index f0663fb..ed1d6b2 100644 --- a/docs/documents/CHANGELOG.html +++ b/docs/documents/CHANGELOG.html @@ -1,4 +1,4 @@ -CHANGELOG | @karmaniverous/npm-package-template-ts

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

+CHANGELOG | @your-scope/react-component-template

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

Generated by auto-changelog.

-
+
diff --git a/docs/functions/index.HelloWorld.html b/docs/functions/index.HelloWorld.html new file mode 100644 index 0000000..b32bc55 --- /dev/null +++ b/docs/functions/index.HelloWorld.html @@ -0,0 +1,6 @@ +HelloWorld | @your-scope/react-component-template

Function HelloWorld

  • A simple Hello World React component.

    +

    Parameters

    Returns Element

      +
    • Targets React 18 with the modern react-jsx runtime.
    • +
    • No styling is applied by default.
    • +
    +
diff --git a/docs/functions/index.foo.html b/docs/functions/index.foo.html deleted file mode 100644 index a9ae72a..0000000 --- a/docs/functions/index.foo.html +++ /dev/null @@ -1,9 +0,0 @@ -foo | @karmaniverous/npm-package-template-ts

Function foo

  • Foos your bar!

    -

    Parameters

    Returns string

    Your fooed bar.

    -

    This function is documented according to the TSDoc spec. Linting support is -built into this template. TSDoc is similar to JSDoc, but is way less verbose -as it can take advantage of TypeScript's type system. It also has better -support for documenting generics and other TypeScript-specific features.

    -

    TSDoc for more info!

    -
diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 1d56f1d..8cac4b9 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -@karmaniverous/npm-package-template-ts

@karmaniverous/npm-package-template-ts

Hierarchy Summary

+@your-scope/react-component-template

@your-scope/react-component-template

Hierarchy Summary

diff --git a/docs/index.html b/docs/index.html index 898541a..c236199 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,172 +1,206 @@ -@karmaniverous/npm-package-template-ts

@karmaniverous/npm-package-template-ts

TypeScript NPM Package Template

-

👇 Some of these badges only activate when you publish your package!

+@your-scope/react-component-template

@your-scope/react-component-template

React Component Library Template (TypeScript)

+

A fast, minimal, batteries‑included starter for React 18 component libraries.

-

npm version -Node Current -license

-

Writing great TypeScript is only half the battle! You also need to instrument it, format it, lint it, test it, bundle it, document it, and publish it!

-

Getting all of these pieces to work gracefully together is not trivial.

-

This template puts those pieces together in a way that just WORKS, right out of the box, so you can focus on your code. It includes fully-configured support for:

-

Code authoring with TypeScript.
-✅ Inline documentation with TSDoc.
-✅ CLI generation with Commander.
-✅ Code formatting with Prettier.
-✅ Linting with ESLint.
-✅ Unit testing with Vitest.
-✅ Package pruning with Knip.
-✅ Bundling with Rollup.
-✅ Publishing with ReleaseIt.
-✅ Git hooks with Lefthook.
-✅ API documentation generated by [TypeDoc].
-✅ Recommended extensions & settings wherever appropriate.

-

Create a new repo using this template! When you clone it locally, be sure to run:

-
npm i                 # install dependencies
npx lefthook install # install Git hooks +

This template gives you a production‑ready foundation to build and publish React +components with TypeScript. It prioritizes a smooth developer experience (DX) +with fast feedback, predictable builds, and clear test and lint ergonomics.

+

What you get out of the box

+
    +
  • React 18 + TypeScript (react‑jsx runtime)
  • +
  • ESM‑only bundling with Rollup (react and react‑dom externalized)
  • +
  • Type declarations (.d.ts) bundled via rollup-plugin-dts
  • +
  • Vitest + @testing-library/react + jest‑dom (happy‑dom env)
  • +
  • Vite playground for live browser testing (HMR)
  • +
  • TypeScript ESLint flat config (no project parser friction)
  • +
  • Prettier formatting
  • +
  • TypeDoc for API documentation
  • +
  • Release tooling (release-it), optional lefthook Git hooks
  • +
  • Peer dependencies: react, react‑dom (>=18); sideEffects: false
  • +
+

Contents

+
    +
  • Getting Started
  • +
  • Develop React components
  • +
  • Test your components
  • +
  • View in the browser (Vite playground)
  • +
  • Build and publish
  • +
  • Linting & formatting
  • +
  • Type checking
  • +
  • API docs with TypeDoc
  • +
  • FAQ and tips
  • +
+
+

Prerequisites

+
    +
  • Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under +“Linting & formatting” about “--import tsx”.
  • +
+

Install and initialize

+
npm install
npx lefthook install # optional Git hooks (branch naming, etc.)
-

Also, type @recommended into the VSCode Extensions sidebar and install the recommended extensions!

-

Change all repository & personal references in package.json & typedoc.json to reflect your own info.

-

Before your first commit, be sure to reset your project's version number (e.g. to 0.0.0) in package.json.

-

To streamline the release process from your desktop, set up a GitHub Personal Access Token and follow the instructions in .env.local.template.

-

You want to write straight TS code without having to jump through weird hoops like adding a .js extension to your TS imports. (Click here to dive into that hole. 🙄)

-

Long story short: you can. Just write your code in the src directory and import it as you would any other module. The bundling process will take care of the rest.

-

This template uses TSDoc for inline documentation. TSDoc is similar to JSDoc, but is way less verbose as it can take advantage of TypeScript's type system. It also has better support for documenting generics and other TypeScript-specific features.

-

TSdoc comments are automatically included in your bundled code, so you can use them to document your code for IntelliSense in JavaScript as well as TypeScript.

-

The template also includes linting support for your TSDoc comments to keep you out of trouble. Just run npm run lint to check your comments along with the rest of your code, and be sure to check out the great TSDoc documentation for more details!

-

Also note that this template generates API Documentation with TypeDoc. The TypeDoc spec includes a few tags that TSDoc doesn't support. tsdoc.json specifies these extra tags and ensures you can use them in your code without generating ESLint warnings!

-

This template uses Commander to generate a CLI for your package.

-

Given that your underlying library is solid, wrapping it into a CLI is fairly straightforward. Just follow these steps:

-
    -
  1. -

    All of your CLI-specific code should live in the src/cli directory, but can import code from across your package as required. Each subdirectory here is the root of a CLI command. You can have as many as you want, but this template includes a single example called mycli.

    -
  2. -
  3. -

    The index.ts file in each named CLI subdirectory will be picked up by the bundler and compiled into a CLI command with the same name as the subdirectory. So src/cli/mycli/index.ts will be compiled into dist/mycli.cli.mjs.

    -
  4. -
  5. -

    The bin field in package.json must specifically reference each of these compiled CLI commands. On installation, you can then execute your CLI command like this:

    -
  6. -
-
> npx mycli      # if installed localy

> mycli # if installed globally

# this is what you get...

Usage: mycli [options] [command]

My CLI tool

Options:
-h, --help display help for command

Commands:
foo [options] Foos your bar.
help [command] display help for command +

Run tests and type checks to verify your environment

+
npm run test
npm run typecheck
npm run build
npm run docs
-

Providing a detailed tutorial on Commander is really out of scope for this README, but this repo demonstrates a simple example with a single subcommand abstracted into a separate dependency.

-

You can build on this example to create a MUCH more complex CLI! See the Commander documentation for more details.

-

If your project requires an extensive, config-driven CLI, you might want to use my get-dotenv-child template instead!

-

Code formatting is provided by Prettier.

-

Just run npm run lint to lint & format your code, or npm run lint:fix to resolve any issues automatically if possible.

-

The Prettier extension is included in the template's VSCode workspace recommendations, and the template contains related workspace settings, so be sure to install recommended extensions when prompted!

-

Linting services are provided by ESLint.

-

Just run npm run lint to lint your code, or npm run lint:fix to resolve any issues automatically if possible. These commands also run Prettier to identify & fix formatting issues.

-

The ESLint extension is included in the template's VSCode workspace recommendations, and the template contains related workspace settings, so be sure to install recommended extensions when prompted!

-

Unit test support is provided by Vitest.

-

Any file containing .test. in its name (e.g. foo.test.ts) will be treated as a test file and executed by Vitest. See vitest.config.ts for configuration details.

-

Just run npm run test to execute your tests.

-

Test coverage reporting is provided by Vitest and runs every time you execute your tests. If you execute your tests from the command line, you will see a coverage report at the bottom of the run. You can also see a prettier version of this report by opening coverage/lcov-report/index.html in your browser.

-

The Vitest extension is a great way to execute & debug your Vitest tests! It's included in the template's VSCode workspace recommendations, and the template contains related workspace settings, so be sure to install recommended extensions when prompted!

-

Knip is a great command-line tool that finds unused files, dependencies and exports in your TypeScript project. Less code and dependencies lead to improved performance, less maintenance and easier refactorings!

-

This template integrates Knip into your build process so you can prune your package at every release. Edit the config file to add any new cutouts, and run npm run knip to prune your package on demand!

-

This template uses Rollup to bundle your code. See the References section for more detailed notes. It creates several kinds of outputs:

-
    -
  • ESM, for import into most TS/JS code.
  • -
  • IIFE (Immediately Invoked Function Expression), for direct browser import.
  • -
  • CJS, for lulz.
  • -
  • Type definition files to support TypeScript imports and power IntelliSense in Javascript.
  • -
  • CLI commands for execution from your command line. See the CLI Generation section for details. Don't forget to update the bin field in package.json!
  • -
-

Type declarations are properly bundled and should be available no matter how your package is imported.

-

Just run npm run build to bundle your code, and the output will be in the dist directory.

-

See rollup.config.ts for details. If you don't need all of the output types listed above, it should be fairly straightforward to modify this file to suit your needs.

-

Incremental builds are turned on in this template. This will save you some build time, but @rollup/plugin-typescript will emit the following warning at build time:

-
(!) [plugin typescript] @rollup/plugin-typescript: outputToFilesystem option is defaulting to true.
+

Start the browser playground (HMR)

+
npm run dev
# opens http://localhost:5173 (by default)
-

This is a known issue and should have no negative effect on your build. If you can figure out how to suppress this warning, please submit a PR!

-

rollup.config.ts is configured to treat all non-dev and peer dependencies listed in package.json as external dependencies. This means...

+
+

Structure

    -
  • -

    These dependencies will not be bundled into your package, but should be installed as a matter of course when you run npm install.

    -
  • -
  • -

    Your distribution files will be located in your dist directory as specified in your package.json exports field (e.g. dist/mjs/index.js).

    -
  • +
  • Put components in src/components.
  • +
  • Export public surface from src/index.ts.
-

It is possible for external dependencies to creep into your build. For example, let's say you have a dev dependency that you referenced in runtime code, but is actually included as a runtime dependency by some other package. In this case...

+

Example: a simple HelloWorld component (already included)

+
// src/components/HelloWorld.tsx
export type HelloWorldProps = { who?: string };

export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element {
return <div>Hello {who}</div>;
} +
+ +

Re-export in your library entry

+
// src/index.ts
export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; +
+ +

Consume from another app after publishing

+
import { HelloWorld } from '@your-scope/react-component-template';

export default function App() {
return <HelloWorld who="React" />;
} +
+ +
+

This template uses:

    -
  • -

    the dependency would not be listed as an external dependency by rollup.config.ts, and

    -
  • -
  • -

    your distribution files would shift to dist/mjs/src/index.js, breaking your package.

    -
  • +
  • Vitest (happy‑dom)
  • +
  • @testing-library/react
  • +
  • jest‑dom (registered via vitest.setup.ts)
-

To prevent this, simply list the dependency as a regular dependency in your package.json file... which is exactly where it belongs anyway!

-

This will restore the structure of your build AND ensure proper tree-shaking of your dependencies.

-

This template uses ReleaseIt to create a release on GitHub and publish your package to NPM.

-

Just run npm run release and the following will happen:

-
    -
  • ESLint will lint your code.
  • -
  • Vitest will execute your tests and assess code coverage. Open coverage/lcov-report/index.html to see the results.
  • -
  • Rollup will bundle your code.
  • -
  • TypeDoc will generate & commit your API documentation.
  • -
  • ReleaseIt will create a release on GitHub and publish your package to NPM.
  • -
-

To preserve Git Flow integrity, npm run release will only run on the main branch. It is often useful, though, to create a pre-release version from a feature branch. To do this, run npm run release:pre on any branch.

-

See the release-it section in package.json for details.

-

Use this awesome utility to validate that the types in your package are actually accessible in key target development environments.

-

This template assumes you will be using something like Git Flow with a strong Git branch naming convention.

-

The template uses Lefthook to perform two services:

-
    -
  • -

    It will prevent you from committing to a branch with an invalid name. See the branch-naming-policy script for details.

    -
  • -
  • -

    If your branch name begins with a standard-format issue number (e.g. GH-1) it will prefix your commit message with the issue number. This is a great way to keep your commits organized and linked to the issues they address! See the add-issue script for details.

    -
  • +

    Add tests alongside components (co‑located)

    +
    // src/components/HelloWorld.test.tsx
    import { render, screen } from '@testing-library/react';
    import { describe, expect, it } from 'vitest';
    import { HelloWorld } from './HelloWorld';

    describe('HelloWorld', () => {
    it('renders default greeting', () => {
    render(<HelloWorld />);
    expect(screen.getByText('Hello World')).toBeInTheDocument();
    });

    it('renders custom greeting', () => {
    render(<HelloWorld who="Developer" />);
    expect(screen.getByText('Hello Developer')).toBeInTheDocument();
    });
    }); +
    + +

    Run tests (with coverage)

    +
    npm run test
    +
    + +

    Notes

    +
      +
    • The test environment is happy‑dom for speed and stability. You can switch to +jsdom later if needed.
    • +
    • Vitest excludes stale compiled tests from .rollup.cache.
    -

    To activate this functionality, be sure to run npx lefthook install after cloning the repository & installing dependencies!

    -

    This is really slick!

    -

    If you've been careful to document your code according to TSDoc conventions, then when you run npm run docs or npm run build, TypeDoc will generate API documentation, wrap it up with your README file, and publish it in browsable form to the docs directory of your repo.

    -

    You can alter the outcome by editing typedoc.json. See the TypeDoc options documentation for more info.

    -

    Update your repository's GitHub Pages settings as illustrated below, and this site will be published to <your GitHub username>.github.io/<your repo name>. You can also assign it a custom domain.

    -

    GitHub Pages Settings

    -

    If you already have a custom domain set up for a GitHub Pages site at <your GitHub username>.github.io, this documentation will appear at <your custom domain>/<your repo name>.

    -

    For example, see https://docs.karmanivero.us/npm-package-template-ts.

    -

    Finally, note that this README file contains a link in the header to this documentation site that does NOT appear in the copy of the README on the documentation site's home page.

    -

    This is accomplished with the typedoc-plugin-replace-text TypeDoc plugin. It's already installed & configured in this template, and using it is really simple. Just enclose any Markdown you'd like to exclude from the documentation site in a pair of special Markdown comment tags like this:

    -
    
    +
    +

    A minimal playground is included under playground/ for fast, local viewing with +HMR. It imports your components directly from src (no publishing required).

    +

    Commands

    +
    npm run dev       # start Vite dev server for the playground
    npm run preview # preview a production build of the playground
    -

    Anything between these tags (as well as the tags themselves) will be excluded from the documentation site. Note that you can also use these tags to exclude content from your inline Typescript documenation!

    -

    Some tips:

    +

    Where to edit

      -
    • When TypeDoc finds a relative link in your README to an asset in your repo, it will copy that asset to the media directory of the documentation site. This is fine for images, but you probably want source code links to continue to point to the source code file in its original location. To accomplish this, just use the full URL to the file instead of a relative link.
    • +
    • playground/src/App.tsx: Import and render your components from ../../src.
    • +
    • playground/index.html and playground/vite.config.ts are already wired.
    -
    -

    Do you know how to restrict this behavior to certain file extensions? Start a discussion and let me know!

    -
    +

    Publishing note

      -
    • -

      The organization of your documentation site mostly reflects the organization of your code. So make full use of the tags supported by TypeDoc!

      -
    • -
    • -

      I added convenient links in typedoc.json to the project GitHub repository and my GitHub profile. You'll want to change these to reflect your own info.

      -
    • +
    • The playground is excluded from your npm package (files: ["dist"]).
    • +
    +
    +

    Build the library

    +
    npm run build
    +
    + +

    Outputs

    +
      +
    • dist/mjs/** for ESM modules (preserveModules enabled)
    • +
    • dist/index.d.ts for types
    • +
    +

    Externalized

    +
      +
    • react, react-dom, and react/jsx-runtime are marked external and must be +installed by consumers. They are listed as peerDependencies and devDependencies +here for DX.
    • +
    +

    ESM only

    +
      +
    • This template ships ESM only (no CJS/IIFE). Most modern toolchains support +this directly. If you need CJS, add a second Rollup target.
    • +
    +

    Release flow (optional)

    +
      +
    • release-it is configured to run lint/test/knip/build, generate changelog, and +publish to npm + GitHub releases.
    • +
    +
    +

    This template uses a TypeScript ESLint flat config in eslint.config.ts with:

    +
      +
    • ESLint recommended + TypeScript recommended (non type‑checked)
    • +
    • Vitest recommended rules for test files
    • +
    • Prettier integration
    • +
    • simple-import-sort and basic TSDoc checks
    • +
    +

    Run lint

    +
    npm run lint
    npm run lint:fix +
    + +

    Node 20.6+ note

    +
      +
    • If you see “tsx must be loaded with --import instead of --loader”, update the +lint scripts to:
    • +
    +
    {
    "lint": "node --import tsx ./node_modules/eslint/bin/eslint.js .",
    "lint:fix": "node --import tsx ./node_modules/eslint/bin/eslint.js --fix ."
    } +
    + +

    (Your current scripts may already work depending on Node version.)

    +
    +

    TypeScript runs in check‑only mode (no emit):

    +
    npm run typecheck
    +
    + +

    Scoping

    +
      +
    • Type checks focus on src/** and test setup. Playground and test files are +excluded from typecheck to keep the build/docs pipeline friction‑free.
    • +
    +
    +

    Generate docs from your TSDoc comments

    +
    npm run docs
    +
    + +

    Output is written to docs/. You can host this via GitHub Pages or your preferred +static host. Additional behavior is configured in typedoc.json.

    +
    +
      +
    • Why ESM only? +
        +
      • Simpler outputs and smaller surface area. Add a CJS target in Rollup if you +must support CJS consumers.
      -

      Also note that this template generates API Documentation with TypeDoc. The TypeDoc spec includes a few tags that TSDoc doesn't support. tsdoc.json specifies these extra tags and ensures you can use them in your code without generating ESLint warnings!

      -
      +
        +
      • Build, docs, and typecheck pass.
      • +
      • Tests pass with Vitest + Testing Library.
      • +
      • Lint is configured with a TS flat config; if you’re on Node ≥ 20.6, consider +switching lint scripts from “--loader tsx” to “--import tsx” (see above).
      • +
      • For a typical React 18 component workflow, this template is ready to use.
      • +
      +

      Built for you with ❤️ on Bali! Find more great tools & templates on my GitHub Profile.

      -
+
diff --git a/docs/media/github-pages-config.png b/docs/media/github-pages-config.png deleted file mode 100644 index c6b7dce63767b573c72d4bcb7a87b62d328a6b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261278 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

el&$fqvq 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 P_)AJmUbIR?Kj8lWBXmtG diff --git a/docs/modules.html b/docs/modules.html index 12a5768..412a8de 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1 +1 @@ -@karmaniverous/npm-package-template-ts

    @karmaniverous/npm-package-template-ts

    Documents

    CHANGELOG

    Modules

    index
    +@your-scope/react-component-template

      @your-scope/react-component-template

      Documents

      CHANGELOG

      Modules

      index
      diff --git a/docs/modules/index.html b/docs/modules/index.html index fd339ab..4c12ef6 100644 --- a/docs/modules/index.html +++ b/docs/modules/index.html @@ -1,2 +1,2 @@ -index | @karmaniverous/npm-package-template-ts

      Module index

      This is the main entry point for the library.

      -

      Type Aliases

      FooTarget

      Functions

      foo
      +index | @your-scope/react-component-template

      Module index

      This is the main entry point for the library.

      +

      Type Aliases

      HelloWorldProps

      Functions

      HelloWorld
      diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 21da73c..82f5cbd 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,30 +2,30 @@ https://docs.karmanivero.us/npm-package-template-ts/index.html - 2025-08-27T01:37:39.172Z + 2025-08-30T01:57:26.146Z https://docs.karmanivero.us/npm-package-template-ts/modules.html - 2025-08-27T01:37:39.172Z + 2025-08-30T01:57:26.146Z https://docs.karmanivero.us/npm-package-template-ts/hierarchy.html - 2025-08-27T01:37:39.172Z + 2025-08-30T01:57:26.146Z https://docs.karmanivero.us/npm-package-template-ts/documents/CHANGELOG.html - 2025-08-27T01:37:39.172Z + 2025-08-30T01:57:26.146Z https://docs.karmanivero.us/npm-package-template-ts/modules/index.html - 2025-08-27T01:37:39.172Z + 2025-08-30T01:57:26.146Z - https://docs.karmanivero.us/npm-package-template-ts/types/index.FooTarget.html - 2025-08-27T01:37:39.172Z + https://docs.karmanivero.us/npm-package-template-ts/types/index.HelloWorldProps.html + 2025-08-30T01:57:26.146Z - https://docs.karmanivero.us/npm-package-template-ts/functions/index.foo.html - 2025-08-27T01:37:39.172Z + https://docs.karmanivero.us/npm-package-template-ts/functions/index.HelloWorld.html + 2025-08-30T01:57:26.146Z diff --git a/docs/types/index.FooTarget.html b/docs/types/index.FooTarget.html deleted file mode 100644 index 4d058d2..0000000 --- a/docs/types/index.FooTarget.html +++ /dev/null @@ -1,2 +0,0 @@ -FooTarget | @karmaniverous/npm-package-template-ts

      Type Alias FooTarget

      FooTarget: string | undefined

      The kind of thing you could foo.

      -
      diff --git a/docs/types/index.HelloWorldProps.html b/docs/types/index.HelloWorldProps.html new file mode 100644 index 0000000..f6fa76a --- /dev/null +++ b/docs/types/index.HelloWorldProps.html @@ -0,0 +1,4 @@ +HelloWorldProps | @your-scope/react-component-template

      Type Alias HelloWorldProps

      HelloWorldProps defines the props for the HelloWorld component.

      +
      type HelloWorldProps = {
          who?: string;
      }
      Index

      Properties

      Properties

      who?: string

      Whom to greet. Defaults to "World".

      +
      From af01fc15ba713d95a13e3466ff8520b97d59e25c Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 07:55:17 +0800 Subject: [PATCH 08/27] Node 20 compatibility fix and update Rollup config --- .stan/system/.docs.meta.json | 2 +- docs/functions/index.HelloWorld.html | 2 +- docs/sitemap.xml | 14 ++++++------ docs/types/index.HelloWorldProps.html | 4 ++-- package-lock.json | 31 +++++++++++++++++++++++---- package.json | 23 ++++++++++---------- playground/src/App.tsx | 1 + rollup.config.ts => rollup.config.js | 26 ++++++++++++---------- src/index.ts | 3 ++- stan.config.yml | 2 +- 10 files changed, 68 insertions(+), 40 deletions(-) rename rollup.config.ts => rollup.config.js (62%) diff --git a/.stan/system/.docs.meta.json b/.stan/system/.docs.meta.json index 0c2cd82..0c40e32 100644 --- a/.stan/system/.docs.meta.json +++ b/.stan/system/.docs.meta.json @@ -1,3 +1,3 @@ { - "version": "0.5.3" + "version": "0.5.6" } \ No newline at end of file diff --git a/docs/functions/index.HelloWorld.html b/docs/functions/index.HelloWorld.html index b32bc55..e0e9df7 100644 --- a/docs/functions/index.HelloWorld.html +++ b/docs/functions/index.HelloWorld.html @@ -3,4 +3,4 @@
    • Targets React 18 with the modern react-jsx runtime.
    • No styling is applied by default.
    • -
      +
      diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 82f5cbd..53cd933 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,30 +2,30 @@ https://docs.karmanivero.us/npm-package-template-ts/index.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z https://docs.karmanivero.us/npm-package-template-ts/modules.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z https://docs.karmanivero.us/npm-package-template-ts/hierarchy.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z https://docs.karmanivero.us/npm-package-template-ts/documents/CHANGELOG.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z https://docs.karmanivero.us/npm-package-template-ts/modules/index.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z https://docs.karmanivero.us/npm-package-template-ts/types/index.HelloWorldProps.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z https://docs.karmanivero.us/npm-package-template-ts/functions/index.HelloWorld.html - 2025-08-30T01:57:26.146Z + 2025-08-30T10:06:15.911Z diff --git a/docs/types/index.HelloWorldProps.html b/docs/types/index.HelloWorldProps.html index f6fa76a..7301236 100644 --- a/docs/types/index.HelloWorldProps.html +++ b/docs/types/index.HelloWorldProps.html @@ -1,4 +1,4 @@ HelloWorldProps | @your-scope/react-component-template

      Type Alias HelloWorldProps

      HelloWorldProps defines the props for the HelloWorld component.

      -
      type HelloWorldProps = {
          who?: string;
      }
      Index

      Properties

      type HelloWorldProps = {
          who?: string;
      }
      Index

      Properties

      Properties

      who?: string

      Whom to greet. Defaults to "World".

      -
      +
      diff --git a/package-lock.json b/package-lock.json index e1e4594..6e8f1ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.6.13", "license": "BSD-3-Clause", "dependencies": { - "@karmaniverous/stan": "^0.1.0" + "@karmaniverous/stan": "^0.5.6" }, "devDependencies": { "@dotenvx/dotenvx": "^1.49.0", @@ -1827,13 +1827,15 @@ } }, "node_modules/@karmaniverous/stan": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@karmaniverous/stan/-/stan-0.1.0.tgz", - "integrity": "sha512-aHH2WLpN2yQugNAnpU8Y2VrWH4NJzu1SoSH8PJ/IqqtvTL1I31fiZLBIuSFx6nP//ybyYodCI85Pwx5PALCztA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@karmaniverous/stan/-/stan-0.5.6.tgz", + "integrity": "sha512-tbcsasmztaYdlxfZf6CxfFsL1cAKOfDufS5JEShPWgnimlyIIEN8a5ywRQMxsnL8BeOxIzOZkg5lOly1PMHAYA==", "license": "BSD-3-Clause", "dependencies": { + "chalk": "^5.3.0", "clipboardy": "^4.0.0", "commander": "^14.0.0", + "diff": "^8.0.2", "ignore": "^7.0.5", "inquirer": "^12.9.3", "package-directory": "^8.1.0", @@ -1847,6 +1849,18 @@ "node": ">=20" } }, + "node_modules/@karmaniverous/stan/node_modules/chalk": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@karmaniverous/stan/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -4651,6 +4665,15 @@ "dev": true, "license": "MIT" }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", diff --git a/package.json b/package.json index 0de9d70..69b8665 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/your-org/react-component-template/issues" }, "dependencies": { - "@karmaniverous/stan": "^0.1.0" + "@karmaniverous/stan": "^0.5.6" }, "description": "A React component library template for TypeScript projects.", "devDependencies": { @@ -21,14 +21,15 @@ "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-typescript": "^12.1.4", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.0.0", "@types/eslint__js": "^9.14.0", "@types/eslint-config-prettier": "^6.11.3", "@types/fs-extra": "^11.0.4", "@types/node": "^24.3.0", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.0.0", + "@vitejs/plugin-react": "^4.3.1", "@vitest/coverage-v8": "^3.2.4", "auto-changelog": "^2.5.0", "concurrently": "^9.2.0", @@ -43,23 +44,22 @@ "knip": "^5.62.0", "lefthook": "^1.12.3", "prettier": "^3.6.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", "release-it": "^19.0.4", "rimraf": "^6.0.1", "rollup": "^4.46.4", "rollup-plugin-dts": "^6.2.3", "tar": "^7.4.3", "tslib": "^2.8.1", + "tsx": "^4.20.4", "typedoc": "^0.28.10", "typedoc-plugin-mdn-links": "^5.0.8", "typedoc-plugin-replace-text": "^4.2.0", "typescript": "^5.9.2", "typescript-eslint": "^8.40.0", "vite": "^5.4.0", - "@vitejs/plugin-react": "^4.3.1", - "vitest": "^3.2.4", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "tsx": "^4.20.4" + "vitest": "^3.2.4" }, "engines": { "node": ">=20" @@ -131,13 +131,13 @@ "url": "git+https://github.com/your-org/react-component-template.git" }, "scripts": { - "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", + "build": "rimraf dist && rollup --config rollup.config.js", "changelog": "auto-changelog", "diagrams": "cd diagrams/src && plantuml -tpng -o ../out -r .", "docs": "typedoc", "knip": "knip", - "lint": "node --loader tsx ./node_modules/eslint/bin/eslint.js .", - "lint:fix": "node --loader tsx ./node_modules/eslint/bin/eslint.js --fix .", + "lint": "node --import tsx ./node_modules/eslint/bin/eslint.js .", + "lint:fix": "node --import tsx ./node_modules/eslint/bin/eslint.js --fix .", "release": "dotenvx run -f .env.local -- release-it", "release:pre": "dotenvx run -f .env.local -- release-it --no-git.requireBranch --github.prerelease --preRelease", "stan": "stan", @@ -152,4 +152,3 @@ "types": "dist/index.d.ts", "version": "0.6.13" } - diff --git a/playground/src/App.tsx b/playground/src/App.tsx index 57a5188..e7747a5 100644 --- a/playground/src/App.tsx +++ b/playground/src/App.tsx @@ -8,3 +8,4 @@ export default function App() { ); } + diff --git a/rollup.config.ts b/rollup.config.js similarity index 62% rename from rollup.config.ts rename to rollup.config.js index f7a4efc..d580691 100644 --- a/rollup.config.ts +++ b/rollup.config.js @@ -1,35 +1,38 @@ import { createRequire } from 'node:module'; -import aliasPlugin, { type Alias } from '@rollup/plugin-alias'; +import aliasPlugin from '@rollup/plugin-alias'; import commonjsPlugin from '@rollup/plugin-commonjs'; import jsonPlugin from '@rollup/plugin-json'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import typescriptPlugin from '@rollup/plugin-typescript'; -import type { InputOptions, RollupOptions } from 'rollup'; import dtsPlugin from 'rollup-plugin-dts'; const require = createRequire(import.meta.url); -type Package = Record | undefined>; -const pkg = require('./package.json') as Package; +const pkg = require('./package.json'); const outputPath = `dist`; -const commonPlugins = [commonjsPlugin(), jsonPlugin(), nodeResolve(), typescriptPlugin()]; +const commonPlugins = [ + commonjsPlugin(), + jsonPlugin(), + nodeResolve(), + typescriptPlugin(), +]; -const commonAliases: Alias[] = []; +const commonAliases = []; -const commonInputOptions: InputOptions = { +const commonInputOptions = { input: 'src/index.ts', external: [ - ...Object.keys((pkg as unknown as Package).dependencies ?? {}), - ...Object.keys((pkg as unknown as Package).peerDependencies ?? {}), + ...Object.keys(pkg.dependencies ?? {}), + ...Object.keys(pkg.peerDependencies ?? {}), 'tslib', 'react/jsx-runtime', ], plugins: [aliasPlugin({ entries: commonAliases }), ...commonPlugins], }; -const config: RollupOptions[] = [ +const config = [ // ESM output only. { ...commonInputOptions, @@ -57,4 +60,5 @@ const config: RollupOptions[] = [ }, ]; -export default config; \ No newline at end of file +export default config; + diff --git a/src/index.ts b/src/index.ts index e772194..8084588 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,4 +4,5 @@ * @packageDocumentation */ -export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; \ No newline at end of file +export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; + diff --git a/stan.config.yml b/stan.config.yml index 13978e8..4c86f23 100644 --- a/stan.config.yml +++ b/stan.config.yml @@ -14,4 +14,4 @@ scripts: docs: npm run stan:docs build: npm run build knip: npm run knip -stanPath: .stan \ No newline at end of file +stanPath: .stan From a631efa35a2a66591bb004c0cd375ded529c3476 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 10:07:56 +0800 Subject: [PATCH 09/27] Revert the Rollup configuration file back to TS --- package.json | 3 ++- rollup.config.js => rollup.config.ts | 14 +++++++++----- tsconfig.json | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) rename rollup.config.js => rollup.config.ts (76%) diff --git a/package.json b/package.json index 69b8665..bc40de9 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "url": "git+https://github.com/your-org/react-component-template.git" }, "scripts": { - "build": "rimraf dist && rollup --config rollup.config.js", + "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin typescript", "changelog": "auto-changelog", "diagrams": "cd diagrams/src && plantuml -tpng -o ../out -r .", "docs": "typedoc", @@ -152,3 +152,4 @@ "types": "dist/index.d.ts", "version": "0.6.13" } + diff --git a/rollup.config.js b/rollup.config.ts similarity index 76% rename from rollup.config.js rename to rollup.config.ts index d580691..371d0a4 100644 --- a/rollup.config.js +++ b/rollup.config.ts @@ -5,12 +5,16 @@ import commonjsPlugin from '@rollup/plugin-commonjs'; import jsonPlugin from '@rollup/plugin-json'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import typescriptPlugin from '@rollup/plugin-typescript'; +import type { RollupOptions } from 'rollup'; import dtsPlugin from 'rollup-plugin-dts'; const require = createRequire(import.meta.url); -const pkg = require('./package.json'); +const pkg = require('./package.json') as { + dependencies?: Record; + peerDependencies?: Record; +}; -const outputPath = `dist`; +const outputPath = 'dist'; const commonPlugins = [ commonjsPlugin(), @@ -19,7 +23,7 @@ const commonPlugins = [ typescriptPlugin(), ]; -const commonAliases = []; +const commonAliases: Array<{ find: string; replacement: string }> = []; const commonInputOptions = { input: 'src/index.ts', @@ -32,7 +36,7 @@ const commonInputOptions = { plugins: [aliasPlugin({ entries: commonAliases }), ...commonPlugins], }; -const config = [ +const config: RollupOptions[] = [ // ESM output only. { ...commonInputOptions, @@ -49,7 +53,7 @@ const config = [ // Type definitions output. { ...commonInputOptions, - plugins: [commonInputOptions.plugins, dtsPlugin()], + plugins: [...commonInputOptions.plugins, dtsPlugin()], output: [ { extend: true, diff --git a/tsconfig.json b/tsconfig.json index 1fa5843..4b9f9d8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,6 +35,6 @@ "jsx": "react-jsx" }, "exclude": ["coverage", "dist", "docs", "node_modules", "playground"], - "include": ["src/**/*", "vitest.setup.ts"] + "include": ["src/**/*", "vitest.setup.ts", "rollup.config.ts"] } From 6f8d5b5e99b40900cd14522e4d262304a43b8c6e Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 10:22:43 +0800 Subject: [PATCH 10/27] Update docs --- CHANGELOG.md | 308 ++----------------------- docs/assets/search.js | 2 +- docs/documents/CHANGELOG.html | 309 ++------------------------ docs/functions/index.HelloWorld.html | 2 +- docs/sitemap.xml | 14 +- docs/types/index.HelloWorldProps.html | 4 +- 6 files changed, 40 insertions(+), 599 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26087b9..1f4f3a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,297 +2,17 @@ All notable changes to this project will be documented in this file. Dates are displayed in UTC. -Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - -#### [v0.6.13](https://github.com/karmaniverous/npm-package-template-ts/compare/v2.0.6...v0.6.13) - -- typedoc site [`1b72314`](https://github.com/karmaniverous/npm-package-template-ts/commit/1b7231495f944192d9a9029c20afb3b914c7a579) -- updated dependencies [`e8ae168`](https://github.com/karmaniverous/npm-package-template-ts/commit/e8ae168890a2524f2ee910b833e261a202bffeea) -- updated dependencies & configured knip [`a1158ea`](https://github.com/karmaniverous/npm-package-template-ts/commit/a1158ea3b71564858e9f72358172067cdc54d9a6) - -### [v2.0.6](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.12...v2.0.6) - -> 9 June 2024 - -- Feature/GH-16-support-prerelease-from-any-branch [`#17`](https://github.com/karmaniverous/npm-package-template-ts/pull/17) -- [GH-14] added tsdoc support [`#15`](https://github.com/karmaniverous/npm-package-template-ts/pull/15) -- [GH-12] added json import support [`#13`](https://github.com/karmaniverous/npm-package-template-ts/pull/13) -- Feature/gh-6-add-cli-support [`#9`](https://github.com/karmaniverous/npm-package-template-ts/pull/9) -- [GH-4] Added tslog logging [`#5`](https://github.com/karmaniverous/npm-package-template-ts/pull/5) -- updated dependencies [`ca882a3`](https://github.com/karmaniverous/npm-package-template-ts/commit/ca882a3d59eb145a6a58e366ce3e91eff49a3416) -- Added noderesolve & incremental builds [`de7ce79`](https://github.com/karmaniverous/npm-package-template-ts/commit/de7ce7922f698a90b6db222fede70c4be5586ac3) -- updated dependencies [`ceb4894`](https://github.com/karmaniverous/npm-package-template-ts/commit/ceb489482c55cee21edeea6e5701db29dd311635) - -#### [v0.6.12](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.11...v0.6.12) - -> 7 October 2024 - -- chore: release v0.6.12 [`4adce6d`](https://github.com/karmaniverous/npm-package-template-ts/commit/4adce6dbc54e301e885850cf6a1d28b66141cf20) -- updated plugin handling [`4f4283f`](https://github.com/karmaniverous/npm-package-template-ts/commit/4f4283fed54b86ae12991e97f1bfdc093d7731f1) - -#### [v0.6.11](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.10...v0.6.11) - -> 2 October 2024 - -- updated dependencies [`83e753b`](https://github.com/karmaniverous/npm-package-template-ts/commit/83e753bbecdc3025ab7d67ec6c9ca1750696ab06) -- chore: release v0.6.11 [`75379b4`](https://github.com/karmaniverous/npm-package-template-ts/commit/75379b478ab17c8b562aa4d0f2de07f5e8170475) -- exclude external dependencies & simplify d.ts generation [`f837fe1`](https://github.com/karmaniverous/npm-package-template-ts/commit/f837fe198e56ea359aba94460ce71348cd5aaef1) - -#### [v0.6.10](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.9...v0.6.10) - -> 30 August 2024 - -- removed eslint version restriction [`89d52c8`](https://github.com/karmaniverous/npm-package-template-ts/commit/89d52c83270852984b23ee66e82f7b4651283eb9) -- chore: release v0.6.10 [`75f0cdf`](https://github.com/karmaniverous/npm-package-template-ts/commit/75f0cdf29979b4918dbc6edeeb66cd4a7975ee98) -- updated docs [`4599068`](https://github.com/karmaniverous/npm-package-template-ts/commit/4599068c5d68df8d88aba6912754d06766d82819) - -#### [v0.6.9](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.8...v0.6.9) - -> 25 August 2024 - -- Extended tsdoc to support typedoc [`815a016`](https://github.com/karmaniverous/npm-package-template-ts/commit/815a016664778bc402c8ba4ff05660650bc75419) -- chore: release v0.6.9 [`6556fa9`](https://github.com/karmaniverous/npm-package-template-ts/commit/6556fa9c682227da8c010bca28c31056d61dbba1) -- updated docs [`615e677`](https://github.com/karmaniverous/npm-package-template-ts/commit/615e67799c7a79eb2205a3983fc081926cd81bec) - -#### [v0.6.8](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.7...v0.6.8) - -> 25 August 2024 - -- typedoc site [`1b72314`](https://github.com/karmaniverous/npm-package-template-ts/commit/1b7231495f944192d9a9029c20afb3b914c7a579) -- updated dependencies [`e8ae168`](https://github.com/karmaniverous/npm-package-template-ts/commit/e8ae168890a2524f2ee910b833e261a202bffeea) -- chore: release v0.4.1 [`1a536c4`](https://github.com/karmaniverous/npm-package-template-ts/commit/1a536c49adfbe23b568391483bc3566fd758b6ca) - -#### [v0.6.7](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.6...v0.6.7) - -> 25 August 2024 - -- typedoc site [`0d673d4`](https://github.com/karmaniverous/npm-package-template-ts/commit/0d673d4f27f18c6ec7104b657b244e15c3535c0c) -- updated dependencies [`d40a21e`](https://github.com/karmaniverous/npm-package-template-ts/commit/d40a21ea3bd44ce0d078eb3fc023fe1893351318) -- chore: release v0.4.1 [`b006090`](https://github.com/karmaniverous/npm-package-template-ts/commit/b006090636f330446ccd3475f80a132ac3376af0) - -#### [v0.6.6](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.5...v0.6.6) - -> 25 August 2024 - -- chore: release v0.6.6 [`fa35411`](https://github.com/karmaniverous/npm-package-template-ts/commit/fa35411eedad019ef9f0515b0aa46cb69fa95f71) -- updated docs [`3d24d09`](https://github.com/karmaniverous/npm-package-template-ts/commit/3d24d09850ec014f8ae2da52d71e2694000a85d5) - -#### [v0.6.5](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.4...v0.6.5) - -> 25 August 2024 - -- chore: release v0.6.5 [`acd8a3e`](https://github.com/karmaniverous/npm-package-template-ts/commit/acd8a3ed9b859165b913ef8c24801ffb8a950c43) -- updated docs [`804835b`](https://github.com/karmaniverous/npm-package-template-ts/commit/804835b1f417c6c44721768f9a5db97d49ee0211) - -#### [v0.6.4](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.3...v0.6.4) - -> 25 August 2024 - -- chore: release v0.6.4 [`9e20a8d`](https://github.com/karmaniverous/npm-package-template-ts/commit/9e20a8d493defacc7f133bd986f287a768d792e1) -- added .env.local.template [`db25fdd`](https://github.com/karmaniverous/npm-package-template-ts/commit/db25fddcf4fa408811172e9470a11f9263871a97) -- updated docs [`73668b5`](https://github.com/karmaniverous/npm-package-template-ts/commit/73668b50a9d040061113e05a9745548fb2857f73) - -#### [v0.6.3](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.2...v0.6.3) - -> 25 August 2024 - -- added .env.local support [`b8d4676`](https://github.com/karmaniverous/npm-package-template-ts/commit/b8d4676a79d95488ea3d2980608d148adc280285) -- chore: release v0.6.3 [`0f3920c`](https://github.com/karmaniverous/npm-package-template-ts/commit/0f3920c5d0e882e9309638119aedddf6ddc88dd7) -- updated docs [`a836efa`](https://github.com/karmaniverous/npm-package-template-ts/commit/a836efaefde9a7ff6263788feb14a2f00bea070b) - -#### [v0.6.2](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.1...v0.6.2) - -> 25 August 2024 - -- updated docs [`f7b19a2`](https://github.com/karmaniverous/npm-package-template-ts/commit/f7b19a2f7e4143d3d852b7d0666b94dea725037e) -- updated docs [`846fc2c`](https://github.com/karmaniverous/npm-package-template-ts/commit/846fc2cc3667f12d3a481b1d2ed034cd3f65d114) -- chore: release v0.6.2 [`618367c`](https://github.com/karmaniverous/npm-package-template-ts/commit/618367c6a4064836a70500aadc61fe436ff8214b) - -#### [v0.6.1](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.6.0...v0.6.1) - -> 24 August 2024 - -- updated docs [`379b500`](https://github.com/karmaniverous/npm-package-template-ts/commit/379b500c127534c9c737d1d81e9a281753e30618) -- updated docs [`0d7a845`](https://github.com/karmaniverous/npm-package-template-ts/commit/0d7a845cf5d050ec21d7508a2e4a5ecbb3654f40) -- chore: release v0.6.1 [`4694f71`](https://github.com/karmaniverous/npm-package-template-ts/commit/4694f714a8e1ed901754b38eb255f7c9961068bf) - -#### [v0.6.0](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.5.4...v0.6.0) - -> 24 August 2024 - -- typedoc site [`bd18a77`](https://github.com/karmaniverous/npm-package-template-ts/commit/bd18a776526c45c861376cce4843620750fd459f) -- updated docs [`7eef8ac`](https://github.com/karmaniverous/npm-package-template-ts/commit/7eef8ac44340513bbf1c4759bdf12de600529bee) -- Added FooTarget type & updated docs [`b23cb7b`](https://github.com/karmaniverous/npm-package-template-ts/commit/b23cb7b41a8a265c0963389a7b7933f610f21f87) - -#### [v0.5.4](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.5.3...v0.5.4) - -> 23 August 2024 - -- added typedoc support [`90bab5f`](https://github.com/karmaniverous/npm-package-template-ts/commit/90bab5f7b2ecb728a419180190e15d00fb5918cb) -- chore: release v0.5.4 [`a57d7ab`](https://github.com/karmaniverous/npm-package-template-ts/commit/a57d7ab818ce07c01cd64794d023c19d5f484b9c) -- added doc generation to relese script [`7997d58`](https://github.com/karmaniverous/npm-package-template-ts/commit/7997d58627266140b64d5a792f7323128ac2ef00) - -#### [v0.5.3](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.5.2...v0.5.3) - -> 23 August 2024 - -- updated dependencies [`9bcbc3c`](https://github.com/karmaniverous/npm-package-template-ts/commit/9bcbc3c6423d26f4407545f9bccd851c3e03d968) -- updated dependencies [`9925c26`](https://github.com/karmaniverous/npm-package-template-ts/commit/9925c262c9a7d560c678eedc1da7328e1e172af5) -- Eliminated tslog & preserved dependency packages [`8e5fb1d`](https://github.com/karmaniverous/npm-package-template-ts/commit/8e5fb1d759727814f272f5ee09af28aebfefd19f) - -#### [v0.5.2](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.5.1...v0.5.2) - -> 3 July 2024 - -- updated dependencies [`b4da11c`](https://github.com/karmaniverous/npm-package-template-ts/commit/b4da11c8e834d03ed052022599879d1632c8b683) -- chore: release v0.5.2 [`5345d98`](https://github.com/karmaniverous/npm-package-template-ts/commit/5345d98322a3a6053cf90e876f83dfdf25ec538e) - -#### [v0.5.1](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.5.0...v0.5.1) - -> 19 June 2024 - -- restored package.json breakage [`28dd47f`](https://github.com/karmaniverous/npm-package-template-ts/commit/28dd47f6788cb49d28f64bd26f17f09246ba59a5) -- chore: release v0.5.1 [`75f305b`](https://github.com/karmaniverous/npm-package-template-ts/commit/75f305b6fdde65fe990b2c38ad8f959bbc6e99c4) - -#### [v0.5.0](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.4.1...v0.5.0) - -> 9 June 2024 - -- [GH-16] reset version [`#18`](https://github.com/karmaniverous/npm-package-template-ts/pull/18) -- Feature/GH-16-support-prerelease-from-any-branch [`#17`](https://github.com/karmaniverous/npm-package-template-ts/pull/17) -- chore: release v0.5.0 [`a2bdf4f`](https://github.com/karmaniverous/npm-package-template-ts/commit/a2bdf4fa1ffbce9a72cef5f28435435329ead6e8) -- [GH-16] Merge branch 'main' into feature/GH-16-support-prerelease-from-any-branch [`64d78de`](https://github.com/karmaniverous/npm-package-template-ts/commit/64d78de210f06bb23f78c6129f72dd493f16b466) -- [GH-16] added release:pre script [`275825d`](https://github.com/karmaniverous/npm-package-template-ts/commit/275825d747f25af09cb20fda13959032790689c6) - -#### [v0.4.1](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.4.0...v0.4.1) - -> 6 June 2024 - -- updated dependencies [`ca882a3`](https://github.com/karmaniverous/npm-package-template-ts/commit/ca882a3d59eb145a6a58e366ce3e91eff49a3416) -- reordered exports [`42b7007`](https://github.com/karmaniverous/npm-package-template-ts/commit/42b70077df4899d98d5e536d3e27017c43a11df1) -- chore: release v0.4.1 [`383286d`](https://github.com/karmaniverous/npm-package-template-ts/commit/383286d0c56d6fe08f709fce20e8b65e47eef766) - -#### [v0.4.0](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.3.0...v0.4.0) - -> 5 May 2024 - -- [GH-14] added tsdoc support [`#15`](https://github.com/karmaniverous/npm-package-template-ts/pull/15) -- [GH-12] added json import support [`#13`](https://github.com/karmaniverous/npm-package-template-ts/pull/13) -- updated dependencies [`ceb4894`](https://github.com/karmaniverous/npm-package-template-ts/commit/ceb489482c55cee21edeea6e5701db29dd311635) -- chore: release v0.4.0 [`c6b73ed`](https://github.com/karmaniverous/npm-package-template-ts/commit/c6b73ed5ceb0745e972dac7d4de7bd52c19e6d26) - -#### [v0.3.0](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.2.1...v0.3.0) - -> 1 May 2024 - -- Feature/gh-6-add-cli-support [`#9`](https://github.com/karmaniverous/npm-package-template-ts/pull/9) -- [GH-6] added CLI support [`b2bfd0c`](https://github.com/karmaniverous/npm-package-template-ts/commit/b2bfd0ca39e1fdcd8865fcaf039a450da986533f) -- [GH-6] wip [`27aa2ee`](https://github.com/karmaniverous/npm-package-template-ts/commit/27aa2ee57f706c0360a64e9d6419b319db0e9598) -- [GH-7] resolved iife build warnings [`7b3e30a`](https://github.com/karmaniverous/npm-package-template-ts/commit/7b3e30aed09b7f921c3245377e67a04b155eb28b) - -#### [v0.2.1](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.2.0...v0.2.1) - -> 25 April 2024 - -- Added noderesolve & incremental builds [`de7ce79`](https://github.com/karmaniverous/npm-package-template-ts/commit/de7ce7922f698a90b6db222fede70c4be5586ac3) -- bounded editor word wrap for markdown [`327637a`](https://github.com/karmaniverous/npm-package-template-ts/commit/327637a0a412475840fe1f4db16164eb277d01ef) -- chore: release v0.2.1 [`b154990`](https://github.com/karmaniverous/npm-package-template-ts/commit/b1549907847ba369d808b6f9e3baf92c436acb24) - -#### [v0.2.0](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.1.0...v0.2.0) - -> 21 April 2024 - -- [GH-4] Added tslog logging [`#5`](https://github.com/karmaniverous/npm-package-template-ts/pull/5) -- sorted json [`20dc1d1`](https://github.com/karmaniverous/npm-package-template-ts/commit/20dc1d1c1e2092c677cebfb1e66157b9498f9a12) -- chore: release v0.2.0 [`67f50b4`](https://github.com/karmaniverous/npm-package-template-ts/commit/67f50b4e285857e5e52d317694dc6975b053d382) -- updated readme [`9327b68`](https://github.com/karmaniverous/npm-package-template-ts/commit/9327b68558ec844383f6e7456e8b4a5c89ff57eb) - -#### [v0.1.0](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.10...v0.1.0) - -> 15 April 2024 - -- updated docs [`ca8c1e5`](https://github.com/karmaniverous/npm-package-template-ts/commit/ca8c1e5182a1f1ec5010c99f399d469bdfc0f14d) -- chore: release v0.1.0 [`47df9d0`](https://github.com/karmaniverous/npm-package-template-ts/commit/47df9d0e5d35337e240ac6aa720b920bb558fab2) - -#### [v0.0.10](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.9...v0.0.10) - -> 15 April 2024 - -- updated docs & recommended extensions [`da662d4`](https://github.com/karmaniverous/npm-package-template-ts/commit/da662d4bd4bd989a2d82b19aa5995951d268b8d1) -- chore: release v0.0.10 [`b0c409c`](https://github.com/karmaniverous/npm-package-template-ts/commit/b0c409c6da61b6732bd2ab45abfd9c72b510f2cb) -- added missing ignores [`42048e9`](https://github.com/karmaniverous/npm-package-template-ts/commit/42048e933ceb7ada992c813ffea9ed283c783f83) - -#### [v0.0.9](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.8...v0.0.9) - -> 15 April 2024 - -- cjs -> cts [`eafc162`](https://github.com/karmaniverous/npm-package-template-ts/commit/eafc162462b14da0015e8c7ad32aa9fd01cb5930) -- chore: release v0.0.9 [`5ab12ed`](https://github.com/karmaniverous/npm-package-template-ts/commit/5ab12edbacc9093821191ad1d85532e5630b4b7a) - -#### [v0.0.8](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.7...v0.0.8) - -> 15 April 2024 - -- updated build script & exports [`9f90d08`](https://github.com/karmaniverous/npm-package-template-ts/commit/9f90d08f2ce74c241aa05dc04d92a65b92963091) -- chore: release v0.0.8 [`8812313`](https://github.com/karmaniverous/npm-package-template-ts/commit/8812313e119298f266b446b7b6b23b1eac5a58bb) - -#### [v0.0.7](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.6...v0.0.7) - -> 15 April 2024 - -- fleshed out exports [`0cf492e`](https://github.com/karmaniverous/npm-package-template-ts/commit/0cf492e95c4bf4483334d73f3c034c281bed1efd) -- chore: release v0.0.7 [`a260c8f`](https://github.com/karmaniverous/npm-package-template-ts/commit/a260c8f31687519b6f111612be15fe14e7be38ba) - -#### [v0.0.6](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.5...v0.0.6) - -> 15 April 2024 - -- chore: release v0.0.6 [`4b6cec8`](https://github.com/karmaniverous/npm-package-template-ts/commit/4b6cec865c4334b499c41af1c90158061310ce1c) -- removed .js from import [`fb96831`](https://github.com/karmaniverous/npm-package-template-ts/commit/fb96831f094b54a47cf97c5b03d3a02b0a689337) - -#### [v0.0.5](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.4...v0.0.5) - -> 15 April 2024 - -- installed & configured rollup [`b9ac884`](https://github.com/karmaniverous/npm-package-template-ts/commit/b9ac8849a3858bcc8e1f676deab48791cbde8452) -- chore: release v0.0.5 [`a3c80f9`](https://github.com/karmaniverous/npm-package-template-ts/commit/a3c80f98be715ed81eb806a99e01395bad89ab45) - -#### [v0.0.4](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.3...v0.0.4) - -> 14 April 2024 - -- chore: release v0.0.4 [`f849935`](https://github.com/karmaniverous/npm-package-template-ts/commit/f8499354723d30d617a94f16d00b7d0723955e28) -- restored module & switched import to .js (!) [`69ed985`](https://github.com/karmaniverous/npm-package-template-ts/commit/69ed985d5fec3d75ccfc0a50076f4397b663f95b) -- ignore nyc temp dir [`dd72b06`](https://github.com/karmaniverous/npm-package-template-ts/commit/dd72b06d6174be01d995d34a74c5bbeb14bb6388) - -#### [v0.0.3](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.2...v0.0.3) - -> 14 April 2024 - -- chore: release v0.0.3 [`c9214d1`](https://github.com/karmaniverous/npm-package-template-ts/commit/c9214d14e00ed76dff88c2832104dcd596c4ed09) -- exclude tests [`ee7ce3a`](https://github.com/karmaniverous/npm-package-template-ts/commit/ee7ce3a27abd644fe810053d602dd8fccb948dd6) -- try eliminating module property [`67692c0`](https://github.com/karmaniverous/npm-package-template-ts/commit/67692c0d644d2edf26c0d5b61b9b1ea799b3d1b1) - -#### [v0.0.2](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.1...v0.0.2) - -> 14 April 2024 - -- wip [`1b1d022`](https://github.com/karmaniverous/npm-package-template-ts/commit/1b1d022e29f058aa8a5378831e489a426bcc66a9) -- installed prettier & configured eslint [`0bb0e54`](https://github.com/karmaniverous/npm-package-template-ts/commit/0bb0e540e8c718863f95e55cf119e032d2ba1aaf) -- got tests working [`f20a6d9`](https://github.com/karmaniverous/npm-package-template-ts/commit/f20a6d9994e7272c41598aedfeb282172f38d860) - -#### [v0.0.1](https://github.com/karmaniverous/npm-package-template-ts/compare/v0.0.0...v0.0.1) - -> 12 April 2024 - -- updated package.json [`f4ae65b`](https://github.com/karmaniverous/npm-package-template-ts/commit/f4ae65bf46deaa271970f145a238a843d8f9a8da) -- chore: release v0.0.1 [`5fa932b`](https://github.com/karmaniverous/npm-package-template-ts/commit/5fa932b3e6e5414b49a1121c6a1abc97bac8961b) - -#### v0.0.0 - -> 12 April 2024 - -- [GH-1] updated release scripts [`#3`](https://github.com/karmaniverous/npm-package-template-ts/pull/3) -- [GH-1] installed & configured release-it [`#2`](https://github.com/karmaniverous/npm-package-template-ts/pull/2) -- initial commit [`d8b4846`](https://github.com/karmaniverous/npm-package-template-ts/commit/d8b484653f8f018ff9835c4a3b88835d95332b3e) -- initial commit [`158622c`](https://github.com/karmaniverous/npm-package-template-ts/commit/158622c02a6b33bbb9382c91e177939d948fd9f6) +#### 0.6.13 + +- Initial commit [`76856f2`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/76856f2450e80952fb9ddc2480b09244449e890e) +- Fix vitest typescript error [`1144b8f`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/1144b8f3318e2442ece7bea9f41d5e59e75b96bc) +- Update docs [`c8dee9f`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/c8dee9f3163096dbf3ff2aea7ef971be75470e0e) +- feat: convert to React 18 component template [`06c2075`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/06c2075731626f1bb3208010a74e46435fb9cf73) +- docs: rewrite README for React component template [`24e0dbe`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/24e0dbeb5d52bdbdc84d5107af4ae47586d8b28f) +- added diagram support [`b5ab901`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/b5ab90106d2a89d546ddd3f022fcd6863b8b0b52) +- Node 20 compatibility fix and update Rollup config [`af01fc1`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/af01fc15ba713d95a13e3466ff8520b97d59e25c) +- chore: switch to TS ESLint flat config; fix lint/TS friction [`8a6424f`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/8a6424f0c7bac6a77143762f2ca06a8c37ceb7de) +- fix: clean lint and TS for React component template [`fede91a`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/fede91a5d62a0b55d103e4849780ffedb715b179) +- Revert the Rollup configuration file back to TS [`a631efa`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/a631efa35a2a66591bb004c0cd375ded529c3476) +- Updated STAN [`7780380`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/778038014fdafa4990c2837056b5ed00a982df41) +- Add link to TypeDoc in README API documentation section [`1fe7807`](https://github.com/karmaniverous/react-component-npm-package-template-ts/commit/1fe7807621598b6156aff28758a19198d1ba971c) diff --git a/docs/assets/search.js b/docs/assets/search.js index 6e4723c..8e1c431 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "eJylfV2PIzev5n/pc7MXRo9E6jN3i8XinAMsdvdq9yIIFvqccdJtN9zuzBsE+e8Luapos6YdhGW8LzCK2/VQJfEhKUqi/3w6Hb+/P/30859Pv+0P9emngCE4FXZPh/Tann56+m//8V//57//9//xv/79aff0cXp5+umpHsvHazuc37/Q356/nV9fnnZP5SW9v7f3p5+env7aLYhAWPtDbf8inNdj/Xhp718un/49gope2yvOf7SXl+P/PZ5e6v8+Hd/eCfH8xxvhrb7zCf7u6S2d2uFMHbsK1AoMSfv+7fiPJfzb9OW/kbJ+7EaqM5+8IYnuH4dy3h8PP4r/R+/2y25u/fTn0+/t9L4/Hp5+eoJnfI5Pu6e+by91qMHUgd1TOb6OOX7a0XQ//TJ/7f+0cj6expenb39RT7uf1S48e2t/+WX38/Ls5fPLBwvE/E317I3e6R08Rx92sFPPFtwO53/N/K/dqefg7c6N/3Zu5+fPw/xvnP/Vamno8UT0O71A6gVTL6DaLg23NBZcPYARYacXZFiQQS8NGJ22uANcGgsy2J1+dtHsBtQzBrcDP/cHwvjyeDbOn6DawbMzeodjFAD8DmH5Ey4NM+Pg0mdc+oxLn3EZDFz6bNT81BjhqTH67KLeGdzpZ2vdzpi5q8bO0s3os/a4M355KiyfxPkTq+aO2WWc7UAGr3d2QbZmB89o3M7a+XE7kGOIO7uMhg0LYJy/45Y+uwXZLaPhFmRnlk8WZOeWTxZkt/TZLePs1fyJX5D9guyXcfYLsrdLY0H2C7IPS2NBDstohEU3wqJ1YUEOC3IY4+wg7oZWPDsLu0DavMxgWGYwLloXF+S4IMdFn+OidXHRjbj0OS7IkYhyZQpRRWlqLQOiFbFFEV0U8UU5+h4xRgVqkYwbOpIMDbOeab2MjdaGWpZaRMorKzXJIF5qIqYmZmpYlFEDvQeRUwO9B5CM0Z+LamogGUAykGQgycCrYSEZSDKIp5qIqompGhfl1MRVbUiGIRmGZJir9SIZhmQYkmFIhqH3MCTDkgxLMizJsCTDXk0kybAkw5IMSzIsyXAkw5EMRzIcyXAkw13tMMlwJMORDEcyPMnwJMOTDE8yPMnwJMNfjT3J8CTDk4xAMojVmmitA8kIJCOQjEAywtWjkAxityZ6a+K3JoJrYriOxA/iuI4kg1iuieY6Xv0WOS7iOSigFlKLnBfxHJSjlqdWoBbJ0FfnSDLI8QJ5XiCeA/leIJ4D8RyI53D1v1cHfOOBYeYREM/h6oSJ50A8ByAZxHMgngPxHIjnQDwH4jkQz4F4DsRzIJ4DuWTAxVcA8RyI50A8B+I5EM+BeA7EcyCeA/EcDMkg9wzEcyCeA/Ec7DVgIRnEcyCeA/EciOdw4fkIkYB4DsRzIJ4D8RyI53Dh+fQsySCeA/EciOdAPAfiORDPgXgOxHPwSxgDxHMgngPxHIjnQDwH4jmQ/wbiORDPgXgOxHMgnkNYYhogngPxHOLia4F4DuTKgXgOxHOIFEMSz4F4jsRzJJ4j8RwVzh4RiedIPEfiORLP8cLzYRWQeI7EcySeI/EciedIITYSz5F4jsRzJJ4j8RyJ50g8RyAZxHMkniPxHInnSDxH4jkSz5F4jsRzJJ4j8RyJ53iNu6+B9zXyvobe5M+ReI7EcySeI/EciedIPEfiORLPkXiO5M+R/DkSz5F4jsRzJJ4j8RyJ50g8R+I5Es+R/DkSz5F4jsRzJJ6ju65RSAbxHInnSDxH4jkSz5F4jsRzJJ4j8Rz9dSFEMihER+I5Es+ReI7Ecww4cxWJ50g8R+I5Es+ReI7kz5F4jsRzJH+OxHMknmNc4l0kniP5c4zXJd11TaeopakF1KKVM/HcEM8N8dwQzw35c0M8N3rxH4Z4bojnhnhuiOeGeG6I54Z4bojnhnhuiOeGeG6I54Z4bojnhnhuiOeGeG6I54Z4bojnhnhuiOeGeG6I54Z4bojnhnhuiOfmusYmnhuzrCuNAWqRDOK5IZ6bheeXxMglfaKfdj+bsfDG5+CQZVDGny7rLudnDzpak522aHbmYiHGZ+ZiITy6nbGX5bQfy3tNLZhaPB2jlwTNpR8w+mHxk0TO+Mss1C2SnN6Zi7WJKu6MHSkFMwTZpeHob35qcdnAZONFdvhsDMafBujwCOaSM7AjdXFJGkwtTa3xlko5LgmZJHOR5D55y/GXSWttnGOd0ZrGeGqNN8fL2/nls8kuXlqXuCHYnZmSFZeWpdaITVzYmSldcfkoUCsurYtZnFqaWkAtEuFJhJ9F8Jc2l5e+JP1+b6dzq/85Jf9+/vnpaffn0/+bc4F6yTj++dc153f5D0r7/fTnkxof/fXXEKByVs2aW4xBXClK6SZCu0UZTkKKUp3HyvoyFs1iFJ+CsQwlejFKxwiqMBQfpSj69vkRTEqfh1sAKx5RjbfPO7F2aDYZVjwXmk2DdfLngwNgszBMrxTFcQDx8569hRI/H5gauDsAT+byyH2YyGCMXBuSRVc4v1Cuk1lXBcAthnxMsgfk6gVikrJORLF2gYKV4ZMj1KIrY/lYBklRVgDycWA0HykaKQBXiigH4PZ2w1R6G8BWrg9iewU+JWjMD42luRQl1Gp8ZyhWrBt8TuQ8Q8WGVIsHA8E79Inrlpio6GO2ivclik0wBoTgVtMrH5IKpipmBkeeW4jCdN2JNdWAMqGxTqDcJxnIXinPB0TeFxujcoFzT6zvxkXTPY9VlFhRjK89VqYoIyEjRUm1NK4oQezoTHalFTYsI8cgRekGAjIzEMXvw+yiFw+qRWNr5PGDPICxKWtobFBHFkmK0lNEyMxjorgvLBZzYl112jbnGW/0hk7ogM7z6D6KJ8eZ6kPl3ka+6nHWup64UZPzxnkXoTD2jTSOGKVblZmBHMt0KUpsNQam+ShfgbE5DmJF8ehcyDwskQcU3g7/x6MjuWn0tqtSOzfTW1BQ2czDEjGLfYy+Wm5R5C7DZ2yoWGwx9jGkKK31kAp3PGKlDcoE5OOi5UvdoG1SfKU4Tg9IUbB5i6wvcs0PxvXCV71jE1qKEjQgTwCMpL8UJVYL3JVq+QIlNNuz5uEfilWX2Ugj5k9UOWXLw3ot7wSCzzzkGrtXUpQItoDjLBRrW8wlF+T8kS+9YgOVQuX8EbMw9qiq4uNixW/ELIq5Fx58limZn9fahsbXPOJXSeBUCUxRUO46EuTaDVc3ebyTsATV+WpDHhAn66tP3HVoOUpA13ridkk+LqWGhCxq0hsUpTKFdeIQMNXKI2L5QjK9vLARFT9/+IOpu3xC3t5e9vwtxkaClDNvpz17kXHSQNqTE59Q+Vh+fP14P3M3Ix/Qj/ORx/RShKyUU5FnO4zYomZVjIrMLo8TBFIUbU3kfRnnM6QogCX7FfXFvjND7pVvh4B8wZRNTVpzlA3jEqpxnkdq8tV9jqmEwJc6QezHc9Uh8eXoOG8jRWHkkSvt8eOwMma4oROndCjfmC2R9+TU0m/pK18SW/kMf+xfeLAoD6IvGO8s+yLXkT+4r9u2b1Nc9sinB+SaViJow7cajBJ7jJJCgMQWBV5sZksKRTe+vpcHr6VlEyIjoDwjXL6lw9f2cvx6C3O1S/NXJVhMZcQkKt+O3BNumOhf37njkA/Ky57FRvIuHF9f98wZG/neWDm+vh0P4/NbHHuHyE8wfXI3SinHQ99//Tit7Jx8hs58eOXWqT5ziHGpQgphVAK9CpnkKCGbYFab2+IAoSbngJ+6GIchxShnTh15pFIz2F5X61Cx8tfqISs+KPJ4tjZfmmfLLvnuTG09fbxw/fd3Zvm+4s8o3C7dy2894d/A7A8r63ZvyTOR8XOUt3ao7VD2HArlLFqQmI8dB/SlQPsTn2yxpar797eX9Ae3LPLMUD2uMjHi+LgeC+eQPPe+fLx6GXFXWkhNr9NcYpDUi3bA7a0cpe7PRzbHKLe4bRAaeXpJvqXeXvav+0NajS7ItX8B2h++8i6J/Vk7nE88jXDvgNKTvsfqdvj9+eVYEssC6Hum6u/6MuM8n9vr20s6cw8n3xtr7y/7wyorIB+hf5WXD75Np+VGov3r7XjiVhjkK4r2r3Nbr9XGdcUtMOPKNzfCKHZRA+h0WE283F12UMlVnp+XJ6K7Sc3Z1QazmFrdZx0TMzpaHoX3gL43zcdF/kbBxIirnVD56Ca0RvO+yM1oz9EF5EfN5Auu3tL549S+fOWZAvk77V84I+Xv89Lev61WA/Jti348ntPpa2NGBuQL6772UPeSBXr65JMIi8Gdjq88bpR26Gs7tNPaU8l37maYUV2CUUE80Fxh5Or79cgDafme29dT49Ns7p7EvRtFfz3zYEYcV31Lh/qy8vpRbOO+jVoh/FXE64oLxvepJMlt9HCdWXr2n6wMrnBvUw2XW8yreSCAf4R5Pr+9//Tly9f9+dtHfi7H1y/lePztrZ3bl3WuXx5tf4L+Wzq9psP+93Y6frx/ObwxDsrd9P7rYZUOQvkhiQlklRMSB0H7fV8dixUzeP86IiCWWRKP+Z6bEbHi7w/l1MbnPGSRh6rTgyxzcrWNFCnfQ1ow9uc974iRb2fsD+/n9PKy8mTyA0/7w4oQ8qOte07bexuSiw+7a1pWuUP52edVCtSLmffrO3dY8g3mX9+5etw7u3l/FH79eOG5DfmRlV8/Doy1cu367bB/4y5LivCyz6e0XmLecd/3l5gvx69fV25Pntt7Tdx+wL1477N+cKDTb/X4nYGNO/Li/vAJlpP2tZ1Wu2XybP3r/v19NbQoD8hfj7WdDjymuDMg91V+KgHHHZ74fQ48srm3P3W/F4fxKu39+PI768q9kxF/15Nzyqv3EWP8wa+vyU+PHsv5mBtbXgTxqxw/eOQqdw5vqfywtSuO4meQ57V9BnkkPUPxjIx8P+jt5eMrtyrycw1vx/16m+tefv6ugXw7tVN7aemdG3xxlPZ2au/t9Ps6QymfqVM7n/dc7cyGCT8df22FDY5c807Ht3Y6cxckz89/si65t2i6uyI5tVRWa8h7LuiueTq1VF+5UQGx2p7a9K31uQ/5acdPtC5sBfnpjS93QH7jZSC9r6yMOOo5tdfjigJaviF5asfT8CSra2tixRuM5PkleTg6+7PVqZgtXTkf128kP2EwYE778kNaSH7j5HR8efngEarcuZ0+Duc9p5S5d2D3Pi/fy2n/xudJbu8mEG5m5Gn59/3r28vKEYjPdV5A9p2fYZKfC3vfn1cRqhjheFrlIVF++Pj9/Mc6bzbKZ0jH5ONtncSQn7t4/74/l3XqWZ5PmfLOq339e8dj7r7R2GnjAabYWn62WSe/EnRu76uXke86n79xpb9nmVgW/W8SEedvPKWxcbnIEyv3goZPksYMZLWGlvuj8/uXcjmZ9WWu2qJaKF6H4LBH26wtXevYFEKFnHRK7PKBkQcZNwKnAi/RFpO7MQERTfXYsSg0BYLOrerWV7sxYr9yI3CqBdPBdx2Ka8VrZbKzPoMxTduCFm1ZFWiRp0VvBV7KxpRuq7KqFdDVWxUSNJNsKzmjs6ab1UV4sRm7EThVmLFVtRCgRVTRYdA6plZr7a7WEkKt/KprkFOKBM7FVBQklxFzzhEDlKib9j5irNGEXmNfnSeTm7WrwKneSEy15waYrQsYtQmYC1rnevU2ZFf4hRJ5kuxG4FSapEHsyoaUQrLoQ0DdTIjJgMulOJdW+9Rye3kj8FLFJNoejdERakxRQSygUs+YozbFJ8vPkclPyl7lzfVGim6gIhTnfWm5Z92c09bnaGLoMfGqQSjfGbkROJXl8MZ3sKmrWDKoXpPGaKNC8KP8QCz8Ipv8RPGtwEsFD+u7V64odCo502J1RseMOtasWrSrG/HyeiU3AqdiH86HULKJFUJ3JldwXfuuIhiXk42J7eGDvBLSVeBclkMlo8F4G4zqTXdTs3bamZbB+6p049fP5DslNwKnCh5Fg7doSiwefdU16BYTBO3tuMrreJEivSGcuQqcin2oYl11vanQvYq9NFAtZGebGfd+veNK84hlm+uChGG3lTY9pAY1WaheN3DRKKVSsJVfBpdfnb4KnGuAIJaWfaopRihBY+8txVYhYPEBe+CXbx8xpXO5EF+7CTHWGKptFl3FBl5pXwwmrWvnNTzk2yY3AqfKIsVWF2oPNYSUk4tDh0xVzjtXAwRekko/EmHMRUhMCk23GpX21mQMLYO13ZcYnVYuZH6fckOsexU41StptqJF9A2MSsWl5EHlCCpna0NPmdtS+fHUG4FTaZNcrGmodAvBBqtKd0lXCNk5bXTpwCIMecm4G3lTFRRni0E02cRYjE5dl6i0Dcpp1Ko0fh0L5aecbwROBVNatSYHl5qGGHWLvuvca1ERq/eouZLKT0Nd5c3FURAgYXLKYulRteBdD1h77WBbsRj4uka+3LsRONVRyamUqEb0pHXUadhSaxGadaiyyauSS/KqdzcCp5Ir2FyzRo85TFqDLi7plEv0OZUQnV4dmXvgDefyKjEWn3xsGUDZhDFgLyroCK7UEevzsPsxgZdKLC4Z5UxAl7yySqVUi9O9GXS9B9CGV3eQH5i5ETgVbQGtunI5A3YfitMQu4daTcSuXTYr5/TISmau71JcAABfUyhKq1wShIJaDRepa86JH+97xM7MpWCqM6ZCqx1cUdVmp3PMuiUfY8aqM79KJj8ZdivwUjWmwTBovtlmoaL2LppaXPQ2K4sVwyoqfeQNpwIz1fZWsHpbSi8qWaW86wajz+6yImZKg4+s1eZiMirFqoxSTmuNTdkUvbHWhJ4hjIiV+Xv9SBg8153xIWXtS8jWQUqmqg61Kd9tC9or43lE84g3nEvUQIxDbtSh5uJabS07V6pJPnrbWlyVGntM4Khm43qtzdneYlQZCoZUQ4825iF+eCwedz9gS+fCNw48DFersjPVJh+hewTUEFKB1nmlO3gkoplr5LSqYvY9gi4IxqL3zfmkTNbWtgyBa6l8e/hG4FROxxg0ymrMuetivI25dg21OaUsxLwqjyg/1HwVOFfe0d1oX1wxxoP2bixBbc3RVxNbU7A6uSyvQXMjcCrS45zxPuRiFJSQk+ldWeeUsyoXb80qKsUHhnSu55NbqQUV2JR9db4VV2JJ2lvlokur62aPGJq59E9B5/yYNEwmjKwGtDoSbRW7s1XzuqlaXg/kRuBUJahpHSGGDs5lY1z22WXA4S6KTTZkrqTyMiY3AqeCQgheBQsxmAzYmnMtQPfZOKshYMt8CuXbBTcCp9pD3kYPPuiRUoRuW1MxdQip5d561ZEvLOTbqFeBc50hn6GV7CEko6MOSkfVtK1K9WyjDmVVkuERgVNJImtDK8EYDNhd88a6FrJJtoTYu/WNz6F8G+dG4FS9CEpMvlqnivOhtZGaSh5hLOC0h9R5zuQRGs6FjpwBHJkZY5S3xvaYS6nB6oJNYY1uVdXsAaWZayKZiOP6ZSm+a8RcY3Adgk/eheojrO6HyM/U3Aicyid1KM2bAkanpGwtytQIydkcITpUkV/fkJ+/vQqcKyVh9to6E2xoIwJGG7QH5XypxZoak+OrwwfkTUWVULvgrY7Zda2105Cbtr1p03xuGDJfOz0SQs31l5LuPZcWk4fSuu0QDFqDFiG2VF1b1eZ+wN/PpZpCbl7bNvJrOSiXYmxqpEtzqiGmzCvT4yML/LmqU9ChNOWL0qU646OpCrDoWG03wWRehwbkNXFuBE4FoFqvYzx7d+BGfr23rE2CrlRuSXnFF2vhkTmcakXVmIONetBAY+uhgAlqzGtI0apieNz9CCvm+j8OXUdUxrhSKhpve1BJI6SC6F3qqwJBDxiauVSQq8np7DxCrjCUJOVeY/GQrVYduLNAeTGGG4FTVSEfjM8JXaxBhex6bJhTj1AMulQyLwiO8kuXNwKnAkRGp5DA2TK2uTDE5LOPiN2N99M98Bo6j+S751pFCWPTvZYagrO9pK4wJmNVTTE4i7ywLzySUpjLGoUW0FSFrSoLCsDGGHys2uGIUh3PBsNDczhVQEo+1mhNGGa8QgzKqVC1CakWCArCqvjpA8Z7LpYUEwYbcimh6e68qy1lE3zUJdcWjOUrfPkpshuBU10lZ8EVY0twGr0rpZlg0IHyVvVq7Cpok98Kvwqci/TY0rLyxrbooabiq6nN5xGx6thcXVVsfOQN53o+pinVqne19xAKBAStTC3VRldMWxU7N/Ij6jcCp9I/1cZhrm1yyYaGzpWGLerW+5hewyug3jtg8w/ljSpBOkDSXbdilVYlxo4xVuPGorSors3q+OIDtnsuKBSgWFtaAz3SF8k165WuGWKtqLXjt3Ef2XWai7gkzNWY0lRVPrQ8MqWAvekQEa3G1b7aI5tAc70Xiz10pUPvMaAtJmEOIaCt0eIlWcw38B8w3XNpmDz+H0NMUAOMy9XJxmij1RVcyGH1+xfy2z43AqcSMGXEbUaFoLX20KLxKmndIzgMXqfIz0TIz5jeCJyqxVSnvclN6RqjrWiSN8XmPIiSs8MQOAsfGdKpsAxAdzGkqLKrGQB6q82rYnKzNrhUeIWuB+KLuY5HiCqBBdOhtahVDogNnE6gIPfeVhVTH2D9XPLDOMja1KSUtuOQUqoIKcVelS7ZRv7bFvjIdvpc2AN8yiPj3VvQauSbnYJaQy8lRxNq5ada5LfNrwLnWgcxmubBQzHaxpBa7SOZB9pDx1CD46XYH1mLzmURuhn+NoHX0Q/DaRNgSMHgSJimUHltE/mB/xuBUwWF7pvRBivWYCH7qpxzOZrakger0PP7+4/4wrnYQgzNupbQxpRTNMap0rxGE0q1KbW+qsbwyJBOdRmMB6yoBvtTNF27qtR4UQ8YrW3Ay988cspkLuHQWk1V6dj6OKGkbVYpGVeyiz1Fu/oNDv0ILeZqD11Fk61JxpcefbFZYcWkIKvkhoPyPGLbaEnf0ql9+V09j/89P18afHdpq1u/AusFmP/w1NbV7A3w3GX9zG3SVsZekWHpMnLvsZEoV2BcgPkibesS5gpsFuBVjmKjLbkC2wV4lU7ayKgrsFuAuSLLL1Gugf0CvKpo/rBWhAV49QtCDwNHot7qN3geHAu9kBpWDNmasl6A4QrMI0h5caY18GwtkPcYtm6ULMC49NisgR/ssbkCr45wPcgQswyFXfX4UUW2S4/tqsfySjVrYOoxM/Ugr0m5BoYFmGditu6EXIFxAea71VtP+F+BZ4PsVpMnL9DFgd0yeY5Pnt56GusKrBfgVQGuB/XYkZ92z3w/WX4H7gdk6jM/OP0oqQfeQIYf/N6DQYtbNNk9r06cPDzKuADzHeat2yJXYNLk1SHcB62FW0ILx4dYy++Tr4HdAsyzDVvztldgvwDzzNDWzbUrcFiAV6dyH7Rvbgkt3Cq00BsueN0gwzV+c896lR3fAPz28fLyZfWLx1sma8Lhv1y8ZW4mHP7bwVtC9AlntU+5GYivnzbdtrng8EXNJud8weE/kLj5tZjKy8sAnt9X1Xu33A5YlaGXlzs9//G2Opwl9xR/vLV1IWLxq3y81XXlQPkK/uPMTwmL52RKKHA12waySkaIg5zPllVy5swov/wXaeE5lFc1mWTJRRn57bQp17FBlPxQ12fZFLFlnkA29Fe+vfhZkkbskSaQDVojr2PzWe5n2/jaDf2V/5TYZymlbZPkNvRXvjn6SaZKvnk1gWzorzyI/yQBJg88JpAN/ZUHXZ/k1eS/6jaBbOivPPPxSdpZXu96AtnQX3mB7k+SgPIrABPIhv7KKz59kluU7/xNIBv6K7+OMaUY5aJgk5X+IYm5hSpmW3+3DM0qN6rla44JZEN/N5n6dcpVvhidQDb0d5PpXGdyN5lOu2l85adiPkkQy2teTiAb+ivP1Ux54g2i5Ku3zzLR2/q7IeqETQbWbdJy+T7RZynvLQueHzNhW1Hkr63lSYHP0uZbQeQdlp+b+CwZv0WDB4i8v5uc08hgbmHLNlEbtGbTwvOHbZxtWrNhErS8lvJnGyJbQgS3xU7rTSHCD/ssW4y922KntfwO32fbN9vGd0N2QMuv/n62K7SNbxuyA1peVHPaHNoiattbbViT600J2PWG1KY1rtuyJtcboifYmA6SU6Gd3n8ooCru7/d0OuwPX3kZbPkV5O/feNX1G2ZTYcN7OITA86X3itze/3Wd7/sX9msa8rfgP3YAcqf3fX/mv2x1bxfnftHJ78fTautETJrvx9Nv62Kn8m3cH3/c594SdJqSvymk+f2UeJFeYd79l93T2/6tvewP7emnn3/566//D6lqzgo="; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/documents/CHANGELOG.html b/docs/documents/CHANGELOG.html index ed1d6b2..a0ca351 100644 --- a/docs/documents/CHANGELOG.html +++ b/docs/documents/CHANGELOG.html @@ -1,295 +1,16 @@ CHANGELOG | @your-scope/react-component-template

      All notable changes to this project will be documented in this file. Dates are displayed in UTC.

      -

      Generated by auto-changelog.

      - -
      -

      9 June 2024

      -
      -
        -
      • Feature/GH-16-support-prerelease-from-any-branch #17
      • -
      • [GH-14] added tsdoc support #15
      • -
      • [GH-12] added json import support #13
      • -
      • Feature/gh-6-add-cli-support #9
      • -
      • [GH-4] Added tslog logging #5
      • -
      • updated dependencies ca882a3
      • -
      • Added noderesolve & incremental builds de7ce79
      • -
      • updated dependencies ceb4894
      • -
      -
      -

      7 October 2024

      -
      - -
      -

      2 October 2024

      -
      -
        -
      • updated dependencies 83e753b
      • -
      • chore: release v0.6.11 75379b4
      • -
      • exclude external dependencies & simplify d.ts generation f837fe1
      • -
      -
      -

      30 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      25 August 2024

      -
      - -
      -

      24 August 2024

      -
      - -
      -

      24 August 2024

      -
      - -
      -

      23 August 2024

      -
      -
        -
      • added typedoc support 90bab5f
      • -
      • chore: release v0.5.4 a57d7ab
      • -
      • added doc generation to relese script 7997d58
      • -
      -
      -

      23 August 2024

      -
      -
        -
      • updated dependencies 9bcbc3c
      • -
      • updated dependencies 9925c26
      • -
      • Eliminated tslog & preserved dependency packages 8e5fb1d
      • -
      -
      -

      3 July 2024

      -
      - -
      -

      19 June 2024

      -
      -
        -
      • restored package.json breakage 28dd47f
      • -
      • chore: release v0.5.1 75f305b
      • -
      -
      -

      9 June 2024

      -
      -
        -
      • [GH-16] reset version #18
      • -
      • Feature/GH-16-support-prerelease-from-any-branch #17
      • -
      • chore: release v0.5.0 a2bdf4f
      • -
      • [GH-16] Merge branch 'main' into feature/GH-16-support-prerelease-from-any-branch 64d78de
      • -
      • [GH-16] added release:pre script 275825d
      • -
      -
      -

      6 June 2024

      -
      - -
      -

      5 May 2024

      -
      -
        -
      • [GH-14] added tsdoc support #15
      • -
      • [GH-12] added json import support #13
      • -
      • updated dependencies ceb4894
      • -
      • chore: release v0.4.0 c6b73ed
      • -
      -
      -

      1 May 2024

      -
      -
        -
      • Feature/gh-6-add-cli-support #9
      • -
      • [GH-6] added CLI support b2bfd0c
      • -
      • [GH-6] wip 27aa2ee
      • -
      • [GH-7] resolved iife build warnings 7b3e30a
      • -
      -
      -

      25 April 2024

      -
      -
        -
      • Added noderesolve & incremental builds de7ce79
      • -
      • bounded editor word wrap for markdown 327637a
      • -
      • chore: release v0.2.1 b154990
      • -
      -
      -

      21 April 2024

      -
      - -
      -

      15 April 2024

      -
      - -
      -

      15 April 2024

      -
      -
        -
      • updated docs & recommended extensions da662d4
      • -
      • chore: release v0.0.10 b0c409c
      • -
      • added missing ignores 42048e9
      • -
      -
      -

      15 April 2024

      -
      - -
      -

      15 April 2024

      -
      -
        -
      • updated build script & exports 9f90d08
      • -
      • chore: release v0.0.8 8812313
      • -
      -
      -

      15 April 2024

      -
      - -
      -

      15 April 2024

      -
      - -
      -

      15 April 2024

      -
      -
        -
      • installed & configured rollup b9ac884
      • -
      • chore: release v0.0.5 a3c80f9
      • -
      -
      -

      14 April 2024

      -
      -
        -
      • chore: release v0.0.4 f849935
      • -
      • restored module & switched import to .js (!) 69ed985
      • -
      • ignore nyc temp dir dd72b06
      • -
      -
      -

      14 April 2024

      -
      - -
      -

      14 April 2024

      -
      - -
      -

      12 April 2024

      -
      - -
      -

      12 April 2024

      -
      -
        -
      • [GH-1] updated release scripts #3
      • -
      • [GH-1] installed & configured release-it #2
      • -
      • initial commit d8b4846
      • -
      • initial commit 158622c
      • -
      -
      +
        +
      • Initial commit 76856f2
      • +
      • Fix vitest typescript error 1144b8f
      • +
      • Update docs c8dee9f
      • +
      • feat: convert to React 18 component template 06c2075
      • +
      • docs: rewrite README for React component template 24e0dbe
      • +
      • added diagram support b5ab901
      • +
      • Node 20 compatibility fix and update Rollup config af01fc1
      • +
      • chore: switch to TS ESLint flat config; fix lint/TS friction 8a6424f
      • +
      • fix: clean lint and TS for React component template fede91a
      • +
      • Revert the Rollup configuration file back to TS a631efa
      • +
      • Updated STAN 7780380
      • +
      • Add link to TypeDoc in README API documentation section 1fe7807
      • +
      +
      diff --git a/docs/functions/index.HelloWorld.html b/docs/functions/index.HelloWorld.html index e0e9df7..e7552ab 100644 --- a/docs/functions/index.HelloWorld.html +++ b/docs/functions/index.HelloWorld.html @@ -3,4 +3,4 @@
    • Targets React 18 with the modern react-jsx runtime.
    • No styling is applied by default.
    • -
      +
      diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 53cd933..03971f0 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,30 +2,30 @@ https://docs.karmanivero.us/npm-package-template-ts/index.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z https://docs.karmanivero.us/npm-package-template-ts/modules.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z https://docs.karmanivero.us/npm-package-template-ts/hierarchy.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z https://docs.karmanivero.us/npm-package-template-ts/documents/CHANGELOG.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z https://docs.karmanivero.us/npm-package-template-ts/modules/index.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z https://docs.karmanivero.us/npm-package-template-ts/types/index.HelloWorldProps.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z https://docs.karmanivero.us/npm-package-template-ts/functions/index.HelloWorld.html - 2025-08-30T10:06:15.911Z + 2025-08-31T02:13:27.807Z diff --git a/docs/types/index.HelloWorldProps.html b/docs/types/index.HelloWorldProps.html index 7301236..109c41b 100644 --- a/docs/types/index.HelloWorldProps.html +++ b/docs/types/index.HelloWorldProps.html @@ -1,4 +1,4 @@ HelloWorldProps | @your-scope/react-component-template

      Type Alias HelloWorldProps

      HelloWorldProps defines the props for the HelloWorld component.

      -
      type HelloWorldProps = {
          who?: string;
      }
      Index

      Properties

      type HelloWorldProps = {
          who?: string;
      }
      Index

      Properties

      Properties

      who?: string

      Whom to greet. Defaults to "World".

      -
      +
      From f6677cb4777c90a102c156b4ed04dc5a8e148708 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 10:38:23 +0800 Subject: [PATCH 11/27] tests: add entry tests; edge cases; tweak cov When: 2025-08-31T00:00:00Z Why: Improve confidence in public exports and component behavior; make coverage metrics reflect actual source instead of docs/build assets. What changed: - src/index.test.tsx: new test to validate library entry re-exports - src/components/HelloWorld.edge-cases.test.tsx: edge cases for empty string, '0', and emoji/unicode handling - vitest.config.ts: exclude docs/, dist/, playground/ from coverage - README.md: add example for testing library entry; coverage notes - .stan/system/stan.todo.md: mark README update/tests complete; note coverage tuning --- .stan/system/stan.todo.md | 15 ++++++++----- README.md | 20 ++++++++++++++++- src/components/HelloWorld.edge-cases.test.tsx | 22 +++++++++++++++++++ src/index.test.tsx | 12 ++++++++++ vitest.config.ts | 7 +++++- 5 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 src/components/HelloWorld.edge-cases.test.tsx create mode 100644 src/index.test.tsx diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index f726b24..0c3c6c6 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -1,21 +1,24 @@ -When updated: 2025-08-29T00:00:00Z +When updated: 2025-08-31T00:00:00Z Next up + - Run: npm install to ensure new devDependencies (react, react-dom, @types/react, @types/react-dom, vite, @vitejs/plugin-react, - @testing-library/*, tsx) are installed before running test/docs/typecheck. -- Refresh README to reflect React component template workflow (build, - test, Vite playground usage), and the ESLint TS flat-config usage. + @testing-library/\*, tsx) are installed before running test/docs/typecheck. - Optionally add story tooling (Storybook or Ladle) if docs scale up. - Consider pruning unused devDependencies flagged by knip. Completed (recent) + +- Added tests for library entry re-exports and HelloWorld edge cases. +- Tuned Vitest coverage to exclude docs/, dist/, and playground/ by default. +- Updated README test section with entry re-export example and coverage notes. - Updated README to reflect React component template usage and features. - Replaced eslint.config.js with eslint.config.ts (flat config), updated npm scripts to run ESLint via node --loader tsx. - Scoped linting to avoid type-aware parse errors; ignore playground; tests use Vitest recommended rules (non type-checked). -- Excluded tests and playground from ts typecheck; removed jest-dom types from tsconfig to prevent build/docs errors if not installed. +- Excluded tests and playground from ts typecheck; removed jest-dom types from tsconfig to prevent build/docs errors if not installed. - Excluded .rollup.cache from Vitest to avoid stale compiled tests. - Excluded playground from lint/typecheck to reduce false positives. - Added vitest.setup.ts and configured jest-dom globally. @@ -29,4 +32,4 @@ Completed (recent) - Marked react/react-dom as peerDependencies; set sideEffects: false. - Updated rollup config to externalize react & react/jsx-runtime. - Kept TypeDoc; preserved Vitest + happy-dom environment. -- Updated package/repository metadata placeholders. \ No newline at end of file +- Updated package/repository metadata placeholders. diff --git a/README.md b/README.md index 1c25f46..faf02b2 100644 --- a/README.md +++ b/README.md @@ -143,8 +143,26 @@ Notes jsdom later if needed. - Vitest excludes stale compiled tests from .rollup.cache. ---- +- Also verify your library entry (src/index.ts) re-exports what you intend. + A tiny test can import from the library entry instead of deep paths: +```tsx +// src/index.test.tsx +import { render, screen } from '@testing-library/react'; +import { HelloWorld } from './index'; + +it('re-exports HelloWorld', () => { + render(); + expect(screen.getByText('Hello Library')).toBeInTheDocument(); +}); +``` + +- Coverage scope: docs/, dist/, and playground/ are excluded in + vitest.config.ts so coverage focuses on your source. Adjust + test.coverage.exclude as needed if you want to include or exclude + additional paths. + +--- ## View in the browser (Vite playground) A minimal playground is included under playground/ for fast, local viewing with diff --git a/src/components/HelloWorld.edge-cases.test.tsx b/src/components/HelloWorld.edge-cases.test.tsx new file mode 100644 index 0000000..568b7f7 --- /dev/null +++ b/src/components/HelloWorld.edge-cases.test.tsx @@ -0,0 +1,22 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +import { HelloWorld } from './HelloWorld'; + +describe('HelloWorld edge cases', () => { + it('respects empty string (no defaulting)', () => { + render(); + expect(screen.getByText('Hello ')).toBeInTheDocument(); + }); + + it('renders falsy-but-defined values', () => { + render(); + expect(screen.getByText('Hello 0')).toBeInTheDocument(); + }); + + it('renders emoji and unicode', () => { + render(); + expect(screen.getByText('Hello 🚀')).toBeInTheDocument(); + }); +}); + diff --git a/src/index.test.tsx b/src/index.test.tsx new file mode 100644 index 0000000..df09cf6 --- /dev/null +++ b/src/index.test.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +import { HelloWorld } from './index'; + +describe('library entry (src/index.ts)', () => { + it('re-exports HelloWorld', () => { + render(); + expect(screen.getByText('Hello Library')).toBeInTheDocument(); + }); +}); + diff --git a/vitest.config.ts b/vitest.config.ts index 7222da2..31b4f10 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -9,7 +9,12 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'lcov'], + exclude: [ + 'docs/**', + 'dist/**', + 'playground/**', + '.rollup.cache/**', + ], }, }, }); - From f9f1dfbc8b9414cbfd29c966918f4d1c6a51cee9 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 10:45:16 +0800 Subject: [PATCH 12/27] Fix failing test --- src/components/HelloWorld.edge-cases.test.tsx | 2 +- src/components/HelloWorld.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/HelloWorld.edge-cases.test.tsx b/src/components/HelloWorld.edge-cases.test.tsx index 568b7f7..bbaa61a 100644 --- a/src/components/HelloWorld.edge-cases.test.tsx +++ b/src/components/HelloWorld.edge-cases.test.tsx @@ -6,7 +6,7 @@ import { HelloWorld } from './HelloWorld'; describe('HelloWorld edge cases', () => { it('respects empty string (no defaulting)', () => { render(); - expect(screen.getByText('Hello ')).toBeInTheDocument(); + expect(screen.getByText(/^Hello\s*$/)).toBeInTheDocument(); }); it('renders falsy-but-defined values', () => { diff --git a/src/components/HelloWorld.tsx b/src/components/HelloWorld.tsx index 8402303..222e544 100644 --- a/src/components/HelloWorld.tsx +++ b/src/components/HelloWorld.tsx @@ -17,4 +17,5 @@ export type HelloWorldProps = { */ export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element { return
      Hello {who}
      ; -} \ No newline at end of file +} + From bfb97b4322c213ba4ab05d7fc484febb97cab5d8 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 11:01:54 +0800 Subject: [PATCH 13/27] Update github urls in package.json --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bc40de9..f295794 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "hideCredit": true }, "bugs": { - "url": "https://github.com/your-org/react-component-template/issues" + "url": "https://github.com/karmaniverous/react-component-npm-package-template-ts/issues" }, "dependencies": { "@karmaniverous/stan": "^0.5.6" @@ -73,7 +73,7 @@ "files": [ "dist" ], - "homepage": "https://github.com/your-org/react-component-template#readme", + "homepage": "https://github.com/karmaniverous/react-component-npm-package-template-ts#readme", "keywords": [ "react", "component", @@ -87,7 +87,7 @@ ], "license": "BSD-3-Clause", "module": "dist/mjs/index.js", - "name": "@your-scope/react-component-template", + "name": "@karmaniverous/react-component-npm-package-template-ts", "peerDependencies": { "react": ">=18", "react-dom": ">=18" @@ -128,7 +128,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/your-org/react-component-template.git" + "url": "git+https://github.com/karmaniverous/react-component-npm-package-template-ts.git" }, "scripts": { "build": "rimraf dist && rollup --config rollup.config.ts --configPlugin typescript", @@ -152,4 +152,3 @@ "types": "dist/index.d.ts", "version": "0.6.13" } - From ce46b9743b2a5ad1da63326cf30ef6f20346a9d6 Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 11:13:09 +0800 Subject: [PATCH 14/27] Update package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e8f1ef..782efbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@your-scope/react-component-template", + "name": "@karmaniverous/react-component-npm-package-template-ts", "version": "0.6.13", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@your-scope/react-component-template", + "name": "@karmaniverous/react-component-npm-package-template-ts", "version": "0.6.13", "license": "BSD-3-Clause", "dependencies": { From 6376dfc1ecfa2c0b427152472418963617c2d84d Mon Sep 17 00:00:00 2001 From: Jason Galvin Date: Sun, 31 Aug 2025 11:19:38 +0800 Subject: [PATCH 15/27] =?UTF-8?q?docs:=20add=20=E2=80=9CHow=20to=20use=20t?= =?UTF-8?q?his=20template=E2=80=9D=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When: 2025-08-31T00:00:00Z Why: Improve onboarding for new projects adopting the template, including where to change placeholders and how to run the first release. What changed: - README.md: add section covering template usage (GitHub UI, degit, shallow clone), placeholder fields to update, npm pkg set snippet, and first-release steps (GITHUB_TOKEN, release-it) - .stan/system/stan.todo.md: record README improvement in Completed --- README.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index faf02b2..690462f 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,10 @@ What you get out of the box Contents +- How to use this template - Getting Started - Develop React components -- Test your components -- View in the browser (Vite playground) +- Test your components- View in the browser (Vite playground) - Build and publish - Linting & formatting - Type checking @@ -33,10 +33,100 @@ Contents --- +## How to use this template + +Option A — GitHub “Use this template” + +1) Open this repository on GitHub. +2) Click “Use this template” → “Create a new repository”. +3) Pick your owner/org and repo name, then create the repo. +4) Clone your new repo locally. + +Option B — degit (no git history) + +```bash +npx degit karmaniverous/react-component-npm-package-template-ts my-lib +cd my-lib +git init && git add -A && git commit -m "chore: scaffold from template" +``` + +Option C — shallow clone then reset history + +```bash +git clone --depth=1 https://github.com/karmaniverous/react-component-npm-package-template-ts my-lib +cd my-lib +rm -rf .git +git init && git add -A && git commit -m "chore: scaffold from template" +``` + +Replace placeholders (package.json and docs) + +- package.json + - name: Use your scoped package, e.g. @your-scope/my-lib + - version: 0.0.0 (start here; release-it will bump on first release) + - description, author, license + - repository.url: git+https://github.com/your-org/my-lib.git + - bugs.url: https://github.com/your-org/my-lib/issues + - homepage: https://github.com/your-org/my-lib#readme + - keywords: adjust for your library + - publishConfig.access: public (keep for public scoped packages) +- README.md + - Title, import examples (replace @your-scope/react-component-template with your real package name) +- typedoc.json + - hostedBaseUrl and navigationLinks.GitHub to point to your repo/docs +- FUNDING.yml (optional) + - Update to your funding info or remove + +Quick package.json edits with npm + +```bash +npm pkg set name='@your-scope/my-lib' version='0.0.0' \ + description='My awesome React component library' \ + author='Your Name ' license='MIT' \ + repository.type='git' \ + repository.url='git+https://github.com/your-org/my-lib.git' \ + bugs.url='https://github.com/your-org/my-lib/issues' \ + homepage='https://github.com/your-org/my-lib#readme' +``` + +Prepare for your first release + +1) Install and verify + +```bash +npm install +npx lefthook install # optional +npm run lint +npm run test +npm run typecheck +npm run build +``` + +2) Configure your GitHub token (for release-it) + - Copy .env.local.template to .env.local. + - Create a GitHub Personal Access Token (classic) with “repo” scope: + https://github.com/settings/tokens + - Set GITHUB_TOKEN in .env.local. + +3) Push to your repo (main branch) + +```bash +git remote add origin git@github.com:your-org/my-lib.git +git push -u origin main +``` + +4) Release (interactive) + +```bash +npm run release +``` + +release-it will bump the version (starting from 0.0.0), run lint/test/knip/build, +tag, publish to npm, and create a GitHub Release. + ## Getting Started Prerequisites - - Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under “Linting & formatting” about “--import tsx”. @@ -143,9 +233,9 @@ Notes jsdom later if needed. - Vitest excludes stale compiled tests from .rollup.cache. +- Also verify your library entry (src/index.ts) re-exports what you intend. - Also verify your library entry (src/index.ts) re-exports what you intend. A tiny test can import from the library entry instead of deep paths: - ```tsx // src/index.test.tsx import { render, screen } from '@testing-library/react'; @@ -162,8 +252,7 @@ it('re-exports HelloWorld', () => { test.coverage.exclude as needed if you want to include or exclude additional paths. ---- -## View in the browser (Vite playground) +---## View in the browser (Vite playground) A minimal playground is included under playground/ for fast, local viewing with HMR. It imports your components directly from src (no publishing required). From ce300b00a20f63434bcfe44e082f44ca517ce9ae Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 12:42:59 +0800 Subject: [PATCH 16/27] Improved cross-platform config --- .editorconfig | 9 +++++++++ .gitattributes | 6 ++++++ .prettierrc.json | 4 +++- .vscode/extensions.json | 8 ++++---- .vscode/settings.json | 8 ++++---- eslint.config.ts | 3 ++- 6 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..93b6e9d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +end_of_line = lf +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ca1958 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# Normalize text files to LF in the repo regardless of platform +* text=auto eol=lf + +# Optional: allow CRLF where required on Windows scripts +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/.prettierrc.json b/.prettierrc.json index 1c9c474..ef5b0d3 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,4 +1,6 @@ { - "endOfLine": "crlf", + "embeddedLanguageFormatting": "auto", + "endOfLine": "lf", + "proseWrap": "never", "singleQuote": true } diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 2dac3fe..ea1f7dd 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,10 +2,10 @@ "recommendations": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", - "vitest.explorer", + "github.vscode-github-actions", + "gruntfuggly.todo-tree", "jebbs.plantuml", "redhat.vscode-yaml", - "gruntfuggly.todo-tree", - "github.vscode-github-actions" + "vitest.explorer" ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index d6823f1..dbb48a9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,18 +13,18 @@ "typescript", "typescriptreact" ], + "files.eol": "\n", + "files.insertFinalNewline": true, "git.autofetch": true, "git.enableSmartCommit": true, "javascript.preferences.importModuleSpecifierEnding": "minimal", "javascript.updateImportsOnFileMove.enabled": "always", - "plantuml.diagramsRoot": "diagrams/src", + "plantuml.diagramsRoot": "diagrams", "plantuml.exportFormat": "", "plantuml.exportIncludeFolderHeirarchy": true, - "plantuml.exportOutDir": "diagrams/out", + "plantuml.exportOutDir": "assets", "plantuml.exportSubFolder": false, "plantuml.render": "Local", - "prettier.prettierPath": "./node_modules/prettier", - "prettier.singleQuote": true, "todo-tree.filtering.ignoreGitSubmodules": false, "todo-tree.filtering.includeHiddenFiles": false, "todo-tree.general.showActivityBarBadge": true, diff --git a/eslint.config.ts b/eslint.config.ts index 3d41ec7..596da36 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -38,6 +38,8 @@ export default tseslint.config( tsdoc: tsDocPlugin, }, rules: { + // Defer to the repo Prettier config (.prettierrc.json) as the single source of truth. + 'prettier/prettier': 'error', '@typescript-eslint/consistent-type-imports': 'error', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-unused-expressions': 'off', @@ -52,4 +54,3 @@ export default tseslint.config( // Disable stylistic conflicts with Prettier. prettierConfig, ); - From 366bf6580ee1e851dae237bc191d540840197bf7 Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 12:59:20 +0800 Subject: [PATCH 17/27] fix: set tsconfigRootDir to fix Windows lint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When: 2025-08-31T00:00:30Z Why: ESLint failed on Windows due to a typescript-eslint parser bug reporting an invalid tsconfigRootDir path format. Providing a resolved absolute path avoids the issue and restores cross-OS linting. What changed: - eslint.config.ts: add node:path import; set languageOptions.parserOptions.tsconfigRootDir = path.resolve(); - .stan/system/stan.project.md: document Windows tsconfigRootDir note. - .stan/system/stan.todo.md: record fix and add “re-run lint” next step. --- .stan/system/stan.project.md | 13 +++++-------- .stan/system/stan.todo.md | 14 ++++++-------- eslint.config.ts | 9 +++++++++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/.stan/system/stan.project.md b/.stan/system/stan.project.md index ddd118c..a38c23c 100644 --- a/.stan/system/stan.project.md +++ b/.stan/system/stan.project.md @@ -4,8 +4,7 @@ When updated: 2025-08-29T00:00:00Z Repository goal -- Provide a ready-to-use template for building and publishing React 18 - component libraries using TypeScript. +- Provide a ready-to-use template for building and publishing React 18 component libraries using TypeScript. Baseline decisions @@ -21,9 +20,9 @@ Baseline decisions - Mark package as "sideEffects": false (no global CSS side-effects). - Linting - TS-only rules; no react-specific eslint plugins for now. - - Ignore playground/\*\* from lint to avoid dev-only noise. - - Flat config in eslint.config.ts (TypeScript), executed via - `node --loader tsx` in npm scripts. + - Ignore playground/\*_/_ from lint to avoid dev-only noise. + - Flat config in eslint.config.ts (TypeScript), executed via `node --loader tsx` in npm scripts. + - Windows: set ESLint languageOptions.parserOptions.tsconfigRootDir to path.resolve() to avoid a known typescript-eslint path bug affecting tsconfigRootDir resolution on Windows. - Tests linted with Vitest recommended rules (non type-checked). - Testing - Vitest with happy-dom environment (project default). @@ -31,8 +30,7 @@ Baseline decisions - jest-dom is registered via vitest.setup.ts. - Dev preview - Vite playground under /playground for interactive browser viewing. - - Playground is excluded from npm package (files: ["dist"]) and from - typecheck/lint. + - Playground is excluded from npm package (files: ["dist"]) and from typecheck/lint. - Source layout - Components under src/components. - Public entry at src/index.ts re-exports components. @@ -47,4 +45,3 @@ Operational notes - Rollup marks react and react/jsx-runtime as externals. - Keep release and docs scripts; they may be adjusted later as needed. - Consider adding Storybook or Ladle later if richer docs are required. - diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index 0c3c6c6..3fa2c48 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -1,23 +1,21 @@ -When updated: 2025-08-31T00:00:00Z +When updated: 2025-08-31T00:00:30Z Next up -- Run: npm install to ensure new devDependencies (react, react-dom, - @types/react, @types/react-dom, vite, @vitejs/plugin-react, - @testing-library/\*, tsx) are installed before running test/docs/typecheck. +- Run: npm install to ensure new devDependencies (react, react-dom, @types/react, @types/react-dom, vite, @vitejs/plugin-react, @testing-library/\*, tsx) are installed before running test/docs/typecheck. - Optionally add story tooling (Storybook or Ladle) if docs scale up. - Consider pruning unused devDependencies flagged by knip. +- Re-run: npm run lint to confirm the Windows tseslint parser fix. Completed (recent) +- Fixed ESLint parser error on Windows by setting parserOptions.tsconfigRootDir = path.resolve() in eslint.config.ts. - Added tests for library entry re-exports and HelloWorld edge cases. - Tuned Vitest coverage to exclude docs/, dist/, and playground/ by default. - Updated README test section with entry re-export example and coverage notes. - Updated README to reflect React component template usage and features. -- Replaced eslint.config.js with eslint.config.ts (flat config), updated - npm scripts to run ESLint via node --loader tsx. -- Scoped linting to avoid type-aware parse errors; ignore playground; - tests use Vitest recommended rules (non type-checked). +- Replaced eslint.config.js with eslint.config.ts (flat config), updated npm scripts to run ESLint via node --loader tsx. +- Scoped linting to avoid type-aware parse errors; ignore playground; tests use Vitest recommended rules (non type-checked). - Excluded tests and playground from ts typecheck; removed jest-dom types from tsconfig to prevent build/docs errors if not installed. - Excluded .rollup.cache from Vitest to avoid stale compiled tests. - Excluded playground from lint/typecheck to reduce false positives. diff --git a/eslint.config.ts b/eslint.config.ts index 596da36..e6aa418 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,3 +1,5 @@ +import path from 'node:path'; + import eslint from '@eslint/js'; import prettierConfig from 'eslint-config-prettier'; import prettierPlugin from 'eslint-plugin-prettier'; @@ -18,6 +20,13 @@ export default tseslint.config( 'node_modules/**/*', 'playground/**/*', ], + languageOptions: { + parserOptions: { + // Windows: force a resolved absolute path to work around a + // typescript-eslint parser bug affecting tsconfigRootDir. + tsconfigRootDir: path.resolve(), + }, + }, }, // Base JS + TS (non type-checked) recommendations. From 08afae7e68899d5e6c6b28e06aa331614535b0c2 Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:22:59 +0800 Subject: [PATCH 18/27] chore: lint playground and drop hook proposal When: 2025-08-31T00:18:00Z Why: Lint/Prettier should cover all hand-written code, including /playground. We will not add a new Lefthook script since Prettier on save already keeps files normalized pre-commit. What changed: - eslint.config.ts: include playground; ignore only generated outputs; add JS block with ESLint recommended; scope TS-only rules and keep Windows tsconfigRootDir workaround. - .stan/system/stan.project.md: document lint scope (include playground), LF-only normalization guidance, and no new hook requirement. - .stan/system/stan.todo.md: record decision and next verification step. --- .gitignore | 1 - .stan/system/stan.project.md | 6 ++- .stan/system/stan.todo.md | 5 +- archive.ts | 89 ------------------------------------ eslint.config.ts | 34 ++++++++++---- 5 files changed, 33 insertions(+), 102 deletions(-) delete mode 100644 archive.ts diff --git a/.gitignore b/.gitignore index 2531683..497b652 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ coverage/ dist/ esm/ node_modules/ -context/ .stan/output/ .stan/diff/ .stan/dist/ diff --git a/.stan/system/stan.project.md b/.stan/system/stan.project.md index a38c23c..96e9612 100644 --- a/.stan/system/stan.project.md +++ b/.stan/system/stan.project.md @@ -20,9 +20,11 @@ Baseline decisions - Mark package as "sideEffects": false (no global CSS side-effects). - Linting - TS-only rules; no react-specific eslint plugins for now. - - Ignore playground/\*_/_ from lint to avoid dev-only noise. + - Playground IS included in lint/Prettier scope (treat as first-class source). Exclude only generated output: dist/, docs/, coverage/, .rollup.cache/, .stan/, context/, diagrams/out/. - Flat config in eslint.config.ts (TypeScript), executed via `node --loader tsx` in npm scripts. - Windows: set ESLint languageOptions.parserOptions.tsconfigRootDir to path.resolve() to avoid a known typescript-eslint path bug affecting tsconfigRootDir resolution on Windows. + - Limit lint to non-generated code; exclude dist/, docs/, coverage/, .rollup.cache/, .stan/, context/, and diagrams/out/. + - Line endings (cross-platform): enforce LF-only in the repo via .gitattributes, .editorconfig, and Prettier (endOfLine: "lf"). If CRLF noise appears locally, normalize once: • git add --renormalize . • npm run lint:fix Editors with Prettier on save should keep files normalized. - Tests linted with Vitest recommended rules (non type-checked). - Testing - Vitest with happy-dom environment (project default). @@ -30,7 +32,7 @@ Baseline decisions - jest-dom is registered via vitest.setup.ts. - Dev preview - Vite playground under /playground for interactive browser viewing. - - Playground is excluded from npm package (files: ["dist"]) and from typecheck/lint. + - Playground is excluded from npm package (files: ["dist"]) and from typecheck. - Source layout - Components under src/components. - Public entry at src/index.ts re-exports components. diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index 3fa2c48..f0dd711 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -1,4 +1,4 @@ -When updated: 2025-08-31T00:00:30Z +When updated: 2025-08-31T00:18:00Z Next up @@ -6,10 +6,13 @@ Next up - Optionally add story tooling (Storybook or Ladle) if docs scale up. - Consider pruning unused devDependencies flagged by knip. - Re-run: npm run lint to confirm the Windows tseslint parser fix. +- Normalize line endings to LF if you see CRLF noise: • git add --renormalize . • npm run lint:fix • commit the normalization +- Verify lint includes /playground and excludes only generated output. Completed (recent) - Fixed ESLint parser error on Windows by setting parserOptions.tsconfigRootDir = path.resolve() in eslint.config.ts. +- Clarified lint/format policy: include /playground; exclude generated outputs; rely on editor Prettier (no new Lefthook script). - Added tests for library entry re-exports and HelloWorld edge cases. - Tuned Vitest coverage to exclude docs/, dist/, and playground/ by default. - Updated README test section with entry re-export example and coverage notes. diff --git a/archive.ts b/archive.ts deleted file mode 100644 index 5f9b81b..0000000 --- a/archive.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { spawn } from 'child_process'; -import { existsSync } from 'fs'; -import { mkdir, rename, unlink } from 'fs/promises'; -import path from 'path'; -import { create } from 'tar'; - -type RunResult = { code: number; stdout: string; stderr: string }; - -const run = async ( - cmd: string, - args: string[], - cwd: string, -): Promise => - new Promise((resolve, reject) => { - const child = spawn(cmd, args, { - cwd, - stdio: ['ignore', 'pipe', 'pipe'], - shell: false, - }); - let stdout = ''; - let stderr = ''; - child.stdout.on('data', (d: Buffer) => { - stdout += d.toString('utf8'); - }); - child.stderr.on('data', (d: Buffer) => { - stderr += d.toString('utf8'); - }); - child.on('error', (err: Error) => { - reject(err); - }); - child.on('close', (code) => { - resolve({ code: code ?? 0, stdout, stderr }); - }); - }); - -const main = async (): Promise => { - const root = await run( - 'git', - ['rev-parse', '--show-toplevel'], - process.cwd(), - ); - const repoRoot = root.code === 0 ? root.stdout.trim() : process.cwd(); - - const outDirRel = 'context'; - const outDirAbs = path.join(repoRoot, outDirRel); - await mkdir(outDirAbs, { recursive: true }); - - const list = await run( - 'git', - ['ls-files', '-z', '--cached', '--others', '--exclude-standard'], - repoRoot, - ); - if (list.code !== 0) { - console.log('archive: no file list; left context directory in place'); - process.exitCode = 1; - return; - } - - const allRel = list.stdout.split('\u0000').filter((f) => f.length > 0); - const filesRel = allRel.filter( - (p) => !p.startsWith('context/') && existsSync(path.join(repoRoot, p)), - ); - - const archiveRel = 'context/archive.tar'; - const archiveAbs = path.join(repoRoot, archiveRel); - const tmpAbs = `${archiveAbs}.tmp`; - if (existsSync(tmpAbs)) await unlink(tmpAbs); - - try { - await create( - { - cwd: repoRoot, - file: tmpAbs, - portable: false, - noMtime: true, - preservePaths: false, - }, - filesRel, - ); - await rename(tmpAbs, archiveAbs); - console.log( - `archive: wrote ${archiveRel} (${filesRel.length.toString()} files)`, - ); - } catch { - process.exitCode = 1; - } -}; - -void main(); diff --git a/eslint.config.ts b/eslint.config.ts index e6aa418..e55c618 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -18,19 +18,27 @@ export default tseslint.config( 'dist/**/*', 'docs/**/*', 'node_modules/**/*', - 'playground/**/*', + 'assets/**/*', + 'diagrams/out/**/*', ], - languageOptions: { - parserOptions: { - // Windows: force a resolved absolute path to work around a - // typescript-eslint parser bug affecting tsconfigRootDir. - tsconfigRootDir: path.resolve(), - }, + }, + + // JavaScript files: ESLint recommended + Prettier + import sorting. + { + files: ['**/*.js', '**/*.cjs', '**/*.mjs'], + ...eslint.configs.recommended, + plugins: { + prettier: prettierPlugin, + 'simple-import-sort': simpleImportSortPlugin, + }, + rules: { + 'prettier/prettier': 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', }, }, - // Base JS + TS (non type-checked) recommendations. - eslint.configs.recommended, + // TypeScript (non type-checked) recommendations. ...tseslint.configs.recommended, // Test files: Vitest recommended rules. @@ -41,6 +49,14 @@ export default tseslint.config( // Common plugins & rules. { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parserOptions: { + // Windows: force a resolved absolute path to work around a + // typescript-eslint parser bug affecting tsconfigRootDir. + tsconfigRootDir: path.resolve(), + }, + }, plugins: { prettier: prettierPlugin, 'simple-import-sort': simpleImportSortPlugin, From a7d5cba72489328b9120b6a4fb2b6e55883a73ca Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:23:55 +0800 Subject: [PATCH 19/27] lintfix --- playground/src/App.tsx | 2 +- playground/src/main.tsx | 1 + playground/vite.config.ts | 3 ++- rollup.config.ts | 1 - src/components/HelloWorld.edge-cases.test.tsx | 1 - src/components/HelloWorld.test.tsx | 1 - src/components/HelloWorld.tsx | 1 - src/index.test.tsx | 1 - src/index.ts | 1 - vitest.config.ts | 7 +------ 10 files changed, 5 insertions(+), 14 deletions(-) diff --git a/playground/src/App.tsx b/playground/src/App.tsx index e7747a5..4acbba7 100644 --- a/playground/src/App.tsx +++ b/playground/src/App.tsx @@ -1,4 +1,5 @@ import React from 'react'; + import { HelloWorld } from '../../src/components/HelloWorld'; export default function App() { @@ -8,4 +9,3 @@ export default function App() { ); } - diff --git a/playground/src/main.tsx b/playground/src/main.tsx index a18c91a..1028074 100644 --- a/playground/src/main.tsx +++ b/playground/src/main.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { createRoot } from 'react-dom/client'; + import App from './App'; const container = document.getElementById('root'); diff --git a/playground/vite.config.ts b/playground/vite.config.ts index 70874b2..f0ec777 100644 --- a/playground/vite.config.ts +++ b/playground/vite.config.ts @@ -1,6 +1,7 @@ import { fileURLToPath } from 'node:url'; -import { defineConfig } from 'vite'; + import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; export default defineConfig({ root: fileURLToPath(new URL('.', import.meta.url)), diff --git a/rollup.config.ts b/rollup.config.ts index 371d0a4..4d23ed7 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -65,4 +65,3 @@ const config: RollupOptions[] = [ ]; export default config; - diff --git a/src/components/HelloWorld.edge-cases.test.tsx b/src/components/HelloWorld.edge-cases.test.tsx index bbaa61a..f7ba0ad 100644 --- a/src/components/HelloWorld.edge-cases.test.tsx +++ b/src/components/HelloWorld.edge-cases.test.tsx @@ -19,4 +19,3 @@ describe('HelloWorld edge cases', () => { expect(screen.getByText('Hello 🚀')).toBeInTheDocument(); }); }); - diff --git a/src/components/HelloWorld.test.tsx b/src/components/HelloWorld.test.tsx index d3395da..f33700f 100644 --- a/src/components/HelloWorld.test.tsx +++ b/src/components/HelloWorld.test.tsx @@ -14,4 +14,3 @@ describe('HelloWorld', () => { expect(screen.getByText('Hello React')).toBeInTheDocument(); }); }); - diff --git a/src/components/HelloWorld.tsx b/src/components/HelloWorld.tsx index 222e544..0092f79 100644 --- a/src/components/HelloWorld.tsx +++ b/src/components/HelloWorld.tsx @@ -18,4 +18,3 @@ export type HelloWorldProps = { export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element { return
      Hello {who}
      ; } - diff --git a/src/index.test.tsx b/src/index.test.tsx index df09cf6..86ecc49 100644 --- a/src/index.test.tsx +++ b/src/index.test.tsx @@ -9,4 +9,3 @@ describe('library entry (src/index.ts)', () => { expect(screen.getByText('Hello Library')).toBeInTheDocument(); }); }); - diff --git a/src/index.ts b/src/index.ts index 8084588..c0f1ea5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,4 +5,3 @@ */ export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; - diff --git a/vitest.config.ts b/vitest.config.ts index 31b4f10..d3f92f5 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -9,12 +9,7 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'lcov'], - exclude: [ - 'docs/**', - 'dist/**', - 'playground/**', - '.rollup.cache/**', - ], + exclude: ['docs/**', 'dist/**', 'playground/**', '.rollup.cache/**'], }, }, }); From 10ad8211f7bba677fe5331a02cbdc97d44c42ce7 Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:30:06 +0800 Subject: [PATCH 20/27] chore: dedupe ESLint config; share Prettier/sort When: 2025-08-31T00:28:00Z Why: Prettier and simple-import-sort rules were duplicated across JS/TS blocks. Consolidating them reduces redundancy while keeping all non-generated code (incl. playground) in scope. What changed: - eslint.config.ts: add shared JS/TS block for Prettier and import-sort; keep JS base + TS recommended + TS-specific rules; expand Vitest test globs to include JS. - .stan/system/stan.todo.md: record change and update timestamp. --- .stan/system/stan.todo.md | 3 ++- eslint.config.ts | 45 ++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/.stan/system/stan.todo.md b/.stan/system/stan.todo.md index f0dd711..2d3aa51 100644 --- a/.stan/system/stan.todo.md +++ b/.stan/system/stan.todo.md @@ -1,4 +1,4 @@ -When updated: 2025-08-31T00:18:00Z +When updated: 2025-08-31T00:28:00Z Next up @@ -11,6 +11,7 @@ Next up Completed (recent) +- Deduped ESLint config: shared Prettier/import-sort for JS/TS; kept TS-specific rules; expanded Vitest test globs to include JS. - Fixed ESLint parser error on Windows by setting parserOptions.tsconfigRootDir = path.resolve() in eslint.config.ts. - Clarified lint/format policy: include /playground; exclude generated outputs; rely on editor Prettier (no new Lefthook script). - Added tests for library entry re-exports and HelloWorld edge cases. diff --git a/eslint.config.ts b/eslint.config.ts index e55c618..fcfc339 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,13 +1,12 @@ import path from 'node:path'; -import eslint from '@eslint/js'; import prettierConfig from 'eslint-config-prettier'; +import eslint from '@eslint/js'; import prettierPlugin from 'eslint-plugin-prettier'; import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort'; import tsDocPlugin from 'eslint-plugin-tsdoc'; import vitestPlugin from 'eslint-plugin-vitest'; import tseslint from 'typescript-eslint'; - export default tseslint.config( // Global ignores to keep lint focus on source. { @@ -23,31 +22,37 @@ export default tseslint.config( ], }, - // JavaScript files: ESLint recommended + Prettier + import sorting. + // JavaScript files: ESLint recommended base. { - files: ['**/*.js', '**/*.cjs', '**/*.mjs'], + files: ['**/*.js', '**/*.cjs', '**/*.mjs', '**/*.jsx'], ...eslint.configs.recommended, + }, + + // TypeScript (non type-checked) recommendations. + ...tseslint.configs.recommended, + + // Test files: Vitest recommended rules. + { + ...vitestPlugin.configs.recommended, + files: ['**/*.test.ts', '**/*.test.tsx', '**/*.test.js', '**/*.test.jsx'], + }, + + // Shared formatting and import sorting across JS/TS. + { + files: ['**/*.{js,cjs,mjs,jsx,ts,tsx}'], plugins: { prettier: prettierPlugin, 'simple-import-sort': simpleImportSortPlugin, }, rules: { + // Defer to the repo Prettier config (.prettierrc.json) as the single source of truth. 'prettier/prettier': 'error', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', }, }, - // TypeScript (non type-checked) recommendations. - ...tseslint.configs.recommended, - - // Test files: Vitest recommended rules. - { - ...vitestPlugin.configs.recommended, - files: ['**/*.test.ts', '**/*.test.tsx'], - }, - - // Common plugins & rules. + // TS-specific rules and parser options. { files: ['**/*.ts', '**/*.tsx'], languageOptions: { @@ -57,25 +62,17 @@ export default tseslint.config( tsconfigRootDir: path.resolve(), }, }, - plugins: { - prettier: prettierPlugin, - 'simple-import-sort': simpleImportSortPlugin, - tsdoc: tsDocPlugin, - }, + plugins: { tsdoc: tsDocPlugin }, rules: { - // Defer to the repo Prettier config (.prettierrc.json) as the single source of truth. - 'prettier/prettier': 'error', '@typescript-eslint/consistent-type-imports': 'error', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/no-unused-vars': 'error', 'no-unused-vars': 'off', - 'simple-import-sort/imports': 'error', - 'simple-import-sort/exports': 'error', 'tsdoc/syntax': 'warn', }, }, // Disable stylistic conflicts with Prettier. prettierConfig, -); +); \ No newline at end of file From abd38266f7975df70954732ea3d8f10737a0b3cf Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:34:40 +0800 Subject: [PATCH 21/27] Added license & updated README --- LICENSE | 28 ++++++++++++++++++ README.md | 86 ++++++++++++++++++++++--------------------------------- 2 files changed, 62 insertions(+), 52 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4890fcd --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2025, Jason Williscroft + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 690462f..926854b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ +> A fast, minimal, batteries‑included starter for React 18 component libraries. + # React Component Library Template (TypeScript) -> A fast, minimal, batteries‑included starter for React 18 component libraries. +> 👇 NPM & Node Current badges will be activated when you publish your component to NPM! + +[![npm version](https://img.shields.io/npm/v/@karmaniverous/react-component-npm-package-template-ts.svg)](https://www.npmjs.com/package/@karmaniverous/react-component-npm-package-template-ts) ![Node Current](https://img.shields.io/node/v/@karmaniverous/react-component-npm-package-template-ts) [![docs](https://img.shields.io/badge/docs-website-blue)](https://docs.karmanivero.us/react-component-npm-package-template-ts) [![changelog](https://img.shields.io/badge/changelog-latest-blue.svg)](https://github.com/karmaniverous/react-component-npm-package-template-ts/tree/main/CHANGELOG.md) [![license](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://github.com/karmaniverous/react-component-npm-package-template-ts/tree/main/LICENSE.md) -This template gives you a production‑ready foundation to build and publish React -components with TypeScript. It prioritizes a smooth developer experience (DX) -with fast feedback, predictable builds, and clear test and lint ergonomics. +This template gives you a production‑ready foundation to build and publish React components with TypeScript. It prioritizes a smooth developer experience (DX) with fast feedback, predictable builds, and clear test and lint ergonomics. What you get out of the box @@ -37,10 +39,10 @@ Contents Option A — GitHub “Use this template” -1) Open this repository on GitHub. -2) Click “Use this template” → “Create a new repository”. -3) Pick your owner/org and repo name, then create the repo. -4) Clone your new repo locally. +1. Open this repository on GitHub. +2. Click “Use this template” → “Create a new repository”. +3. Pick your owner/org and repo name, then create the repo. +4. Clone your new repo locally. Option B — degit (no git history) @@ -91,7 +93,7 @@ npm pkg set name='@your-scope/my-lib' version='0.0.0' \ Prepare for your first release -1) Install and verify +1. Install and verify ```bash npm install @@ -102,33 +104,31 @@ npm run typecheck npm run build ``` -2) Configure your GitHub token (for release-it) +2. Configure your GitHub token (for release-it) - Copy .env.local.template to .env.local. - - Create a GitHub Personal Access Token (classic) with “repo” scope: - https://github.com/settings/tokens + - Create a GitHub Personal Access Token (classic) with “repo” scope: https://github.com/settings/tokens - Set GITHUB_TOKEN in .env.local. -3) Push to your repo (main branch) +3. Push to your repo (main branch) ```bash git remote add origin git@github.com:your-org/my-lib.git git push -u origin main ``` -4) Release (interactive) +4. Release (interactive) ```bash npm run release ``` -release-it will bump the version (starting from 0.0.0), run lint/test/knip/build, -tag, publish to npm, and create a GitHub Release. +release-it will bump the version (starting from 0.0.0), run lint/test/knip/build, tag, publish to npm, and create a GitHub Release. ## Getting Started Prerequisites -- Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under - “Linting & formatting” about “--import tsx”. + +- Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under “Linting & formatting” about “--import tsx”. Install and initialize @@ -229,13 +229,12 @@ npm run test Notes -- The test environment is happy‑dom for speed and stability. You can switch to - jsdom later if needed. +- The test environment is happy‑dom for speed and stability. You can switch to jsdom later if needed. - Vitest excludes stale compiled tests from .rollup.cache. - Also verify your library entry (src/index.ts) re-exports what you intend. -- Also verify your library entry (src/index.ts) re-exports what you intend. - A tiny test can import from the library entry instead of deep paths: +- Also verify your library entry (src/index.ts) re-exports what you intend. A tiny test can import from the library entry instead of deep paths: + ```tsx // src/index.test.tsx import { render, screen } from '@testing-library/react'; @@ -247,15 +246,11 @@ it('re-exports HelloWorld', () => { }); ``` -- Coverage scope: docs/, dist/, and playground/ are excluded in - vitest.config.ts so coverage focuses on your source. Adjust - test.coverage.exclude as needed if you want to include or exclude - additional paths. +- Coverage scope: docs/, dist/, and playground/ are excluded in vitest.config.ts so coverage focuses on your source. Adjust test.coverage.exclude as needed if you want to include or exclude additional paths. ---## View in the browser (Vite playground) -A minimal playground is included under playground/ for fast, local viewing with -HMR. It imports your components directly from src (no publishing required). +A minimal playground is included under playground/ for fast, local viewing with HMR. It imports your components directly from src (no publishing required). Commands @@ -290,19 +285,15 @@ Outputs Externalized -- react, react-dom, and react/jsx-runtime are marked external and must be - installed by consumers. They are listed as peerDependencies and devDependencies - here for DX. +- react, react-dom, and react/jsx-runtime are marked external and must be installed by consumers. They are listed as peerDependencies and devDependencies here for DX. ESM only -- This template ships ESM only (no CJS/IIFE). Most modern toolchains support - this directly. If you need CJS, add a second Rollup target. +- This template ships ESM only (no CJS/IIFE). Most modern toolchains support this directly. If you need CJS, add a second Rollup target. Release flow (optional) -- release-it is configured to run lint/test/knip/build, generate changelog, and - publish to npm + GitHub releases. +- release-it is configured to run lint/test/knip/build, generate changelog, and publish to npm + GitHub releases. --- @@ -324,8 +315,7 @@ npm run lint:fix Node 20.6+ note -- If you see “tsx must be loaded with --import instead of --loader”, update the - lint scripts to: +- If you see “tsx must be loaded with --import instead of --loader”, update the lint scripts to: ```json { @@ -348,8 +338,7 @@ npm run typecheck Scoping -- Type checks focus on src/\*\* and test setup. Playground and test files are - excluded from typecheck to keep the build/docs pipeline friction‑free. +- Type checks focus on src/\*\* and test setup. Playground and test files are excluded from typecheck to keep the build/docs pipeline friction‑free. --- @@ -361,25 +350,20 @@ Generate docs from your TSDoc comments npm run docs ``` -Output is written to docs/. You can host this via GitHub Pages or your preferred -static host. Additional behavior is configured in typedoc.json. +Output is written to docs/. You can host this via GitHub Pages or your preferred static host. Additional behavior is configured in typedoc.json. --- ## FAQ and tips - Why ESM only? - - Simpler outputs and smaller surface area. Add a CJS target in Rollup if you - must support CJS consumers. + - Simpler outputs and smaller surface area. Add a CJS target in Rollup if you must support CJS consumers. - Where do I put styles? - - This template ships “sideEffects: false” and no CSS by default. Add your own - styling approach (CSS modules, CSS‑in‑JS, etc.) per component need. + - This template ships “sideEffects: false” and no CSS by default. Add your own styling approach (CSS modules, CSS‑in‑JS, etc.) per component need. - How do I add more components? - - Create new files under src/components, export from src/index.ts, add tests, - and render them in the playground during development. + - Create new files under src/components, export from src/index.ts, add tests, and render them in the playground during development. - Can I use Storybook or Ladle? - - Yes — add it later if you need richer component docs/demos. The Vite - playground keeps things minimal to start. + - Yes — add it later if you need richer component docs/demos. The Vite playground keeps things minimal to start. --- @@ -387,11 +371,9 @@ static host. Additional behavior is configured in typedoc.json. - Build, docs, and typecheck pass. - Tests pass with Vitest + Testing Library. -- Lint is configured with a TS flat config; if you’re on Node ≥ 20.6, consider - switching lint scripts from “--loader tsx” to “--import tsx” (see above). +- Lint is configured with a TS flat config; if you’re on Node ≥ 20.6, consider switching lint scripts from “--loader tsx” to “--import tsx” (see above). - For a typical React 18 component workflow, this template is ready to use. --- Built for you with ❤️ on Bali! Find more great tools & templates on [my GitHub Profile](https://github.com/karmaniverous). - From c4e02f48974599682df70b68bb2d823bc9bf1705 Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:45:05 +0800 Subject: [PATCH 22/27] lintfix --- README.md | 2 +- eslint.config.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 926854b..85e6c05 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This template gives you a production‑ready foundation to build and publish React components with TypeScript. It prioritizes a smooth developer experience (DX) with fast feedback, predictable builds, and clear test and lint ergonomics. -What you get out of the box +What's in the box: - React 18 + TypeScript (react‑jsx runtime) - ESM‑only bundling with Rollup (react and react‑dom externalized) diff --git a/eslint.config.ts b/eslint.config.ts index fcfc339..259cc7c 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,7 +1,7 @@ import path from 'node:path'; -import prettierConfig from 'eslint-config-prettier'; import eslint from '@eslint/js'; +import prettierConfig from 'eslint-config-prettier'; import prettierPlugin from 'eslint-plugin-prettier'; import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort'; import tsDocPlugin from 'eslint-plugin-tsdoc'; @@ -75,4 +75,4 @@ export default tseslint.config( // Disable stylistic conflicts with Prettier. prettierConfig, -); \ No newline at end of file +); From 6142d7e13e3a3d04facc51225154a92c1fc1b233 Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:46:27 +0800 Subject: [PATCH 23/27] =?UTF-8?q?docs(readme):=20add=20STAN=20+=20?= =?UTF-8?q?=E2=80=9CIn=20The=20Box=E2=80=9D=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When: 2025-08-31T00:36:00Z Why: Make the template more compelling and self-explanatory by listing all batteries included (with links), and feature STAN explicitly. Also fix lint errors from import order/newline in eslint.config.ts. What changed: - README.md: added STAN in top features; created “In The Box” section with emoji-rich subsections and authoritative links; updated Contents. - eslint.config.ts: sorted external imports per simple-import-sort and ensured EOF newline to satisfy Prettier. - .stan/system/stan.todo.md: recorded docs update and lint fix. --- README.md | 91 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 85e6c05..ef9ad69 100644 --- a/README.md +++ b/README.md @@ -10,23 +10,26 @@ This template gives you a production‑ready foundation to build and publish Rea What's in the box: -- React 18 + TypeScript (react‑jsx runtime) -- ESM‑only bundling with Rollup (react and react‑dom externalized) -- Type declarations (.d.ts) bundled via rollup-plugin-dts -- Vitest + @testing-library/react + jest‑dom (happy‑dom env) -- Vite playground for live browser testing (HMR) -- TypeScript ESLint flat config (no project parser friction) -- Prettier formatting -- TypeDoc for API documentation -- Release tooling (release-it), optional lefthook Git hooks -- Peer dependencies: react, react‑dom (>=18); sideEffects: false +- ⚛️ React 18 + TypeScript (react‑jsx runtime) +- 📦 ESM‑only bundling with Rollup (react and react‑dom externalized) +- 🧾 Type declarations (.d.ts) via rollup‑plugin‑dts +- ✅ Vitest + React Testing Library + jest‑dom (happy‑dom env) +- ⚡ Vite playground for live browser testing (HMR) +- 🧹 ESLint flat config (TypeScript) + simple‑import‑sort +- ✨ Prettier formatting +- 📚 TypeDoc for API documentation +- 🚀 release‑it for releases (optional Lefthook Git hooks) +- 🤖 STAN — AI‑assisted refactoring & patch workflow +- 🧩 Peer dependencies: react, react‑dom (>=18); sideEffects: false Contents +- In The Box - How to use this template - Getting Started - Develop React components -- Test your components- View in the browser (Vite playground) +- Test your components +- View in the browser (Vite playground) - Build and publish - Linting & formatting - Type checking @@ -35,6 +38,72 @@ Contents --- +## In The Box + +Delightful defaults with modern tooling — batteries included, no drama. + +### ⚛️ React 18 + TypeScript (react‑jsx runtime) + +- React: https://react.dev +- TypeScript JSX options (react‑jsx automatic runtime): https://www.typescriptlang.org/docs/handbook/jsx.html +- New JSX Transform (background): https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html + +### 📦 ESM‑only bundling with Rollup + +- Rollup (bundler): https://rollupjs.org +- Externalized: `react`, `react-dom`, and `react/jsx-runtime` (smaller bundles; consumers bring their own React) + +### 🧾 Type declarations (.d.ts) via rollup‑plugin‑dts + +- rollup‑plugin‑dts: https://github.com/Swatinem/rollup-plugin-dts +- Ships `dist/index.d.ts` for consumers and API docs + +### ✅ Testing: Vitest + Testing Library + jest‑dom (happy‑dom) + +- Vitest: https://vitest.dev +- React Testing Library: https://testing-library.com/docs/react-testing-library/intro/ +- jest‑dom matchers: https://testing-library.com/docs/ecosystem-jest-dom/ +- happy‑dom (fast, stable DOM env): https://github.com/capricorn86/happy-dom + +### ⚡ Vite playground (HMR) + +- Vite: https://vite.dev +- Local dev playground under `/playground` for instant feedback without publishing + +### 🧹 ESLint flat config (TypeScript) + simple‑import‑sort + +- ESLint “flat” config: https://eslint.org/docs/latest/use/configure/configuration-files +- typescript‑eslint: https://typescript-eslint.io +- simple‑import‑sort keeps imports tidy by default + +### ✨ Prettier formatting + +- Prettier: https://prettier.io +- Opinionated, consistent formatting with `endOfLine: "lf"` for cross‑platform harmony + +### 📚 TypeDoc API documentation + +- TypeDoc: https://typedoc.org +- Generates browsable API docs from your TSDoc comments + +### 🚀 Release automation (release‑it) + optional Lefthook + +- release‑it: https://github.com/release-it/release-it +- Lefthook (optional Git hooks manager): https://lefthook.dev +- Version bump, changelog, GitHub release, npm publish — all wired + +### 🤖 STAN — AI‑assisted refactoring & patch workflow + +- STAN: https://github.com/karmaniverous/stan +- A rigorous, patch‑first assistant that helps refactor safely, keep docs in sync, and maintain clean diffs + +### 🧩 Peer dependencies & tree‑shaking + +- peerDependencies (npm): https://docs.npmjs.com/files/package.json/ +- `sideEffects: false` (tree‑shaking hint): https://webpack.js.org/guides/tree-shaking/ + +--- + ## How to use this template Option A — GitHub “Use this template” From 956bf53d851d12b198653d30248b660bde66d23f Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:46:49 +0800 Subject: [PATCH 24/27] updated docs --- docs/assets/highlight.css | 39 ++-- docs/documents/CHANGELOG.html | 4 +- docs/functions/index.HelloWorld.html | 4 +- docs/hierarchy.html | 2 +- docs/index.html | 248 ++++++++++++++++++++------ docs/modules.html | 2 +- docs/modules/index.html | 4 +- docs/sitemap.xml | 14 +- docs/types/index.HelloWorldProps.html | 6 +- 9 files changed, 233 insertions(+), 90 deletions(-) diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 59ea05f..e75d706 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -5,24 +5,26 @@ --dark-hl-1: #D4D4D4; --light-hl-2: #A31515; --dark-hl-2: #CE9178; - --light-hl-3: #008000; - --dark-hl-3: #6A9955; - --light-hl-4: #AF00DB; - --dark-hl-4: #C586C0; - --light-hl-5: #0000FF; - --dark-hl-5: #569CD6; - --light-hl-6: #267F99; - --dark-hl-6: #4EC9B0; - --light-hl-7: #001080; - --dark-hl-7: #9CDCFE; - --light-hl-8: #800000; - --dark-hl-8: #808080; + --light-hl-3: #0000FF; + --dark-hl-3: #569CD6; + --light-hl-4: #EE0000; + --dark-hl-4: #D7BA7D; + --light-hl-5: #008000; + --dark-hl-5: #6A9955; + --light-hl-6: #AF00DB; + --dark-hl-6: #C586C0; + --light-hl-7: #267F99; + --dark-hl-7: #4EC9B0; + --light-hl-8: #001080; + --dark-hl-8: #9CDCFE; --light-hl-9: #800000; - --dark-hl-9: #569CD6; - --light-hl-10: #E50000; - --dark-hl-10: #9CDCFE; - --light-hl-11: #0451A5; + --dark-hl-9: #808080; + --light-hl-10: #800000; + --dark-hl-10: #569CD6; + --light-hl-11: #E50000; --dark-hl-11: #9CDCFE; + --light-hl-12: #0451A5; + --dark-hl-12: #9CDCFE; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -40,6 +42,7 @@ --hl-9: var(--light-hl-9); --hl-10: var(--light-hl-10); --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); --code-background: var(--light-code-background); } } @@ -56,6 +59,7 @@ --hl-9: var(--dark-hl-9); --hl-10: var(--dark-hl-10); --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); --code-background: var(--dark-code-background); } } @@ -72,6 +76,7 @@ --hl-9: var(--light-hl-9); --hl-10: var(--light-hl-10); --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); --code-background: var(--light-code-background); } @@ -88,6 +93,7 @@ --hl-9: var(--dark-hl-9); --hl-10: var(--dark-hl-10); --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); --code-background: var(--dark-code-background); } @@ -103,4 +109,5 @@ .hl-9 { color: var(--hl-9); } .hl-10 { color: var(--hl-10); } .hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } pre, code { background: var(--code-background); } diff --git a/docs/documents/CHANGELOG.html b/docs/documents/CHANGELOG.html index a0ca351..0d30eb9 100644 --- a/docs/documents/CHANGELOG.html +++ b/docs/documents/CHANGELOG.html @@ -1,4 +1,4 @@ -CHANGELOG | @your-scope/react-component-template

      All notable changes to this project will be documented in this file. Dates are displayed in UTC.

      +CHANGELOG | @karmaniverous/react-component-npm-package-template-ts

      All notable changes to this project will be documented in this file. Dates are displayed in UTC.

      • Initial commit 76856f2
      • Fix vitest typescript error 1144b8f
      • @@ -13,4 +13,4 @@
      -
      +
      diff --git a/docs/functions/index.HelloWorld.html b/docs/functions/index.HelloWorld.html index e7552ab..c474f1e 100644 --- a/docs/functions/index.HelloWorld.html +++ b/docs/functions/index.HelloWorld.html @@ -1,6 +1,6 @@ -HelloWorld | @your-scope/react-component-template

      Function HelloWorld

      diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 8cac4b9..42558f2 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -@your-scope/react-component-template

      @your-scope/react-component-template

      Hierarchy Summary

      +@karmaniverous/react-component-npm-package-template-ts

      @karmaniverous/react-component-npm-package-template-ts

      Hierarchy Summary

      diff --git a/docs/index.html b/docs/index.html index c236199..7b137f2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,24 +1,29 @@ -@your-scope/react-component-template

      @your-scope/react-component-template

      React Component Library Template (TypeScript)

      +@karmaniverous/react-component-npm-package-template-ts

      @karmaniverous/react-component-npm-package-template-ts

      A fast, minimal, batteries‑included starter for React 18 component libraries.

      -

      This template gives you a production‑ready foundation to build and publish React -components with TypeScript. It prioritizes a smooth developer experience (DX) -with fast feedback, predictable builds, and clear test and lint ergonomics.

      -

      What you get out of the box

      -
        -
      • React 18 + TypeScript (react‑jsx runtime)
      • -
      • ESM‑only bundling with Rollup (react and react‑dom externalized)
      • -
      • Type declarations (.d.ts) bundled via rollup-plugin-dts
      • -
      • Vitest + @testing-library/react + jest‑dom (happy‑dom env)
      • -
      • Vite playground for live browser testing (HMR)
      • -
      • TypeScript ESLint flat config (no project parser friction)
      • -
      • Prettier formatting
      • -
      • TypeDoc for API documentation
      • -
      • Release tooling (release-it), optional lefthook Git hooks
      • -
      • Peer dependencies: react, react‑dom (>=18); sideEffects: false
      • +

        React Component Library Template (TypeScript)

        +

        👇 NPM & Node Current badges will be activated when you publish your component to NPM!

        +
        +

        npm version Node Current license

        +

        This template gives you a production‑ready foundation to build and publish React components with TypeScript. It prioritizes a smooth developer experience (DX) with fast feedback, predictable builds, and clear test and lint ergonomics.

        +

        What's in the box:

        +
          +
        • ⚛️ React 18 + TypeScript (react‑jsx runtime)
        • +
        • 📦 ESM‑only bundling with Rollup (react and react‑dom externalized)
        • +
        • 🧾 Type declarations (.d.ts) via rollup‑plugin‑dts
        • +
        • ✅ Vitest + React Testing Library + jest‑dom (happy‑dom env)
        • +
        • ⚡ Vite playground for live browser testing (HMR)
        • +
        • 🧹 ESLint flat config (TypeScript) + simple‑import‑sort
        • +
        • ✨ Prettier formatting
        • +
        • 📚 TypeDoc for API documentation
        • +
        • 🚀 release‑it for releases (optional Lefthook Git hooks)
        • +
        • 🤖 STAN — AI‑assisted refactoring & patch workflow
        • +
        • 🧩 Peer dependencies: react, react‑dom (>=18); sideEffects: false

        Contents

          +
        • In The Box
        • +
        • How to use this template
        • Getting Started
        • Develop React components
        • Test your components
        • @@ -30,13 +35,142 @@
        • FAQ and tips

        +

        Delightful defaults with modern tooling — batteries included, no drama.

        + +
          +
        • Rollup (bundler): https://rollupjs.org
        • +
        • Externalized: react, react-dom, and react/jsx-runtime (smaller bundles; consumers bring their own React)
        • +
        + + +
          +
        • Vite: https://vite.dev
        • +
        • Local dev playground under /playground for instant feedback without publishing
        • +
        + +
          +
        • Prettier: https://prettier.io
        • +
        • Opinionated, consistent formatting with endOfLine: "lf" for cross‑platform harmony
        • +
        + + + + +
        +

        Option A — GitHub “Use this template”

        +
          +
        1. Open this repository on GitHub.
        2. +
        3. Click “Use this template” → “Create a new repository”.
        4. +
        5. Pick your owner/org and repo name, then create the repo.
        6. +
        7. Clone your new repo locally.
        8. +
        +

        Option B — degit (no git history)

        +
        npx degit karmaniverous/react-component-npm-package-template-ts my-lib
        cd my-lib
        git init && git add -A && git commit -m "chore: scaffold from template" +
        + +

        Option C — shallow clone then reset history

        +
        git clone --depth=1 https://github.com/karmaniverous/react-component-npm-package-template-ts my-lib
        cd my-lib
        rm -rf .git
        git init && git add -A && git commit -m "chore: scaffold from template" +
        + +

        Replace placeholders (package.json and docs)

        +
          +
        • package.json +
            +
          • name: Use your scoped package, e.g. @your-scope/my-lib
          • +
          • version: 0.0.0 (start here; release-it will bump on first release)
          • +
          • description, author, license
          • +
          • repository.url: git+https://github.com/your-org/my-lib.git
          • +
          • bugs.url: https://github.com/your-org/my-lib/issues
          • +
          • homepage: https://github.com/your-org/my-lib#readme
          • +
          • keywords: adjust for your library
          • +
          • publishConfig.access: public (keep for public scoped packages)
          • +
          +
        • +
        • README.md +
            +
          • Title, import examples (replace @your-scope/react-component-template with your real package name)
          • +
          +
        • +
        • typedoc.json +
            +
          • hostedBaseUrl and navigationLinks.GitHub to point to your repo/docs
          • +
          +
        • +
        • FUNDING.yml (optional) +
            +
          • Update to your funding info or remove
          • +
          +
        • +
        +

        Quick package.json edits with npm

        +
        npm pkg set name='@your-scope/my-lib' version='0.0.0' \
        description='My awesome React component library' \
        author='Your Name <you@example.com>' license='MIT' \
        repository.type='git' \
        repository.url='git+https://github.com/your-org/my-lib.git' \
        bugs.url='https://github.com/your-org/my-lib/issues' \
        homepage='https://github.com/your-org/my-lib#readme' +
        + +

        Prepare for your first release

        +
          +
        1. Install and verify
        2. +
        +
        npm install
        npx lefthook install # optional
        npm run lint
        npm run test
        npm run typecheck
        npm run build +
        + +
          +
        1. +

          Configure your GitHub token (for release-it)

          +
            +
          • Copy .env.local.template to .env.local.
          • +
          • Create a GitHub Personal Access Token (classic) with “repo” scope: https://github.com/settings/tokens
          • +
          • Set GITHUB_TOKEN in .env.local.
          • +
          +
        2. +
        3. +

          Push to your repo (main branch)

          +
        4. +
        +
        git remote add origin git@github.com:your-org/my-lib.git
        git push -u origin main +
        + +
          +
        1. Release (interactive)
        2. +
        +
        npm run release
        +
        + +

        release-it will bump the version (starting from 0.0.0), run lint/test/knip/build, tag, publish to npm, and create a GitHub Release.

        Prerequisites

          -
        • Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under -“Linting & formatting” about “--import tsx”.
        • +
        • Node.js 20+ (recommended). If you use node >= 20.6, see the lint note under “Linting & formatting” about “--import tsx”.

        Install and initialize

        -
        npm install
        npx lefthook install # optional Git hooks (branch naming, etc.) +
        npm install
        npx lefthook install # optional Git hooks (branch naming, etc.)

        Run tests and type checks to verify your environment

        @@ -44,7 +178,7 @@

        Start the browser playground (HMR)

        -
        npm run dev
        # opens http://localhost:5173 (by default) +
        npm run dev
        # opens http://localhost:5173 (by default)

        @@ -54,15 +188,15 @@

      Example: a simple HelloWorld component (already included)

      -
      // src/components/HelloWorld.tsx
      export type HelloWorldProps = { who?: string };

      export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element {
      return <div>Hello {who}</div>;
      } +
      // src/components/HelloWorld.tsx
      export type HelloWorldProps = { who?: string };

      export function HelloWorld({ who = 'World' }: HelloWorldProps): JSX.Element {
      return <div>Hello {who}</div>;
      }

      Re-export in your library entry

      -
      // src/index.ts
      export { HelloWorld, type HelloWorldProps } from './components/HelloWorld'; +
      // src/index.ts
      export { HelloWorld, type HelloWorldProps } from './components/HelloWorld';

      Consume from another app after publishing

      -
      import { HelloWorld } from '@your-scope/react-component-template';

      export default function App() {
      return <HelloWorld who="React" />;
      } +
      import { HelloWorld } from '@your-scope/react-component-template';

      export default function App() {
      return <HelloWorld who="React" />;
      }

      @@ -73,7 +207,7 @@
      +
      diff --git a/docs/modules.html b/docs/modules.html index 412a8de..556de08 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1 +1 @@ -@your-scope/react-component-template

        @your-scope/react-component-template

        Documents

        CHANGELOG

        Modules

        index
        +@karmaniverous/react-component-npm-package-template-ts

          @karmaniverous/react-component-npm-package-template-ts

          Documents

          CHANGELOG

          Modules

          index
          diff --git a/docs/modules/index.html b/docs/modules/index.html index 4c12ef6..4d21ab1 100644 --- a/docs/modules/index.html +++ b/docs/modules/index.html @@ -1,2 +1,2 @@ -index | @your-scope/react-component-template

          Module index

          This is the main entry point for the library.

          -

          Type Aliases

          HelloWorldProps

          Functions

          HelloWorld
          +index | @karmaniverous/react-component-npm-package-template-ts

          Module index

          This is the main entry point for the library.

          +

          Type Aliases

          HelloWorldProps

          Functions

          HelloWorld
          diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 03971f0..fe7a064 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,30 +2,30 @@ https://docs.karmanivero.us/npm-package-template-ts/index.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z https://docs.karmanivero.us/npm-package-template-ts/modules.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z https://docs.karmanivero.us/npm-package-template-ts/hierarchy.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z https://docs.karmanivero.us/npm-package-template-ts/documents/CHANGELOG.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z https://docs.karmanivero.us/npm-package-template-ts/modules/index.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z https://docs.karmanivero.us/npm-package-template-ts/types/index.HelloWorldProps.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z https://docs.karmanivero.us/npm-package-template-ts/functions/index.HelloWorld.html - 2025-08-31T02:13:27.807Z + 2025-08-31T05:46:39.493Z diff --git a/docs/types/index.HelloWorldProps.html b/docs/types/index.HelloWorldProps.html index 109c41b..3083863 100644 --- a/docs/types/index.HelloWorldProps.html +++ b/docs/types/index.HelloWorldProps.html @@ -1,4 +1,4 @@ -HelloWorldProps | @your-scope/react-component-template

          Type Alias HelloWorldProps

          HelloWorldProps defines the props for the HelloWorld component.

          -
          type HelloWorldProps = {
              who?: string;
          }
          Index

          Properties

          who? +HelloWorldProps | @karmaniverous/react-component-npm-package-template-ts

          Type Alias HelloWorldProps

          HelloWorldProps defines the props for the HelloWorld component.

          +
          type HelloWorldProps = {
              who?: string;
          }
          Index

          Properties

          Properties

          who?: string

          Whom to greet. Defaults to "World".

          -
          +
          From bd31c56fa4b4358766f9613f5efb5bfcfb202e9f Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:50:55 +0800 Subject: [PATCH 25/27] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ef9ad69..f12de4a 100644 --- a/README.md +++ b/README.md @@ -301,7 +301,6 @@ Notes - The test environment is happy‑dom for speed and stability. You can switch to jsdom later if needed. - Vitest excludes stale compiled tests from .rollup.cache. -- Also verify your library entry (src/index.ts) re-exports what you intend. - Also verify your library entry (src/index.ts) re-exports what you intend. A tiny test can import from the library entry instead of deep paths: ```tsx From ab11e12f48a9c13e06464ca42d7e4a0d9c22306a Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:51:24 +0800 Subject: [PATCH 26/27] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f12de4a..c38ecaa 100644 --- a/README.md +++ b/README.md @@ -316,7 +316,9 @@ it('re-exports HelloWorld', () => { - Coverage scope: docs/, dist/, and playground/ are excluded in vitest.config.ts so coverage focuses on your source. Adjust test.coverage.exclude as needed if you want to include or exclude additional paths. ----## View in the browser (Vite playground) +--- + +## View in the browser (Vite playground) A minimal playground is included under playground/ for fast, local viewing with HMR. It imports your components directly from src (no publishing required). From 8c3e405ba7da1794d4171d44f662824016e18d04 Mon Sep 17 00:00:00 2001 From: Jason Williscroft Date: Sun, 31 Aug 2025 13:53:03 +0800 Subject: [PATCH 27/27] updated docs --- docs/functions/index.HelloWorld.html | 2 +- docs/index.html | 9 +++------ docs/sitemap.xml | 14 +++++++------- docs/types/index.HelloWorldProps.html | 4 ++-- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/docs/functions/index.HelloWorld.html b/docs/functions/index.HelloWorld.html index c474f1e..ef57410 100644 --- a/docs/functions/index.HelloWorld.html +++ b/docs/functions/index.HelloWorld.html @@ -3,4 +3,4 @@
        • Targets React 18 with the modern react-jsx runtime.
        • No styling is applied by default.
        • -
          +
          diff --git a/docs/index.html b/docs/index.html index 7b137f2..467591b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -223,9 +223,6 @@