เรียนรู้การใช้คำสั่ง npm query เพื่อดึงค่า package ที่สนใจ
NPM เวอร์ชัน 8.18.0 ได้เพิ่มคำสั่งใหม่คือ npm query <selector>
เพื่อใช้สำหรับดึงค่าจาก package.json
ของ dependencies ที่ใช้อยู่ในโปรเจคของเรา โดยรูปแบบของการใช้งานนี้จะอิงตาม Syntax ของ
CSS Selectors 4 Spec
ตัวอย่างการใช้งานกลุ่ม <selector>
เช่น
#<name>
: เลือก dependencies ที่สนใจจากชื่อ เช่น
1npm query "#react"23ผลลัพธ์ที่ได้คือ4[5 {6 "name": "react",7 "description": "React is a JavaScript library for building user interfaces.",8 "keywords": [9 "react"10 ],11 "version": "18.2.0",12 // ....13 }14]
[attribute=value]
: เลือก dependencies ที่มีค่าของ attribute ตรงกับ value ที่ต้องการ
1# ดึง dependencies ทั้งหมดที่มี license เป็น MIT2npm query "[license=MIT]"34// ดึง dependencies ทั้งหมดที่ขึ้นต้นด้วย react5npm query "[name=^=react]"
:attr()
: attr ใช้สำหรับดึงค่า dependencies ที่สนใจโดยดูจาก attribute ที่มีค่าเป็น Array หรือ Object เช่น
1// หาแพคเกจที่ใช้ได้กับ Node เวอร์ชั่น 10+2npm query ':attr(engines, [node=">=10"])'
การใช้ npm query
ควบคู่กับ jq จะยิ่งเสริมประสิทธิภาพให้กับคำสั่งนี้ได้อย่างยิ่ง
เช่น จากคำสั่งก่อนหน้า npm query
ที่คืนผลลัพธ์ในรูปแบบอาร์เรย์ ดังนี้
1[2 // ...3 {4 "name": "cosmiconfig",5 "version": "7.0.1",6 "description": "Find and load configuration from a package.json property, rc file, or CommonJS module",7 "main": "dist/index.js",8 "types": "dist/index.d.ts",9 "files": ["dist"]10 // ...11 },12 {13 "name": "yup",14 "version": "0.32.11",15 "description": "Dead simple Object schema validation",16 "main": "lib/index.js",17 "module": "es/index.js",18 "runkitExampleFilename": "./runkit-example.js"19 // ...20 }21 // ...22]
หากเราสนใจกรองเอาเฉพาะ name ออกมาจากแต่ละชุดแพคเกจเราสามารถใช้คำสั่งของ npm query
ควบคู่กับ jq ได้ดังนี้
1npm query ':attr(engines, [node=">=10"])' | jq 'map(.name)'
ได้ผลลัพธ์เป็น
1["escape-string-regexp", "babel-plugin-macros", "cosmiconfig", "yup"]
นอกเหนือจากการใช้คำสั่งโดยตรงของ npm query
แล้ว เรายังสามารถเขียนโปรแกรมเพื่อเข้าถึง dependencies ต่าง ๆ ได้ผ่าน querySelectorAll
เช่น เราหาแพคเกจที่ใช้ได้กับ Node เวอร์ชั่น 10+ ผ่านการเขียนโปรแกรมดังนี้
1const Arborist = require('@npmcli/arborist');2const arb = new Arborist({});34arb.loadActual().then(async (tree) => {5 const results = await tree.querySelectorAll(':attr(engines, [node=">=10"])');6 console.log(results);7});
ข้อมูลเพิ่มเติมเกี่ยวกับการใช้งาน npm query
สามารถอ่านเพิ่มเติมได้จาก Dependency Selector Syntax & Querying ครับ