Các thay đổi qua từng phiên bản vnstock-js
Bản vá cho CLI sau khi release 1.3.0.
history --range 7d giờ trả đúng ~7 phiên (trước đây trả ~365 phiên do VCI API bỏ qua start khi countBack mặc định lớn). Handler tự tính countBack theo khoảng ngày và filter lại kết quả.56.291760000000004k.symbols --exchange HOSE giờ hoạt động (trước đây trả rỗng vì data lưu HSX). Directory.getByExchange tự map HOSE → HSX.symbols mặc định trả đầy đủ (trước đây tự cắt ở 50). --limit N chỉ áp dụng khi user chỉ định.vnstock -v cho --version (trước đây dùng -V hoa mặc định của commander). Version đọc từ package.json thay vì hardcode. --verbose ở sub-command bỏ alias -v để tránh xung đột.history và symbols: ví dụ VCB 2026-04-07 → 2026-04-14 (5 phiên) và HOSE (702 mã).docs/local-test.md — hướng dẫn npm link, watch mode, npm pack, debug CLI trước khi release.npm run dev — tsc --watch để auto rebuild khi sửa code.await init() bắt buộc trước khi dùng symbol lookup hoặc calendar API. Symbol và holiday data không còn bundle trong package — fetch runtime từ raw GitHub để luôn mới.
import { init } from "vnstock-js";
await init(); // gọi 1 lần lúc khởi động app
init() nhận options: symbolsUrl, holidaysUrl, ttl, force, cacheDir, noCache, timeout.
raw.githubusercontent.com/ttqteo/vnstock-js/master/data/*.json~/.vnstock-js/cache/, TTL mặc định 24hNotInitializedError và DataUnavailableError error typesnpm i -g vnstock-js hoặc npx vnstock-js <command>:
vnstock quote <SYMBOL> — snapshot 1 mãvnstock history <SYMBOL> [--from 7d|1w|1m|1y] [--range 7d] [--limit N] — OHLCVvnstock search <QUERY> — tìm mã theo tên/tickervnstock symbols [--exchange HOSE|HNX|UPCOM] — liệt kê mã--json, --csv, --no-color, -v, --verbose. Non-TTY auto plain text.unsubscribe() giờ gửi unsub message cho server. Message routing phân biệt quote/JSON/plain text. Loại bỏ WebSocket ping() vô nghĩa (browser không còn reset oan ~40s).deadManTimeout (mặc định 60s).RealtimeClientOptions.heartbeatInterval và heartbeatTimeout, thay bằng deadManTimeout?: number.data/*.json không còn bundle trong npm package.isTradeDay, nextTradeDay, prevTradeDay, holidays, giờ giao dịch sàn HOSERetry-After header rồi retrystock.search(query, { limit }) -- tìm mã cổ phiếu offlinelisting.search(), listing.getBySymbol(), listing.getByExchange(), listing.getByIndustry(), listing.allLocal()market.calendar.isTradeDay(date), nextTradeDay(date), prevTradeDay(date), holidays(year), session()fetchWithRetry hỗ trợ rateLimitWait option (mặc định 5s)SymbolInfo, TradingSession typesnpm run update-symbolsdata/symbols.json và data/holidays.json trong npm packageVnstockError, NetworkError, RateLimitError, ApiError, InvalidSymbolError, InvalidParameterError, ParseErrorRealtimeClient dùng EventEmitter pattern, auto-reconnect với exponential backoff, heartbeat, subscribe queueStockDataAdapter interface + VciAdapter, chuẩn bị cho multi-source sau nàyVnstockRealtime.connect/subscribe/parseData) thay bằng realtime.create() + RealtimeClient event emitterrealtime giờ là top-level export, không còn trên Vnstock class hay stock objectfetchWithRetry wrap axios errors thành custom error classesInvalidParameterError thay vì throw new Errorxlsx (2 CVE: Prototype Pollution + ReDoS)period giờ optional)ScreenResultQuoteHistory typeBreaking changes so với v0.5.x. Refactor toàn bộ kiến trúc.
stock.screening) -- lọc theo PE, ROE, vốn hóastock.price() -> stock.quote()stock.company() giờ là factory method trả về Company instanceVnstockTypes trỏ sang normalized typesparseData() trả về RealtimeQuote với field names mớistock.price -> stock.quotetrading.topGainers, trading.topLosers