ڈیپلائے کرنا

⁦text build --adapter static⁩، bun، vercel یا cloudflare سے ڈیپلائے کریں، یا پراکسی کے پیچھے ⁦text start⁩ چلائیں۔

text build ایک پورٹیبل dist/ بناتا ہے۔ اڈاپٹر اسے پلیٹ فارم کے مطلوبہ آؤٹ پٹ میں بدلتا ہے۔

اڈاپٹرز

text build --adapter <name>
اڈاپٹرآؤٹ پٹچلانے کا ماحول
(کوئی نہیں)dist/ + dist/.text/servertext start (Node)
staticdist/کوئی بھی اسٹیٹک ہوسٹ
bundist/server.jsbun dist/server.js
vercel.vercel/outputVercel (⁦Build Output API v3⁩)
cloudflaredist/ + _worker.js⁦Cloudflare Pages⁩

اڈاپٹر TEXTJS_ADAPTER سے بھی لیا جا سکتا ہے۔ جب text build کمانڈ Vercel (VERCEL=1) یا ⁦Cloudflare Pages⁩ (CF_PAGES=1) پر چلتی ہے تو متعلقہ اڈاپٹر خودکار طور پر منتخب ہوتا ہے۔

سرور اڈاپٹرز (bun، vercel اور cloudflare) وہی پائپ لائن چلاتے ہیں جو text start چلاتا ہے: مڈل ویئر، rewrites، روٹ کیش کے ساتھ روٹ ہینڈلرز، اسٹیٹک اثاثے، پھر صفحے کے URLs کے لیے کونسول ڈاکیومنٹ۔ curl جیسے ٹرمینل کلائنٹس کو اس کے بجائے صفحے کا پہلا فریم ANSI متن کی صورت میں ملتا ہے۔ vercel اور cloudflare پر یہ صرف اسٹیٹک صفحات کے لیے ہے (curl اور ٹرمینل کلائنٹس دیکھیں)۔ سرور اڈاپٹرز /assets/ کے تحت ہیش شدہ فائلیں Cache-Control: public, max-age=31536000, immutable کے ساتھ پیش کرتے ہیں۔

اسٹیٹک

text build --adapter static

اسے سرور کے بغیر ہوسٹس، جیسے ⁦GitHub Pages⁩، ⁦S3⁩ یا CDN کے لیے استعمال کریں۔ dynamic = "force-static" یا revalidate والے GET روٹ ہینڈلرز کی پری رینڈرنگ فائلوں میں ہوتی ہے: app/api/feed.json/route.ts سے dist/api/feed.json بنتی ہے۔ index.html کی ایک نقل 404.html میں لکھی جاتی ہے تاکہ ڈیپ لنکس کونسول ایپ کھولیں۔ اسٹیٹک ہوسٹس curl اور براؤزر میں فرق نہیں کر سکتے، اس لیے curl کو HTML صفحہ ملتا ہے۔

اگر ایپ کو سرور درکار ہو تو بلڈ ہر وجہ درج کرکے ناکام ہوتا ہے: middleware.ts، سرور پر رینڈر شدہ روٹس، ڈائنامک روٹ ہینڈلرز، ڈائنامک سیگمنٹس والے روٹ ہینڈلرز، یا GET کے علاوہ میتھڈز۔ اس کے بجائے ہوسٹ پر rewrites کنفیگر کریں۔

Bun

text build --adapter bunPORT=8080 bun dist/server.js

bun اڈاپٹر ایک مکمل، خود کفیل سرور لکھتا ہے جسے رن ٹائم پر node_modules کی ضرورت نہیں ہوتی۔ یہ PORT (ڈیفالٹ 3000) اور HOSTNAME (ڈیفالٹ 0.0.0.0) پڑھتا ہے، اور کبھی server.js یا .text/ پیش نہیں کرتا۔ یہ طویل عرصے تک چلنے والا پروسیس ہے، اس لیے text start کی طرح سرور پر رینڈر شدہ روٹس (export const runtime = "server") اور ان کے لائیو سیشنز بھی ہوسٹ کرتا ہے۔ اسے کنٹینر میں استعمال کریں:

Dockerfiletext
FROM oven/bun:1COPY dist /appCMD ["bun", "/app/server.js"]

Vercel

text build --adapter vercelvercel deploy --prebuilt

یا Vercel سے منسلک Git ریپوزٹری میں پش کریں: بلڈ text build چلاتا ہے، Vercel کی شناخت کرتا ہے اور .vercel/output لکھتا ہے۔

آؤٹ پٹمواد
static/کلائنٹ بلڈ (basePath کے تحت)
functions/_textjs/server.funcایک ⁦Node.js 22⁩ فنکشن جو اسٹریمنگ کے ساتھ ہر روٹ ہینڈلر پیش کرتا ہے
functions/_middleware.funcEdge روٹنگ مڈل ویئر: middleware.ts، اور ہر ایپ کے کینونیکل پاتھ
config.jsonاثاثوں کے ہیڈرز، مڈل ویئر میچرز، ری رائٹس، ہینڈلر روٹس اور کونسول ڈاکیومنٹ

