[{"data":1,"prerenderedAt":281},["ShallowReactive",2],{"blog-slugs":3,"project-vuestrata-ar":8},{"en":4,"ar":7},[5,6],"dynamic-generic-slots","from-renderless-component-to-composable-function",[5,6],{"id":9,"title":10,"body":11,"description":273,"extension":274,"meta":275,"navigation":276,"path":277,"seo":278,"stem":279,"__hash__":280},"projects/projects/ar/vuestrata.md","Vuestrata",{"type":12,"value":13,"toc":265},"minimark",[14,18,22,30,34,37,66,69,76,149,153,156,160,163,196,199,203,206,261],[15,16,17],"h2",{"id":17},"المشكلة",[19,20,21],"p",{},"إنشاء مشروع Vue جديد أمر سهل. الصعب أن يبقى المشروع متّسقًا وهو يكبر: التوجيه، وملكية الحالة، وحدود الوحدات، والاتصال بالواجهات البرمجية، والمصادقة، والسمات، والصلاحيات، وبيانات المحاكاة، والاختبارات، وإعدادات النشر.",[19,23,24,25,29],{},"وأهمّ القواعد هي التي تُخالَف دون أن يظهر خطأ. وحدة نسيتَ تسجيلها في ",[26,27,28],"code",{},"setup.ts",": لا خطأ، لكن الميزة لا تعمل. سمة عُرّفت في ثلاثة ملفات من أربعة: لا خطأ، لكن الألوان تظهر في غير مواضعها. بيانات محاكاة بقيت في نسخة الإنتاج: لا خطأ، لكنها تصل إلى المستخدمين.",[15,31,33],{"id":32},"قواعد-تفرضها-الأدوات","قواعد تفرضها الأدوات",[19,35,36],{},"لذلك لا يكتفي Vuestrata بتوثيق قواعده، بل يفحص أهمّها آليًا:",[38,39,40,48,54,60],"ul",{},[41,42,43,47],"li",{},[44,45,46],"strong",{},"ست قواعد تدقيق مخصّصة",": الحالة المعرَّفة على مستوى الوحدة، واستعمال ألوان اللوحة مباشرة، والمعالِجات المكتوبة داخل القوالب، وتطابق مفاتيح الترجمة بين الإنجليزية والفرنسية والعربية، وتطابق أسماء الأيقونات، والملفات الأربعة التي يجب أن ترد فيها كل سمة.",[41,49,50,53],{},[44,51,52],{},"أربعة اختبارات معمارية",": مطابقة سجلّ الوحدات لما في المشروع، والتزام كل وحدة بعقدها، وتسجيل صفحات التوثيق، وحصر ما يخص العرض التجريبي في العرض التجريبي.",[41,55,56,59],{},[44,57,58],{},"فحص حزمة الإنتاج",": يفشل البناء إذا تسرّب إليها شيء من خادم المحاكاة، أو إذا تجاوز حجمها الحدّ المقرَّر.",[41,61,62,65],{},[44,63,64],{},"فحص التطابق",": إصدارات الأدوات وترويسات الأمان تُولَّد كلٌّ منها من تعريف واحد، ويفشل التكامل المستمر إذا خالفته أي نسخة.",[15,67,68],{"id":68},"المولّدات",[19,70,71,72,75],{},"لكل إضافة شائعة مولّد يكتب ملفاتها ويسجّلها في المواضع التي يسهل نسيانها. والخيار ",[26,73,74],{},"--dry-run"," يعرض ما سيُكتب دون أن يكتب شيئًا.",[77,78,83],"pre",{"className":79,"code":80,"language":81,"meta":82,"style":82},"language-bash shiki shiki-themes site-light site-light site-dark","vpr gen:module payments        # CRUD domain: schema, queries, mocks, pages, i18n, registered\nvpr gen:page payments refunds  # a page, wired into the module's routes\nvpr gen:theme midnight         # theme, imported and registered in all four places\nvpr gen:component Tag          # Ui* wrapper (+ --field for a forms composable)\n","bash","",[26,84,85,105,121,135],{"__ignoreMap":82},[86,87,90,94,98,101],"span",{"class":88,"line":89},"line",1,[86,91,93],{"class":92},"sUqqj","vpr",[86,95,97],{"class":96},"sgVH1"," gen:module",[86,99,100],{"class":96}," payments",[86,102,104],{"class":103},"s5c__","        # CRUD domain: schema, queries, mocks, pages, i18n, registered\n",[86,106,108,110,113,115,118],{"class":88,"line":107},2,[86,109,93],{"class":92},[86,111,112],{"class":96}," gen:page",[86,114,100],{"class":96},[86,116,117],{"class":96}," refunds",[86,119,120],{"class":103},"  # a page, wired into the module's routes\n",[86,122,124,126,129,132],{"class":88,"line":123},3,[86,125,93],{"class":92},[86,127,128],{"class":96}," gen:theme",[86,130,131],{"class":96}," midnight",[86,133,134],{"class":103},"         # theme, imported and registered in all four places\n",[86,136,138,140,143,146],{"class":88,"line":137},4,[86,139,93],{"class":92},[86,141,142],{"class":96}," gen:component",[86,144,145],{"class":96}," Tag",[86,147,148],{"class":103},"          # Ui* wrapper (+ --field for a forms composable)\n",[15,150,152],{"id":151},"اثنتا-عشرة-سمة-لمجموعة-مكوّنات-واحدة","اثنتا عشرة سمة لمجموعة مكوّنات واحدة",[19,154,155],{},"تعيد كل سمة مدمجة تعريف تدرّجات الألوان واستدارة الزوايا والظلال في الوضعين الفاتح والداكن، فوق المكوّنات نفسها، وثمانٍ منها تغيّر الخط أيضًا. أما الأيقونات ومقياس المسافات والحركة فثابتة، وهذا ما يجعل التبديل بين السمات ممكنًا.",[15,157,159],{"id":158},"تحديث-نسختك-من-القالب","تحديث نسختك من القالب",[19,161,162],{},"Vuestrata قالب تنسخه إلى مشروعك، وليس حزمة تثبّتها. وأداة سطر الأوامر المرفقة تجلب إصلاحات القالب الأصلي حتى بعد أن تعدّل نسختك:",[77,164,166],{"className":79,"code":165,"language":81,"meta":82,"style":82},"vp exec vuestrata diff      # what would change; writes nothing\nvp exec vuestrata upgrade\n",[26,167,168,185],{"__ignoreMap":82},[86,169,170,173,176,179,182],{"class":88,"line":89},[86,171,172],{"class":92},"vp",[86,174,175],{"class":96}," exec",[86,177,178],{"class":96}," vuestrata",[86,180,181],{"class":96}," diff",[86,183,184],{"class":103},"      # what would change; writes nothing\n",[86,186,187,189,191,193],{"class":88,"line":107},[86,188,172],{"class":92},[86,190,175],{"class":96},[86,192,178],{"class":96},[86,194,195],{"class":96}," upgrade\n",[19,197,198],{},"الملفات التي لم تعدّلها تُستبدل، والتي عدّلتها تبقى كما هي، وتوضع النسخة الجديدة بجانبها للمقارنة.",[15,200,202],{"id":201},"محوّلات-المصادقة","محوّلات المصادقة",[19,204,205],{},"تمرّ المصادقة عبر محوّلات قابلة للاستبدال: محوّل محاكاة للعروض التجريبية، و JWT، و OAuth مع PKCE. يصرّح كل محوّل بطريقة نقله وبما يدعمه، فتُخفي الواجهة عناصر التحكم التي لا يدعمها المحوّل المستعمل.",[77,207,211],{"className":208,"code":209,"language":210,"meta":82,"style":82},"language-ts shiki shiki-themes site-light site-light site-dark","const { login, register, logout, isLoading, error } = useAuth()\n","ts",[26,212,213],{"__ignoreMap":82},[86,214,215,219,223,227,230,233,235,238,240,243,245,248,251,255,258],{"class":88,"line":89},[86,216,218],{"class":217},"sZ9Zp","const",[86,220,222],{"class":221},"sXnUm"," {",[86,224,226],{"class":225},"sJ-0L"," login",[86,228,229],{"class":221},",",[86,231,232],{"class":225}," register",[86,234,229],{"class":221},[86,236,237],{"class":225}," logout",[86,239,229],{"class":221},[86,241,242],{"class":225}," isLoading",[86,244,229],{"class":221},[86,246,247],{"class":225}," error",[86,249,250],{"class":221}," }",[86,252,254],{"class":253},"sZ7qJ"," =",[86,256,257],{"class":92}," useAuth",[86,259,260],{"class":221},"()\n",[262,263,264],"style",{},"html pre.shiki code .sUqqj, html code.shiki .sUqqj{--shiki-light:#4A3170;--shiki-default:#4A3170;--shiki-dark:#D9BDF0}html pre.shiki code .sgVH1, html code.shiki .sgVH1{--shiki-light:#3A6830;--shiki-default:#3A6830;--shiki-dark:#A5CF93}html pre.shiki code .s5c__, html code.shiki .s5c__{--shiki-light:#736D67;--shiki-light-font-style:italic;--shiki-default:#736D67;--shiki-default-font-style:italic;--shiki-dark:#979189;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZ9Zp, html code.shiki .sZ9Zp{--shiki-light:#994920;--shiki-default:#994920;--shiki-dark:#ECA457}html pre.shiki code .sXnUm, html code.shiki .sXnUm{--shiki-light:#6D6863;--shiki-default:#6D6863;--shiki-dark:#96918C}html pre.shiki code .sJ-0L, html code.shiki .sJ-0L{--shiki-light:#2D54A0;--shiki-default:#2D54A0;--shiki-dark:#93BDF5}html pre.shiki code .sZ7qJ, html code.shiki .sZ7qJ{--shiki-light:#6D6863;--shiki-default:#6D6863;--shiki-dark:#A39E98}",{"title":82,"searchDepth":107,"depth":107,"links":266},[267,268,269,270,271,272],{"id":17,"depth":107,"text":17},{"id":32,"depth":107,"text":33},{"id":68,"depth":107,"text":68},{"id":151,"depth":107,"text":152},{"id":158,"depth":107,"text":159},{"id":201,"depth":107,"text":202},"قالب لتطبيقات Vue 3 تُفرض قواعده بفحوص آلية.","md",{},true,"/projects/ar/vuestrata",{"title":10,"description":273},"projects/ar/vuestrata","Sxx4cPi7u6YJcwlnWpER5stqGvrRi8Dg1iA3Bx8Ap8k",1791794147987]