Introducing the new npm Dependency Selector Syntax | GitHub Changelog
`npm query` 是從
npm v8.16.0 開始最新的指令, 他接收一個
Dependency Selector(如同在
Dependency Selector Syntax Specification 所定義的) 然後回傳一個從你的專案的 dependencies 篩選過後的 JSON Array 或 NodeList. 我們相信這個能力就是這個套件管理生態裡缺少的一角; 有了他的介紹, 我們希望可以將開發者的潛力解鎖, 捫心自問關於套件的 dependencies, 之間的關係和相關的 metadata.
大部分的 JavaScript 開發者, Dependency Selector Syntax 看起來熟悉, 因為他確實是採用 CSS 的形式. 我們取用了現存的, 已知的語言, 以及他的 operators 讓不同的套件資訊廣泛存取.
範例使用方式
如果我要列出所有的 dependencies(與 `npm list --all` 類似), 我可以執行:
npm query "*"
如果我要找出專案內每個 `react` 和 `lodash` 的版本, 我可以執行:
npm query "#react, #lodash"
如果我要找出所有 `react` 版本, 但並非定義在 peer dependency, 我可以執行:
npm query "#react:not(.peer)"
如果我要找出所有專案內的 dependencies, 且使用 `MIT` 授權, 我會將查詢改成:
npm query "[license=MIT]"
如果我要找出所有專案內 git dependencies, 我可以執行:
npm query ":type(git)"
如果我要找出有哪些 transitive dependencies 使用了 `postinstall` script, 我可以執行:
npm query ":attr(scripts, [postinstall]):not(:root > *)"
程式使用方式
我們知道大部分在這個生態系的開發者也會想要自己運用這個新語法, 所以我們把他建立在 CLI 的程式大腦中. 在底層, 我們將新的 `.querySelectorAll()` 方法加入到現存的 `Node` Class, 在
`@npmcli/arborist` 函式庫中使用. 工具開發者們現在也可以載入並查詢他們的 dependencies, 如同我們這樣.
// index.js
const Arborist = require('@npmcli/arborist')
const arb = new Arborist({})
arb.loadActual((tree) => {
// query all workspaces
const results = await tree.querySelectorAll('.workspace')
console.log(results)
})
下一步是甚麼?
未來我們計畫根據 registry metadata 加入新的 pseudo states 和 selectors, 應該會將另一些關於 auditing 的能力解鎖(舉例包括 `:outdated`, `:deprecated`, `:vulnerable`, `:cve()` 和 `:cwe()` ). 如同在原本的 RFC proposal 中所註記的, 我們也會考慮支援 `query` flag 或是從 `stdin` 讀取現存的指令.