From 405ce15933904ac7df271674c56285d398b5b512 Mon Sep 17 00:00:00 2001 From: Mats Bosson Date: Sun, 29 Mar 2026 02:30:05 +0700 Subject: [PATCH] Initial monorepo setup --- .eslintrc.cjs | 19 +++++++++ .gitignore | 6 +++ biome.json | 33 ++++++++++++++++ package.json | 18 +++++++++ packages/core/package.json | 71 ++++++++++++++++++++++++++++++++++ packages/core/tests/setup.ts | 1 + packages/core/tsconfig.json | 11 ++++++ packages/core/tsdown.config.ts | 19 +++++++++ packages/core/vite.config.ts | 12 ++++++ pnpm-workspace.yaml | 2 + tsconfig.base.json | 18 +++++++++ 11 files changed, 210 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 biome.json create mode 100644 package.json create mode 100644 packages/core/package.json create mode 100644 packages/core/tests/setup.ts create mode 100644 packages/core/tsconfig.json create mode 100644 packages/core/tsdown.config.ts create mode 100644 packages/core/vite.config.ts create mode 100644 pnpm-workspace.yaml create mode 100644 tsconfig.base.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..8314914 --- /dev/null +++ b/.eslintrc.cjs @@ -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", + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c43cd57 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +.tsdown/ +coverage/ +*.tsbuildinfo +.superpowers/ diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..0f4d4e7 --- /dev/null +++ b/biome.json @@ -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"] + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a1d53f6 --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..cd465c5 --- /dev/null +++ b/packages/core/package.json @@ -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" + } +} diff --git a/packages/core/tests/setup.ts b/packages/core/tests/setup.ts new file mode 100644 index 0000000..d0de870 --- /dev/null +++ b/packages/core/tests/setup.ts @@ -0,0 +1 @@ +import "@testing-library/jest-dom"; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000..9405dd6 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "baseUrl": ".", + "paths": {} + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/packages/core/tsdown.config.ts b/packages/core/tsdown.config.ts new file mode 100644 index 0000000..561ebeb --- /dev/null +++ b/packages/core/tsdown.config.ts @@ -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"], +}); diff --git a/packages/core/vite.config.ts b/packages/core/vite.config.ts new file mode 100644 index 0000000..0d4ed06 --- /dev/null +++ b/packages/core/vite.config.ts @@ -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?$/] }, + }, +}); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..dee51e9 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..3fd4bf8 --- /dev/null +++ b/tsconfig.base.json @@ -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 + } +}