Bỏ qua, đến nội dung

@digiforce-nc/cli

Package@digiforce-nc/cli
Depends on@digiforce-nc/app

1) Tổng quan

@digiforce-nc/cli cung cấp lệnh digiforce - công cụ dòng lệnh chính để quản lý vòng đời ứng dụng Digiforce: khởi động, cài đặt, nâng cấp, quản lý plugin, và phát triển.

Vai trò

CLI là entry point duy nhất cho mọi tương tác với Digiforce từ terminal. Nó khởi tạo environment, tạo Application instance, rồi delegate sang các command handler tương ứng.


2) Bảng lệnh chính

Lifecycle commands

LệnhMô tảVí dụ
digiforce devKhởi động development server với hot reloaddigiforce dev --port 3000
digiforce startKhởi động production serverdigiforce start -d
digiforce installCài đặt ứng dụng: tạo bảng, seed dữ liệudigiforce install
digiforce upgradeChạy migration và nâng cấp hệ thốngdigiforce upgrade

Plugin management (pm)

LệnhMô tảVí dụ
digiforce pm add <plugin>Thêm plugin vào hệ thốngdigiforce pm add @digiforce-nc/plugin-audit-logs
digiforce pm enable <plugin>Kích hoạt plugindigiforce pm enable audit-logs
digiforce pm disable <plugin>Vô hiệu hóa plugindigiforce pm disable audit-logs
digiforce pm remove <plugin>Gỡ bỏ plugindigiforce pm remove audit-logs
digiforce pm listLiệt kê tất cả plugin và trạng tháidigiforce pm list

Schema export / import (schema)

LệnhMô tảVí dụ
digiforce schema -lLiệt kê menu tree (UID, title, type)digiforce schema -l
digiforce schema -i <uid> -p <plugin>Export một route theo UID vào plugindigiforce schema -i abc123 -p @digiforce/plugin-my-app
digiforce schema -a -p <plugin>Export tất cả root menu itemsdigiforce schema -a -p @digiforce/plugin-my-app
digiforce schema -a -r -p <plugin>Export đệ quy (bao gồm children của group)digiforce schema -a -r -p @digiforce/plugin-my-app
digiforce schema -A import -b <path>Import schemas từ thư mục plugindigiforce schema -A import -b packages/plugins/@digiforce/plugin-my-app/src

Options đầy đủ:

OptionMô tả
-l, --listIn cây menu ra stdout
-i, --uid <schema-uid>Schema UID cần export (chỉ khớp mục menu gốc)
-a, --allExport tất cả root menu items
-f, --forceGhi đè file .ts nếu đã tồn tại
-p, --plugin <name>Tên plugin đích — file ghi vào <plugin>/src/server/schemas/
-r, --recursiveĐệ quy export children khi route là group
-A, --action <action>export (mặc định) hoặc import
-b, --base-path <path>Thư mục gốc cho import (cần có server/schemas/ bên trong)

Trước khi chạy

Cần database đã cài đặt và ứng dụng kết nối được tới DB (giống các lệnh digiforce có xác thực). Khi export, hệ thống khởi động ứng dụng để đọc menu và schema từ dữ liệu thật.

Format file export:

Mỗi file .ts sinh ra có dạng:

typescript
export default {
  target: 'digiforce-admin-menu',
  position: 'beforeEnd',
  route: { type: 'page', schemaUid: '...', title: '...', icon: '...' },
  schema: { /* Formily JSON Schema */ },
  widgets: [ /* khi trang uiPage: widget trang và các tab */ ],
};
FieldKhi nào cóMô tả
routeLuôn cóMetadata route (type, title, icon, schemaUid). Với group: không bao gồm children (con export bằng -r).
schemaLuôn cóCấu trúc Formily của trang (đã mở rộng đủ khối con; block template đã gắn nội dung thật).
widgetsKhi trang là uiPageDanh sách widget: phần tử đầu là khối trang, các phần tử sau là khối từng tab con (nếu có).

Cấu trúc thư mục khi export đệ quy (-r):

