curl and Terminal Clients

curl, Wget, HTTPie and xh get a page's first frame as truecolor ANSI text. Configure its size or turn it off.

ٹرمینل HTTP کلائنٹس کو HTML دستاویز کے بجائے صفحے کا پہلا فریم ٹروکلر ANSI متن کی صورت میں ملتا ہے۔ آپ کو کوئی کنفیگریشن کرنے کی ضرورت نہیں۔

curl https://my-app.example.com/about

فریم حاصل کرنے والی درخواستیں

درخواست کو فریم تب ملتا ہے جب یہ تمام شرائط پوری ہوں:

  • میتھڈ GET یا HEAD ہو؛
  • User-Agent کی ابتدا curl/، Wget/، wget2/، HTTPie/ یا xh/ سے ہو؛
  • Accept ہیڈر موجود نہ ہو یا اس میں text/html کا ذکر نہ ہو۔

براؤزرز، کرالرز اور لنک پریویوز کو HTML صفحہ ملتا ہے۔ curl سے HTML حاصل کرنے کے لیے اس کی درخواست کریں:

curl -H 'Accept: text/html' https://my-app.example.com/about

فریم کا انتخاب اس مقام پر ہوتا ہے جہاں صفحہ پیش ہونا ہوتا ہے: مڈل ویئر، rewrites اور روٹ ہینڈلرز کے بعد، اور کبھی ان فائلوں یا پاتھس کے لیے نہیں جن کے آخری حصے میں نقطہ ہو۔ مڈل ویئر کے ری ڈائریکٹس، 401 جوابات، ہیڈرز اور ری رائٹس curl پر بھی براؤزرز کی طرح لاگو ہوتے ہیں۔ /api/health اب بھی اپنا ہینڈلر چلاتا ہے اور /robots.txt اب بھی فائل پیش کرتا ہے۔

فریم کا مواد

فریم صفحے کا پہلا رینڈر ہے، جیسے پری رینڈر شدہ شیل میں: ہر <Suspense> باؤنڈری جو ابھی منتظر ہے اپنا فال بیک دکھاتی ہے۔ غیر ہم وقت سرور کمپوننٹس نہیں چلتے، اور fetch() کبھی ریزولو نہیں ہوتا، اس لیے ایفیکٹس میں لوڈ ہونے والا ڈیٹا اپنی لوڈنگ حالت میں رہتا ہے۔

  • سائز: ⁦80 × 24⁩ سیل۔ مقررہ ویوپورٹ (viewport.responsive: false) والی ایپ اس کے بجائے viewport.width × viewport.height استعمال کرتی ہے۔
  • رنگ: ایپ کے viewport.theme میں 24 بٹ SGR ایسکیپ کوڈز۔ ہر قطار ری سیٹ پر ختم ہوتی ہے، اور فریم نئی لائن پر ختم ہوتا ہے۔
  • اسٹیٹس: 200، یا ایپ کے صفحہ نہ ملنے والے صفحے کے ساتھ 404، جب کوئی صفحہ میچ نہ کرے یا صفحہ notFound() کو کال کرے۔ رینڈرنگ کے دوران redirect() کو کال کرنے والا صفحہ HTML پیش کرتا ہے۔

جوابات text/plain; charset=utf-8 ہوتے ہیں، جن کے ساتھ Vary: User-Agent, Accept اور Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate ہوتے ہیں، اس لیے مشترکہ کیشز کبھی فریم محفوظ کرکے براؤزر کو پیش نہیں کرتے۔ جس پاتھ پر curl کو فریم ملتا ہے، وہاں HTML صفحے میں بھی یہی Vary ہیڈر ہوتا ہے۔

معاون ہوسٹس

ہوسٹاسٹیٹک صفحاتڈائنامک صفحات، نامعلوم پاتھس
text devدرخواست پر رینڈرنگدرخواست پر رینڈرنگ
text start، buntext build سے پری رینڈرنگدرخواست پر رینڈرنگ
vercel، cloudflaretext build سے پری رینڈرنگHTML صفحہ
staticHTML صفحہHTML صفحہ

