مرجع الإضافة.yaml

يحتوي ملف مواصفات الإضافة (extension.yaml) على ملف الإضافة الوصفي، ويوضّح الموارد التي أنشأتها الإضافة وواجهات برمجة التطبيقات والوصول المطلوبَين من الإضافة، ويحدّد أي مَعلمات يضبطها المستخدم توفّرها الإضافة.

توضّح الجداول في هذه الصفحة الحقول المتاحة لملف extension.yaml.

المعلومات الأساسية والمعلومات التي تحدد الهوية

name: your-extension-name
version: 1.0.0         # Semantic versioning (semver)
specVersion: v1beta    # Always "v1beta"
license: Apache-2.0    # Always "Apache-2.0" (required to publish on extensions.dev)
billingRequired: true  # Always "true"

displayName: Your extension name
description: >-
  Description of the extension. (One or two
  sentences.)
icon: icon.png
tags: [tag, anothertag]

sourceUrl: https://github.com/your-org/your-repo   # GitHub repo URL
releaseNotesUrl: https://github.com/your-org/your-repo/blob/main/CHANGELOG.md

author:
  authorName: Your Company
  email: extensions@example.com
  url: https://example.com/
contributors:
  - authorName: Your Name
  - authorName: Another Contributor
    email: colleague@example.net
    url: https://github.com/their-org/
الحقول الأساسية
name
string
(مطلوب)

معرّف الإضافة

لا يمكن أن يحتوي إلا على أحرف صغيرة وأرقام وشُرط، ويجب ألا يزيد عن 40 حرفًا.

ملاحظة: تُستخدَم هذه القيمة لإنشاء ملف التمديد المعرِّف (الذي يُستخدَم بعد ذلك لإنشاء أسماء حساب الخدمة الخاص بالتمديد والموارد الخاصة بالتمديد).

version
string
(مطلوب)

إصدار الإضافة

يجب أن يتّبع نظام ترقيم الإصدارات semver (مثلاً، 1.2.0).

specVersion
string
(مطلوب)

إصدار مواصفات إضافات Firebase

القيمة الحالية: v1beta

license
string
(اختياري)

ترخيص الإضافة

يجب أن تكون الإضافة مرخّصة باستخدام Apache-2.0.

billingRequired
منطقي
(اختياري)

ما إذا كانت الخدمات التي تستخدمها الإضافة تتطلّب حساب فوترة في Firebase لإصدار مدفوع

يتم ضبطه دائمًا على true.

displayName
string
(اختياري)

اسم معروض سهل للإضافة (من 3 إلى 5 كلمات).

عدد الأحرف المسموح به هو 40.

description
string
(اختياري)
وصف موجز للمهمة التي تؤديها الإضافة (جملة واحدة تقريبًا)
icon
string
(اختياري)

ملف لاستخدامه كرمز الإضافة على extensions.dev و وحدة تحكّم Firebase

يجب أن يكون هذا الملف بتنسيق PNG مربّعًا بحجم يتراوح بين 512×512 و1024×1024 بكسل. ضَع الملف في الدليل نفسه الذي يتضمّن extension.yaml، ولا يمكنك تحديد دليل فرعي.

يُرجى مراعاة الإرشادات التالية عند تصميم رمز لإضافة Chrome:

  • اختَر ألوانًا مناسبة لعلامتك التجارية في الخلفية والأعمال الفنية.
  • يجب أن تكون ألوان الرموز بسيطة، مع استخدام لونَين فقط. يمكن أن تؤدي الألوان المتعدّدة إلى تشويش الرمز بشكل بصري.
  • ولهذا السبب نفسه، لا تستخدِم تدرّجات الألوان في رمزك. يصعب تمييز التدرجات عند استخدام أحجام صغيرة، كما تجعل الرمز معقدًا visually.
  • استخدِم صورًا بسيطة وفريدة تُظهر وظائف الإضافة.
  • إذا كانت شركتك تُنشئ إضافات متعدّدة، لا تستخدِم شعارك كرمز. سيواجه المستخدمون صعوبة في التمييز بين الإضافات.
  • اجعل العمل الفني رسومًا جريئة. لا تستخدِم أعمالًا فنية دقيقة أو مفصّلة ، لأنّها لن تظهر بشكل جيد عند تصغيرها.
  • لا تُدرِج كلمات توضّح ما تفعله الإضافة. النص غالبًا ما يكون غير مقروء عند استخدام أحجام أصغر.
