أمان الأنواع، من العقد إلى الواجهة.

أنا إبراهيم، مطوّر ويب متكامل أول بخبرة تزيد على ست سنوات. أعمل بـ TypeScript و Nuxt و NestJS، وأستخدم عقدًا مشتركًا للواجهة البرمجية يأخذ منه الخادم والواجهة أنواع البيانات. ويكشف فحص الأنواع التغييرات غير المتوافقة عند تعديل العقد.

أقيم في الجزائر العاصمة (UTC+1) وأعمل عن بُعد.

الصفحة الرئيسية لموقع QueryWeave: نص استعلام يتحوّل إلى حالة محدَّدة الأنواع

حالة عنوان URL بأنواع محدَّدة، في المتصفح والخادم والاختبارات.تفاصيل المشروع

مشاريع مفتوحة المصدر. خمسة مشاريع أطوّرها وأصونها علنًا على GitHub.

لكل مشروع موقع يعمل وتوثيق ومجموعة اختبارات. وثلاثة منها، QueryWeave و Taqwim و vueye-table، تضع منطقها في نواة لا ترتبط بأي إطار عمل، وفوقها طبقات ربط خفيفة.

Vuestrata

نسخة ألفامنذ 2021 111 نجمة

قالب لتطبيقات Vue 3 تُفرض قواعده بفحوص آلية.

قالب تبدأ منه تطبيقات Vue 3. تفحص قواعدَه ست قواعد تدقيق مخصّصة وأربعة اختبارات معمارية، وتتولّى المولّدات كتابة ملفات كل وحدة أو صفحة أو سمة أو مكوّن جديد وتسجيلها. ويأتي بـ 12 سمة فوق مجموعة مكوّنات واحدة.

  • 67 مكوّنًا مبنيًّا على Reka UI، بالإنجليزية والفرنسية والعربية (من اليمين إلى اليسار)
  • 12 سمة تغيّر الألوان واستدارة الزوايا والظلال، وثمانٍ منها تغيّر الخط أيضًا
  • مصادقة عبر محوّلات قابلة للاستبدال: محاكاة و JWT و OAuth
الصفحة الرئيسية لموقع Vuestrata، وفيها نافذة شيفرة بجانب العنوان
terminal
vpr gen:module payments  # schema, queries, mocks, pages, i18n
vpr gen:page payments refunds  # wired into the module's routes
vpr gen:theme midnight  # registered in all four places
vpr gen:component Tag  # a Ui* wrapper

QueryWeave

نسخة تجريبيةمنذ 2026

حالة عنوان URL بأنواع محدَّدة، في المتصفح والخادم والاختبارات.

محرّك لإدارة حالة عنوان URL لا يرتبط بأي إطار عمل. تصف معاملات الاستعلام مرة واحدة في نموذج محدَّد الأنواع، وهو يتولّى قراءتها والتحقق منها وكتابتها بالطريقة نفسها في المتصفح وعلى الخادم وفي الاختبارات. وإن وردت قيمة غير صالحة عاد إلى القيمة الافتراضية وأبلغ عنها، دون أن تتعطّل الصفحة.

  • 9 حزم: النواة، المتصفح، الخادم، Node.js، Standard Schema، الاختبار، Vue، Vue Router و Nuxt
  • حجم النواة 7.4 كيلوبايت بعد الضغط، ولكل حزمة حدّ حجم يُفحص آليًا
  • تُختبر في متصفحات فعلية: Chromium و Firefox و WebKit
الصفحة الرئيسية لموقع QueryWeave: نص استعلام يتحوّل إلى حالة محدَّدة الأنواع
filters.ts
const filters = defineQueryModel({
  search: param.text().optional(),
  page: param.integer({ min: 1 }).default(1),
  sort: param.choice(['name', 'price']).default('name'),
})

const runtime = createQueryRuntime({ model: filters, adapter })
await runtime.update({ search: 'vue', page: 1 })

Rezuma

منشورمنذ 2026

منشئ سير ذاتية يصدّر ملفات PDF بنص قابل للتحديد.

أنشئ سيرتك الذاتية في المتصفح دون حساب. يصدّر Rezuma ملفات PDF بخطوط مضمّنة ونص قابل للتحديد، ويستخدم سكربت اختبار مكتبة pdf.js لفحص استخراج النص من تسعة ملفات تجريبية.

  • سكربت اختبار يصدّر تسعة ملفات PDF ويستخرج نصوصها بـ pdf.js ويفحصها حقلًا حقلًا
  • النص العربي يُشكَّل ويُرتَّب داخل ملف PDF نفسه، لا على الشاشة فقط
  • فحوص فورية للتواريخ وفجوات المسار المهني والإنجازات المرقّمة والكلمات المفتاحية
