import { Client } from '@microsoft/microsoft-graph-client'; // Bun-native env loader async function loadEnv(filePath: string) { const file = Bun.file(filePath); if (!(await file.exists())) { console.warn(`⚠ Env file not found: ${filePath}`); return; } const text = await file.text(); for (const line of text.split('\n')) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) continue; const eqIndex = trimmed.indexOf('='); if (eqIndex === -1) continue; const key = trimmed.slice(0, eqIndex).trim(); let value = trimmed.slice(eqIndex + 1).trim(); if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { value = value.slice(1, -1); } process.env[key] = value; } } await loadEnv('/home/admin/secrets/.env'); async function getGraphToken() { const tokenEndpoint = `https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/v2.0/token`; const params = new URLSearchParams(); params.append('client_id', process.env.CLIENT_ID!); params.append('client_secret', process.env.CLIENT_SECRET!); params.append('scope', 'https://graph.microsoft.com/.default'); params.append('grant_type', 'client_credentials'); const response = await fetch(tokenEndpoint, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params, }); const data = await response.json(); return data.access_token; } async function inspectTables() { const token = await getGraphToken(); const client = Client.init({ authProvider: (done) => { done(null, token); }, }); const driveId = process.env.DRIVE_ID; const itemId = process.env.ITEM_ID; const baseUrl = `/drives/${driveId}/items/${itemId}/workbook/tables`; console.log(`Inspecting tables in file: ${itemId}`); try { const res = await client.api(baseUrl).get(); const tables = res.value; for (const table of tables) { console.log(`\nTable: ${table.name}`); const cols = await client.api(`${baseUrl}/${table.name}/columns`).get(); console.log(`- Column count: ${cols.value.length}`); } } catch (err) { console.error('Error:', err.message); } } inspectTables();