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

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

# Lớp PackageInit

Lớp `PackageInit` chịu trách nhiệm khởi tạo cấu trúc gói mới trong hệ thống thiết kế. Nó xử lý việc quét danh mục và ủy quyền khởi tạo tệp riêng lẻ cho lớp `PackageInitItem`, đảm bảo thiết lập môi trường nhất quán dựa trên các mẫu và loại được cung cấp.

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

- **Tự động triển khai cấu trúc** — Tự động tạo hệ thống phân cấp thư mục cần thiết cho các gói mới.
- **Khởi tạo dựa trên mẫu** — Hỗ trợ các loại gói và bộ mẫu khác nhau để thiết lập môi trường linh hoạt.
- **Xử lý thư mục đệ quy** — Xác định và xử lý các thư mục trống hoặc mới trong thư mục gốc của gói.
- **Quản lý vòng đời** — Cung cấp một điểm nhập duy nhất để kích hoạt toàn bộ chuỗi khởi tạo.

## Khởi tạo

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

**Tham số:**
- `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).
- `dir: string` — Thư mục cơ sở nơi đặt các gói (mặc định là `UI_DIR_PACKAGES`).

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

// Khởi tạo cho gói 'functional' với các mẫu mặc định
const initializer = new PackageInit('functional', 'basic,test')
```

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

### Điều khiển

- `make(): void` — Bắt đầu quá trình khởi tạo cho tất cả các thư mục được xác định trong đường dẫn mục tiêu.

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

### Quy trình khởi tạo chi tiết

Phương thức `make()` tuân theo một trình tự cụ thể để đảm bảo thiết lập gói sạch sẽ:

1. **Quét**: Quét thư mục mục tiêu `dir` để xác định các thư mục con yêu cầu khởi tạo (thường là các thư mục trống).
2. **Ủy quyền**: Đối với mỗi thư mục được xác định, nó tạo một thực thể của `PackageInitItem`.
3. **Thực thi**: Kích hoạt phương thức `make()` trên mỗi `PackageInitItem`, phương thức này xử lý việc tạo tệp thực tế và áp dụng mẫu.

### Xác định thư mục mục tiêu

Lớp sử dụng phương thức nội bộ `getDirs()` để tìm các thư mục "trống" (không chứa thư mục con), sau đó được coi là gốc cho các thành phần gói mới.
```typescript
protected getDirs(): string[] {
  return PropertiesFile.readDir(this.dir)
    .filter(
      path => PropertiesFile.readDir([this.dir, path]).length === 0
    )
}
```