الصفحة الرئيسية لموقع Rezuma: سيرة ذاتية مصفوفة وبجانبها النص المستخرَج منها
terminal
pnpm verify:pdf
​
AR / classic / sidebar
  file        ar-classic-sidebar.pdf (65 KB, 1 page)
  extracted   2563 chars
  checks      51/51 found
  order       summary → experience → skills → education
  arabic      1554 letters (61% of the text)

Taqwim

نسخة تجريبيةمنذ 2024

تواريخ هجرية، وتقويم واحد لخمسة أطر عمل.

أدوات للتاريخ الهجري تدعم تقويم أم القرى والتقويم الهجري المدني وتقويم TBLA، ومعها مكوّن تقويم يراعي إمكانية الوصول. سلوك التقويم مكتوب مرة واحدة في آلة حالات لا ترتبط بأي إطار عمل، ولها طبقات ربط لـ Vue و React و Svelte و Solid و Angular.

  • 13 حزمة تصدر معًا برقم إصدار واحد
  • 33 سمة، يتحقق اختبار آلي من مطابقة كلٍّ منها لمعيار التباين WCAG AA
  • جدول أم القرى يغطي الأعوام 1343–1500 هـ، ويُصدر خطأً صريحًا خارجها
الصفحة الرئيسية لتوثيق Taqwim وفيها تقويم هجري يعمل
dates.ts
import { toHijri, formatHijriDate } from '@taqwim/core'

toHijri(new Date('2024-03-11'))
// { hy: 1445, hm: 9, hd: 1 }

formatHijriDate({ hy: 1445, hm: 9, hd: 1 }, 'iYYYY/iMM/iDD', 'ar')
// ١٤٤٥/٠٩/٠١

vueye-table

الإصدار 3 (ألفا)منذ 2018 111 نجمة

جداول بيانات وجداول حسابية لـ Vue.

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

  • ست حزم، من المحرّك إلى مكوّن جدول كامل، وتثبيت واحد يشملها كلها
  • ترميز يراعي إمكانية الوصول: aria-sort و aria-rowindex والتنقّل بلوحة المفاتيح
  • صدر أول مرة عام 2018، والإصدار الثالث إعادة كتابة كاملة
الصفحة الرئيسية لتوثيق vueye-table وتحتها شبكة جدول
UsersTable.vue
<script setup lang="ts">
const columns = defineColumns<User>([
  { id: 'name.first', header: 'First name' },
  { id: 'age', align: 'end', format: age => `${age} years` },
  { id: 'city' },
])
</script>

<template>
  <VueyeTable v-model:selected="selected" :data="users" :columns="columns" selectable />
</template>

طريقتي في البناء. عقد واحد يتقاسمه الخادم والعميل.

