import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/vi/scripts/Classes/PackageInitItem - Trình khởi tạo mục gói'/>

# Lớp PackageInitItem

Lớp `PackageInitItem` xử lý quá trình khởi tạo chi tiết của một thành phần riêng lẻ hoặc gói con. Nó quản lý vòng đời của tệp — từ việc áp dụng mẫu đến tích hợp với thư viện chính, `package.json` và Storybook.

## Các tính năng chính

- **Tạo tệp** — Tự động tạo các tệp dựa trên các mẫu có sẵn và các mẫu chuyên dụng.
- **Thay thế nội dung động** — Tự động phân giải các trình giữ chỗ như `[name]` và `@packages/library` bên trong các tệp được tạo.
- **Tích hợp thư viện** — Tự động tạo các điểm nhập và đăng ký thành phần trong thư viện toàn cục.
- **Quản lý phụ thuộc** — Cập nhật `package.json` gốc để bao gồm gói mới trong các phần phụ thuộc, xuất bản (exports) và danh sách tệp.
- **Tự động hóa Storybook** — Tự động chèn các câu chuyện (stories) mới vào cấu hình Storybook.

## Khởi tạo

Để khởi tạo đối tượng, hãy gọi hàm khởi tạo `PackageInitItem(name, dir, type, templates)`.

**Tham số:**
- `name: string` — Tên hoặc định danh đường dẫn duy nhất của thành phần.
- `dir: string[]` — Mảng đường dẫn tuyệt đối đến thư mục mục tiêu của thành phần.
- `type: string` — Mã định danh loại gói (ví dụ: `'functional'`, `'ui'`).
- `templates?: string` — Danh sách các mẫu tùy chọn cần áp dụng (cách nhau bởi dấu phẩy).

```typescript
import { PackageInitItem } from '@dxtmisha/scripts'

const item = new PackageInitItem(
  'button',
  ['path', 'to', 'button'],
  'ui'
)
```

## Các phương thức

### Điều khiển

- `make(): void` — Thực hiện chu trình khởi tạo đầy đủ: tạo tệp, cập nhật thư viện, `package.json` và Storybook.

## Các thao tác (Operations)

### Quy trình khởi tạo

Khi `make()` được gọi, lớp sẽ thực hiện các bước sau theo thứ tự:

1. **Chuẩn bị file**: Nó lấy các tệp mẫu từ thư mục media/templates dựa trên loại gói `type`.
2. **Áp dụng mẫu**: Nếu các `templates` cụ thể được cung cấp, nó sẽ lấy và áp dụng chúng.
3. **Ghi tệp**: Nó ghi các tệp đã xử lý vào thư mục mục tiêu, thực hiện các thay thế nội dung cần thiết.
4. **Tích hợp (Thư viện)**: Nếu tệp `library.ts` được tạo, nó sẽ kích hoạt việc tự động tạo các tệp xuất bản (export) trong thư mục gốc của thư viện.
5. **Tích hợp (Gói)**: Nó cập nhật `package.json` gốc để đăng ký phụ thuộc workspace và xuất bản của gói mới.
6. **Tích hợp (Storybook)**: Nó quét cấu hình Storybook và thêm các mẫu để bao gồm các câu chuyện của thành phần mới.

### Logic phân giải nội bộ

Lớp sử dụng một số hàm hỗ trợ nội bộ để phân giải các quy ước đặt tên:
- **`getName()`**: Bình thường hóa tên thành phần để sử dụng trong nội dung tệp.
- **`getCode()`**: Chuyển đổi tên thành mã có gạch nối cho các định danh gói.
- **`getProjectName()`**: Phân giải tên gói NPM đầy đủ bao gồm cả tiền tố thiết kế.