tags
قائمة السلاسل
(اختياري)
علامات لمساعدة المستخدمين في العثور على إضافتك تتمّ ربط العلامات التالية بالفئات في "مركز الإضافات": marketing، messaging، payments، search، shipping، social، utilities، ai
sourceUrl
string
(اختياري)
عنوان URL متاح للجميع يمكن من خلاله الوصول إلى دليل الإضافات
releaseNotesUrl
string
(اختياري)
عنوان URL علني يمكن من خلاله الوصول إلى ملاحظات الإصدار الخاصة بالإضافة
author
عنصر مؤلف واحد
(اختياري)

المؤلف الأساسي وجهة التواصل الخاصة بالإضافة.

author:
  authorName: Your Company
  email: extensions@example.com
  url: https://example.com/
حقول المؤلفين
authorName
string
(مطلوب)

اسم المؤلف

يمكن أن يكون شخصًا أو شركة أو مؤسسة أو غير ذلك.

email
string
(اختياري)
عنوان البريد الإلكتروني للمؤلف
url
string
(اختياري)
عنوان URL متاح للجميع يمكن من خلاله الوصول إلى معلومات عن المؤلف
contributors
قائمة بعناصر المؤلفين
(اختيارية)

أي مؤلفين إضافيين ساهموا في إضافة الإضافة

contributors:
  - authorName: Your Name
  - authorName: Another Contributor
    email: colleague@example.net
    url: https://github.com/their-org/
حقول المؤلفين
authorName
string
(مطلوب)

اسم المؤلف

يمكن أن يكون شخصًا أو شركة أو مؤسسة أو غير ذلك.

email
string
(اختياري)
عنوان البريد الإلكتروني للمؤلف
url
string
(اختياري)
عنوان URL متاح للجميع يمكن من خلاله الوصول إلى معلومات عن المؤلف

واجهات برمجة التطبيقات Firebase وGoogle Cloud

تحدِّد هذه الحقول واجهات برمجة تطبيقات Firebase وGoogle التي تستخدمها الإضافة. عندما يُثبِّت المستخدمون الإضافة، يمكنهم اختيار تفعيل واجهات برمجة التطبيقات هذه تلقائيًا في مشروعهم.

apis:
  - apiName: apiname.googleapis.com
    reason: Explanation of why the extension uses this API
  - apiName: anotherapiname.googleapis.com
    reason: Explanation of why the extension uses this API
حقول واجهة برمجة التطبيقات
apiName
string
(مطلوب)

اسم واجهة برمجة التطبيقات من Google

يجب أن يتطابق مع حقل اسم الخدمة كما هو مُدرَج في كلٍّ من صفحة النظرة العامة على واجهة برمجة التطبيقات (مثال) في مكتبة Google Cloud API

reason
string
(مطلوب)
وصف موجز لسبب حاجة الإضافة إلى استخدام واجهة برمجة التطبيقات هذه

أدوار إدارة الهوية وإمكانية الوصول

تحدِّد هذه الحقول أدوار Cloud IAM التي تتطلّبها الإضافة. يتم منح هذه الأدوار لحساب الخدمة الذي تم إعداده للإضافة.

يمكنك تحديد أحد الأدوار المتوافقة فقط.

