ดึง package ที่สนใจในโปรเจคด้วย npm query
Nuttavut Thongjor
Node.js

เรียนรู้การใช้คำสั่ง npm query เพื่อดึงค่า package ที่สนใจ

คำอธิบาย
ความคิดเห็น

NPM เวอร์ชัน 8.18.0 ได้เพิ่มคำสั่งใหม่คือ npm query <selector> เพื่อใช้สำหรับดึงค่าจาก package.json ของ dependencies ที่ใช้อยู่ในโปรเจคของเรา โดยรูปแบบของการใช้งานนี้จะอิงตาม Syntax ของ CSS Selectors 4 Spec

ตัวอย่างการใช้งานกลุ่ม <selector> เช่น

  • #<name>: เลือก dependencies ที่สนใจจากชื่อ เช่น
Code
1npm query "#react"
2
3ผลลัพธ์ที่ได้คือ
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 ที่ต้องการ
Code
1# ดึง dependencies ทั้งหมดที่มี license เป็น MIT
2npm query "[license=MIT]"
3
4// ดึง dependencies ทั้งหมดที่ขึ้นต้นด้วย react
5npm query "[name=^=react]"
  • :attr(): attr ใช้สำหรับดึงค่า dependencies ที่สนใจโดยดูจาก attribute ที่มีค่าเป็น Array หรือ Object เช่น
Code
1// หาแพคเกจที่ใช้ได้กับ Node เวอร์ชั่น 10+
2npm query ':attr(engines, [node=">=10"])'

การใช้ npm query ควบคู่กับ jq จะยิ่งเสริมประสิทธิภาพให้กับคำสั่งนี้ได้อย่างยิ่ง เช่น จากคำสั่งก่อนหน้า npm query ที่คืนผลลัพธ์ในรูปแบบอาร์เรย์ ดังนี้

Code
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 ได้ดังนี้

Code
1npm query ':attr(engines, [node=">=10"])' | jq 'map(.name)'

ได้ผลลัพธ์เป็น

Code
1["escape-string-regexp", "babel-plugin-macros", "cosmiconfig", "yup"]

นอกเหนือจากการใช้คำสั่งโดยตรงของ npm query แล้ว เรายังสามารถเขียนโปรแกรมเพื่อเข้าถึง dependencies ต่าง ๆ ได้ผ่าน querySelectorAll เช่น เราหาแพคเกจที่ใช้ได้กับ Node เวอร์ชั่น 10+ ผ่านการเขียนโปรแกรมดังนี้

JavaScript
1const Arborist = require('@npmcli/arborist');
2const arb = new Arborist({});
3
4arb.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 ครับ