ایج مڈل ویئر x-middleware-next / x-middleware-rewrite پروٹوکول استعمال کرتا ہے، اس لیے فنکشن یا CDN تک پہنچنے سے پہلے Vercel کے راؤٹر میں ہیڈر اوور رائیڈز اور ری رائٹس ہوتے ہیں۔ تمام میچرز ایک ہی روٹ src پیٹرن استعمال کرتے ہیں۔ جن درخواستوں سے کوئی میچر نہیں ملتا وہ مڈل ویئر چھوڑ دیتی ہیں، سوائے اس صورت کے جب ان کا پاتھ شاید کینونیکل شکل میں نہ ہو (پرسنٹ ایسکیپس، URL پارسر کے انکوڈ کیے جانے والے حروف، //، . یا .. سیگمنٹس، آخر میں سلیش)۔ پھر مڈل ویئر کینونیکل پاتھ کو میچ کرتا ہے، has / missing جانچتا ہے، اور درخواست کو اس پاتھ پر ری رائٹ کرتا ہے تاکہ Vercel اسے اسی طرح روٹ کرے۔ middleware.ts کے بغیر ایپس کو بھی وہی ایج فنکشن ملتا ہے، جو صرف ری رائٹ کرتا ہے۔ چونکہ ہر بلڈ میں ایک Edge فنکشن شامل ہوتا ہے، اس لیے لاگ اِن Vercel اکاؤنٹ سے ڈیپلائے کریں: گمنام ڈیپلائمنٹس (vercel deploy --temporary) Edge فنکشنز قبول نہیں کرتیں۔

ہینڈلر فنکشن اندرونی ہے۔ ہر ہینڈلر روٹ میچ شدہ پاتھ اسے x-textjs-path درخواست ہیڈر میں دیتا ہے۔ یہ ہیڈر مڈل ویئر سے پہلے اور بعد میں ہر درخواست سے ہٹا دیا جاتا ہے، اور ایج مڈل ویئر کبھی ایسا ہیڈر آگے نہیں بھیجتا (کلائنٹ یا middleware.ts سے)، اس لیے صرف ہینڈلر روٹس اسے سیٹ کر سکتے ہیں۔ /_textjs/* کی درخواستیں مڈل ویئر اور ری رائٹس سے پہلے اور بعد میں، فنکشن چلائے بغیر 404 لوٹاتی ہیں۔ بنائے گئے روٹس بڑے اور چھوٹے حروف کے فرق کے ساتھ میچ ہوتے ہیں، جیسے ہر دوسرے ہوسٹ پر میچرز اور ری رائٹس ہوتے ہیں۔

اڈاپٹر کے ٹیسٹس یہ آؤٹ پٹ Vercel کے راؤٹر کی مقامی ایمولیشن پر چلاتے ہیں۔ src میچنگ، dest کیپچرز، ہیڈر ٹرانسفارمز اور status روٹس کے لیے اس کا رویہ حقیقی ڈیپلائمنٹس پر جانچا گیا؛ Edge مڈل ویئر نہیں جانچا گیا، کیونکہ اسے گمنام طور پر ڈیپلائے نہیں کیا جا سکتا۔

Cloudflare Pages

text build --adapter cloudflarebunx wrangler pages dev dist --compatibility-flags=nodejs_compatbunx wrangler pages deploy dist

آؤٹ پٹ Pages کا ایڈوانسڈ موڈ استعمال کرتا ہے:

فائلمقصد
_worker.jsمڈل ویئر، ری رائٹس، روٹ ہینڈلرز اور کونسول ڈاکیومنٹ
_routes.jsonہر درخواست ورکر کو بھیجتا ہے۔ مڈل ویئر یا basePath کے بغیر، /assets/* فائلیں Pages کے اسٹیٹک CDN پر رہتی ہیں
_headers/assets/* کے لیے ناقابلِ تبدیلی کیشنگ (آپ کے ہیڈرز کے آخر میں جوڑی جاتی ہے)
404.htmlگم شدہ فائلوں کے لیے Pages سے ایپ کے بجائے 404 جواب دلواتی ہے (اگر آپ کی فائل موجود ہو تو اسے برقرار رکھا جاتا ہے)

.text/ (سرور بنڈلز اور بلڈ مینی فیسٹس) کو dist/ سے ہٹا دیا جاتا ہے، کیونکہ Pages ڈائریکٹری کو جوں کا توں شائع کرتا ہے۔

⁦Pages⁩ پروجیکٹ میں (ترتیبات → رن ٹائم) یا wrangler.toml فائل میں nodejs_compat کمپیٹیبلٹی فلیگ فعال کریں؛ ڈیٹا کیش AsyncLocalStorage استعمال کرتا ہے۔ اسٹیٹک فائلیں ASSETS بائنڈنگ سے پیش ہوتی ہیں، اور بیک گراؤنڈ ری ویلیڈیشن ctx.waitUntil() استعمال کرتی ہے۔

مڈل ویئر کے ساتھ ہر درخواست ورکر چلاتی ہے، بشمول ہیش شدہ اثاثوں کی درخواستیں، تاکہ مڈل ویئر ہر وہ پاتھ دیکھے جس سے کسی فائل تک پہنچا جا سکے۔ ورکر چلانے والی ہر درخواست Functions کی ایک کال ہے اور آپ کے Workers درخواست کوٹے میں شمار ہوتی ہے۔ صفحہ لوڈ ہونے پر اس میں ڈاکیومنٹ اور اس کی حاصل کردہ ہر فائل شامل ہے (ایک JavaScript بنڈل والی چھوٹی ٹیسٹ ایپ کے لیے 2؛ زیادہ فائلوں والی ایپس کے لیے زیادہ)۔ ⁦Workers Free⁩ پلان پر روزانہ کا کوٹہ ختم ہونے کے بعد Pages ورکر کے بغیر اسٹیٹک فائلیں پیش کرتا ہے، جس سے مڈل ویئر چھوڑ دیا جاتا ہے۔ اگر مڈل ویئر dist/ میں کسی چیز کی حفاظت کرتا ہے تو ترتیبات → رن ٹائم → ناکامی پر کھلا / بند کو ناکامی پر بند پر سیٹ کریں۔

wrangler.tomltoml
name = "my-console"pages_build_output_dir = "dist"compatibility_date = "2025-01-01"compatibility_flags = ["nodejs_compat"]

اپ گریڈ کرنا

@textjs/app کی سیکیورٹی اصلاحات کسی ڈیپلائمنٹ تک تبھی پہنچتی ہیں جب آپ اسے دوبارہ بلڈ اور ڈیپلائے کریں:

  • ⁦Vercel⁩: نیا .vercel/output ڈیپلائے کریں۔
  • ⁦Cloudflare Pages⁩: نیا dist/، _worker.js اور _routes.json کے ساتھ ڈیپلائے کریں۔
  • Bun: پورا نیا dist/ (server.js، اثاثے اور لائیو بنڈلز) ڈیپلائے کریں اور سرور دوبارہ شروع کریں۔
  • text start: text build چلائیں اور دوبارہ شروع کریں۔

پرانی ڈیپلائمنٹس اپنے URLs پر قابلِ رسائی رہتی ہیں (مثلاً Vercel اور ⁦Cloudflare Pages⁩ کے پری ویو URLs)۔ انہیں حذف کریں یا پلیٹ فارم کے رسائی کے تحفظ کے پیچھے رکھیں۔

سرور پر رینڈر شدہ روٹس

سرور پر رینڈر شدہ روٹس ہر کھلے ٹیب کے لیے ایک سیشن رکھتے ہیں، اس لیے انہیں طویل عرصے تک چلنے والا سرور درکار ہے: text start یا bun اڈاپٹر۔ جب کوئی صفحہ runtime = "server" ایکسپورٹ کرتا ہے تو static، vercel اور cloudflare اڈاپٹرز TX030 کے ساتھ بلڈ ناکام کر دیتے ہیں۔

پراکسی کے پیچھے

text start کمانڈ 127.0.0.1 سے بائنڈ ہوتی ہے اور لوپ بیک سے بائنڈ رہنے تک صرف localhost، *.localhost اور IP ایڈریس والے ہوسٹس کو جواب دیتی ہے (DNS ری بائنڈنگ سے تحفظ)۔ دوسرے ہوسٹس کو TX028 کے ساتھ 403 ملتا ہے۔ پبلک ترتیبات text.config.ts فائل میں رکھیں:

text.config.tsts
import { defineConfig } from "@textjs/app";export default defineConfig({  server: {    origin: "https://console.example.com", // request.url always uses it (or TEXTJS_ORIGIN)    trustProxy: true, // read X-Forwarded-Host / -Proto from your proxy (or TRUST_PROXY=1)    allowedHosts: [".example.com"],  },});

origin یا trustProxy کے بغیر، request.url کی تشکیل تصدیق شدہ Host ہیڈر سے http پر ہوتی ہے۔

احتیاطی نکات

  • text.config.ts میں proxy صرف text dev اور text start میں چلتا ہے؛ اڈاپٹرز میں یہ شامل نہیں ہوتا۔ rewrites استعمال کریں، جس کی ہر سرور اڈاپٹر سپورٹ کرتا ہے۔
  • ہر سرورلیس انسٹینس کا اپنا اِن میموری کیش ہوتا ہے۔ کیشنگ دیکھیں۔
  • خام ریگولر ایکسپریشن گروپس استعمال کرنے والے rewrites کو جہاں تک ممکن ہو Vercel روٹس میں بدلا جاتا ہے؛ نام والے پیرامیٹرز (:slug، :path*) عین مطابق ہوتے ہیں۔
⁦GitHub⁩ پر اس صفحے میں ترمیم کریں