Initial monorepo setup

This commit is contained in:
Mats Bosson 2026-03-29 02:30:05 +07:00
commit 405ce15933
11 changed files with 210 additions and 0 deletions

19
.eslintrc.cjs Normal file
View File

@ -0,0 +1,19 @@
/** @type {import('eslint').Linter.Config} */
module.exports = {
root: true,
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: 2020,
sourceType: "module",
},
plugins: ["solid"],
extends: ["plugin:solid/typescript"],
rules: {
// Only Solid-specific rules — everything else handled by Biome
"solid/reactivity": "error",
"solid/no-destructure": "error",
"solid/prefer-for": "warn",
"solid/no-react-deps": "error",
"solid/no-react-specific-props": "error",
},
};

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
node_modules/
dist/
.tsdown/
coverage/
*.tsbuildinfo
.superpowers/

33
biome.json Normal file
View File

@ -0,0 +1,33 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": { "enabled": true },
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noExplicitAny": "error"
},
"style": {
"useConst": "error",
"useTemplate": "error"
}
}
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"semicolons": "always",
"trailingCommas": "all"
}
},
"files": {
"ignore": ["node_modules", "dist", ".tsdown", "coverage"]
}
}

18
package.json Normal file
View File

@ -0,0 +1,18 @@
{
"name": "pettyui-monorepo",
"private": true,
"scripts": {
"build": "pnpm -r build",
"test": "pnpm -r test",
"lint": "biome check . && eslint packages --ext .ts,.tsx",
"format": "biome format --write .",
"typecheck": "pnpm -r typecheck"
},
"devDependencies": {
"@biomejs/biome": "^1.9.0",
"eslint": "^9.0.0",
"eslint-plugin-solid": "^0.14.0",
"typescript": "^6.0.2",
"zod": "^4.3.6"
}
}

View File

@ -0,0 +1,71 @@
{
"name": "pettyui",
"version": "0.1.0",
"description": "AI-native headless UI component library for SolidJS",
"type": "module",
"exports": {
".": {
"solid": "./src/index.ts",
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
"./dialog": {
"solid": "./src/components/dialog/index.ts",
"import": "./dist/dialog/index.js",
"require": "./dist/dialog/index.cjs"
},
"./presence": {
"solid": "./src/utilities/presence/index.ts",
"import": "./dist/utilities/presence/index.js",
"require": "./dist/utilities/presence/index.cjs"
},
"./focus-trap": {
"solid": "./src/utilities/focus-trap/index.ts",
"import": "./dist/utilities/focus-trap/index.js",
"require": "./dist/utilities/focus-trap/index.cjs"
},
"./scroll-lock": {
"solid": "./src/utilities/scroll-lock/index.ts",
"import": "./dist/utilities/scroll-lock/index.js",
"require": "./dist/utilities/scroll-lock/index.cjs"
},
"./dismiss": {
"solid": "./src/utilities/dismiss/index.ts",
"import": "./dist/utilities/dismiss/index.js",
"require": "./dist/utilities/dismiss/index.cjs"
},
"./portal": {
"solid": "./src/utilities/portal/index.ts",
"import": "./dist/utilities/portal/index.js",
"require": "./dist/utilities/portal/index.cjs"
},
"./visually-hidden": {
"solid": "./src/utilities/visually-hidden/index.ts",
"import": "./dist/utilities/visually-hidden/index.js",
"require": "./dist/utilities/visually-hidden/index.cjs"
}
},
"scripts": {
"build": "tsdown",
"test": "vitest run",
"test:watch": "vitest",
"typecheck": "tsc --noEmit"
},
"peerDependencies": {
"solid-js": "^1.9.0"
},
"dependencies": {
"@floating-ui/dom": "^1.7.6"
},
"devDependencies": {
"@solidjs/testing-library": "^0.8.10",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/user-event": "^14.0.0",
"jsdom": "^26.0.0",
"solid-js": "^1.9.12",
"tsdown": "^0.21.7",
"vite": "^8.0.3",
"vite-plugin-solid": "^2.11.11",
"vitest": "^4.1.2"
}
}

View File

@ -0,0 +1 @@
import "@testing-library/jest-dom";

View File

@ -0,0 +1,11 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist",
"baseUrl": ".",
"paths": {}
},
"include": ["src"],
"exclude": ["node_modules", "dist", "tests"]
}

View File

@ -0,0 +1,19 @@
import { defineConfig } from "tsdown";
export default defineConfig({
entry: {
index: "src/index.ts",
"dialog/index": "src/components/dialog/index.ts",
"presence/index": "src/utilities/presence/index.ts",
"focus-trap/index": "src/utilities/focus-trap/index.ts",
"scroll-lock/index": "src/utilities/scroll-lock/index.ts",
"dismiss/index": "src/utilities/dismiss/index.ts",
"portal/index": "src/utilities/portal/index.ts",
"visually-hidden/index": "src/utilities/visually-hidden/index.ts",
},
format: ["esm", "cjs"],
dts: true,
clean: true,
sourcemap: true,
external: ["solid-js", "solid-js/web", "solid-js/store"],
});

View File

@ -0,0 +1,12 @@
import { defineConfig } from "vite";
import solid from "vite-plugin-solid";
export default defineConfig({
plugins: [solid()],
test: {
environment: "jsdom",
globals: true,
setupFiles: ["./tests/setup.ts"],
transformMode: { web: [/\.[jt]sx?$/] },
},
});

2
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,2 @@
packages:
- "packages/*"

18
tsconfig.base.json Normal file
View File

@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "preserve",
"jsxImportSource": "solid-js",
"strict": true,
"exactOptionalPropertyTypes": true,
"noUncheckedIndexedAccess": true,
"verbatimModuleSyntax": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"esModuleInterop": false,
"skipLibCheck": true
}
}