أبدأ الواجهة البرمجية بكتابة عقدها، بـ oRPC و Zod. ثم ينفّذ متحكِّم NestJS هذا العقد، ويُبنى منه عميل Nuxt، فيأخذ الطرفان أنواعهما من ملف واحد. وهنا أتتبّع مسارًا واحدًا عبر أربعة ملفات.

  1. الخطوة 1 من 4العقد

    كتابة العقد

    يوصف المسار مرة واحدة في حزمة مستقلة: الطريقة والعنوان، ومخطَّط Zod لما يدخل وآخر لما يخرج. ولا شيء في هذا الملف يعرف الخادم أو العميل.

    src/index.tsts
    import { oc } from '@orpc/contract'
    import { z } from 'zod'

    export const customerSchema = z.object({
    id: z.uuid(),
    name: z.string().min(1).max(200),
    email: z.email().nullable(),
    status: z.enum(['active', 'archived']),
    })

    export const ListCustomersInput = z.object({
    status: customerSchema.shape.status.default('active'),
    })

    export const contract = {
    customers: {
    list: oc
    .route({ method: 'GET', path: '/customers', summary: 'List customers' })
    .input(ListCustomersInput)
    .output(z.array(customerSchema)),
    },
    }
  2. الخطوة 2 من 4الخادم

    تنفيذ العقد في متحكِّم

    ينفّذ متحكّم NestJS العقد، وتمرّ المدخلات على التحقّق قبل وصولها إلى المعالج. يكشف فحص الأنواع اختلاف نوع القيمة المُعادة عن العقد، ويتحقّق Zod من القيم وقت التشغيل.

    customers/customers.controller.tsts
    import { Controller, Inject } from '@nestjs/common'
    import { Implement, implement } from '@orpc/nest'
    import { contract } from '@repo/api-contract'
    import { CustomersService } from './customers.service'

    @Controller()
    export class CustomersController {
    constructor(
    @Inject(CustomersService) private readonly customers: CustomersService,
    ) {}

    @Implement(contract.customers)
    customersRoutes() {
    return {
    list: implement(contract.customers.list).handler(({ input }) =>
    this.customers.list(input),
    ),
    }
    }
    }
  3. الخطوة 3 من 4العميل

    بناء العميل من العقد

    تنشئ إضافة Nuxt عميل الواجهة البرمجية من العقد نفسه. وتأتي أنواع المسارات ومدخلاتها ومخرجاتها من ذلك الملف، دون خطوة لتوليد الشيفرة.

    plugins/orpc.tsts
    import { createORPCClient } from '@orpc/client'
    import type { ContractRouterClient } from '@orpc/contract'
    import type { JsonifiedClient } from '@orpc/openapi-client'
    import { OpenAPILink } from '@orpc/openapi-client/fetch'
    import { contract } from '@repo/api-contract'

    export type ApiClient = JsonifiedClient<ContractRouterClient<typeof contract>>

    export default defineNuxtPlugin(() => {
    const link = new OpenAPILink(contract, {
    url: useRuntimeConfig().public.apiUrl,
    })
    const api: ApiClient = createORPCClient(link)

    return { provide: { api } }
    })
  4. الخطوة 4 من 4الصفحة

    استدعاء المسار من الصفحة

    تستدعي الصفحة المسار وتتلقى بيانات معروفة الأنواع. إذا تغيّر اسم email في العقد إلى contact_email، أشار فحص الأنواع إلى customer.email في هذا القالب، وحدّد موضع التعديل.

    pages/customers.vuevue
    <script setup lang="ts">
    const { $api } = useNuxtApp()

    const { data: customers } = await useAsyncData('customers', () =>
    $api.customers.list({ status: 'active' }),
    )
    </script>

    <template>
    <ul>
    <li v-for="customer in customers" :key="customer.id">
    <strong>{{ customer.name }}</strong>
    <span>{{ customer.email }}</span>
    </li>
    </ul>
    </template>

    بعد تغيير اسم الحقل email إلى contact_email في العقد

    Property 'email' does not exist on type '{ id: string; name: string; contact_email: string | null; status: "active" | "archived"; }'. ts(2339)

packages/api-contract/src/index.tsts
import { oc } from '@orpc/contract'
import { z } from 'zod'

export const customerSchema = z.object({
id: z.uuid(),
name: z.string().min(1).max(200),
email: z.email().nullable(),
status: z.enum(['active', 'archived']),
})

export const ListCustomersInput = z.object({
status: customerSchema.shape.status.default('active'),
})

export const contract = {
customers: {
list: oc
.route({ method: 'GET', path: '/customers', summary: 'List customers' })
.input(ListCustomersInput)
.output(z.array(customerSchema)),
},
}

الخبرة. أكثر من ست سنوات من العمل المهني، آخرها على نظام ERP مالي.

