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، bun | text build سے پری رینڈرنگ | درخواست پر رینڈرنگ |
vercel، cloudflare | text build سے پری رینڈرنگ | HTML صفحہ |
static | HTML صفحہ | 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)کنفیگریشن
پوری ایپ کا سائز تبدیل کریں، یا فریمز بند کریں:
import { defineConfig } from "@textjs/app";export default defineConfig({ ansi: { cols: 100, rows: 30 }, // ansi: false,});صفحہ اپنا سائز بدل سکتا ہے، یا ٹرمینلز کو بھی HTML پیش کر سکتا ہے:
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 کو اسی طرح انکوڈ کرتا ہے جیسے فریم ورک کرتا ہے۔