Bỏ qua, đến nội dung

@digiforce-nc/shared

Package @digiforce-nc/shared - tập hợp utility nhỏ gọn dùng chung giữa server và client.


1) Tổng quan

shared chứa các hàm tiện ích được cả package server lẫn client import. Package không có dependency ngoài, giữ kích thước tối thiểu để tránh phình bundle.

Hai nhóm chính:

ModuleMô tả
getValuesByPathTrích xuất giá trị từ object theo đường dẫn dot-notation, hỗ trợ fan-out mảng
variable-usageTiện ích xử lý tham chiếu biến/field trong UI schema

2) getValuesByPath(obj, path)

Hàm cốt lõi của package - resolve giá trị từ object lồng nhau theo chuỗi dot-path, tự động "fan-out" khi gặp mảng.

Signature

typescript
function getValuesByPath(
  obj: Record<string, any>,
  path: string,
): any | any[];

Cách hoạt động

Trường hợpInputOutput
Truy cập đơn giảnobj = { a: { b: 1 } }, path 'a.b'1
Nested objectobj = { a: { b: { c: 'x' } } }, path 'a.b.c''x'
Fan-out mảngobj = { items: [{ name: 'A' }, { name: 'B' }] }, path 'items.name'['A', 'B']
Mảng lồng mảngobj = { groups: [{ tags: ['x','y'] }] }, path 'groups.tags'[['x','y']]
Path không tồn tạiobj = { a: 1 }, path 'b.c'undefined

Khi path đi qua một trường kiểu mảng, hàm tự động map xuống từng phần tử - gọi là fan-out. Nhờ vậy không cần viết vòng lặp thủ công.

Ví dụ

typescript
import { getValuesByPath } from '@digiforce-nc/shared';

const order = {
  customer: { name: 'Nguyễn Văn A' },
  items: [
    { product: 'Laptop', price: 25000000 },
    { product: 'Mouse', price: 350000 },
  ],
};

// Truy cập nested
getValuesByPath(order, 'customer.name');
// → 'Nguyễn Văn A'

// Fan-out qua mảng
getValuesByPath(order, 'items.product');
// → ['Laptop', 'Mouse']

getValuesByPath(order, 'items.price');
// → [25000000, 350000]

3) Variable Usage

Module variable-usage cung cấp tiện ích phân tích và xử lý tham chiếu biến (variable reference) trong UI schema - ví dụ chuỗi dạng {{field.name}} hoặc {{$context.currentUser}}.

Các chức năng chính:

  • Phát hiện tham chiếu biến trong chuỗi schema
  • Trích xuất danh sách field được tham chiếu (phục vụ dependency tracking)
  • Thay thế biến bằng giá trị thực tại runtime

Module này được UI builder và formula engine sử dụng để xác định field nào ảnh hưởng đến field nào, từ đó tính toán lại đúng thứ tự.


4) Lưu ý

  • Không dependency ngoài - import an toàn ở cả Node.js và browser.

  • Package được giữ nhỏ có chủ đích: chỉ chứa logic thực sự cần chia sẻ giữa hai môi trường.

  • Nếu utility chỉ dùng server → đặt trong @digiforce-nc/utils. Chỉ dùng client → đặt trong @digiforce-nc/sdk.

  • Mã nguồn