الدراسة
تحضيريليسانسماستر
  1. ديسمبر 2023 – فيفري 2026

    سنتان و3 أشهر · السعودية · عن بُعد

    مطوّر ويب متكامل أول

    Atqan Gulf Arab Co. Financial Technology Company

    طبقة Nuxt
    50+ طبقة Nuxt
    جدول PostgreSQL
    200+ جدول PostgreSQL
    وحدات مالية
    3 وحدات مالية
    • قدتُ نقل نظام قديم للإدارة المالية إلى مستودع موحّد يضم تطبيقين مكتوبين كليًّا بـ TypeScript، على Turborepo و pnpm workspaces.
    • صمّمتُ طبقة الواجهة البرمجية بعقود TS-Rest مشتركة، تأخذ منها واجهة Nuxt 3 ومتحكّمات NestJS أنواع الطلبات والاستجابات.
    • صمّمتُ وبنيتُ واجهة Nuxt 3 مقسّمة إلى أكثر من 50 طبقة، بـ Composition API في Vue 3 و Tailwind CSS، لنظام ERP مالي متعدد الوحدات.
    • بنيتُ خدمات NestJS و TypeORM التي تحمل منطق العمل المالي في الفوترة والمحاسبة والتقارير، وتولّيتُ صيانتها.
    • صمّمتُ قاعدة بيانات PostgreSQL وصنتُها: أكثر من 200 جدول موزّعة على 3 مخططات، خلف طبقة كيانات TypeORM.
    • أرسيتُ الاختبارات في المشروع من الصفر: Vitest لاختبارات الوحدات و Playwright للاختبارات الشاملة.
    • Nuxt 3
    • Vue 3
    • NestJS
    • TypeORM
    • PostgreSQL
    • TS-Rest
    • Turborepo
    • Vitest
    • Playwright
  2. أكتوبر 2023 – ديسمبر 2023

    3 أشهر · الجزائر العاصمة

    مطوّر واجهات أمامية

    Edraak Technologies

    • بنيتُ متجرًا إلكترونيًا للكراسي المتحركة ولوازمها بـ Vue 3 و Nuxt و Composition API.
    • طوّرتُ الموقع التعريفي للشركة بتصميم متجاوب، وتحققتُ من توافقه مع المتصفحات المختلفة.
    • Vue 3
    • Nuxt
  3. جويلية 2022 – أفريل 2023

    10 أشهر · السعودية · عن بُعد

    مطوّر واجهات أمامية

    Naseej for Education Solutions

    • طوّرتُ واجهات بوابة الطلاب بـ React و TypeScript، ومنها شاشات الإجراءات الأكاديمية.
    • بنيتُ واجهة تطبيق لإدارة التدريب وربطتُها بواجهات REST.
    • React
    • TypeScript
  4. جويلية 2019 – ماي 2022

    سنتان و11 شهرًا · الجزائر العاصمة

    مطوّر ويب متكامل

    Makane Consulting Group

    • صمّمتُ بنية واجهة React لنظام ERP موجَّه للجمعيات والنوادي الرياضية، بوحداته الثلاث: إدارة العضويات والجدولة والمتابعة المالية.
    • طوّرتُ الخدمات الخلفية بـ Spring Boot وواجهات REST، وصمّمتُ مخططات PostgreSQL الخاصة بها.
    • أنجزتُ مشروعًا آخر بـ Vue.js لعميل في مجال مختلف.
    • React
    • Spring Boot
    • PostgreSQL
    • Vue.js
  5. فيفري 2019 – جويلية 2019

    6 أشهر · الجزائر

    مطوّر ويب متكامل (مشروع تخرّج الماستر)

    الهيئة الوطنية للرقابة التقنية للأشغال العمومية (CTTP)

    • صمّمتُ وبنيتُ نظامًا لإدارة صيانة الطرق، يتابع أعمال إصلاح المنشآت ويخطّط لها، وكان مشروع تخرّجي في الماستر.
    • الواجهة بـ Vue.js والخادم بـ Laravel، مع PostGIS لتخزين البيانات الجغرافية وعرضها على الخرائط.
    • اعتمد فريق الهندسة النموذج الأولي داخليًا لتقييم حالة الطرق وترتيب أولويات الصيانة.
    • Vue.js
    • Laravel
    • PostGIS
  6. جويلية 2018 – جوان 2021

    3 سنوات · الجزائر

    مطوّر ويب متكامل مستقل

    عمل حر

    • أنجزتُ 3 منتجات لعملاء: تطبيقًا لإدارة المبيعات، ولوحة لإدارة التوصيل، ولوحة مفاتيح رسومية متعددة الوسائط، بـ Vue.js و TypeScript و Tailwind CSS و Laravel.
    • بنيتُ لوحة متابعة لحظية لفعالية في قطاع الصيدلة بـ Nuxt و Firebase.
    • Vue.js
    • TypeScript
    • Tailwind CSS
    • Laravel
    • Nuxt
    • Firebase

التعليم

  1. سبتمبر 2017 – جويلية 2019

    ماستر في هندسة البرمجيات

    جامعة العلوم والتكنولوجيا هواري بومدين (USTHB) · باب الزوار، الجزائر العاصمة

  2. سبتمبر 2015 – جويلية 2017

    ليسانس في نظم المعلومات وهندسة البرمجيات

    جامعة العلوم والتكنولوجيا هواري بومدين (USTHB) · باب الزوار، الجزائر العاصمة

  3. سبتمبر 2012 – جويلية 2015

    الأقسام التحضيرية المدمجة في الإعلام الآلي

    المدرسة الوطنية العليا للإعلام الآلي (ESI) · واد السمار، الجزائر العاصمة

  4. جوان 2012

    بكالوريا شعبة تقني رياضي، هندسة كهربائية

    ثانوية عداوي الحبيب · مدريسة، تيارت

اللغات

  • العربيةاللغة الأم
  • الإنجليزيةمستوى مهني
  • الفرنسيةمستوى مهني

التقنيات. ما أعمل به، وأين استعملتُه.

الواجهة