<plugin>/src/server/schemas/
├── rootGroupUid.ts              # Group route
├── rootGroupUid.d/
│   ├── childPageUid.ts          # Child page
│   └── childGroupUid.ts         # Nested group
│       └── childGroupUid.d/
│           └── grandchildUid.ts # Grandchild
└── anotherRootUid.ts

Import:

Lệnh digiforce schema -A import -b <basePath> đọc thư mục <basePath>/server/schemas/, nạp từng file .ts hoặc .js, và các thư mục con dạng <schemaUid>.d/ (cùng cấu trúc với lúc export). Menu, schema giao diện và widget được ghi vào database trong một lần xử lý; ứng dụng cần có plugin lưu trữ schema (plugin-ui-schema-storage).


3) Flow xử lý lệnh


4) Utility functions

initEnv()

Đọc và merge các file environment theo thứ tự ưu tiên:

typescript
// Thứ tự load (sau override trước):
// 1. .env               - cấu hình mặc định
// 2. .env.local          - override cục bộ (git-ignored)
// 3. .env.[NODE_ENV]     - theo môi trường (development, production)
// 4. .env.[NODE_ENV].local

initEnv();
// Sau khi gọi, process.env chứa tất cả biến từ các file trên

Lưu ý

File .env.local.env.*.local nên được thêm vào .gitignore. Chúng chứa secret riêng của từng developer/server.

checkDBDialect()

Kiểm tra và validate dialect database trước khi khởi động:

typescript
checkDBDialect();
// Throws nếu DB_DIALECT không hợp lệ
// Hỗ trợ: 'postgres', 'mysql', 'mariadb', 'sqlite'

buildIndexHtml()

Sinh file index.html cho client SPA, inject các biến cấu hình runtime:

typescript
await buildIndexHtml();
// Đọc template → inject API_BASE_URL, APP_NAME, etc. → ghi ra dist/

genTsConfigPaths()

Tự động sinh TypeScript path aliases cho workspace monorepo:

typescript
genTsConfigPaths();
// Scan packages/ → sinh tsconfig.paths.json
// Cho phép import '@digiforce-nc/server' thay vì đường dẫn tương đối

5) Environment setup

CLI đọc cấu hình từ environment variables. Các biến quan trọng:

BiếnMô tảMặc định
APP_PORTCổng HTTP server13000
APP_HOSTHost bind0.0.0.0
DB_DIALECTLoại databasesqlite
DB_HOSTDatabase hostlocalhost
DB_PORTDatabase portdialect-dependent
DB_DATABASETên databasedigiforce
DB_USERDatabase user-
DB_PASSWORDDatabase password-
DB_STORAGESQLite file path./storage/db/digiforce.sqlite
APP_KEYSecret key cho JWT/encryption-
PLUGIN_PACKAGE_PREFIXPrefix cho plugin package@digiforce-nc/plugin-

Bắt buộc

APP_KEY phải được đặt trong production. Nếu thiếu, JWT token và encryption sẽ không an toàn.


6) Plugin generation helpers

CLI cung cấp tiện ích tạo scaffold cho plugin mới:

bash
# Tạo plugin mới với template
digiforce pm create my-plugin

# Cấu trúc sinh ra:
# packages/plugins/my-plugin/
# ├── src/
# │   ├── server/
# │   │   ├── plugin.ts        # Server plugin class
# │   │   └── index.ts
# │   └── client/
# │       ├── index.tsx         # Client plugin entry
# │       └── locale/           # i18n files
# ├── package.json
# └── tsconfig.json

Plugin scaffold bao gồm:

  • Server plugin class kế thừa Plugin với lifecycle hooks (afterAdd, beforeLoad, load, install)
  • Client entry đăng ký routes, components, settings pages
  • Locale files cho đa ngôn ngữ
  • package.json với đúng peerDependencies

7) Kiến trúc CLI

Mở rộng

CLI sử dụng commander.js bên dưới. Các plugin có thể đăng ký command riêng thông qua app.cli.command() - xem Server Application.