175 lines
5.7 KiB
Markdown
175 lines
5.7 KiB
Markdown
# Configucci — Project Context
|
|
|
|
## Project Overview
|
|
|
|
**Configucci** is a React-based web application for managing XML configuration files. It enables users to load, edit, and visualize configurations with support for multiple environments and parameter templating.
|
|
|
|
### Core Features
|
|
- Load XML configuration files with multiple environments
|
|
- Edit environment parameters with change tracking (yellow border indicates modifications)
|
|
- Template system using @paramName@ syntax for dynamic substitution
|
|
- Visual preview of configurations in multiple formats (XML, JSON, Raw)
|
|
- Bootstrap 5-based responsive UI
|
|
|
|
## Technology Stack
|
|
|
|
| Category | Technology |
|
|
|----------|------------|
|
|
| **Framework** | React 19.2.0 |
|
|
| **Language** | TypeScript 5.9 |
|
|
| **Build Tool** | Vite 7.2.4 |
|
|
| **UI Library** | Bootstrap 5.3.3 |
|
|
| **Testing** | Vitest 4.0.16 + jsdom |
|
|
| **Linting** | ESLint 9.17.0 + typescript-eslint |
|
|
| **Syntax Highlighting** | react-highlight + highlight.js |
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
configucci/
|
|
├── src/
|
|
│ ├── models/ # Data models and domain logic
|
|
│ │ ├── Config.tsx # Config, ConfigTemplate classes
|
|
│ │ ├── ConfigReader.tsx # XML parser utility
|
|
│ │ ├── Env.ts # Env, AppEvent, AddEvent, DelEvent, UpdateEvent
|
|
│ │ ├── EnvParam.ts # EnvParam class
|
|
│ │ └── NamedId.ts # NamedId interface
|
|
│ ├── componets/ # React components (note: directory name typo)
|
|
│ │ ├── env/
|
|
│ │ │ ├── Environment.tsx # Environment list & editor
|
|
│ │ │ └── EnvironmentParam.tsx # Single parameter editor
|
|
│ │ ├── content/
|
|
│ │ │ └── Content.tsx # Tabbed content viewer
|
|
│ │ └── FileChooser.tsx # File upload component
|
|
│ ├── builders/ # XML builders
|
|
│ │ ├── EnvBuilder.ts
|
|
│ │ └── index.ts
|
|
│ ├── assets/ # Static assets (images, etc.)
|
|
│ ├── test/ # Unit tests
|
|
│ │ └── ConfigReader.test.ts
|
|
│ ├── App.tsx # Root component
|
|
│ ├── App.css # Application styles
|
|
│ ├── main.tsx # Entry point
|
|
│ └── index.css # Global styles
|
|
├── docs/
|
|
│ └── config.json.xml # Example configuration file
|
|
├── public/ # Public static assets
|
|
├── index.html
|
|
├── package.json
|
|
├── tsconfig.json
|
|
├── vite.config.ts
|
|
└── vitest.config.ts
|
|
```
|
|
|
|
## Key Data Models
|
|
|
|
### Config
|
|
Main configuration container:
|
|
- `envs: Env[]` — Array of environments
|
|
- `template: ConfigTemplate` — Template with parameter placeholders
|
|
- Methods: `addEnvs()`, `addTemplate()`, `getTemplateAsJson()`, `validateParams()`
|
|
|
|
### ConfigTemplate
|
|
Template with @paramName@ placeholders:
|
|
- Extracts parameters via regex `/@(\w+)@/g`
|
|
- Properties: `content` (raw text), `Params` (array of parameter names)
|
|
|
|
### Env
|
|
Environment definition:
|
|
- `id: number`, `name: string`, `params: EnvParam[]`
|
|
- Methods: `addParams()`, `delParam()`, `updateParams()`, `isDefault()`
|
|
|
|
### EnvParam
|
|
Environment parameter:
|
|
- `id: number`, `name: string`, `value: string`, `isChanged: boolean`
|
|
- Methods: `Changed()`, `sanitize()` (HTML escaping)
|
|
|
|
### AppEvent<T>
|
|
Base class for CRUD operations:
|
|
- `AddEvent<T>`, `UpdateEvent<T>`, `DelEvent<T>` subclasses
|
|
|
|
## Building and Running
|
|
|
|
### Development Server
|
|
```bash
|
|
npm run dev
|
|
```
|
|
Starts Vite dev server with HMR on 0.0.0.0:5173 (accessible externally).
|
|
|
|
### Build
|
|
```bash
|
|
npm run build
|
|
```
|
|
Compiles TypeScript and bundles with Vite. Output in `dist/`.
|
|
|
|
### Preview Production Build
|
|
```bash
|
|
npm run preview
|
|
```
|
|
|
|
### Linting
|
|
```bash
|
|
npm run lint
|
|
```
|
|
|
|
### Testing
|
|
```bash
|
|
npm run test
|
|
```
|
|
Runs Vitest tests with jsdom environment.
|
|
|
|
## Configuration File Format
|
|
|
|
XML configuration files follow this structure:
|
|
|
|
- Root element: `engine`
|
|
- Environment elements: `environment name="..."` containing `parameter` children
|
|
- Template element: `template` containing JSON/text with @param@ placeholders
|
|
|
|
See `docs/config.json.xml` for a complete example.
|
|
|
|
## Component Architecture
|
|
|
|
### App (Root)
|
|
Manages global state via `AppState` singleton. Handles:
|
|
- File loading through `FileChooser`
|
|
- Environment editing through `Environment`
|
|
- Content preview through `Content`
|
|
|
|
### FileChooser
|
|
File upload component supporting only XML files (`text/xml`). "Create new" button initializes a default configuration.
|
|
|
|
### Environment
|
|
Displays environment list (dropdown) and parameter editor. Features:
|
|
- Add/delete/update parameters
|
|
- Visual change tracking (yellow border for modified values)
|
|
- DEFAULT environment is special (cannot be deleted)
|
|
|
|
### Content
|
|
Tabbed viewer with four tabs:
|
|
1. **Env** - XML representation of current environment
|
|
2. **Content Template** - JSON template with syntax highlighting
|
|
3. **Raw template** - Full XML with all environments and template
|
|
4. **Test-filled template** - JavaScript test code (stub)
|
|
|
|
## State Management
|
|
|
|
Uses `AppState` singleton pattern:
|
|
- Stores current `Config` and `Env[]`
|
|
- `saveEnv()` has artificial 1-second delay (simulates async persistence)
|
|
- Components subscribe via React `useState` hooks
|
|
|
|
## Development Conventions
|
|
|
|
- **TypeScript**: Strict typing with solution-style references (`tsconfig.app.json`, `tsconfig.node.json`)
|
|
- **ESLint**: Uses `typescript-eslint` with React hooks and refresh plugins
|
|
- **Testing**: Vitest with jsdom, tests in `src/test/`
|
|
- **Naming**: Component files use PascalCase, models use PascalCase
|
|
- **Note**: Directory is named `componets` (typo preserved for consistency)
|
|
|
|
## Known Quirks
|
|
|
|
1. Directory `src/componets/` has a typo (should be `components/`)
|
|
2. `ConfigReader.tsx` has `.tsx` extension but contains no JSX
|
|
3. Some model files use `.ts` while others use `.tsx`
|