From 63a5413c116ee98644e6b466ddb705509c399766 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:01:07 +0000 Subject: [PATCH 1/5] Initial plan From bebd7b4847501ab616a4f4f868c0b0fc91b6b39a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:08:38 +0000 Subject: [PATCH 2/5] Create multi-package monorepo structure Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com> --- .changeset/config.json | 4 +- .gitignore | 4 + README.md | 273 +----- package.json | 20 +- packages/constants/README.md | 48 + packages/constants/package.json | 30 + packages/constants/src/index.ts | 13 + .../constants/src}/paths.ts | 0 packages/constants/tsconfig.json | 9 + packages/meta/README.md | 61 ++ packages/meta/package.json | 32 + .../meta => packages/meta/src}/field-type.ts | 0 packages/meta/src/index.ts | 16 + .../meta/src}/object-entity.ts | 0 .../meta/src}/object-field.ts | 0 .../meta => packages/meta/src}/object-view.ts | 0 packages/meta/tsconfig.json | 9 + packages/plugin/README.md | 63 ++ packages/plugin/package.json | 30 + packages/plugin/src/index.ts | 12 + {src/types => packages/plugin/src}/plugin.ts | 0 packages/plugin/tsconfig.json | 9 + packages/schemas/README.md | 56 ++ packages/schemas/package.json | 33 + packages/schemas/src/index.ts | 12 + .../schemas/src}/manifest.zod.ts | 0 packages/schemas/tsconfig.json | 9 + packages/spec/README.md | 61 ++ packages/spec/package.json | 37 + {src => packages/spec/src}/index.ts | 29 +- packages/spec/tsconfig.json | 9 + pnpm-lock.yaml | 858 ++++++++++++++++++ pnpm-workspace.yaml | 2 + src/examples.ts | 257 ------ src/types/index.ts | 9 - src/types/meta/index.ts | 13 - 36 files changed, 1469 insertions(+), 549 deletions(-) create mode 100644 packages/constants/README.md create mode 100644 packages/constants/package.json create mode 100644 packages/constants/src/index.ts rename {src/constants => packages/constants/src}/paths.ts (100%) create mode 100644 packages/constants/tsconfig.json create mode 100644 packages/meta/README.md create mode 100644 packages/meta/package.json rename {src/types/meta => packages/meta/src}/field-type.ts (100%) create mode 100644 packages/meta/src/index.ts rename {src/types/meta => packages/meta/src}/object-entity.ts (100%) rename {src/types/meta => packages/meta/src}/object-field.ts (100%) rename {src/types/meta => packages/meta/src}/object-view.ts (100%) create mode 100644 packages/meta/tsconfig.json create mode 100644 packages/plugin/README.md create mode 100644 packages/plugin/package.json create mode 100644 packages/plugin/src/index.ts rename {src/types => packages/plugin/src}/plugin.ts (100%) create mode 100644 packages/plugin/tsconfig.json create mode 100644 packages/schemas/README.md create mode 100644 packages/schemas/package.json create mode 100644 packages/schemas/src/index.ts rename {src/schemas => packages/schemas/src}/manifest.zod.ts (100%) create mode 100644 packages/schemas/tsconfig.json create mode 100644 packages/spec/README.md create mode 100644 packages/spec/package.json rename {src => packages/spec/src}/index.ts (59%) create mode 100644 packages/spec/tsconfig.json create mode 100644 pnpm-workspace.yaml delete mode 100644 src/examples.ts delete mode 100644 src/types/index.ts delete mode 100644 src/types/meta/index.ts diff --git a/.changeset/config.json b/.changeset/config.json index 0e214ca72..472c1a875 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -3,7 +3,9 @@ "changelog": ["@changesets/cli/changelog", { "repo": "objectstack-ai/spec" }], "commit": false, "fixed": [], - "linked": [], + "linked": [ + ["@objectstack/spec-meta", "@objectstack/spec-plugin", "@objectstack/spec-schemas", "@objectstack/spec-constants", "@objectstack/spec"] + ], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", diff --git a/.gitignore b/.gitignore index 90d567ecc..ff9ddab53 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,7 @@ coverage/ # Temporary files tmp/ temp/ + +# Package builds +packages/*/dist/ +packages/*/*.tsbuildinfo diff --git a/README.md b/README.md index 8068cf933..f92b54236 100644 --- a/README.md +++ b/README.md @@ -7,279 +7,84 @@ ## 📜 Overview -This package defines the **core interfaces, schemas, and conventions** for the ObjectStack ecosystem. It serves as the "Constitution" - the shared language that ObjectOS, ObjectStudio, ObjectCloud, and all third-party plugins use to communicate. +This monorepo contains the **core interfaces, schemas, and conventions** for the ObjectStack ecosystem. It serves as the "Constitution" - the shared language that ObjectOS, ObjectStudio, ObjectCloud, and all third-party plugins use to communicate. **Guiding Principle:** *"Strict Types, No Logic"* -This package contains: -- ✅ TypeScript Interfaces (Shared types) -- ✅ Zod Schemas (Validation rules with type inference) -- ✅ Constants (Convention configurations) +## 📦 Packages -This package does NOT contain: -- ❌ Database connections -- ❌ UI components -- ❌ Runtime business logic +This repository is organized as a monorepo with the following packages: + +### Core Packages + +- **[@objectstack/spec](./packages/spec)** - Main package that re-exports everything (use this for convenience) +- **[@objectstack/spec-meta](./packages/meta)** - Metamodel type definitions (ObjectEntity, ObjectField, ObjectView) +- **[@objectstack/spec-plugin](./packages/plugin)** - Plugin runtime interfaces (ObjectStackPlugin, PluginContext) +- **[@objectstack/spec-schemas](./packages/schemas)** - Zod validation schemas (ManifestSchema, MenuItemSchema) +- **[@objectstack/spec-constants](./packages/constants)** - Convention constants (PKG_CONVENTIONS) ## 🚀 Installation +### Install the main package (recommended) + ```bash pnpm install @objectstack/spec ``` -## 📦 What's Inside - -### 1. Manifest Schema (`ManifestSchema`) - -Defines the structure of a package configuration file. All packages (apps, plugins, drivers, modules) must conform to this schema. - -```typescript -import { ManifestSchema, type ObjectStackManifest } from '@objectstack/spec'; - -// Validate a manifest -const manifest: ObjectStackManifest = { - id: 'com.example.myapp', - version: '1.0.0', - type: 'plugin', - name: 'My App', - permissions: ['system.user.read'], - menus: [ - { label: 'Dashboard', path: '/dashboard', icon: 'home' } - ] -}; +### Install individual packages (for smaller bundle sizes) -// Validate with Zod -ManifestSchema.parse(manifest); +```bash +pnpm install @objectstack/spec-meta +pnpm install @objectstack/spec-plugin +pnpm install @objectstack/spec-schemas +pnpm install @objectstack/spec-constants ``` -### 2. Plugin Runtime Interface (`ObjectStackPlugin`) +## 📚 Usage -Defines the contract that every plugin must implement to be loaded by ObjectOS. +### Using the main package ```typescript -import { ObjectStackPlugin, PluginContext } from '@objectstack/spec'; - -export default function createPlugin(): ObjectStackPlugin { - return { - async onInstall(ctx: PluginContext) { - ctx.logger.info('Plugin installed'); - }, - - async onEnable(ctx: PluginContext) { - ctx.logger.info('Plugin enabled'); - }, - - async onDisable(ctx: PluginContext) { - ctx.logger.info('Plugin disabled'); - } - }; -} +import { + ObjectEntity, + ObjectStackPlugin, + ManifestSchema, + PKG_CONVENTIONS +} from '@objectstack/spec'; ``` -### 3. Directory Conventions (`PKG_CONVENTIONS`) - -Defines the "Law of Location" - where things must be in ObjectStack packages. +### Using individual packages ```typescript -import { PKG_CONVENTIONS } from '@objectstack/spec'; - -console.log(PKG_CONVENTIONS.DIRS.SCHEMA); // 'src/schemas' -console.log(PKG_CONVENTIONS.DIRS.TRIGGERS); // 'src/triggers' -console.log(PKG_CONVENTIONS.FILES.MANIFEST); // 'objectstack.config.ts' +import { ObjectEntity } from '@objectstack/spec-meta'; +import { ObjectStackPlugin } from '@objectstack/spec-plugin'; +import { ManifestSchema } from '@objectstack/spec-schemas'; +import { PKG_CONVENTIONS } from '@objectstack/spec-constants'; ``` -## 📚 API Reference - -### Schemas - -- `ManifestSchema` - Zod schema for package manifests -- `MenuItemSchema` - Zod schema for menu items -- `ObjectStackManifest` - TypeScript type for manifests -- `MenuItem` - TypeScript type for menu items - -### Types - -- `ObjectStackPlugin` - Plugin interface with lifecycle methods -- `PluginContext` - Context provided to plugin methods -- `PluginFactory` - Plugin factory function type -- `PluginLogger` - Logger interface -- `ObjectQLClient` - Database client interface -- `ObjectOSKernel` - OS kernel interface - -### Constants - -- `PKG_CONVENTIONS` - Directory and file conventions -- `PackageDirectory` - Type for package directories -- `PackageFile` - Type for package files - ## 🏗️ Development ```bash # Install dependencies pnpm install -# Build the project +# Build all packages pnpm run build -# Watch mode for development +# Watch mode for development (all packages) pnpm run dev # Clean build artifacts pnpm run clean ``` -## 📄 License -# ObjectStack Specification - -The ObjectStack Protocol & Specification repository defines the core type definitions and interfaces for the ObjectStack ecosystem. This repository serves as the "Constitution" of the system, providing the contract between backend (ObjectQL) parsers and frontend (ObjectUI) renderers. - -## Purpose - -This repository contains: -- **TypeScript Interfaces**: Shared types for the entire ObjectStack ecosystem -- **No Logic**: Only type definitions, no runtime code or business logic -- **Universal Compatibility**: Works in Node.js, Browser, and Electron environments - -## Metamodel Interfaces - -The metamodel defines the structure for describing data models in ObjectStack: - -### Core Interfaces - -#### `FieldType` -Defines the available field data types: -- Text types: `text`, `textarea`, `email`, `url` -- Numeric types: `number`, `currency`, `percentage` -- Date/Time types: `date`, `datetime` -- Relation types: `lookup` -- Selection types: `select`, `multiselect` -- Special types: `boolean`, `json`, `file`, `image` - -#### `ObjectField` -Represents a field definition within an entity: -```typescript -interface ObjectField { - name: string; // Field identifier - label: string; // Display label - type: FieldType; // Data type - required?: boolean; // Validation - unique?: boolean; // Constraint - lookupEntity?: string; // For lookup fields - // ... and more options -} -``` - -#### `ObjectEntity` -Represents a complete entity (data model) definition: -```typescript -interface ObjectEntity { - name: string; // Entity identifier - label: string; // Singular display label - pluralLabel: string; // Plural display label - fields: ObjectField[]; // Field definitions - primaryKey?: string; // Primary key field - displayField?: string; // Display field for lookups - // ... and more options -} -``` - -#### `ObjectView` -Represents a view configuration for presenting entity data: -```typescript -interface ObjectView { - name: string; // View identifier - label: string; // Display label - entityName: string; // Target entity - type: ViewType; // Presentation type (list, form, detail, etc.) - fields?: string[]; // Fields to display - columns?: ViewColumn[]; // Column configuration - filters?: ViewFilter[]; // Default filters - sort?: ViewSort[]; // Default sort order - // ... and more options -} -``` - -## Usage - -### Installation +### Building Individual Packages ```bash -pnpm install @objectstack/spec +# Build a specific package +cd packages/meta && pnpm run build ``` -### Importing Types - -```typescript -// Import all metamodel types -import { ObjectEntity, ObjectField, ObjectView, FieldType } from '@objectstack/spec'; - -// Or import specific types -import type { ObjectEntity } from '@objectstack/spec'; -``` - -### Example: Defining an Entity - -```typescript -import { ObjectEntity, ObjectField } from '@objectstack/spec'; - -const userEntity: ObjectEntity = { - name: 'User', - label: 'User', - pluralLabel: 'Users', - description: 'System user account', - fields: [ - { - name: 'id', - label: 'ID', - type: 'text', - required: true, - readonly: true - }, - { - name: 'email', - label: 'Email', - type: 'email', - required: true, - unique: true - }, - { - name: 'name', - label: 'Full Name', - type: 'text', - required: true - }, - { - name: 'role', - label: 'Role', - type: 'select', - required: true, - options: [ - { value: 'admin', label: 'Administrator' }, - { value: 'user', label: 'User' } - ] - } - ], - primaryKey: 'id', - displayField: 'name' -}; -``` - -## Building - -```bash -pnpm install -pnpm run build -``` - -This will compile TypeScript files to JavaScript and generate type declarations in the `dist/` directory. - -## Philosophy - -Following the ObjectStack Protocol: -- **Strict Types, No Logic**: This repository contains only type definitions -- **Documentation as Code**: Every interface property has TSDoc comments for IntelliSense -- **Universal Compatibility**: Pure TypeScript with no platform-specific dependencies - -## License +## 📄 License -MIT \ No newline at end of file +MIT diff --git a/package.json b/package.json index a7e910ed9..844b63241 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "@objectstack/spec", + "name": "@objectstack/spec-monorepo", "version": "0.1.0", - "description": "ObjectStack Protocol & Specification - TypeScript Interfaces, JSON Schemas, and Convention Configurations", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "private": true, + "description": "ObjectStack Protocol & Specification - Monorepo for TypeScript Interfaces, JSON Schemas, and Convention Configurations", "scripts": { - "build": "tsc", - "dev": "tsc --watch", - "clean": "rm -rf dist", - "prepublishOnly": "pnpm run clean && pnpm run build" + "build": "pnpm -r --stream build", + "dev": "pnpm -r --parallel dev", + "clean": "pnpm -r --parallel clean && rm -rf dist", + "version": "changeset version", + "release": "pnpm run build && changeset publish" }, "keywords": [ "objectstack", @@ -20,12 +20,10 @@ "author": "ObjectStack", "license": "MIT", "devDependencies": { + "@changesets/cli": "^2.27.1", "@types/node": "^20.10.0", "typescript": "^5.3.0" }, - "dependencies": { - "zod": "^3.22.4" - }, "engines": { "node": ">=18.0.0" }, diff --git a/packages/constants/README.md b/packages/constants/README.md new file mode 100644 index 000000000..848b1e133 --- /dev/null +++ b/packages/constants/README.md @@ -0,0 +1,48 @@ +# @objectstack/spec-constants + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +> ObjectStack Convention Constants + +## 📜 Overview + +This package defines the **"Law of Location"** - where things must be in ObjectStack packages. + +**Guiding Principle:** *"Strict Types, No Logic"* + +This package contains: +- ✅ Constants (Convention configurations) + +This package does NOT contain: +- ❌ Database connections +- ❌ UI components +- ❌ Runtime business logic + +## 🚀 Installation + +```bash +pnpm install @objectstack/spec-constants +``` + +## 📦 What's Inside + +### Constants + +- `PKG_CONVENTIONS` - Directory and file conventions +- `PackageDirectory` - Type for package directories +- `PackageFile` - Type for package files + +## 📚 Usage + +```typescript +import { PKG_CONVENTIONS } from '@objectstack/spec-constants'; + +console.log(PKG_CONVENTIONS.DIRS.SCHEMA); // 'src/schemas' +console.log(PKG_CONVENTIONS.DIRS.TRIGGERS); // 'src/triggers' +console.log(PKG_CONVENTIONS.FILES.MANIFEST); // 'objectstack.config.ts' +``` + +## 📄 License + +MIT diff --git a/packages/constants/package.json b/packages/constants/package.json new file mode 100644 index 000000000..e3309fd1d --- /dev/null +++ b/packages/constants/package.json @@ -0,0 +1,30 @@ +{ + "name": "@objectstack/spec-constants", + "version": "0.1.0", + "description": "ObjectStack Convention Constants - Directory and file conventions for ObjectStack packages", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist" + }, + "keywords": [ + "objectstack", + "constants", + "conventions", + "paths" + ], + "author": "ObjectStack", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/constants/src/index.ts b/packages/constants/src/index.ts new file mode 100644 index 000000000..61102ae8b --- /dev/null +++ b/packages/constants/src/index.ts @@ -0,0 +1,13 @@ +/** + * @objectstack/spec-constants + * + * ObjectStack Convention Constants + * + * This package defines the "Law of Location" - where things must be in ObjectStack packages. + * These paths are used by ObjectOS Runtime, ObjectStack CLI, and ObjectStudio IDE. + * + * Guiding Principle: "Strict Types, No Logic" + * This package has NO database connections, NO UI components, and NO runtime business logic. + */ + +export * from './paths'; diff --git a/src/constants/paths.ts b/packages/constants/src/paths.ts similarity index 100% rename from src/constants/paths.ts rename to packages/constants/src/paths.ts diff --git a/packages/constants/tsconfig.json b/packages/constants/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/packages/constants/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/meta/README.md b/packages/meta/README.md new file mode 100644 index 000000000..a16ca8cf9 --- /dev/null +++ b/packages/meta/README.md @@ -0,0 +1,61 @@ +# @objectstack/spec-meta + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +> ObjectStack Metamodel Type Definitions + +## 📜 Overview + +This package defines the **core metamodel interfaces** that form the contract between the backend (ObjectQL) parser and the frontend (ObjectUI) renderer. + +**Guiding Principle:** *"Strict Types, No Logic"* + +This package contains: +- ✅ TypeScript Interfaces (Entity, Field, View types) + +This package does NOT contain: +- ❌ Database connections +- ❌ UI components +- ❌ Runtime business logic + +## 🚀 Installation + +```bash +pnpm install @objectstack/spec-meta +``` + +## 📦 What's Inside + +### Core Interfaces + +- `FieldType` - Available field data types +- `ObjectField` - Field definition interface +- `ObjectEntity` - Entity (data model) definition interface +- `ObjectView` - View configuration interface + +## 📚 Usage + +```typescript +import { ObjectEntity, ObjectField, FieldType } from '@objectstack/spec-meta'; + +const userEntity: ObjectEntity = { + name: 'User', + label: 'User', + pluralLabel: 'Users', + fields: [ + { + name: 'email', + label: 'Email', + type: 'email', + required: true + } + ], + primaryKey: 'id', + displayField: 'email' +}; +``` + +## 📄 License + +MIT diff --git a/packages/meta/package.json b/packages/meta/package.json new file mode 100644 index 000000000..12569535b --- /dev/null +++ b/packages/meta/package.json @@ -0,0 +1,32 @@ +{ + "name": "@objectstack/spec-meta", + "version": "0.1.0", + "description": "ObjectStack Metamodel Type Definitions - Core interfaces for entities, fields, and views", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist" + }, + "keywords": [ + "objectstack", + "metamodel", + "types", + "entity", + "field", + "view" + ], + "author": "ObjectStack", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/src/types/meta/field-type.ts b/packages/meta/src/field-type.ts similarity index 100% rename from src/types/meta/field-type.ts rename to packages/meta/src/field-type.ts diff --git a/packages/meta/src/index.ts b/packages/meta/src/index.ts new file mode 100644 index 000000000..efa3be6a4 --- /dev/null +++ b/packages/meta/src/index.ts @@ -0,0 +1,16 @@ +/** + * @objectstack/spec-meta + * + * ObjectStack Metamodel Type Definitions + * + * This package defines the core metamodel interfaces that form the contract + * between the backend (ObjectQL) parser and the frontend (ObjectUI) renderer. + * + * Guiding Principle: "Strict Types, No Logic" + * This package has NO database connections, NO UI components, and NO runtime business logic. + */ + +export * from './field-type'; +export * from './object-field'; +export * from './object-entity'; +export * from './object-view'; diff --git a/src/types/meta/object-entity.ts b/packages/meta/src/object-entity.ts similarity index 100% rename from src/types/meta/object-entity.ts rename to packages/meta/src/object-entity.ts diff --git a/src/types/meta/object-field.ts b/packages/meta/src/object-field.ts similarity index 100% rename from src/types/meta/object-field.ts rename to packages/meta/src/object-field.ts diff --git a/src/types/meta/object-view.ts b/packages/meta/src/object-view.ts similarity index 100% rename from src/types/meta/object-view.ts rename to packages/meta/src/object-view.ts diff --git a/packages/meta/tsconfig.json b/packages/meta/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/packages/meta/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/plugin/README.md b/packages/plugin/README.md new file mode 100644 index 000000000..482fadab6 --- /dev/null +++ b/packages/plugin/README.md @@ -0,0 +1,63 @@ +# @objectstack/spec-plugin + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +> ObjectStack Plugin Runtime Interfaces + +## 📜 Overview + +This package defines the **contract that every plugin must implement** to be loaded by ObjectOS. + +**Guiding Principle:** *"Strict Types, No Logic"* + +This package contains: +- ✅ TypeScript Interfaces (Plugin runtime interfaces) + +This package does NOT contain: +- ❌ Database connections +- ❌ UI components +- ❌ Runtime business logic + +## 🚀 Installation + +```bash +pnpm install @objectstack/spec-plugin +``` + +## 📦 What's Inside + +### Plugin Interfaces + +- `ObjectStackPlugin` - Plugin interface with lifecycle methods +- `PluginContext` - Context provided to plugin methods +- `PluginFactory` - Plugin factory function type +- `PluginLogger` - Logger interface +- `ObjectQLClient` - Database client interface +- `ObjectOSKernel` - OS kernel interface + +## 📚 Usage + +```typescript +import { ObjectStackPlugin, PluginContext } from '@objectstack/spec-plugin'; + +export default function createPlugin(): ObjectStackPlugin { + return { + async onInstall(ctx: PluginContext) { + ctx.logger.info('Plugin installed'); + }, + + async onEnable(ctx: PluginContext) { + ctx.logger.info('Plugin enabled'); + }, + + async onDisable(ctx: PluginContext) { + ctx.logger.info('Plugin disabled'); + } + }; +} +``` + +## 📄 License + +MIT diff --git a/packages/plugin/package.json b/packages/plugin/package.json new file mode 100644 index 000000000..a8dc43735 --- /dev/null +++ b/packages/plugin/package.json @@ -0,0 +1,30 @@ +{ + "name": "@objectstack/spec-plugin", + "version": "0.1.0", + "description": "ObjectStack Plugin Runtime Interfaces - Type definitions for plugin development", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist" + }, + "keywords": [ + "objectstack", + "plugin", + "types", + "runtime" + ], + "author": "ObjectStack", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts new file mode 100644 index 000000000..ce0793827 --- /dev/null +++ b/packages/plugin/src/index.ts @@ -0,0 +1,12 @@ +/** + * @objectstack/spec-plugin + * + * ObjectStack Plugin Runtime Interfaces + * + * This package defines the contract that every plugin must implement to be loaded by ObjectOS. + * + * Guiding Principle: "Strict Types, No Logic" + * This package has NO database connections, NO UI components, and NO runtime business logic. + */ + +export * from './plugin'; diff --git a/src/types/plugin.ts b/packages/plugin/src/plugin.ts similarity index 100% rename from src/types/plugin.ts rename to packages/plugin/src/plugin.ts diff --git a/packages/plugin/tsconfig.json b/packages/plugin/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/packages/plugin/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/schemas/README.md b/packages/schemas/README.md new file mode 100644 index 000000000..435316395 --- /dev/null +++ b/packages/schemas/README.md @@ -0,0 +1,56 @@ +# @objectstack/spec-schemas + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +> ObjectStack Zod Validation Schemas + +## 📜 Overview + +This package contains **Zod schemas for validating** ObjectStack configurations and manifests. + +**Guiding Principle:** *"Strict Types, No Logic"* + +This package contains: +- ✅ Zod Schemas (Validation rules with type inference) + +This package does NOT contain: +- ❌ Database connections +- ❌ UI components +- ❌ Runtime business logic + +## 🚀 Installation + +```bash +pnpm install @objectstack/spec-schemas +``` + +## 📦 What's Inside + +### Schemas + +- `ManifestSchema` - Zod schema for package manifests +- `MenuItemSchema` - Zod schema for menu items +- `ObjectStackManifest` - TypeScript type for manifests +- `MenuItem` - TypeScript type for menu items + +## 📚 Usage + +```typescript +import { ManifestSchema, type ObjectStackManifest } from '@objectstack/spec-schemas'; + +const manifest: ObjectStackManifest = { + id: 'com.example.myapp', + version: '1.0.0', + type: 'plugin', + name: 'My App', + permissions: ['system.user.read'] +}; + +// Validate with Zod +ManifestSchema.parse(manifest); +``` + +## 📄 License + +MIT diff --git a/packages/schemas/package.json b/packages/schemas/package.json new file mode 100644 index 000000000..6ea732ce3 --- /dev/null +++ b/packages/schemas/package.json @@ -0,0 +1,33 @@ +{ + "name": "@objectstack/spec-schemas", + "version": "0.1.0", + "description": "ObjectStack Zod Validation Schemas - Runtime validation for ObjectStack configurations", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist" + }, + "keywords": [ + "objectstack", + "schema", + "validation", + "zod" + ], + "author": "ObjectStack", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "dependencies": { + "zod": "^3.22.4" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/schemas/src/index.ts b/packages/schemas/src/index.ts new file mode 100644 index 000000000..cfb11f44f --- /dev/null +++ b/packages/schemas/src/index.ts @@ -0,0 +1,12 @@ +/** + * @objectstack/spec-schemas + * + * ObjectStack Zod Validation Schemas + * + * This package contains Zod schemas for validating ObjectStack configurations and manifests. + * + * Guiding Principle: "Strict Types, No Logic" + * This package has NO database connections, NO UI components, and NO runtime business logic. + */ + +export * from './manifest.zod'; diff --git a/src/schemas/manifest.zod.ts b/packages/schemas/src/manifest.zod.ts similarity index 100% rename from src/schemas/manifest.zod.ts rename to packages/schemas/src/manifest.zod.ts diff --git a/packages/schemas/tsconfig.json b/packages/schemas/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/packages/schemas/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/spec/README.md b/packages/spec/README.md new file mode 100644 index 000000000..2e6e9a2b6 --- /dev/null +++ b/packages/spec/README.md @@ -0,0 +1,61 @@ +# @objectstack/spec + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +> ObjectStack Protocol & Specification - The Constitution of the ObjectStack Ecosystem + +## 📜 Overview + +This is the **main package** that re-exports all ObjectStack specification packages for convenience and backward compatibility. + +**Guiding Principle:** *"Strict Types, No Logic"* + +This package aggregates: +- `@objectstack/spec-meta` - Metamodel type definitions +- `@objectstack/spec-plugin` - Plugin runtime interfaces +- `@objectstack/spec-schemas` - Zod validation schemas +- `@objectstack/spec-constants` - Convention constants + +## 🚀 Installation + +```bash +pnpm install @objectstack/spec +``` + +## 📦 What's Inside + +This package provides a unified import for all ObjectStack specifications. You can import everything from this package, or use the individual packages for smaller bundle sizes. + +## 📚 Usage + +### Using the main package (recommended for most use cases) + +```typescript +import { + ObjectEntity, + ObjectStackPlugin, + ManifestSchema, + PKG_CONVENTIONS +} from '@objectstack/spec'; +``` + +### Using individual packages (for smaller bundle sizes) + +```typescript +import { ObjectEntity } from '@objectstack/spec-meta'; +import { ObjectStackPlugin } from '@objectstack/spec-plugin'; +import { ManifestSchema } from '@objectstack/spec-schemas'; +import { PKG_CONVENTIONS } from '@objectstack/spec-constants'; +``` + +## 📦 Sub-packages + +- **[@objectstack/spec-meta](../meta)** - Metamodel type definitions +- **[@objectstack/spec-plugin](../plugin)** - Plugin runtime interfaces +- **[@objectstack/spec-schemas](../schemas)** - Zod validation schemas +- **[@objectstack/spec-constants](../constants)** - Convention constants + +## 📄 License + +MIT diff --git a/packages/spec/package.json b/packages/spec/package.json new file mode 100644 index 000000000..5fc98c8c1 --- /dev/null +++ b/packages/spec/package.json @@ -0,0 +1,37 @@ +{ + "name": "@objectstack/spec", + "version": "0.1.0", + "description": "ObjectStack Protocol & Specification - TypeScript Interfaces, JSON Schemas, and Convention Configurations", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist" + }, + "keywords": [ + "objectstack", + "protocol", + "specification", + "schema", + "types" + ], + "author": "ObjectStack", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "dependencies": { + "@objectstack/spec-meta": "workspace:*", + "@objectstack/spec-plugin": "workspace:*", + "@objectstack/spec-schemas": "workspace:*", + "@objectstack/spec-constants": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/src/index.ts b/packages/spec/src/index.ts similarity index 59% rename from src/index.ts rename to packages/spec/src/index.ts index f3cd7e96f..900beeaa1 100644 --- a/src/index.ts +++ b/packages/spec/src/index.ts @@ -16,27 +16,8 @@ * This package has NO database connections, NO UI components, and NO runtime business logic. */ -// Export schemas -export { - ManifestSchema, - MenuItemSchema, - type ObjectStackManifest, - type MenuItem, -} from './schemas/manifest.zod'; - -// Export types -export { - type ObjectStackPlugin, - type PluginContext, - type PluginFactory, - type PluginLogger, - type ObjectQLClient, - type ObjectOSKernel, -} from './types/plugin'; - -// Export constants -export { - PKG_CONVENTIONS, - type PackageDirectory, - type PackageFile, -} from './constants/paths'; +// Re-export from sub-packages for backward compatibility +export * from '@objectstack/spec-meta'; +export * from '@objectstack/spec-plugin'; +export * from '@objectstack/spec-schemas'; +export * from '@objectstack/spec-constants'; diff --git a/packages/spec/tsconfig.json b/packages/spec/tsconfig.json new file mode 100644 index 000000000..ed464a96b --- /dev/null +++ b/packages/spec/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 317379568..c2e73b057 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,45 @@ settings: importers: .: + devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.29.8(@types/node@20.19.30) + '@types/node': + specifier: ^20.10.0 + version: 20.19.30 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/constants: + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.19.30 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/meta: + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.19.30 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/plugin: + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.19.30 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/schemas: dependencies: zod: specifier: ^3.22.4 @@ -19,11 +58,399 @@ importers: specifier: ^5.3.0 version: 5.9.3 + packages/spec: + dependencies: + '@objectstack/spec-constants': + specifier: workspace:* + version: link:../constants + '@objectstack/spec-meta': + specifier: workspace:* + version: link:../meta + '@objectstack/spec-plugin': + specifier: workspace:* + version: link:../plugin + '@objectstack/spec-schemas': + specifier: workspace:* + version: link:../schemas + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.19.30 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + packages: + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.14': + resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.8': + resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} + hasBin: true + + '@changesets/config@3.1.2': + resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.14': + resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.19.30': resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -32,17 +459,448 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: + '@babel/runtime@7.28.6': {} + + '@changesets/apply-release-plan@7.0.14': + dependencies: + '@changesets/config': 3.1.2 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.8(@types/node@20.19.30)': + dependencies: + '@changesets/apply-release-plan': 7.0.14 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.2 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.14 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@20.19.30) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-release-plan@4.0.14': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.2': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.6': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.2 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.3 + prettier: 2.8.8 + + '@inquirer/external-editor@1.0.3(@types/node@20.19.30)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 20.19.30 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.6 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@types/node@12.20.55': {} + '@types/node@20.19.30': dependencies: undici-types: 6.21.0 + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + chardet@2.1.1: {} + + ci-info@3.9.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esprima@4.0.1: {} + + extendable-error@0.1.7: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + human-id@4.1.3: {} + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mri@1.2.0: {} + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@4.0.1: {} + + prettier@2.8.8: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.2 + pify: 4.0.1 + strip-bom: 3.0.0 + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.7.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + term-size@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + typescript@5.9.3: {} undici-types@6.21.0: {} + universalify@0.1.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..18ec407ef --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'packages/*' diff --git a/src/examples.ts b/src/examples.ts deleted file mode 100644 index 4e8225fc9..000000000 --- a/src/examples.ts +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Example Usage of ObjectStack Metamodel - * - * This file demonstrates how to use the metamodel interfaces - * to define entities and views. - */ - -import type { ObjectEntity, ObjectView } from './types/meta'; - -/** - * Example: User Entity Definition - */ -export const UserEntity: ObjectEntity = { - name: 'User', - label: 'User', - pluralLabel: 'Users', - description: 'System user account', - fields: [ - { - name: 'id', - label: 'ID', - type: 'text', - required: true, - readonly: true, - }, - { - name: 'email', - label: 'Email Address', - type: 'email', - required: true, - unique: true, - maxLength: 255, - }, - { - name: 'name', - label: 'Full Name', - type: 'text', - required: true, - maxLength: 100, - }, - { - name: 'role', - label: 'Role', - type: 'select', - required: true, - options: [ - { value: 'admin', label: 'Administrator' }, - { value: 'editor', label: 'Editor' }, - { value: 'viewer', label: 'Viewer' }, - ], - }, - { - name: 'status', - label: 'Status', - type: 'select', - required: true, - defaultValue: 'active', - options: [ - { value: 'active', label: 'Active' }, - { value: 'inactive', label: 'Inactive' }, - { value: 'suspended', label: 'Suspended' }, - ], - }, - { - name: 'createdAt', - label: 'Created At', - type: 'datetime', - readonly: true, - }, - ], - primaryKey: 'id', - displayField: 'name', - icon: 'user', - auditable: true, - searchable: true, - searchableFields: ['name', 'email'], -}; - -/** - * Example: All Users List View - */ -export const AllUsersView: ObjectView = { - name: 'all_users', - label: 'All Users', - entityName: 'User', - type: 'list', - description: 'View all users in the system', - columns: [ - { - field: 'name', - label: 'Name', - width: '25%', - sortable: true, - }, - { - field: 'email', - label: 'Email', - width: '30%', - sortable: true, - }, - { - field: 'role', - label: 'Role', - width: '15%', - sortable: true, - }, - { - field: 'status', - label: 'Status', - width: '15%', - sortable: true, - }, - { - field: 'createdAt', - label: 'Created', - width: '15%', - sortable: true, - format: 'date:MM/DD/YYYY', - }, - ], - sort: [ - { - field: 'name', - direction: 'asc', - }, - ], - pageSize: 25, - default: true, -}; - -/** - * Example: Active Users View (with filter) - */ -export const ActiveUsersView: ObjectView = { - name: 'active_users', - label: 'Active Users', - entityName: 'User', - type: 'list', - description: 'View only active users', - columns: [ - { - field: 'name', - width: '30%', - }, - { - field: 'email', - width: '40%', - }, - { - field: 'role', - width: '30%', - }, - ], - filters: [ - { - field: 'status', - operator: 'equals', - value: 'active', - }, - ], - sort: [ - { - field: 'name', - direction: 'asc', - }, - ], -}; - -/** - * Example: User Form View - */ -export const UserFormView: ObjectView = { - name: 'user_form', - label: 'User Form', - entityName: 'User', - type: 'form', - description: 'Form for creating and editing users', - fields: ['name', 'email', 'role', 'status'], - layout: { - type: 'sections', - sections: [ - { - id: 'basic', - title: 'Basic Information', - fields: ['name', 'email'], - }, - { - id: 'settings', - title: 'Settings', - fields: ['role', 'status'], - }, - ], - }, -}; - -/** - * Example: Product Entity with Lookup - */ -export const ProductEntity: ObjectEntity = { - name: 'Product', - label: 'Product', - pluralLabel: 'Products', - description: 'Product catalog', - fields: [ - { - name: 'id', - label: 'ID', - type: 'text', - required: true, - readonly: true, - }, - { - name: 'name', - label: 'Product Name', - type: 'text', - required: true, - maxLength: 200, - }, - { - name: 'description', - label: 'Description', - type: 'textarea', - maxLength: 1000, - }, - { - name: 'price', - label: 'Price', - type: 'currency', - required: true, - min: 0, - }, - { - name: 'category', - label: 'Category', - type: 'lookup', - required: true, - lookupEntity: 'Category', - lookupDisplayField: 'name', - }, - { - name: 'inStock', - label: 'In Stock', - type: 'boolean', - defaultValue: true, - }, - { - name: 'image', - label: 'Product Image', - type: 'image', - }, - ], - primaryKey: 'id', - displayField: 'name', - icon: 'package', - searchable: true, - searchableFields: ['name', 'description'], -}; diff --git a/src/types/index.ts b/src/types/index.ts deleted file mode 100644 index b9a4610a2..000000000 --- a/src/types/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Type Definitions - * - * This module exports all type definitions used in the ObjectStack specification. - * - * @module types - */ - -export * from './meta'; diff --git a/src/types/meta/index.ts b/src/types/meta/index.ts deleted file mode 100644 index 6fee88473..000000000 --- a/src/types/meta/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Metamodel Type Definitions - * - * This module defines the core metamodel interfaces that form the contract - * between the backend (ObjectQL) parser and the frontend (ObjectUI) renderer. - * - * @module types/meta - */ - -export * from './field-type'; -export * from './object-field'; -export * from './object-entity'; -export * from './object-view'; From cb57a5f746160ed3b44949970cdbcc48b31c23fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:10:09 +0000 Subject: [PATCH 3/5] Add examples to meta package and update tsconfig Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com> --- packages/meta/src/examples.ts | 257 ++++++++++++++++++++++++++++++++++ packages/meta/src/index.ts | 1 + tsconfig.json | 6 +- 3 files changed, 259 insertions(+), 5 deletions(-) create mode 100644 packages/meta/src/examples.ts diff --git a/packages/meta/src/examples.ts b/packages/meta/src/examples.ts new file mode 100644 index 000000000..25cd0540d --- /dev/null +++ b/packages/meta/src/examples.ts @@ -0,0 +1,257 @@ +/** + * Example Usage of ObjectStack Metamodel + * + * This file demonstrates how to use the metamodel interfaces + * to define entities and views. + */ + +import type { ObjectEntity, ObjectView } from './index'; + +/** + * Example: User Entity Definition + */ +export const UserEntity: ObjectEntity = { + name: 'User', + label: 'User', + pluralLabel: 'Users', + description: 'System user account', + fields: [ + { + name: 'id', + label: 'ID', + type: 'text', + required: true, + readonly: true, + }, + { + name: 'email', + label: 'Email Address', + type: 'email', + required: true, + unique: true, + maxLength: 255, + }, + { + name: 'name', + label: 'Full Name', + type: 'text', + required: true, + maxLength: 100, + }, + { + name: 'role', + label: 'Role', + type: 'select', + required: true, + options: [ + { value: 'admin', label: 'Administrator' }, + { value: 'editor', label: 'Editor' }, + { value: 'viewer', label: 'Viewer' }, + ], + }, + { + name: 'status', + label: 'Status', + type: 'select', + required: true, + defaultValue: 'active', + options: [ + { value: 'active', label: 'Active' }, + { value: 'inactive', label: 'Inactive' }, + { value: 'suspended', label: 'Suspended' }, + ], + }, + { + name: 'createdAt', + label: 'Created At', + type: 'datetime', + readonly: true, + }, + ], + primaryKey: 'id', + displayField: 'name', + icon: 'user', + auditable: true, + searchable: true, + searchableFields: ['name', 'email'], +}; + +/** + * Example: All Users List View + */ +export const AllUsersView: ObjectView = { + name: 'all_users', + label: 'All Users', + entityName: 'User', + type: 'list', + description: 'View all users in the system', + columns: [ + { + field: 'name', + label: 'Name', + width: '25%', + sortable: true, + }, + { + field: 'email', + label: 'Email', + width: '30%', + sortable: true, + }, + { + field: 'role', + label: 'Role', + width: '15%', + sortable: true, + }, + { + field: 'status', + label: 'Status', + width: '15%', + sortable: true, + }, + { + field: 'createdAt', + label: 'Created', + width: '15%', + sortable: true, + format: 'date:MM/DD/YYYY', + }, + ], + sort: [ + { + field: 'name', + direction: 'asc', + }, + ], + pageSize: 25, + default: true, +}; + +/** + * Example: Active Users View (with filter) + */ +export const ActiveUsersView: ObjectView = { + name: 'active_users', + label: 'Active Users', + entityName: 'User', + type: 'list', + description: 'View only active users', + columns: [ + { + field: 'name', + width: '30%', + }, + { + field: 'email', + width: '40%', + }, + { + field: 'role', + width: '30%', + }, + ], + filters: [ + { + field: 'status', + operator: 'equals', + value: 'active', + }, + ], + sort: [ + { + field: 'name', + direction: 'asc', + }, + ], +}; + +/** + * Example: User Form View + */ +export const UserFormView: ObjectView = { + name: 'user_form', + label: 'User Form', + entityName: 'User', + type: 'form', + description: 'Form for creating and editing users', + fields: ['name', 'email', 'role', 'status'], + layout: { + type: 'sections', + sections: [ + { + id: 'basic', + title: 'Basic Information', + fields: ['name', 'email'], + }, + { + id: 'settings', + title: 'Settings', + fields: ['role', 'status'], + }, + ], + }, +}; + +/** + * Example: Product Entity with Lookup + */ +export const ProductEntity: ObjectEntity = { + name: 'Product', + label: 'Product', + pluralLabel: 'Products', + description: 'Product catalog', + fields: [ + { + name: 'id', + label: 'ID', + type: 'text', + required: true, + readonly: true, + }, + { + name: 'name', + label: 'Product Name', + type: 'text', + required: true, + maxLength: 200, + }, + { + name: 'description', + label: 'Description', + type: 'textarea', + maxLength: 1000, + }, + { + name: 'price', + label: 'Price', + type: 'currency', + required: true, + min: 0, + }, + { + name: 'category', + label: 'Category', + type: 'lookup', + required: true, + lookupEntity: 'Category', + lookupDisplayField: 'name', + }, + { + name: 'inStock', + label: 'In Stock', + type: 'boolean', + defaultValue: true, + }, + { + name: 'image', + label: 'Product Image', + type: 'image', + }, + ], + primaryKey: 'id', + displayField: 'name', + icon: 'package', + searchable: true, + searchableFields: ['name', 'description'], +}; diff --git a/packages/meta/src/index.ts b/packages/meta/src/index.ts index efa3be6a4..2bcf8960d 100644 --- a/packages/meta/src/index.ts +++ b/packages/meta/src/index.ts @@ -14,3 +14,4 @@ export * from './field-type'; export * from './object-field'; export * from './object-entity'; export * from './object-view'; +export * from './examples'; diff --git a/tsconfig.json b/tsconfig.json index 2039e6bc1..325b4d1e0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,8 +5,6 @@ "lib": ["ES2020"], "declaration": true, "declarationMap": true, - "outDir": "./dist", - "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, @@ -17,7 +15,5 @@ "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] + } } From 053983d4bf6b9b3a5c3daf8a5aca95754947803a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:11:46 +0000 Subject: [PATCH 4/5] Add files field to package.json for publishing control Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com> --- packages/constants/package.json | 4 ++++ packages/meta/package.json | 4 ++++ packages/plugin/package.json | 4 ++++ packages/schemas/package.json | 4 ++++ packages/spec/package.json | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/packages/constants/package.json b/packages/constants/package.json index e3309fd1d..ca406d0e6 100644 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -4,6 +4,10 @@ "description": "ObjectStack Convention Constants - Directory and file conventions for ObjectStack packages", "main": "dist/index.js", "types": "dist/index.d.ts", + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsc", "dev": "tsc --watch", diff --git a/packages/meta/package.json b/packages/meta/package.json index 12569535b..b38fba632 100644 --- a/packages/meta/package.json +++ b/packages/meta/package.json @@ -4,6 +4,10 @@ "description": "ObjectStack Metamodel Type Definitions - Core interfaces for entities, fields, and views", "main": "dist/index.js", "types": "dist/index.d.ts", + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsc", "dev": "tsc --watch", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index a8dc43735..1740f731a 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -4,6 +4,10 @@ "description": "ObjectStack Plugin Runtime Interfaces - Type definitions for plugin development", "main": "dist/index.js", "types": "dist/index.d.ts", + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsc", "dev": "tsc --watch", diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 6ea732ce3..6a2dae2aa 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -4,6 +4,10 @@ "description": "ObjectStack Zod Validation Schemas - Runtime validation for ObjectStack configurations", "main": "dist/index.js", "types": "dist/index.d.ts", + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsc", "dev": "tsc --watch", diff --git a/packages/spec/package.json b/packages/spec/package.json index 5fc98c8c1..f185cd63e 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -4,6 +4,10 @@ "description": "ObjectStack Protocol & Specification - TypeScript Interfaces, JSON Schemas, and Convention Configurations", "main": "dist/index.js", "types": "dist/index.d.ts", + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsc", "dev": "tsc --watch", From 253d7629126164075c548f0d8649e365123c257f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:13:08 +0000 Subject: [PATCH 5/5] Add monorepo migration guide documentation Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com> --- MONOREPO_MIGRATION.md | 200 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 MONOREPO_MIGRATION.md diff --git a/MONOREPO_MIGRATION.md b/MONOREPO_MIGRATION.md new file mode 100644 index 000000000..b0c7bd0d5 --- /dev/null +++ b/MONOREPO_MIGRATION.md @@ -0,0 +1,200 @@ +# Monorepo Migration Guide + +## Overview + +This document explains the migration from a single package (`@objectstack/spec`) to a monorepo structure with multiple packages. + +## New Structure + +The repository is now organized as a pnpm workspace with the following packages: + +### 📦 Packages + +``` +packages/ +├── constants/ # @objectstack/spec-constants +├── meta/ # @objectstack/spec-meta +├── plugin/ # @objectstack/spec-plugin +├── schemas/ # @objectstack/spec-schemas +└── spec/ # @objectstack/spec (main package) +``` + +### Package Descriptions + +1. **@objectstack/spec-meta** - Metamodel Type Definitions + - Contains: `ObjectEntity`, `ObjectField`, `ObjectView`, `FieldType` + - Also includes: Example entities and views + - Dependencies: None + +2. **@objectstack/spec-plugin** - Plugin Runtime Interfaces + - Contains: `ObjectStackPlugin`, `PluginContext`, `PluginLogger`, etc. + - Dependencies: None + +3. **@objectstack/spec-schemas** - Zod Validation Schemas + - Contains: `ManifestSchema`, `MenuItemSchema` + - Dependencies: `zod` + +4. **@objectstack/spec-constants** - Convention Constants + - Contains: `PKG_CONVENTIONS` + - Dependencies: None + +5. **@objectstack/spec** - Main Package (Aggregator) + - Re-exports all sub-packages for backward compatibility + - Dependencies: All other packages (workspace:*) + +## Migration Benefits + +### 1. **Smaller Bundle Sizes** +Users can now install only the packages they need: +```bash +# Instead of installing the entire spec +pnpm install @objectstack/spec + +# Install only what you need +pnpm install @objectstack/spec-meta +``` + +### 2. **Better Organization** +Each package has a clear responsibility and can evolve independently. + +### 3. **Backward Compatibility** +The main `@objectstack/spec` package maintains full backward compatibility by re-exporting all sub-packages. + +### 4. **Independent Versioning** +Each package can be versioned independently (though currently linked via changesets). + +## Usage + +### For Existing Users (No Breaking Changes) + +```typescript +// This still works exactly as before +import { + ObjectEntity, + ManifestSchema, + PKG_CONVENTIONS +} from '@objectstack/spec'; +``` + +### For New Users (Optimized Imports) + +```typescript +// Import only what you need for smaller bundles +import { ObjectEntity } from '@objectstack/spec-meta'; +import { ManifestSchema } from '@objectstack/spec-schemas'; +import { PKG_CONVENTIONS } from '@objectstack/spec-constants'; +``` + +## Development + +### Building + +```bash +# Build all packages +pnpm run build + +# Build a specific package +cd packages/meta && pnpm run build +``` + +### Development Mode + +```bash +# Watch all packages +pnpm run dev + +# Watch a specific package +cd packages/meta && pnpm run dev +``` + +### Adding a New Package + +1. Create a new directory in `packages/` +2. Create `package.json`, `tsconfig.json`, and `README.md` +3. Add the package to `.changeset/config.json` linked array +4. Add dependencies in `packages/spec/package.json` if needed + +## Publishing + +The monorepo uses Changesets for version management and publishing: + +```bash +# Create a changeset +pnpm changeset + +# Version packages +pnpm run version + +# Publish packages +pnpm run release +``` + +## CI/CD + +The existing GitHub Actions workflows have been updated to work with the monorepo: +- **CI**: Builds all packages +- **Release**: Publishes all packages with changesets + +## File Structure + +``` +. +├── packages/ +│ ├── constants/ +│ │ ├── src/ +│ │ ├── package.json +│ │ ├── tsconfig.json +│ │ └── README.md +│ ├── meta/ +│ ├── plugin/ +│ ├── schemas/ +│ └── spec/ +├── content/ # Documentation and AI guides +├── .changeset/ # Changeset configuration +├── pnpm-workspace.yaml # Workspace configuration +├── package.json # Root package.json +├── tsconfig.json # Base TypeScript configuration +└── README.md # Main README +``` + +## Technical Details + +### Workspace Configuration + +- **Package Manager**: pnpm (v10.28.0) +- **Workspace Protocol**: `workspace:*` for internal dependencies +- **Build Tool**: TypeScript Compiler (tsc) +- **Version Management**: Changesets + +### TypeScript Configuration + +- Each package extends the root `tsconfig.json` +- All packages compile to `dist/` directory +- Declaration maps are generated for better IDE support + +### Publishing Configuration + +- All packages are published to npm with `public` access +- Each package includes only `dist/` and `README.md` files +- Workspace dependencies are replaced with actual versions during publish + +## Migration Checklist + +- [x] Created monorepo structure +- [x] Split code into logical packages +- [x] Updated all imports and exports +- [x] Configured pnpm workspace +- [x] Updated build scripts +- [x] Added package READMEs +- [x] Updated root README +- [x] Configured changesets for monorepo +- [x] Verified backward compatibility +- [x] Tested all builds +- [x] Updated CI/CD workflows + +## Support + +For issues or questions about the monorepo structure, please: +1. Check this migration guide +2. Review individual package READMEs +3. Open an issue on GitHub