مانیفست کنترل سفارشی
شناسهٔ شِما: custom-control-manifest@1
شِمای قابلخواندن توسط ماشین: custom-control-manifest.schema.json
توصیف مرجع یک کنترل سفارشی (به سبک PCF، بخش 6.3): همان remote در Module Federation که Model-Driven App Player آن را بهجای یک ویرایشگر بومی فیلد درون یک فرم یا نما سوار میکند. یک مانیفست به شکل یکسان اعتبارسنجی میشود، چه از طریق Admin Control Center ثبت شده باشد، چه با یک فراخوانی مستقیم API ارسال شده باشد، چه یک دستیار هوش مصنوعی تولیدش کرده باشد، و چه درون یک وارد کردن راهحل حمل شده باشد — قاعدهٔ تکمسیرِ اعتبارسنجی (بخش 6.7).
این مانیفست با دست نوشته نمیشود. ثبت یک کنترل، بارگذاری بستهای است که
@parsware/pack ساخته، و این مانیفست از روی parsware.json همان
آرشیو ساخته میشود (§۲۸). آنچه در پی میآید شکل ذخیرهشده را توصیف میکند، برای خواندن یک
راهکار خروجیگرفتهشده یا اعتبارسنجی راهکاری که خودتان تولید کردهاید.
شکل
| فیلد | نوع | اجباری | یادداشتها |
|---|---|---|---|
logicalName | string | بله | پیشوند ناشر در ابتدا، با snake-case کوچک (مثلاً par_signature_pad). از راه ویژگی control یک فیلد فرم به آن فیلد بسته میشود. |
displayName | string | بله | نام خوانا برای انسان که در پالت فیلدهای طراح فرم نمایش داده میشود. |
description | string | null | خیر | توصیف کوتاهی که کنار کنترل نمایش داده میشود. |
scope | string | بله | نام scope سراسری کانتینر Module Federation (برای هر remote یکتا)، که از mf-manifest.json بیلد خوانده میشود نه رونویسی. |
module | string | بله | مسیر ماژول در معرض قرارگرفته که Player بارگذاری میکند (مثلاً ./Control). باید با ./ آغاز شود. آن هم از بیلد خوانده میشود. |
entryFileName | string | خیر | فایل ورودی کانتینر درون بسته (مثلاً remoteEntry.js). نشانی سرو از محیط، نام منطقی و همین محاسبه میشود — نشانیای برای ذخیره وجود ندارد. در حالت Hosted خالی است. |
packageHash | string | null | خیر | SHA-256 شانزدهشانزدهی حروفکوچک آرشیو بستهای که کنترل از روی آن ثبت شده. هنگام وارد کردن در برابر بایتهایی که در بستهٔ راهکار جابهجا شدهاند بررسی میشود، تا آنچه سرو میشود همان چیزی باشد که خروجی گرفته شده. در حالت Hosted null است. |
remoteEntryUrl | string | null | خیر | فقط حالت Hosted: نشانی مطلق http(s) به یک remoteEntry.js که بیرون سرو میشود، برای بارگذاری داغ هنگام نوشتن کنترل. ثبت آن جز در محیطی با ردهٔ توسعه پذیرفته نمیشود، و یک کنترل Hosted در بستهٔ راهکار جابهجا نمیشود — کدش از آنِ پلتفرم نیست که آن را حمل کند. |
substitutesFor | string[] | بله | نوع کنترلهای فیلدی که این کنترل میتواند به آنها بسته شود: یک یا چند مورد از Text، MultilineText، Number، Boolean، DateTime، Lookup، File، Image، Custom. باید دستکم یک ورودی داشته باشد. پالت فیلد این کنترل را تنها جایی پیشنهاد میدهد که نوع کنترل یک فیلد منطبق باشد. اینها خانوادههای نوع داده فیلد هستند — نه نام کنترلهای آمادهای که یک جایگذاری فرم انتخاب میکند (TextArea، Toggle، Dropdown، …)؛ آنها واژگان دیگری هستند که تنها در چهار نام مشترکاند. |
آنچه دیگر ندارد
requestedScopes و declaredEntities حذف شدهاند، و additionalProperties برابر
false است، پس مانیفستی که هنوز هرکدام را داشته باشد رد میشود نه اینکه بیصدا نادیده
گرفته شود. یک کنترل با دسترسیهای همان کسی اجرا میشود که از آن استفاده میکند (§۲۴):
مجموعهٔ اسکوپ درخواستی همیشه تنها با نشستِ خودِ کاربر اشتراک گرفته میشد، پس میتوانست
کاربرِ کنترل را تنگتر کند و هرگز گشودهتر نه، و فهرست جدولهای اعلامشده را هیچ مسیر کدی
نمیخواند. حذف هر دو، داستان امنیت را از دو دستگیره به یک جمله تبدیل میکند.
remoteEntryUrl اجباری هم رفته است. بسته اکنون بهعنوان یک بستهٔ سروشده از نشانی خودِ
پلتفرم جابهجا میشود، پس نشانی محاسبه میشود نه ذخیره (§۲۸).
قرارداد کنترل
ماژول در معرض قرارگرفته (./Control) یک کامپوننت React است که قرارداد ثابت
ParswareControlProps از @parsware/runtime-sdk را پیادهسازی میکند:
interface ParswareControlProps {
value: unknown; // the bound field's current value
onChange: (next: unknown) => void; // commit a new value back to the form
fieldMetadata: FieldMetadata; // the bound field's type/label/constraints
context: RuntimeContext; // the same auth/data/logging context apps get
}
Player این props را در زمان رندر تأمین میکند. یک کنترل تنها از طریق context (یک
ParswareRuntime) به پلتفرم میرسد — هرگز با فراخوانی مستقیم Gateway یا Identity.
کجا اعتبارسنجی میشود
- ثبت — لایهٔ Application مانیفست را در برابر
custom-control-manifest@1اعتبارسنجی میکند و پیش از ثبت کنترل در یک محیط، الزام میکند کهlogicalNameبا پیشوند ناشر مالک آغاز شود. - وارد کردن راهحل — هر مانیفست جاسازیشده در یک بستهٔ راهحل، پیش از ثبت کنترل در محیط مقصد، دوباره در برابر همان شِما اعتبارسنجی میشود.
یادداشتهای امنیتی
یک کنترل سفارشی در همان realm جاوااسکریپت پوسته اجرا میشود (Module Federation، نه یک iframe — بخش 6.3)، بنابراین مرز اعتماد جای دیگری اعمال میشود:
- یک کنترل بستهبندیشده از نشانی خودِ پلتفرم سرو میشود، پس مبدأ بیرونیای برای مجاز کردن وجود ندارد. فهرست مجاز CSP همچنان حالت Hosted را کنترل میکند، که تنها شکلی است که سازنده میتواند بستهاش را به هر جایی نشانه بگیرد — و بیرون از محیط توسعه پذیرفته نمیشود.
- آرشیو پیش از ذخیره شدن بررسی میشود: اندازه، تعداد فایل، اندازهای که باز میشود، اینکه هیچ ورودیای مسیری بیرون از پوشهٔ خودش را نام نبرد، و اینکه هر فایل از نوعی باشد که پلتفرم سرو میکند.
- کنترل تنها در صورتی قابل بارگذاری است که یک راهکار آن را در آن محیط مستقر کرده باشد، و درهمسازِ بسته هم هنگام وارد کردن و هم پیش از باز شدن روی دیسک بررسی میشود.
- هر فراخوانی دادهای که از طریق Runtime SDK انجام میدهد، در سمت سرور در برابر App Context Token مجوزدهی میشود که اسکوپهای خودِ کاربر را حمل میکند. یک کنترل دقیقاً همان کاری را میتواند بکند که کاربرش میتواند، و هیچ فیلدی در این مانیفست این را تغییر نمیدهد.
مرتبط
- مانیفست بستهٔ آرتیفکت — همان
parsware.jsonدرون آرشیوی که این مانیفست از روی آن ساخته میشود. - مانیفست برنامهٔ سفارشی — همتای آن برای برنامهٔ سفارشی React، که هنوز بستهبندی را نپذیرفته است.
- تعریف فرم Model-Driven — ویژگی
controlیک فیلد فرم باlogicalNameبه یک کنترل ارجاع میدهد.