سرور پر رینڈر شدہ صفحات کو text start یا bun کی ضرورت ہے (ڈیپلائے کرنا دیکھیں)۔

اسٹیٹک ہوسٹس ایک کلائنٹ کو دوسرے سے مختلف جواب نہیں دے سکتے، اس لیے static اڈاپٹر فریمز کو سپورٹ نہیں کرتا۔ Vercel اور Cloudflare پر اسٹیٹک صفحات کے فریمز بلڈ کے ساتھ آتے ہیں۔ ڈائنامک صفحات ([id]، force-dynamic) وہاں HTML پیش کرتے ہیں، کیونکہ vercel اور cloudflare اڈاپٹرز رینڈرر ڈیپلائے نہیں کرتے۔

text start اور bun dist/server.js باقی صفحات کو درخواست پر .text/server/live.mjs کے ساتھ رینڈر کرتے ہیں، اور آخری 128 فریم 10 سیکنڈ تک محفوظ رکھتے ہیں۔ ہر سرور 10 سیکنڈ میں زیادہ سے زیادہ 20 ایسے صفحات رینڈر کرتا ہے جو کیش میں نہیں ہیں۔ اس حد کے بعد، بجٹ دوبارہ بھرنے تک curl کو HTML صفحہ ملتا ہے۔ اگر سرور پر live.mjs لوڈ نہ ہو سکے، مثلاً اس لیے کہ کسی صفحے کا ماڈیول ٹاپ لیول پر window پڑھتا ہے، تو وہ صفحات HTML پیش کرتے ہیں۔

text build پری رینڈر شدہ فریمز کی رپورٹ دیتا ہے:

 ✓ Prerendering curl frames (5/5)

کنفیگریشن

پوری ایپ کا سائز تبدیل کریں، یا فریمز بند کریں:

text.config.tsts
import { defineConfig } from "@textjs/app";export default defineConfig({  ansi: { cols: 100, rows: 30 },  // ansi: false,});

صفحہ اپنا سائز بدل سکتا ہے، یا ٹرمینلز کو بھی HTML پیش کر سکتا ہے:

app/dashboard/page.tsxtsx
export const ansi = { cols: 120, rows: 40 };// export const ansi = false;

سائز ⁦1–500⁩ سیل تک محدود رہتے ہیں۔ text.config.ts فائل میں ansi: false ہو تو صفحے کے ایکسپورٹس نظر انداز ہوتے ہیں۔

سادہ HTTP

جب تک آپ -L نہ دیں، curl ری ڈائریکٹس کی پیروی نہیں کرتا۔ Vercel، http:// درخواستوں کو https:// پر ری ڈائریکٹ کرتا ہے، اور ہمیشہ HTTPS استعمال کریں فعال ہونے پر Cloudflare بھی ایسا ہی کرتا ہے، اس لیے curl http://… فریم کے بجائے ری ڈائریکٹ پرنٹ کرتا ہے۔ https:// یو آر ایل شیئر کریں۔

کسٹم سرورز

@textjs/app/ansi ان سرورز اور فنکشنز کے لیے شناخت اور جواب کے ہیلپرز ایکسپورٹ کرتا ہے جو text start یا کوئی اڈاپٹر نہیں چلاتے:

import { ansiResponse, wantsAnsi } from "@textjs/app/ansi";import { frameToAnsi } from "@textjs/react";if (wantsAnsi(request)) return ansiResponse(frameToAnsi(buffer, { theme: "geistDark" }), request.method);

wantsAnsi(request)، Web کے Headers یا Node کے IncomingHttpHeaders کے ساتھ (method, headers) بھی قبول کرتا ہے۔ frameToAnsi(buffer, { theme }) رینڈر شدہ CellBuffer کو اسی طرح انکوڈ کرتا ہے جیسے فریم ورک کرتا ہے۔

⁦GitHub⁩ پر اس صفحے میں ترمیم کریں