roles:
  - role: product.role
    reason: Explanation of why the extension needs this level of access
  - role: anotherproduct.role
    resource: projects/${project_id}/resource_type/*
    reason: Explanation of why the extension needs this level of access
حقول الأدوار
role
string
(مطلوب)

اسم دور إدارة الهوية وإمكانية الوصول المطلوب لتشغيل الإضافة

يجب أن يكون أحد الأدوار المتوافقة

reason
string
(مطلوب)
وصف موجز لسبب احتياج الإضافة إلى إذن الوصول الممنوح من هذا الدور
resource
string
(اختياري)

يمكنك حصر نطاق الدور بهذا المورد.

وفي حال عدم إدخالها، يتم ضبط القيمة التلقائية على projects/${project_id}. راجِع مقالة تقليل نطاق الأدوار.

الخدمات الخارجية

تحدِّد هذه الحقول الخدمات غير التابعة لشركة Firebase وGoogle التي تستخدمها الإضافة (عادةً واجهات برمجة تطبيقات REST). لا توفّر منصة Firebase Extensions أي وسيلة لتفعيل هذه الخدمات أو تنفيذ عملية التفويض لها تلقائيًا.

externalServices:
  - name: Example API
    pricingUri: https://developers.example.com/pricing
  - name: Another Example API
    pricingUri: https://developers.example.com/pricing
حقول الخدمات الخارجية
name
string
(مطلوب)
اسم الخدمة الخارجية اللازمة لتشغيل الإضافة
pricingUri
string
(مطلوب)
معرّف الموارد المنتظم (URI) لمعلومات الأسعار الخاصة بالخدمة

المَعلمات التي يمكن للمستخدم ضبطها

تحدِّد هذه الحقول المَعلمات التي تتيحها الإضافة للمستخدمين لضبطها.

params:
  - param: PARAM_ID
    label: Short description of the parameter
    description: >-
      What do you want to set PARAM_ID to?
      This is a longer description of the parameter, often phrased as a prompt
      to the user.
  - param: ANOTHER_PARAM_ID
    label: Short description of the parameter
    description: >
      What do you want to set ANOTHER_PARAM_ID to?
      This is a longer description of the parameter.
    example: example-input
    validationRegex: "^[a-zA-Z][a-zA-Z-]*[a-zA-Z]?$"
    validationErrorMessage:
      Must be a hyphen-delimited string of alphabetic characters
    default: default-value
    required: false
    immutable: true
حقول المَعلمات
param
string
(مطلوب)
اسم المَعلمة ويمكنك استخدام هذا الاسم للإشارة إلى قيمة المَعلمة في الرمز البرمجي.
label
string
(مطلوب)
وصف موجز للمَعلمة يتم عرضها للمستخدم عندما يتم طلب قيمة المَعلمة منه.
description
string
(اختياري)

وصف تفصيلي للمَعلمة يتم عرضها للمستخدم عندما يُطلَب منه إدخال قيمة المَعلمة.

تتوافق مع Markdown.

example
string
(اختياري)
مثال على قيمة للمَعلمة
default
string
(اختياري)
القيمة التلقائية للمَعلمة إذا ترك المستخدِم قيمة المَعلمة فارغة.
validationRegex
string
(اختياري)
تعبير عادي للتحقّق من صحة قيمة المَعلمة التي ضبطها المستخدِم بنية Google RE2
validationErrorMessage
string
(اختياري)
رسالة الخطأ التي يتم عرضها في حال تعذّر التحقّق من التعبير العادي
required
منطقي
(اختياري)
يحدّد ما إذا كان بإمكان المستخدم إرسال سلسلة فارغة عند طلب قيمة المَعلمة منه. الإعداد التلقائي هو true.
immutable
منطقي
(اختياري)

يحدِّد ما إذا كان بإمكان المستخدِم تغيير قيمة المَعلمة بعد التثبيت (مثلاً في حال إعادة ضبط الإضافة). الإعداد التلقائي هو false.

ملاحظة: في حال تحديد مَعلمة "الموقع الجغرافي" للدوالّ التي تم نشرها في الإضافة، اضبط هذا الحقل على true.

type
string
(اختياري)
نوع المَعلمة قد يكون لأنواع المَعلمات الخاصة متطلبات إضافية أو عرض مختلف لواجهة المستخدم. راجِع الأقسام التالية.

المَعلمات القابلة للاختيار والمَعلمات القابلة للاختيار من بين عدّة مَعلمات

تطلب المَعلمات القابلة للاختيار والمَعلمات القابلة للاختيار المتعدّدة من المستخدِمين الاختيار من قائمة الخيارات المحدّدة مسبقًا.

params:
  - param: PARAM_ID
    label: Short description of the parameter
    description: >-
      Do you want to enable the option?
    type: select
    options:
      - label: Yes
        value: true
      - label: No
        value: false
  - param: ANOTHER_PARAM_ID
    label: Short description of the parameter
    description: >-
      Which options do you want to enable?
    type: multiselect
    options:
      - value: red
      - value: green
      - value: blue
حقول المَعلمات التي تتضمّن خيارات متعدّدة
type
سلسلة

select أو multiselect

تشير إلى أنّ المَعلمة يمكن أن تكون قيمة واحدة (select) أو عدة قيم (multiselect) يتم اختيارها من مجموعة من الخيارات المحدّدة مسبقًا

options
قائمة الخيارات
(مطلوبة)

الخيارات التي يمكن للمستخدم الاختيار من بينها

حقول الخيارات
value
string
(مطلوب)
إحدى القيم التي يمكن للمستخدم اختيارها. هذه هي القيمة التي تحصل عليها عند قراءة قيمة المَعلمة في الرمز.
label
string
(اختياري)
وصف موجز للخيار القابل للاختيار وفي حال عدم إدخالها، يتم ضبط القيمة التلقائية على value.

مَعلمات الموارد القابلة للاختيار

تطلب مَعلمات الموارد القابلة للاختيار من المستخدمين اختيار مورد (مثيل قاعدة بيانات أو حزمة تخزين أو غير ذلك) من مشروعهم.

params:
  - param: PARAM_ID
    label: Short description of the parameter
    description: >-
      Which resource do you want to use?
    type: selectresource
    resourceType: product.googleapis.com/ResourceType
حقول مَعلمات الموارد
type
سلسلة

selectresource

تُستخدَم لتحديد أنّ المَعلمة تمثّل موردًا للمشروع.

resourceType
string
(مطلوب)

نوع المورد الذي يجب أن يختار المستخدمه

قيم صالحة:

  • storage.googleapis.com/Bucket
  • firestore.googleapis.com/Database
  • firebasedatabase.googleapis.com/DatabaseInstance

ومع ذلك، لا تتوفّر حاليًا واجهة مستخدم للاختيار إلا في حِزم Cloud Storage (يتم عرض أنواع الموارد الأخرى كحقول إدخال نص بتنسيق حر).

المَعلمات السرية

يتم التعامل مع القيم السرية المقدَّمة من المستخدِم (مثل مفاتيح واجهة برمجة التطبيقات) بشكلٍ مختلف:

  • يتم تخزين القيم السرية باستخدام أداة "إدارة الأسرار في السحابة الإلكترونية". لا يمكن الوصول إلى هذه القيم إلا من خلال العملاء المعتمَدين (مثل نسخة مثبَّتة من إضافة).
  • وعندما يُطلب من المستخدمين تقديم هذه القيم، لا يتم عرض بياناتهم.
params:
  - param: PARAM_ID
    label: Short description of the parameter
    description: >-
      What is the secret value?
    type: secret
حقول المَعلمات السرية
type
سلسلة

secret

تُستخدَم لتحديد أنّ المَعلمة هي قيمة سرية

موارد وظائف السحابة الإلكترونية

تُعرِض هذه الحقول وظائف Cloud Functions المضمّنة في إضافة. تختلف بنية ملف تعريف الموارد قليلاً بين الدوالّ من الجيل الأول والجيل الثاني، والتي يمكن أن تتعايش في إضافة.

وظائف Cloud من الجيل الأول

resources:
  - name: functionName
    type: firebaseextensions.v1beta.function
    description: >-
      Description of what the function does. (One or two
      sentences.)
    properties:
      runtime: runtime-version
      eventTrigger:
        eventType: google.product.event
        resource: projects/_/resource/specifier
حقول الموارد
name
string
(مطلوب)

اسم سهل الاستخدام للدالة التي تم تصديرها.

في حال عدم تحديد سمة entryPoint (راجِع المعلومات أدناه)، يجب أن تتطابق هذه القيمة مع اسم الدالة في رمز دوالّك المصدر.

سيكون الاسم النهائي للدالة المُنشرة بالتنسيق التالي: ext-extension-instance-id-name.

type
string
(مطلوب)
لمورد دالة من الجيل الأول: firebaseextensions.v1beta.function
description
string
(مطلوب)

وصف موجز للمهمة التي تؤديها الدالة لإضافة

properties
(مطلوب)

مواقع Cloud Functions من الجيل الأول في ما يلي أهم السمات ، ولكن يمكنك العثور على القائمة الكاملة في مرجع الدوالّ في السحابة الإلكترونية.

المواقع
location
(اختياري)

الموقع الجغرافي الذي سيتم نشر الدالة فيه الإعداد التلقائي هو us-central1

entryPoint
(اختياري)
اسم الدالة التي تم تصديرها ضمن رمز مصدر الدوال التي يجب أن تبحث عنها الإضافة. القيمة التلقائية هي name، أعلاه.
sourceDirectory
(اختياري)

الدليل الذي يحتوي على package.json في ملفه الجذر يجب أن يكون ملف رمز وظائفك المصدر في هذا الدليل. الإعداد التلقائي هو functions

ملاحظة: يحدِّد الحقل main من package.json ملف رمز المصدر الخاص بالدوالّ (مثل index.js).

timeout
(اختياري)

الحد الأقصى لوقت تنفيذ الدالة

  • عناوين URL التلقائية: 60s
  • الحد الأقصى للقيمة: 540s
availableMemoryMb
(اختياري)

مقدار الذاكرة بالميغابايت المتوفّرة للدالة

  • عناوين URL التلقائية: 256
  • القيم الصالحة هي: 128 و256 512 و1024 و2048
runtime
(إجراء مقترَح)

بيئة وقت التشغيل للدالة

httpsTrigger
أو
eventTrigger
أو
scheduleTrigger
أو
taskQueueTrigger
(يجب استخدام أحد أنواع مشغّلات الدوالّ هذه)
اطّلِع على مقالة كتابة وظائف Cloud لاستخدامها في إضافة للحصول على معلومات محدّدة حول كل نوع من أنواع المشغِّلات.

وظائف Cloud من الجيل الثاني

resources:
  - name: functionName
    type: firebaseextensions.v1beta.v2function
    description: >-
      Description of what the function does. (One or two
      sentences.)
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: crashlytics.newFatalIssue

حقول الموارد
name
string
(مطلوب)

اسم سهل الاستخدام للدالة التي تم تصديرها.

في حال عدم تحديد سمة entryPoint (راجِع المعلومات أدناه)، يجب أن تتطابق هذه القيمة مع اسم الدالة في رمز دوالّك المصدر.

سيكون الاسم النهائي للدالة المُنشرة بالتنسيق التالي: ext-extension-instance-id-name.

type
string
(مطلوب)
للحصول على مرجع للدوالّ من الجيل الثاني: firebaseextensions.v1beta.v2function
description
string
(مطلوب)

وصف موجز للمهمة التي تؤديها الدالة لإضافة

properties
(مطلوب)

مواقع Cloud Functions من الجيل الثاني في ما يلي أهم السمات، ولكن يمكنك العثور على القائمة الكاملة في مرجع وظائف السحابة الإلكترونية.

المواقع
location
(اختياري)

الموقع الجغرافي الذي سيتم نشر الدالة فيه الإعداد التلقائي هو us-central1

sourceDirectory
(اختياري)

الدليل الذي يحتوي على package.json في ملفه الجذر يجب أن يكون ملف رمز وظائفك المصدر في هذا الدليل. الإعداد التلقائي هو functions

ملاحظة: يحدِّد الحقل main من package.json ملف رمز المصدر الخاص بالدوالّ (مثل index.js).

هناك أيضًا ثلاثة حقول لأنواع العناصر تتضمّن خصائصها الخاصة:

سمات buildConfig
buildConfig.runtime
(إجراء مقترَح)

بيئة وقت التشغيل للدالة

buildConfig.entryPoint
(اختياري)
اسم الدالة التي تم تصديرها ضمن رمز مصدر الدوال التي يجب أن تبحث عنها الإضافة. القيمة التلقائية هي name، أعلاه.
سمات serviceConfig
serviceConfig.timeoutSeconds
(اختياري)

الحد الأقصى لوقت تنفيذ الدالة

  • عناوين URL التلقائية: 60
  • الحد الأقصى للقيمة: 540
serviceConfig.availableMemory
(اختياري)
مقدار الذاكرة المتوفّرة لدالة معيّنة الإعداد التلقائي هو 256M. الوحدات المتوافقة هي k، M، G، Mi، Gi. في حال عدم تقديم وحدة، يتم تفسير القيمة على أنّها بايت.
سمات eventTrigger
eventTrigger.eventType
(مطلوب)
نوع الحدث الذي سينشط له المشغِل. اطّلِع على كتابة دوالّ Cloud لإضافة لمعرفة أنواع الأحداث المتاحة لكل منتج.
eventTrigger.eventFilters
(اختياري)
الفلاتر التي تحدّ بشكل أكبر من الأحداث التي يتم الاستماع إليها على سبيل المثال، يمكنك الاستماع إلى الأحداث التي تتطابق فقط مع نمط موارد معيّن. اطّلِع على مقالة كتابة وظائف سحابة تطبيقات Google لإضافة للحصول على معلومات عن فلترة كل نوع من الأحداث.
eventTrigger.channel
(اختياري)
اسم القناة المرتبطة بالعامل المشغِّل بالتنسيق projects/{project}/locations/{location}/channels/{channel}. في حال حذف هذه السمة، ستستمع الدالة إلى أحداث على القناة التلقائية للمشروع.
eventTrigger.triggerRegion
(اختياري)
لن يتلقّى عامل التفعيل سوى الأحداث التي مصدرها هذه المنطقة. يمكن أن تكون المنطقة نفسها التي تقع فيها الدالة، أو منطقة مختلفة أو مناطق متعدّدة، أو المنطقة العالمية. في حال عدم توفيرها، يتم ضبطها تلقائيًا على المنطقة نفسها التي تتوفّر فيها الوظيفة.

أحداث مراحل النشاط

تتيح لك أحداث دورة الحياة تحديد الدوالّ التي سيتم تنفيذها عندما يُثبِّت المستخدم مثيلًا من الإضافة أو يحدّثه أو يعدّله. اطّلِع على معالجة أحداث دورة حياة الإضافة.

lifecycleEvents:
  onInstall:
    function: myTaskFunction
    processingMessage: Describes the task being completed
  onUpdate:
    function: myOtherTaskFunction
    processingMessage: Describes the task being completed
  onConfigure:
    function: myOtherTaskFunction
    processingMessage: Describes the task being completed
حقول الأحداث في مراحل النشاط
onInstall
(اختياري)

تُحدِّد دالة يتم تنفيذها عندما يثبِّت أحد المستخدِمين الإضافة.

مواصفات الدالة
function
string
(مطلوب)

اسم الدالة التي يتم تشغيلها من خلال قائمة انتظار المهام والتي ستتولى التعامل مع الحدث.

يجب الإعلان عن هذه الدالة في القسم resources وأن يكون لديها taskQueue محدّد.

processingMessage
string
(مطلوب)
رسالة للعرض في وحدة تحكُّم Firebase أثناء تنفيذ المهمة
onUpdate
(اختياري)

تُحدِّد دالة يتم تنفيذها عندما يعدِّل مستخدم الإضافة.

مواصفات الدالة
function
string
(مطلوب)

اسم الدالة التي يتم تشغيلها من خلال قائمة انتظار المهام والتي ستتولى التعامل مع الحدث.

يجب الإعلان عن هذه الدالة في القسم resources وأن يكون لديها taskQueue محدّد.

processingMessage
string
(مطلوب)
رسالة للعرض في وحدة تحكُّم Firebase أثناء تنفيذ المهمة
onConfigure
(اختياري)

تُحدِّد وظيفة يتم تنفيذها عندما يعيد المستخدم ضبط الإضافة.

مواصفات الدالة
function
string
(مطلوب)

اسم الدالة التي يتم تشغيلها من خلال قائمة انتظار المهام والتي ستتولى التعامل مع الحدث.

يجب الإعلان عن هذه الدالة في القسم resources وأن يكون لديها taskQueue محدّد.

processingMessage
string
(مطلوب)
رسالة للعرض في وحدة تحكُّم Firebase أثناء تنفيذ المهمة

الأحداث المخصّصة (Eventarc)

الأحداث المخصّصة هي أحداث تُرسِلها إضافتك للسماح للمستخدمين بإدراج منطقهم الخاص في إضافتك. اطّلِع على قسم Eventarc في مقالة إضافة أدوات ربط المستخدمين إلى إضافة.

events:
  - type: publisher-id.extension-name.version.event-name
    description: Description of the event
  - type: publisher-id.extension-name.version.another-event-name
    description: Description of the other event
حقول الأحداث المخصّصة
type
string
(مطلوب)
معرّف نوع الحدث. يجب إنشاء المعرّف من 3 إلى 4 حقول مُحدَّدة بنقاط: يجب ملء حقول معرّف الناشر واسم الإضافة واسم الحدث ، ويُنصح بملء حقل الإصدار. اختَر اسمًا فريدة ووصفيًا للحدث لكل نوع حدث تنشره.
description
string
(مطلوب)
وصف الحدث