mirror of
https://github.com/caty21/forex-dashboard.git
synced 2026-08-15 13:38:06 +00:00
feat: banques centrales (vote+dot plot+previsions), calendrier elargi, fix InvestingLive, M3 auto
Central bank governance (nouvel onglet Banques centrales) : - lib/centralBankGovernance.ts + app/api/central-bank-sources : scraping live du vote de la derniere reunion, dot plot Fed (SEP), et desormais les previsions macro (PIB + inflation) publiees par chaque BC elle-meme (Fed SEP, Eurosystem staff projections, BoJ Outlook Report PDF, SNB conditional forecast, BoC MPR, RBA SMP). GBP/NZD laisses honnetement vides quand aucune source chiffree fiable n'est accessible (RBNZ bloque par Cloudflare). - components/CentralBankSourcesTab.tsx : nouvel onglet avec cards par banque. Taux directeurs + Money Supply M3 : - data/rate_decisions.json corrige (JPY, EUR, NZD etc. etaient perimes d'1-2 decisions) et desormais auto-maintenu : .github/workflows/update-rate-decisions.yml (horaire) detecte les changements de taux via Trading Economics et fait glisser current -> prev sans perte de donnee. - data/money-supply-m3.json (nouveau) + .github/workflows/fetch-money-supply.yml (hebdo) : M3 par devise (proxy M2 pour l'USD, la Fed ne publiant plus M3 depuis 2006), affiche dans CurrencyCard. Calendrier economique elargi : - lib/calendar-countries.ts, lib/calendar-taxonomy.ts, lib/fxstreetCalendar.ts : couverture pays elargie + classification des evenements + source FXStreet. Fix InvestingLive : - lib/investinglive.ts : l'ancienne API WordPress (wp-json) renvoyait 404 depuis leur migration Nuxt.js -> reecrit vers api.investinglive.com/api/homepage/articles, + fix crash silencieux (Tldr pas toujours un tableau). Divers : - .vercel/ ajoute au .gitignore (ne doit jamais etre commite, cf. son propre README). - scripts/ (lancement PWA, push env Vercel), captures d'ecran, cache InvestingLive. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
82a732fbdf
commit
0657b50c07
@@ -0,0 +1,57 @@
|
||||
import { readFileSync } from "fs";
|
||||
import { join, dirname } from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const envFile = join(__dirname, "../.env.local");
|
||||
const TOKEN = process.env.VERCEL_TOKEN;
|
||||
const PROJECT_ID = process.env.VERCEL_PROJECT_ID;
|
||||
const TEAM_ID = process.env.VERCEL_TEAM_ID;
|
||||
|
||||
if (!TOKEN || !PROJECT_ID || !TEAM_ID) {
|
||||
console.error("Missing VERCEL_TOKEN, VERCEL_PROJECT_ID or VERCEL_TEAM_ID");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const lines = readFileSync(envFile, "utf8").split("\n");
|
||||
const envVars = [];
|
||||
for (const line of lines) {
|
||||
const trimmed = line.trim();
|
||||
if (!trimmed || trimmed.startsWith("#")) continue;
|
||||
const idx = trimmed.indexOf("=");
|
||||
if (idx < 0) continue;
|
||||
const key = trimmed.slice(0, idx).trim();
|
||||
const value = trimmed.slice(idx + 1).trim();
|
||||
if (key) envVars.push({ key, value });
|
||||
}
|
||||
|
||||
console.log(`Found ${envVars.length} variables to push...`);
|
||||
|
||||
for (const { key, value } of envVars) {
|
||||
const res = await fetch(
|
||||
`https://api.vercel.com/v10/projects/${PROJECT_ID}/env?teamId=${TEAM_ID}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
Authorization: `Bearer ${TOKEN}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
key,
|
||||
value,
|
||||
type: "encrypted",
|
||||
target: ["production", "preview"],
|
||||
}),
|
||||
}
|
||||
);
|
||||
const data = await res.json();
|
||||
if (data.key) {
|
||||
console.log(` ✓ ${key}`);
|
||||
} else if (data.error?.code === "ENV_ALREADY_EXISTS") {
|
||||
console.log(` ~ ${key} (already exists, skipping)`);
|
||||
} else {
|
||||
console.log(` ✗ ${key}: ${data.error?.message ?? JSON.stringify(data)}`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log("\nDone. Now deploying to production...");
|
||||
Reference in New Issue
Block a user