Created
March 25, 2026 16:22
-
-
Save Sdy603/421f01f3655aa4e1d754dafc35f2e4af to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * DX queries.datafeed fetcher | |
| * | |
| * Usage: | |
| * export DX_API_KEY="your_api_key" | |
| * | |
| * node fetch_dx_query.js | |
| * node fetch_dx_query.js --csv | |
| * node fetch_dx_query.js --csv=out.csv | |
| * node fetch_dx_query.js --feed=abc123 | |
| * node fetch_dx_query.js --apiKey=xxxx --feed=abc123 --csv=data.csv | |
| */ | |
| const https = require("https"); | |
| const fs = require("fs"); | |
| // --- DEFAULTS (fallbacks) --- | |
| const DEFAULT_FEED_TOKEN = "cZUNCosVmt6d1rMkjCpiPe6S"; | |
| const DEFAULT_API_KEY = ""; // optional fallback if you want to hardcode | |
| // --- CLI ARGS --- | |
| const args = process.argv.slice(2); | |
| function getArg(name) { | |
| const arg = args.find(a => a.startsWith(`--${name}=`)); | |
| return arg ? arg.split("=")[1] : null; | |
| } | |
| // --- RESOLUTION ORDER: CLI -> ENV -> DEFAULT --- | |
| const FEED_TOKEN = | |
| getArg("feed") || | |
| process.env.DX_FEED_TOKEN || | |
| DEFAULT_FEED_TOKEN; | |
| const DX_API_KEY = | |
| getArg("apiKey") || | |
| process.env.DX_API_KEY || | |
| DEFAULT_API_KEY; | |
| // CSV flags | |
| const csvArg = args.find(arg => arg.startsWith("--csv")); | |
| const ENABLE_CSV = !!csvArg; | |
| const CSV_FILENAME = csvArg?.includes("=") | |
| ? csvArg.split("=")[1] | |
| : "dx_output.csv"; | |
| // Optional query config | |
| const QUERY_VARS = { | |
| // "var-team": "platform" | |
| }; | |
| const COLUMNS = []; // ["title", "open_to_deploy"] | |
| // --- BUILD URL --- | |
| function buildUrl() { | |
| const url = new URL("https://api.getdx.com/queries.datafeed"); | |
| url.searchParams.append("feed_token", FEED_TOKEN); | |
| Object.entries(QUERY_VARS).forEach(([key, value]) => { | |
| url.searchParams.append(key, value); | |
| }); | |
| if (COLUMNS.length > 0) { | |
| url.searchParams.append("columns", COLUMNS.join(",")); | |
| } | |
| return url.toString(); | |
| } | |
| // --- FETCH --- | |
| function fetchData() { | |
| return new Promise((resolve, reject) => { | |
| const options = { | |
| method: "GET", | |
| headers: { | |
| "Accept": "application/json", | |
| "Authorization": `Bearer ${DX_API_KEY}` | |
| } | |
| }; | |
| https | |
| .get(buildUrl(), options, (res) => { | |
| let data = ""; | |
| res.on("data", chunk => { | |
| data += chunk; | |
| }); | |
| res.on("end", () => { | |
| try { | |
| const parsed = JSON.parse(data); | |
| if (!parsed.ok) { | |
| return reject(new Error(`DX API error: ${JSON.stringify(parsed)}`)); | |
| } | |
| resolve(parsed.data); | |
| } catch (err) { | |
| reject(err); | |
| } | |
| }); | |
| }) | |
| .on("error", reject); | |
| }); | |
| } | |
| // --- OUTPUT --- | |
| function printTable(data) { | |
| const { columns, rows } = data; | |
| console.log("\nColumns:"); | |
| console.log(columns); | |
| console.log("\nRows:"); | |
| rows.forEach((row) => { | |
| const obj = {}; | |
| columns.forEach((col, i) => { | |
| obj[col] = row[i]; | |
| }); | |
| console.log(obj); | |
| }); | |
| } | |
| function writeCSV(data, filename) { | |
| const { columns, rows } = data; | |
| const csv = [ | |
| columns.join(","), | |
| ...rows.map(row => | |
| row.map(val => `"${String(val).replace(/"/g, '""')}"`).join(",") | |
| ) | |
| ].join("\n"); | |
| fs.writeFileSync(filename, csv); | |
| console.log(`\nSaved CSV -> ${filename}`); | |
| } | |
| // --- MAIN --- | |
| async function main() { | |
| if (!DX_API_KEY) { | |
| console.error("Missing API key (use --apiKey or DX_API_KEY)"); | |
| process.exit(1); | |
| } | |
| if (!FEED_TOKEN) { | |
| console.error("Missing feed token (use --feed or DX_FEED_TOKEN)"); | |
| process.exit(1); | |
| } | |
| console.log("Using feed_token:", FEED_TOKEN); | |
| try { | |
| const data = await fetchData(); | |
| if (ENABLE_CSV) { | |
| writeCSV(data, CSV_FILENAME); | |
| } else { | |
| printTable(data); | |
| } | |
| } catch (err) { | |
| console.error("Error:", err.message); | |
| } | |
| } | |
| main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment