ابدأ الآن
OneEntry Platform SDK هو SDK يوفر وسيلة سهلة للتفاعل مع واجهة برمجة تطبيقات OneEntry Platform.
🚀 بدء سريع
ابدأ العمل مع OneEntry في 3 خطوات بسيطة:
1️⃣ التثبيت
npm install oneentry
2️⃣ تهيئة SDK
import { defineOneEntry } from 'oneentry';
const api = defineOneEntry('your-project-url', {
token: 'your-api-token'
});
3️⃣ ابدأ باستخدام واجهة البرمجة
// Fetch products — filters first, the query object third
const products = await api.Products.getProducts([], 'en_US', { limit: 10 });
// Get user profile
const user = await api.Users.getUser();
// Submit a form — one body object, fields carry a marker and a type
const formData = await api.FormData.postFormsData({
formIdentifier: 'contact-form',
formModuleConfigId: 1,
moduleEntityIdentifier: 'contact-us',
replayTo: null,
status: 'sent',
formData: [
{ marker: 'your_name', type: 'string', value: 'John Doe' },
{ marker: 'your_email', type: 'string', value: 'john@example.com' },
],
});
🎉 هذا كل شيء! أنت جاهز لبناء تطبيقات مذهلة باستخدام OneEntry.
تستخدم TypeScript؟ كل نوع عام يتم تصديره من جذر الحزمة ومن
oneentry/types—import type { IProductsEntity } from 'oneentry'. انظر استيراد الأنواع.
✨ الميزات الرئيسية
إدارة رموز مدمجة ودعم OAuth
دعم i18n مع اكتشاف اللغة تلقائيًا
تعريفات نوع كاملة، يمكن استيرادها من جذر الحزمة
بناء ESM قابل للاهتزاز — 9.7 كيلوبايت مضغوط في إعداد نموذجي
29 وحدة متخصصة لجميع احتياجاتك
معالجات أخطاء مخصصة ووضع shell
🌐 الموارد
تعرف على المزيد حول OneEntry Platform
سجل الآن (يفتح في علامة تبويب جديدة)أنشئ حسابك المجاني
Npmjs (يفتح في علامة تبويب جديدة)قم بتنزيل SDK
صندوق الرمل SDK JS (يفتح في علامة تبويب جديدة)جرب طرق SDK مباشرة في متصفحك — لا حاجة للإعداد
📖 الاستخدام التفصيلي
جميع الوحدات المتاحة
استورد وفكك جميع الوحدات التي تحتاجها:
import { defineOneEntry } from 'oneentry'
const config = { token: 'your-app-token',}const { , , , , , , , , , , , , , , , , , , , , , , , , , , , , } = defineOneEntry('your-url', config);
أو
const config = {
token: 'your-app-token',
};
const api = defineOneEntry('your-url', config);
التكوين
المعلمة الثانية من المُنشئ تأخذ 'config'. تحتوي على القيم التالية:
- 'token' - قم بتعيين مفتاح الرمز إذا كان مشروعك مؤمنًا بـ "رمز واجهة برمجة التطبيقات الأمنية". إذا كنت تستخدم حماية الشهادة، فلا تمرر هذه المتغير. اقرأ المزيد في تعليمات أمان المشروع.
- 'langCode' - قم بتعيين "langCode" لتعيين اللغة الافتراضية. من خلال تحديد هذه المعلمة مرة واحدة، لا تحتاج إلى تمرير langCode إلى طرق واجهة برمجة التطبيقات ONEENTRY. إذا لم تقم بتمرير اللغة الافتراضية، فسيتم تعيينها إلى "en_US".
- 'traficLimit' - تستخدم بعض الطرق أكثر من طلب واحد إلى OneEntry بحيث تكون البيانات التي تتلقاها كاملة وسهلة العمل معها. مرر القيمة "true" لهذه المعلمة لتوفير حركة المرور وقرر بنفسك ما هي البيانات التي تحتاجها. القيمة الافتراضية هي "false".
- 'rawData' - عند تعيينها إلى
false(افتراضي)، يقوم SDK تلقائيًا بتحويل مصفوفةadditionalFieldsإلى كائن مفاتيحهmarkerلسهولة الوصول. قم بتعيينها إلىtrueلتلقيadditionalFieldsكمصفوفة أصلية من واجهة البرمجة. - 'guestId' - معرف ضيف اختياري يتم إرساله كعنوان
x-guest-idفي الطلبات غير المصرح بها، مما يمكّن تدفقات سلة/قائمة الرغبات/نشاط الضيف. في المتصفح، إذا تم إغفاله، يتم إنشاء معرف ثابت لكل جهاز ويتم الاحتفاظ به فيlocalStorage. على الخادم، يجب عليك تمريرguestIdلكل زائر. انظر وضع الضيف أدناه. القيمة الافتراضية هيundefined. - 'deviceMetadata' - سلسلة اختيارية تُرسل كعنوان
x-device-metadata(في طلبات POST وتجديد الرموز) بدلاً من بصمة الإصبع التي يحسبها SDK من البيئة الحالية. تربط واجهة البرمجة الرموز المنعشة بهذا العنوان، لذا يجب على الخادم الذي يصدر الرموز نيابة عن متصفح أن يطبع بصمة متصفح هنا. انظر بيانات الجهاز أدناه. القيمة الافتراضية هيundefined. - 'auth' - كائن بإعدادات التفويض. بشكل افتراضي، يتم تكوين SDK للعمل مع الرموز داخل جلسة المستخدم ولا يتطلب أي عمل إضافي منك. في نفس الوقت، لا يخزن SDK حالة الجلسة بين الجلسات. إذا كنت راضيًا عن هذه الإعدادات، فلا تمرر المتغير 'auth' على الإطلاق.
يحتوي 'auth' على الإعدادات التالية:
- 'refreshToken' - رمز التحديث الخاص بالمستخدم. قم بنقله هنا من المستودع لاستعادة جلسة المستخدم أثناء التهيئة.
- 'saveFunction' - دالة تعمل مع تحديث رمز التحديث. إذا كنت ترغب في تخزين الرمز بين الجلسات، على سبيل المثال في التخزين المحلي، مرر دالة هنا تقوم بذلك. يجب أن تقبل الدالة معلمة سيتم تمرير السلسلة التي تحتوي على الرمز إليها.
- 'customAuth' - إذا كنت ترغب في تكوين التفويض والعمل مع الرموز بنفسك، قم بتعيين هذه العلامة إلى true. إذا كنت ترغب في استخدام إعدادات sdk، قم بتعيينها إلى false أو لا تمررها على الإطلاق.
- 'providerMarker' - العلامة لمزود المصادقة. الافتراضي: 'البريد الإلكتروني'. مثال على تكوين مع حماية الرمز والمصادقة التلقائية التي تخزن الحالة بين الجلسات
const tokenFunction = (token) => {
localStorage.setItem('refreshToken', token);
};
const api = defineOneEntry('https://my-project.oneentry.cloud', {
token: 'my-token',
langCode: 'en_US',
auth: {
refreshToken: localStorage.getItem('refreshToken'),
saveFunction: tokenFunction,
providerMarker: 'email'
},
});
مثال على تكوين محمي بشهادة يسمح لك بتكوين نظام المصادقة بنفسك ويحفظ البيانات على الطلبات.
const api = defineOneEntry('https://my-project.oneentry.cloud', {
langCode: 'en_US',
traficLimit: true,
auth: {
customAuth: true,
refreshToken: localStorage.getItem('refreshToken'),
providerMarker: 'email'
},
});
إذا اخترت تكوين الرموز بنفسك، يمكنك تمرير الرمز إلى الطريقة كما يلي. تسمح لك الطريقة الوسيطة بتمرير رمز وصول إلى الطلب. ثم استدعِ الطريقة المطلوبة. يجب عدم استدعاء هذه الطريقة (setAccessToken) إذا كانت الطريقة لا تتطلب مصادقة المستخدم.
const user = api.Users.setAccessToken('my.access.token').getUser();
إذا اخترت حماية الرمز لضمان أمان الاتصال، فقط مرر رمزك إلى الدالة كمعامل اختياري.
يمكنك الحصول على رمز كما يلي
- قم بتسجيل الدخول إلى حسابك الشخصي
- انتقل إلى علامة التبويب "المشاريع" واختر مشروعًا
- انتقل إلى علامة التبويب "الوصول"
- قم بتعيين المفتاح إلى "رمز واجهة برمجة التطبيقات الأمنية"
- قم بتسجيل الدخول إلى المشروع، وانتقل إلى قسم الإعدادات وافتح علامة التبويب الخاصة بالرمز
- احصل على رمز مشروعك وانسخه
يمكنك أيضًا توصيل شهادة tls لحماية مشروعك. في هذه الحالة، لا تمرر "token" على الإطلاق. عند استخدام الشهادة، قم بإعداد وكيل في مشروعك. مرر سلسلة فارغة كمعامل url. تعرف على المزيد حول شهادة mtls
const saveTokenFromLocalStorage = (token) => {
localStorage.setItem('refreshToken', token);
};
const api = defineOneEntry('your-url', {
token: 'my-token',
langCode: 'my-langCode',
auth: {
customAuth: false,
refreshToken: 'user.refresh.token',
saveFunction: saveTokenFromLocalStorage,
providerMarker: 'email'
},
});
وضع الضيف
يمكن أن يعمل SDK نيابة عن ضيف غير مصدق. عندما لا يتم تعيين رمز وصول، فإنه يرسل عنوان x-guest-id في الطلبات، مما يسمح لنقاط النهاية التي تدرك الضيف بالعمل بدون مستخدم مسجل الدخول - تدفقات السلة، قائمة الرغبات ونشاط المستخدم، بالإضافة إلى كتل التخصيص (تمت مشاهدته مؤخرًا، توصيات شخصية، وغيرها).
كيف يتم حل معرف الضيف:
guestIdالمكون صراحة (منconfig.guestIdأوsetGuestId) دائمًا ما يفوز.- في المتصفح، عندما لا يتم توفير أي شيء، يتم إنشاء معرف ثابت (عبر Web Crypto عند توفره) ويتم الاحتفاظ به في
localStorageتحت المفتاحoneentry_guest_id، مما يعكس استراتيجية بيانات الجهاز. يبقى ثابتًا عبر الجلسات والألسنة. - خلاف ذلك، يكون المعرف
undefinedويتم ببساطة حذف عنوانx-guest-id.
⚠️ على الخادم: لا يقوم SDK أبدًا بإنشاء معرف ضيف تلقائيًا على الخادم. ستتسرب حالة سلة/قائمة الرغبات الضيف المشتركة عبر جميع الزوار المجهولين. على الخادم، يجب عليك تمرير
guestIdلكل زائر بنفسك (عبرconfig.guestIdأوsetGuestId).
يتم حذف العنوان للطلبات المصرح بها (عندما يتم تعيين رمز وصول)، لذا يعمل المستخدم المسجل دائمًا على بياناته الخاصة.
تعيين معرف الضيف عند التهيئة
const api = defineOneEntry('https://my-project.oneentry.cloud', {
token: 'my-token',
guestId: 'visitor-123', // per-visitor id, required on the server
});
تعيين أو مسح معرف الضيف في وقت التشغيل
تعمل setGuestId مثل setAccessToken - يمكن ربطها وتعيد مثيل الوحدة. مرر سلسلة فارغة لمسحها (ثم يعود SDK إلى المعرف المدعوم من localStorage في المتصفح، أو إلى عدم وجود معرف ضيف على الإطلاق على الخادم).
// Set the guest id, then call a guest-aware method
const cart = await api.Users.setGuestId('visitor-123').getCart();
// Clear the guest id
api.Users.setGuestId('');
بيانات الجهاز
يرسل SDK عنوان x-device-metadata في طلبات POST وعند تجديد الرموز. بشكل افتراضي، هو بصمة إصبع محسوبة من البيئة الحالية (المنصة، وكيل المستخدم، اللغة، الشاشة، المنطقة الزمنية، بالإضافة إلى معرف مثيل دائم)، يستخدمه API للتحليلات ومكافحة الاحتيال.
يربط API الرموز المنعشة بهذا العنوان. يمكن تجديد رمز التحديث الصادر بينما تم إرسال بصمة إصبع واحدة فقط بينما يتم إرسال نفس بصمة الإصبع — وهو بالضبط المشكلة عندما يتم إصدار الرمز على الخادم نيابة عن متصفح (على سبيل المثال، تبادل رمز OAuth الذي يحتفظ بسر العميل على الخادم): سيكون الرمز مرتبطًا ببصمة الخادم ولا يمكن للمتصفح تجديده أبدًا.
تحل deviceMetadata هذه المشكلة: يقوم الخادم بطباعة بصمة متصفح، ويظل رمز التحديث الصادر قابلًا للتجديد من ذلك المتصفح.
قراءة القيمة في المتصفح
getDeviceMetadata() متاحة على كل وحدة وتعيد السلسلة الدقيقة التي يرسلها SDK — التعديل إذا تم تعيين واحد، خلاف ذلك بصمة الإصبع المحسوبة:
// Browser: obtain the fingerprint and forward it to your backend
const deviceMetadata = api.Users.getDeviceMetadata();
await fetch('/api/oauth/exchange', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code, deviceMetadata }),
});
تعيين التعديل
مرره عند التهيئة:
const api = defineOneEntry('https://my-project.oneentry.cloud', {
token: 'my-token',
deviceMetadata, // the string forwarded from the browser
});
أو قم بتعيينه في وقت التشغيل باستخدام setDeviceMetadata(deviceMetadata) — متاحة على كل وحدة وقابلة للتسلسل، مثل setAccessToken. تمرير سلسلة فارغة يمسح التعديل ويعود إلى بصمة الإصبع المحسوبة:
// Server: issue tokens bound to the browser's fingerprint
const auth = await api.AuthProvider
.setDeviceMetadata(deviceMetadata)
.auth('email', authData);
// Clear the override
api.AuthProvider.setDeviceMetadata('');
| الطريقة | تعيد | الوصف |
|---|---|---|
getDeviceMetadata() | string | سلسلة x-device-metadata التي ترسلها هذه النسخة (تعديل، أو بصمة إصبع محسوبة) |
setDeviceMetadata(value) | مثيل الوحدة | تعيين التعديل؛ سلسلة فارغة تمسحها |
التحقق من استجابة واجهة البرمجة
يتضمن OneEntry SDK التحقق الاختياري من استجابات واجهة البرمجة باستخدام Zod، مكتبة التحقق من المخططات التي تركز على TypeScript. تساعد هذه الميزة في ضمان سلامة البيانات وأمان النوع عند العمل مع استجابات واجهة البرمجة.
الميزات
- اختياري: يتم تعطيل التحقق بشكل افتراضي ويمكن تمكينه حسب التكوين
- آمن من حيث النوع: يستخدم مخططات Zod التي تتماشى مع واجهات TypeScript
- وضعان: وضع ناعم (يسجل الأخطاء) ووضع صارم (يعيد الأخطاء)
- تكلفة صفرية عند التعطيل: يتم تحميل Zod ومخططات الاستجابة عند الطلب — في المرة الأولى التي يجب فيها التحقق فعليًا من استجابة. مع تعطيل التحقق، لا تصل إلى حزمةك على الإطلاق (انظر حجم الحزمة وصيغ الوحدات)
التكوين
قم بتمكين التحقق عن طريق إضافة خاصية validation إلى تكوين SDK الخاص بك:
import { defineOneEntry } from 'oneentry'
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
validation: {
enabled: true, // Enable validation (default: false)
strictMode: false, // Strict mode (default: false)
logErrors: true, // Log validation errors (default: true)
}
})
خيارات التكوين
| الخيار | النوع | الافتراضي | الوصف |
|---|---|---|---|
enabled | boolean | false | تمكين/تعطيل التحقق من الاستجابة |
strictMode | boolean | false | عندما تكون true، تعيد IError عند فشل التحقق. عندما تكون false، تسجل الأخطاء وتعيد البيانات الأصلية |
logErrors | boolean | true | سجل أخطاء التحقق في وحدة التحكم (مفيد للتصحيح) |
أوضاع التحقق
الوضع الناعم (افتراضي)
عندما تكون strictMode هي false، يتم تسجيل أخطاء التحقق في وحدة التحكم، ولكن يتم إرجاع استجابة واجهة البرمجة الأصلية دون تغيير. هذا مفيد أثناء التطوير لتحديد عدم التناسق المحتمل في البيانات دون كسر تطبيقك.
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
validation: {
enabled: true,
strictMode: false, // Soft mode
logErrors: true,
}
})
// Even if validation fails, you'll get the API response
const user = await api.Users.getUser()
// Console will show validation errors if any
الوضع الصارم
عندما تكون strictMode هي true، تعيد حالات فشل التحقق كائن IError بدلاً من البيانات. يضمن ذلك أن تطبيقك يعالج فقط البيانات التي تم التحقق منها.
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
validation: {
enabled: true,
strictMode: true, // Strict mode
logErrors: true,
}
})
const user = await api.Users.getUser()
// Check if response is an error
if ('statusCode' in user) {
console.error('Validation failed:', user.message)
} else {
// Type-safe: user is IUserEntity
console.log('User:', user.email)
}
تنسيق الحقول الإضافية
بشكل افتراضي، يقوم SDK بتحويل خاصية additionalFields من مصفوفة (كما تم إرجاعها بواسطة واجهة البرمجة) إلى كائن مفاتيحه marker. يجعل هذا من السهل جدًا الوصول إلى حقول معينة دون معرفة فهرسها.
السلوك الافتراضي (rawData: false)
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
// rawData is false by default — no need to pass it explicitly
})
// additionalFields is an object keyed by marker:
const field = attribute.additionalFields['my_field']
console.log(field.value) // direct access, no array search needed
الوضع الخام (rawData: true)
إذا كنت بحاجة إلى تنسيق استجابة واجهة البرمجة الأصلية (على سبيل المثال، للتوافق مع الإصدارات السابقة)، قم بتعيين rawData: true:
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
rawData: true,
})
// additionalFields is the original array from the API:
const field = attribute.additionalFields.find(f => f.marker === 'my_field')
console.log(field.value)
خيار التكوين
| الخيار | النوع | الافتراضي | الوصف |
|---|---|---|---|
rawData | boolean | false | عندما تكون false، يتم تحويل additionalFields إلى كائن مفاتيحه marker. عندما تكون true، يتم إرجاع المصفوفة الأصلية من واجهة البرمجة |
يتم وصف بقية التطبيع الذي يطبقه SDK على قيم السمات - فك الملف الفردي، تحويل الأرقام،
nullللقيم غير المحددة، الفرز حسبposition- في قيم السمات.
الأخطاء
إذا كنت ترغب في الهروب من الأخطاء داخل sc، اترك خاصية "الأخطاء" كما هي افتراضيًا. في هذه الحالة، ستتلقى إما بيانات الكيان أو كائن الخطأ. تحتاج إلى إجراء تحقق من النوع. على سبيل المثال، من خلال التحقق من خاصية statusCode باستخدام ".hasOwnProperty"
ومع ذلك، إذا كنت ترغب في استخدام البناء "try catch(e) ", قم بتعيين الخاصية "isShell" إلى القيمة "false". في هذه الحالة، تحتاج إلى معالجة الخطأ باستخدام "try catch(e) ".
أيضًا، يمكنك تمرير دوال مخصصة سيتم استدعاؤها داخل sdk مع رمز الخطأ المناسب. تستقبل هذه الدوال كائن خطأ كوسيط. يمكنك معالجته بنفسك.
const api = defineOneEntry('your-url', {
token: 'my-token',
langCode: 'my-langCode',
errors: {
isShell: false,
customErrors: {
400: (error) => console.error('Bad Request:', error.message),
401: (error) => console.error('Unauthorized:', error.message),
403: (error) => console.error('Forbidden:', error.message),
404: (error) => console.error('Not Found:', error.message),
429: (error) => console.error('Rate Limit Exceeded:', error.message),
500: (error) => console.error('Server Error:', error.message),
502: (error) => console.error('Bad Gateway:', error.message),
503: (error) => console.error('Service Unavailable:', error.message),
504: (error) => console.error('Gateway Timeout:', error.message),
},
},
})
عندما يتم تعيين خيار isShell: false في تكوين SDK، يكون له التأثير التالي:
عند حدوث خطأ في طلبات واجهة البرمجة (مثل أخطاء HTTP 400، 401، 404، 500، إلخ، أو أخطاء الشبكة)، سيقوم SDK بإلقاء استثناء بدلاً من إرجاع كائن الخطأ كقيمة عادية.
يسمح لك ذلك باستخدام بناء try/catch في كود تطبيقك لمعالجة الأخطاء:
try {
const result = await api.someMethod();
// Handling a successful result
} catch (error) {
// Error handling
}
إذا كانت isShell: true، يتم إرجاع الأخطاء كقيم، وستحتاج إلى التحقق صراحة من نوع النتيجة للتحقق:
const result = await api.someMethod();
if ('statusCode' in result) { // Assumes the presence of a statusCode property on the error object
// Error handling
} else {
// Handling a successful result
}
وبالتالي، يسمح isShell: false بنموذج معالجة الأخطاء الأكثر ألفة باستخدام try/catch، بينما يوفر isShell: true نموذجًا مسطحًا حيث يتم إرجاع الأخطاء والنجاح كقيم من نفس النوع.
عند استخدام SDK مع الإعداد الافتراضي (تم تعيين isShell إلى true)، يتم إرجاع الأخطاء كقيم بدلاً من إلقائها كاستثناءات. هذا يعني أن التطبيق لن يتعطل بسبب الاستثناءات غير المعالجة، لأن الأخطاء تتم معالجتها كجزء من تدفق التنفيذ العادي. إليك كيفية معالجة الأخطاء على الواجهة الأمامية دون استخدام try/catch:
تحقق من نوع الإرجاع بعد استدعاء طريقة واجهة البرمجة:
const result = await api.someMethod();
// Check if the result is an error
if ('statusCode' in result || 'message' in result) {
// Error handling
console.error('Error:', result);
} else {
// Handling a successful result
console.log('Success:', result);
}
يمكنك أيضًا إنشاء نوع أدوات الاستخدام "IError" للتحقق من الأخطاء:
import type { IError } from 'oneentry';
function isErrorResult(result: any): result is IError {
return result && typeof result === 'object' &&
(result.hasOwnProperty('statusCode') ||
result.hasOwnProperty('message'));
}
// Then use it like this:
const result = await api.someMethod();
if (isErrorResult(result)) {
// Error handling
console.error('Произошла ошибка:', result);
} else {
// Handling a successful result
console.log('Успешный результат:', result);
}
تسمح لك هذه الطريقة بتجنب استخدام بناء try/catch مع الاستمرار في معالجة الأخطاء بشكل صحيح، مما يمنع التطبيق من التعطل.
statusCode: 0 — لا إجابة قابلة للاستخدام (v1.0.168، v1.0.169)
تعود حالتان بقيمة لا يمكن أن تحملها أي إجابة HTTP — statusCode: 0:
// the request never reached the platform: a dropped connection, a timeout, DNS (v1.0.168)
{ statusCode: 0, message: 'TypeError: fetch failed', pageData: null, timestamp: '…' }
// an answer arrived, but it was not JSON (v1.0.169). The platform can answer
// 200 OK with content-type: text/html and its own admin page in the body
{ statusCode: 0, message: 'Expected JSON from the platform, received text/html (HTTP 200): <!DOCTYPE html>…' }
اقرأها على أنها "لم تكن هناك إجابة"، وليس "لا يوجد سجل": لا تقم بتخزينها، لا تعاملها كنتيجة فارغة، ودع بناء ثابت يفشل بدلاً من تضمين 404 في صفحة بياناتها حية. عندما تصل جسم غير JSON خلف حالة فاشلة، يتم الاحتفاظ بالحالة التي أرسلها الخادم حقًا، وتسمى الرسالة content-type التي جاءت بدلاً من JSON.
قبل 1.0.168، كانت الحالة الأولى استثناءً تم إلقاؤه TypeError تم تسلسله إلى {} — لا statusCode، لا رسالة — لذا كان "لا اتصال" غير قابل للتفريق عن "لا بيانات". كانت الثانية تظهر كخطأ محلل SDK الخاص (SyntaxError: Unexpected token '<')، وعلى فرع الخطأ ككائن فارغ لم يقرأ كخطأ على الإطلاق.
📚 الخطوات التالية
استكشف أدلتنا الشاملة لتتعلم المزيد:
التجارة الإلكترونية
بناء كتالوجات المنتجات مع التصفية والبحث
إدارة المستخدمين
تنفيذ المصادقة وملفات تعريف المستخدمين
الطلبات والدفع
معالجة الطلبات والتعامل مع المدفوعات
الصفحات والمحتوى
إدارة الصفحات الديناميكية وهياكل المحتوى
النماذج
تعلم كيفية التعامل مع النماذج
بيانات النماذج
تعلم كيفية التعامل مع بيانات النماذج
استيراد الأنواع
استيراد كل نوع SDK من 'oneentry' أو 'oneentry/types'
حجم الحزمة
بناء ESM، الاهتزاز وZod / socket.io عند الطلب
قيم السمات
الشكل الموحد الذي تصل به كل سمة
فترات الزمن
توسيع الجداول الزمنية إلى فترات حجز محددة