Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Convert X (Twitter) tweets, threads, and articles to Markdown with YAML front matter via reverse-engineered API.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/cookie-file.ts
1import fs from "node:fs";2import path from "node:path";3import { mkdir, readFile, writeFile } from "node:fs/promises";45import { resolveXToMarkdownCookiePath } from "./paths.js";67export type CookieMap = Record<string, string>;89export type CookieFileData =10| {11cookies: CookieMap;12updated_at: number;13source?: string;14}15| {16version: number;17updatedAt: string;18cookieMap: CookieMap;19source?: string;20};2122export async function read_cookie_file(23p: string = resolveXToMarkdownCookiePath()24): Promise<CookieMap | null> {25try {26if (!fs.existsSync(p) || !fs.statSync(p).isFile()) return null;27const raw = await readFile(p, "utf8");28const data = JSON.parse(raw) as unknown;2930if (data && typeof data === "object" && "cookies" in (data as any)) {31const cookies = (data as any).cookies as unknown;32if (cookies && typeof cookies === "object") {33const out: CookieMap = {};34for (const [k, v] of Object.entries(cookies as Record<string, unknown>)) {35if (typeof v === "string") out[k] = v;36}37return Object.keys(out).length > 0 ? out : null;38}39}4041if (data && typeof data === "object" && "cookieMap" in (data as any)) {42const cookies = (data as any).cookieMap as unknown;43if (cookies && typeof cookies === "object") {44const out: CookieMap = {};45for (const [k, v] of Object.entries(cookies as Record<string, unknown>)) {46if (typeof v === "string") out[k] = v;47}48return Object.keys(out).length > 0 ? out : null;49}50}5152if (data && typeof data === "object") {53const out: CookieMap = {};54for (const [k, v] of Object.entries(data as Record<string, unknown>)) {55if (typeof v === "string") out[k] = v;56}57return Object.keys(out).length > 0 ? out : null;58}5960return null;61} catch {62return null;63}64}6566export async function write_cookie_file(67cookies: CookieMap,68p: string = resolveXToMarkdownCookiePath(),69source?: string70): Promise<void> {71const dir = path.dirname(p);72await mkdir(dir, { recursive: true });7374const payload: CookieFileData = {75version: 1,76updatedAt: new Date().toISOString(),77cookieMap: cookies,78source,79};80await writeFile(p, JSON.stringify(payload, null, 2), "utf8");81}8283export const readCookieFile = read_cookie_file;84export const writeCookieFile = write_cookie_file;8586