الصفحات والمكوّنات والتنسيق.

  • Vue 3

    Atqan، Edraak، ومشاريعي المفتوحة الخمسة

  • Nuxt

    عملي الحالي، Atqan (أكثر من 50 طبقة)، Edraak، وهذا الموقع

  • React

    Naseej، Makane، ومحوّل Taqwim

  • Tailwind CSS

    Atqan، العمل الحر، Vuestrata

  • Reka UI

    Vuestrata (67 مكوّنًا)

  • إمكانية الوصول

    Taqwim (اختبارات WCAG AA)، vueye-table

  • الكتابة من اليمين والتدويل

    Taqwim، Rezuma، Vuestrata، وهذا الموقع

الحالة

حالة التطبيق وبيانات الخادم.

  • Composition API

    Atqan، Edraak

  • Pinia

    مخازن الحالة في Vuestrata

  • TanStack Query

    وحدات البيانات في Vuestrata

  • حالة العنوان (URL)

    QueryWeave

العقد

أنواع ومخططات يتقاسمها العميل والخادم.

  • TypeScript

    Atqan، Naseej، العمل الحر، والمشاريع الخمسة

  • oRPC

    عملي الحالي

  • Zod

    عملي الحالي، والتحقق من البيانات في Vuestrata

  • Standard Schema

    محوّل QueryWeave

  • TS-Rest

    طبقة الواجهة البرمجية في Atqan

الخدمات

الواجهات البرمجية ومنطق العمل.

  • NestJS

    عملي الحالي؛ والفوترة والمحاسبة والتقارير في Atqan

  • Node.js

    Atqan، ومحوّل Node في QueryWeave

  • Spring Boot

    نظام ERP لدى Makane

  • Laravel

    CTTP، العمل الحر

  • واجهات REST

    Naseej، Makane، Atqan

البيانات

قواعد البيانات والاستعلامات.

  • PostgreSQL

    Atqan (أكثر من 200 جدول)، Makane

  • Drizzle

    عملي الحالي

  • TypeORM

    طبقة الكيانات في Atqan

  • PostGIS

    نظام صيانة الطرق لدى CTTP

  • Firebase

    لوحة متابعة لحظية لفعالية

أدوات التطوير

المستودع الموحّد والبناء والتكامل المستمر.

  • Turborepo

    مستودع Atqan الموحّد

  • pnpm workspaces

    Atqan، QueryWeave، Taqwim

  • Vite & Vite+

    Taqwim، Vuestrata، Rezuma

  • Oxlint

    تدقيق الشيفرة في Vuestrata

  • GitHub Actions

    التكامل المستمر في Vuestrata و Taqwim و QueryWeave

  • Docker

    بناء متعدد المراحل في Vuestrata

  • Git

    كل المشاريع

الجودة

الاختبارات الآلية.

  • Vitest

    Atqan (أدخلتُه من الصفر)، QueryWeave، vueye-table، Vuestrata

  • Playwright

    Atqan، QueryWeave، Taqwim، Vuestrata

  • MSW

    محاكاة الخادم واختبارات العقود في Vuestrata

  • axe

    الاختبارات الشاملة في Taqwim

واستعملتُ أيضًا في مشاريعي المفتوحة

  • Svelte 5محوّل Taqwim
  • Solidمحوّل Taqwim
  • Angularمحوّل Taqwim
  • WebGL2 & Canvasمؤثرات الصفحة الرئيسية في Rezuma
  • jsPDF & pdf.jsتصدير PDF واستخراج نصّه في Rezuma
  • Astro Starlightتوثيق QueryWeave

لغات البرمجة

  • TypeScript
  • JavaScript
  • Java
  • PHP
  • SQL
  • HTML
  • CSS

المجتمع التقني. الأول في الترتيب العام للمجيبين في وسم Vue.js 3 على Stack Overflow، بحسب نقاط الإجابات.

كتبتُ 2.229 إجابة على Stack Overflow منذ 2017. وفي حسابي 90.059 نقطة سمعة و19 شارة ذهبية. وأحتلّ المرتبة الثانية في الترتيب العام للمجيبين في وسم Vue.js، بحسب نقاط الإجابات.

الإجابات حسب الوسم

أعلى الإجابات تصويتًا

  1. 225
  2. 123
  3. 88
  4. 82
  5. 80

على GitHub: النجوم 776، المستودعات العامة 38، المتابعون 207.

تواصل معي. البريد الإلكتروني أسرع طريق إليّ.

إن كنتَ تبحث عن مطوّر ويب متكامل أول، فاكتب لي بضعة أسطر عن الفريق والمنتج.

أو راسلني من هنا