تحذير: وصل Node Sass إلى نهاية عمره الافتراضي. ولن يتلقى المزيد من الإصدارات، حتى بالنسبة للإصلاحات الأمنية. يجب على المشاريع التي لا تزال تستخدمه أن تنتقل إلى Dart Sass.
تختلف إصدارات Node.js المدعومة حسب الإصدار، يرجى مراجعة صفحة الإصدارات.
سيتم إسقاط إصدارات العقدة التي وصلت إلى نهاية عمرها https://github.com/nodejs/Release، من الدعم عند كل إصدار لعقدة sass (رئيسي، ثانوي).
سنتوقف عن إنشاء ثنائيات للإصدارات غير المدعومة، واختبار أي أعطال في التوافق مع التبعيات، ولكننا لن نمنع عمليات التثبيت لأولئك الذين يريدون دعم أنفسهم.
يتطلب إصدار العقدة الجديدة تغييرات داخلية طفيفة إلى جانب الدعم من موفري CI (AppVeyor، GitHub Actions). سنفتح إصدارًا واحدًا للمهتمين للاشتراك فيه، ونغلق الإصدارات الإضافية.
فيما يلي دليل سريع للحد الأدنى والحد الأقصى للإصدارات المدعومة من Node-sass:
| NodeJS | نسخة العقدة-ساس المدعومة | وحدة العقدة |
|---|---|---|
| العقدة 20 | 9.0+ | 115 |
| العقدة 19 | 8.0+ | 111 |
| العقدة 18 | 8.0+ | 108 |
| العقدة 17 | 7.0+، <8.0 | 102 |
| العقدة 16 | 6.0+ | 93 |
| العقدة 15 | 5.0+، <7.0 | 88 |
| العقدة 14 | 4.14+، <9.0 | 83 |
| العقدة 13 | 4.13+، <5.0 | 79 |
| العقدة 12 | 4.12+، <8.0 | 72 |
| العقدة 11 | 4.10+، <5.0 | 67 |
| العقدة 10 | 4.9+، <6.0 | 64 |
| العقدة 8 | 4.5.3+، <5.0 | 57 |
| العقدة <8 | <5.0 | <57 |
يسمح لك بتجميع ملفات .scss أصلاً إلى CSS بسرعة مذهلة وتلقائيًا عبر برنامج وسيط للاتصال.
يمكنك العثور عليه على npm: https://www.npmjs.com/package/node-sass
تابع @nodesass على تويتر للحصول على تحديثات الإصدار: https://twitter.com/nodesass
npm تثبيت العقدة ساس
أبلغ بعض المستخدمين عن مشكلات في التثبيت على Ubuntu بسبب تسجيل node في حزمة أخرى. اتبع مستندات NodeJS الرسمية لتثبيت NodeJS بحيث يتم حل #!/usr/bin/env node بشكل صحيح.
يتطلب التجميع على أجهزة Windows المتطلبات الأساسية لـ Node-gyp.
هل ترى الخطأ التالي؟ راجع دليل استكشاف الأخطاء وإصلاحها.**
SyntaxError: Use of const in strict mode.
هل تواجه مشاكل في التثبيت؟ تحقق من دليل استكشاف الأخطاء وإصلاحها لدينا.
تثبيت npm -g Mirror-config-china --registry=https://registry.npmmirror.com npm تثبيت العقدة ساس
فار ساس = يتطلب('node-sass');sass.render({
الملف: scss_filename،
[, options..]}, function(err, result) { /*...*/ });// ORvar result = sass.renderSync({
البيانات: scss_content
[، خيارات..]})؛ النوع: String
الافتراضي: null
خاص : يجب تحديد file أو data
المسار إلى ملف ليقوم LibSass بتجميعه.
النوع: String
الافتراضي: null
خاص : يجب تحديد file أو data
سلسلة لتمريرها إلى LibSass لتجميعها. يوصى باستخدام includePaths بالتزامن مع ذلك حتى يتمكن LibSass من العثور على الملفات عند استخدام التوجيه @import .
هذه ميزة LibSass التجريبية. استخدم بحذر.
النوع: Function | Function[] function(url, prev, done)
الافتراضي: undefined
معلمات الوظيفة والمعلومات:
url (String) - المسار في الاستيراد كما هو ، الذي واجهه LibSass
prev (String) - المسار الذي تم حله مسبقًا
done (Function) - وظيفة رد اتصال يتم استدعاؤها عند إكمال المزامنة، وتأخذ كائنًا يحتوي على كائن حرفي
file (String) - مسار بديل لاستخدام LibSass OR
contents (String) - المحتويات المستوردة (على سبيل المثال، القراءة من الذاكرة أو نظام الملفات)
يعالج عندما يواجه LibSass توجيه @import . يسمح المستورد المخصص بتوسيع محرك LibSass بطريقة متزامنة وغير متزامنة. في كلتا الحالتين، الهدف هو إما return أو استدعاء done() باستخدام كائن حرفي. اعتمادًا على قيمة الكائن الحرفية، سيحدث أحد أمرين.
عند العودة أو الاتصال بـ done() باستخدام { file: "String" } ، سيتم افتراض مسار الملف الجديد لـ @import . من المستحسن أن تضع في اعتبارك قيمة prev في الحالات التي قد تكون فيها دقة المسار النسبي مطلوبة.
عند العودة أو الاتصال بـ done() مع { contents: "String" } ، سيتم استخدام قيمة السلسلة كما لو تمت قراءة الملف من خلال مصدر خارجي.
بدءًا من الإصدار 3.0.0:
يشير this إلى نطاق سياقي للتشغيل الفوري لـ sass.render أو sass.renderSync
يمكن للمستوردين إرجاع خطأ وسيقوم LibSass بإصدار هذا الخطأ ردًا على ذلك. على سبيل المثال:
تم (خطأ جديد ("غير موجود!"))؛ // أو قم بإرجاع خطأ جديد بشكل متزامن ("لا يوجد شيء للقيام به هنا")؛ يمكن أن يكون المستورد عبارة عن مجموعة من الوظائف، والتي سيتم استدعاؤها بواسطة LibSass بترتيب حدوثها في المصفوفة. يساعد هذا المستخدم على تحديد مستورد خاص لنوع معين من المسار (نظام الملفات، http). إذا لم يرغب المستورد في التعامل مع مسار معين، فيجب أن يُرجع null . راجع قسم الوظائف لمزيد من التفاصيل حول أنواع Sass.
هذه ميزة LibSass التجريبية. استخدم بحذر.
functions هي Object يحتوي على مجموعة من الوظائف المخصصة التي يمكن استدعاؤها بواسطة ملفات sass التي يتم تجميعها. قد تأخذ صفرًا أو أكثر من معلمات الإدخال ويجب أن تُرجع قيمة إما بشكل متزامن ( return ...; ) أو بشكل غير متزامن ( done(); ). ستكون هذه المعلمات عبارة عن مثيلات لأحد المُنشئات الموجودة في تجزئة require('node-sass').types يجب أن تكون قيمة الإرجاع من أحد هذه الأنواع أيضًا. انظر قائمة الأنواع المتاحة أدناه:
getValue() / setValue(value) : يحصل على / يحدد الجزء الرقمي من الرقم
getUnit() / setUnit(unit) : يحصل على/يحدد جزء الوحدة من الرقم
getValue() / setValue(value) : يحصل على / يضبط السلسلة المرفقة
getR() / setR(value) : المكون الأحمر (عدد صحيح من 0 إلى 255 )
getG() / setG(value) : المكون الأخضر (عدد صحيح من 0 إلى 255 )
getB() / setB(value) : المكون الأزرق (عدد صحيح من 0 إلى 255 )
getA() / setA(value) : مكون ألفا (الرقم من 0 إلى 1.0 )
مثال:
var Color = require('node-sass').types.Color,
c1 = اللون الجديد (255، 0، 0)،
c2 = لون جديد (0xff0088cc)؛ getValue() : يحصل على القيمة المنطقية المغلقة
types.Boolean.TRUE : مثيل مفرد types.Boolean الذي يحمل "صحيح"
types.Boolean.FALSE : مثيل مفرد types.Boolean الذي يحمل "خطأ"
getValue(index) / setValue(index, value) : value يجب أن تكون في حد ذاتها مثيلًا لأحد المنشئات في sass.types .
getSeparator() / setSeparator(isComma) : ما إذا كان سيتم استخدام الفواصل كفاصل
getLength()
getKey(index) / setKey(index, value)
getValue(index) / setValue(index, value)
getLength()
types.Null.NULL : مثيل مفرد types.Null .Null .
ساس.رندر سينك({
البيانات: '#{العناوين(2,5)} { اللون: #08c; }',
الوظائف: {'العناوين($from: 0, $to: 6)': الوظيفة(from, to) { var i, f = from.getValue(), t = to.getValue(), list = new sass.types .قائمة(ر - و + 1); for (i = f; i <= t; i++) {list.setValue(i - f, new sass.types.String('h' + i)); } قائمة الإرجاع؛}
}}); النوع: Array<String>
تقصير: []
مجموعة من المسارات التي يمكن لـ LibSass البحث فيها لمحاولة حل إعلانات @import الخاصة بك. عند استخدام data ، يوصى باستخدام هذا.
النوع: Boolean
الافتراضي: false
تعمل القيم true على تمكين صيغة Sass Indented Syntax لتحليل سلسلة البيانات أو الملف.
ملاحظة: ستقوم Node-sass/libsass بتجميع مكتبة مختلطة من ملفات scss وملفات بناء الجملة ذات المسافة البادئة (.sass) مع الإعداد الافتراضي (خطأ) طالما يتم استخدام امتدادات .sass و.scss في أسماء الملفات.
النوع: String
الافتراضي: space
يُستخدم لتحديد ما إذا كان سيتم استخدام المسافة أو حرف الجدولة للمسافة البادئة.
النوع: Number
الافتراضي: 2
الحد الأقصى: 10
يُستخدم لتحديد عدد المسافات أو علامات التبويب التي سيتم استخدامها للمسافة البادئة.
النوع: String
الافتراضي: lf
يُستخدم لتحديد ما إذا كان سيتم استخدام تسلسل cr أو crlf أو lf أو lfcr لفاصل الأسطر.
النوع: Boolean
الافتراضي: false
خاص: عند استخدام هذا، يجب عليك أيضًا تحديد outFile لتجنب السلوك غير المتوقع.
تعمل القيم true على تعطيل تضمين معلومات خريطة المصدر في ملف الإخراج.
النوع: String | null
الافتراضي: null
خاص: مطلوب عندما تكون sourceMap قيمة حقيقية
حدد الموقع المقصود لملف الإخراج. يوصى به بشدة عند إخراج خرائط المصدر حتى يتمكنوا من الرجوع بشكل صحيح إلى الملفات المقصودة.
تنبيه : تمكين هذا الخيار لن يكتب لك الملف على القرص، فهو لغرض مرجعي داخلي فقط (لإنشاء الخريطة على سبيل المثال).
مثال على كيفية كتابته على القرص
sass.render({...outFile: yourPathTotheFile،
}, function(error, result) { // رد اتصال بنمط العقدة من الإصدار 3.0.0 onwardsif(!error){ // لا توجد أخطاء أثناء التجميع، اكتب هذه النتيجة على القرص fs.writeFile(yourPathTotheFile, result.css, function (يخطئ){if(!err){ // ملف مكتوب على القرص } });}
});}); النوع: String
الافتراضي: nested
القيم: nested ، expanded ، compact ، compressed
يحدد تنسيق الإخراج لنمط CSS النهائي.
النوع: Integer
الافتراضي: 5
يُستخدم لتحديد عدد الأرقام المسموح بها بعد العلامة العشرية. على سبيل المثال، إذا كان لديك رقم عشري 1.23456789 ودقة 5 ، فستكون النتيجة 1.23457 في ملف CSS النهائي.
النوع: Boolean
الافتراضي: false
true يمكّن رقم السطر والملف حيث يتم تعريف المحدد ليتم إرساله إلى CSS المترجم كتعليق. مفيد لتصحيح الأخطاء، خاصة عند استخدام الواردات والخلطات.
النوع: Boolean | String | undefined
الافتراضي: undefined
تمكين إنشاء خريطة المصدر أثناء render و renderSync .
عندما يكون sourceMap === true ، يتم استخدام قيمة outFile كموقع الإخراج المستهدف للخريطة المصدر مع إضافة اللاحقة .map . إذا لم يتم تعيين outFile ، فسيتم تجاهل معلمة sourceMap .
عندما typeof sourceMap === "string" ، سيتم استخدام قيمة sourceMap كموقع كتابة للملف.
النوع: Boolean
الافتراضي: false
true يتضمن contents في معلومات الخريطة المصدر
النوع: Boolean
الافتراضي: false
true يدمج الخريطة المصدر كمعرف URI للبيانات
النوع: String
الافتراضي: undefined
سيتم إصدار القيمة كـ sourceRoot في معلومات الخريطة المصدر
render رد الاتصال (>= v3.0.0) يدعم Node-Sass عمليات الاسترجاعات غير المتزامنة بنمط العقدة القياسية مع توقيع function(err, result) . في حالات الخطأ، يتم ملء وسيطة error بكائن الخطأ. في حالات النجاح، يتم ملء الكائن result بكائن يصف نتيجة استدعاء العرض.
message (سلسلة) - رسالة الخطأ.
line (الرقم) - رقم سطر الخطأ.
column (الرقم) - رقم عمود الخطأ.
status (الرقم) - رمز الحالة.
file (سلسلة) - اسم ملف الخطأ. في حالة عدم تعيين خيار file (لصالح data )، سيعكس هذا القيمة stdin .
css (Buffer) - ملف CSS المترجم. اكتب هذا في ملف، أو قم بتقديمه حسب الحاجة.
map (المخزن المؤقت) - الخريطة المصدر
stats (كائن) - كائن يحتوي على معلومات حول الترجمة. ويحتوي على المفاتيح التالية:
entry (سلسلة) - المسار إلى ملف scss، أو data إذا لم يكن المصدر ملفًا
start (الرقم) - Date.now() قبل التجميع
end (Number) - Date.now() بعد التجميع
duration (الرقم) - النهاية - البداية
includedFiles (Array) - المسارات المطلقة لجميع ملفات scss ذات الصلة بدون ترتيب معين.
فار ساس = يتطلب('node-sass');sass.render({
الملف: "/path/to/myFile.scss"،
البيانات: 'الجسم {الخلفية: أزرق؛ أ {اللون: أسود؛}}'،
importer: function(url, prev, Done) {// url هو المسار في الاستيراد كما هو، والذي واجهه LibSass.// prev هو المسار الذي تم حله مسبقًا.// Done هو رد اتصال اختياري، إما أن تستهلكه أو ترجع القيمة بشكل متزامن .// this.options يحتوي على تجزئة الخيارات، this.callback يحتوي على رد الاتصال على نمط العقدةsomeAsyncFunction(url, prev, function(result){ Done({file: result.path، // مطلوب واحد منهم فقط، راجع القسم Special Behaviours.contents: result.data });});// ORvar result = someSyncFunction(url, prev);return {file: result.path, contents : result.data};
},
تضمين المسارات: ['lib/'، 'mod/']،
outputStyle: 'compressed'}, function(error, result) { // رد اتصال على نمط العقدة من الإصدار 3.0.0 فصاعدًا
إذا (خطأ) {console.log(error.status); // كان بمثابة "رمز" في الإصدار 2x وما يليهconsole.log(error.column);console.log(error.message);console.log(error.line);
}
else {console.log(result.css.toString());console.log(result.stats);console.log(result.map.toString());// أو Betterconsole.log(JSON.stringify(result. رسم خريطة))؛ // لاحظ أن JSON.stringify يقبل المخزن المؤقت أيضًا
}});// نتيجة ORvar = sass.renderSync({
الملف: "/المسار/إلى/file.scss"،
البيانات: 'الجسم {الخلفية: أزرق؛ أ {اللون: أسود؛}}'،
نمط الإخراج: 'مضغوط'،
الملف الخارجي: '/to/my/output.css'،
sourceMap: صحيح، // أو مسار مطلق أو نسبي (إلى outFile).
importer: function(url, prev, Done) {// url هو المسار في الاستيراد كما هو، والذي واجهه LibSass.// prev هو المسار الذي تم حله مسبقًا.// Done هو رد اتصال اختياري، إما أن تستهلكه أو ترجع القيمة بشكل متزامن .// تحتوي هذه الخيارات على هذه الخيارات hashsomeAsyncFunction(url, prev, function(result){ Done({file: result.path, // مطلوب واحد منهم فقط، راجع القسم Special Behaviours.contents: result.data });});// OR var result = someSyncFunction(url, prev);return {file: result.path, contents: result.data};
}});console.log(result.css);console.log(result.map);console.log(result.stats); في حالة تعيين خيارات file data ، ستعطي Node-sass الأولوية data وتستخدم file لحساب المسارات في خرائط المصدر.
يتم الآن عرض معلومات إصدار node-sass و libsass عبر التابع info :
var sass = require('node-sass');console.log(sass.info);/* سيُخرج شيئًا مثل:node-sass 2.0.1 (Wrapper) [JavaScript] libsass 3.1.0 (Sass Compiler) [ C/C++]*/نظرًا لأن إصدار Node-sass >=v3.0.0 LibSass يتم تحديده في وقت التشغيل.
قائمة باستخدامات المجتمع لـnode-sass في أدوات البناء والأطر.
قامjasonsanjose بإنشاء ملحق Brackets استنادًا إلى العقدة sass: https://github.com/jasonsanjose/brackets-sass. عند تحرير ملفات Sass، يقوم الامتداد بتجميع التغييرات عند الحفظ. يتكامل الامتداد أيضًا مع Live Preview لإظهار تغييرات Sass في المتصفح دون حفظ أو تجميع.
يستخدم ملحق sass الرسمي لـ Brunch عقدة sass بشكل افتراضي، ويعود تلقائيًا إلى روبي إذا تم اكتشاف استخدام Compass: https://github.com/brunch/sass-brunch
قم بإعادة ترجمة ملفات .scss تلقائيًا للاتصال وخوادم http المستندة إلى Express.
تم نقل هذه الوظيفة إلى node-sass-middleware في Node-sass v1.0.0
كتب @10xLaCroixDrinker مكونًا إضافيًا لـ DocPad يقوم بتجميع ملفات .scss باستخدام Node-sass: https://github.com/docpad/docpad-plugin-nodesass
أنشأ @stephenway امتدادًا ينقل Sass إلى CSS باستخدام العقدة sass مع duo.js https://github.com/duojs/sass
أنشأ @sindresorhus مجموعة من المهام الصعبة بناءً على Node-sass: https://github.com/sindresorhus/grunt-sass
قام @dlmanning بإنشاء مكون إضافي gulp sass استنادًا إلى العقدة sass: https://github.com/dlmanning/gulp-sass
يقوم خادم الويب Harp الخاص بـ @sintaxi بتجميع ملفات .scss ضمنيًا باستخدام العقدة sass: https://github.com/sintaxi/harp
أنشأ @stevenschobert مكونًا إضافيًا لـ metalsmith يعتمد على Node-sass: https://github.com/stevenschobert/metalsmith-sass
أنشأ @fourseven مكونًا إضافيًا للنيزك استنادًا إلى العقدة sass: https://github.com/fourseven/meteor-scss
أنشأ @dbashford وحدة Mimosa لـ sass والتي تتضمن العقدة sass: https://github.com/dbashford/mimosa-sass
يوجد أيضًا مثال لتطبيق الاتصال هنا: https://github.com/andrew/node-sass-example
يتضمن Node-sass ثنائيات مجمعة مسبقًا للمنصات الشائعة، لإضافة ثنائي لمنصتك اتبع الخطوات التالية:
تحقق من المشروع:
git clone - العودي https://github.com/sass/node-sass.gitcd العقدة sass تثبيت npm العقدة النصية/build -f # استخدم مفتاح -d لإصدار تصحيح الأخطاء # إذا نجح، فسيتم إنشاء الملف الثنائي ونقله في دليل البائع.
تعد واجهة استخدام سطر الأوامر مبسطة إلى حد ما في هذه المرحلة، كما هو موضح في قسم الاستخدام التالي.
سيتم إرسال الإخراج إلى stdout إذا تم حذف علامة --output .
node-sass [options] <input> [output] أو: cat <input> | node-sass > output
مثال:
node-sass src/style.scss dest/style.css
خيارات:
-w, --watch شاهد الدليل أو الملف
-r, --recursive مشاهدة الدلائل أو الملفات بشكل متكرر
-o، --output دليل الإخراج
-x, --omit-source-map-url حذف تعليق عنوان URL لخريطة المصدر من الإخراج
-i, --indented-syntax معالجة البيانات من stdin كرمز sass (مقابل scss)
-q, --quiet قمع إخراج السجل إلا في حالة الخطأ
-v, --version يطبع معلومات الإصدار
- نمط إخراج CSS على غرار الإخراج (متداخل | موسع | مضغوط | مضغوط)
--indent-type نوع المسافة البادئة لإخراج CSS (مسافة | علامة تبويب)
--indent-width عرض المسافة البادئة؛ عدد المسافات أو علامات التبويب (القيمة القصوى: 10)
--linefeed نمط تغذية الأسطر (cr | crlf | lf | lfcr)
--source-comments قم بتضمين معلومات التصحيح في الإخراج
--source-map انبعاث خريطة المصدر
--source-map-contents قم بتضمين المحتويات في الخريطة
--source-map-embed قم بتضمين sourceMappingUrl كـ URI للبيانات
--source-map-root Base path، سيتم إصداره في خريطة المصدر كما هي
--include-path مسار للبحث عن الملفات المستوردة
--follow اتبع الدلائل المرتبطة بالرمز
- الدقة مقدار الدقة المسموح بها في الأرقام العشرية
--error-bell قم بإخراج حرف الجرس عند حدوث الأخطاء
--importer المسار إلى ملف .js الذي يحتوي على مستورد مخصص
--functions المسار إلى ملف .js الذي يحتوي على وظائف مخصصة
--مساعدة في طباعة معلومات الاستخدام يمكن أن يكون input إما ملف .scss أو .sass أو دليل. إذا كان الإدخال عبارة عن دليل، فيجب أيضًا توفير علامة --output .
لاحظ أيضًا أن --importer يأخذ المسار (المطلق أو النسبي لـ pwd) إلى ملف js، والذي يحتاج إلى تعيين module.exports الافتراضي على وظيفة المستورد. انظر تركيبات الاختبار لدينا على سبيل المثال.
يقبل خيار --source-map قيمة منطقية، وفي هذه الحالة يستبدل امتداد الوجهة بـ .css.map . كما أنه يقبل المسار إلى ملف .map وحتى المسار إلى الدليل المطلوب. عند تجميع دليل --source-map إما قيمة منطقية أو دليلاً.
يدعم Node-sass معلمات التكوين المختلفة لتغيير الإعدادات المتعلقة بثنائي sass مثل الاسم الثنائي أو المسار الثنائي أو مسار التنزيل البديل. يتم دعم المعلمات التالية بواسطة Node-sass:
| اسم متغير | المعلمة .npmrc | حجة العملية | قيمة |
|---|---|---|---|
| SASS_BINARY_NAME | sass_binary_name | --sass-binary-name | طريق |
| SASS_BINARY_SITE | sass_binary_site | --sass-binary-site | عنوان URL |
| SASS_BINARY_PATH | sass_binary_path | --sass-binary-path | طريق |
| SASS_BINARY_DIR | sass_binary_dir | --sass-binary-dir | طريق |
| SASS_REJECT_UNAUTHORIZED | sass_reject_unauthorized | --ساس-رفض-غير مصرح به | قيمة |
يمكن استخدام هذه المعلمات كمتغير بيئة:
على سبيل المثال، export SASS_BINARY_SITE=http://example.com/
كملف تكوين .npmrc محلي أو عالمي:
على سبيل المثال sass_binary_site=http://example.com/
كحجة عملية:
على سبيل المثال npm install node-sass --sass-binary-site=http://example.com/
إذا كنت تستخدم شهادات موقعة ذاتيًا لملفك الثنائي، فسوف يتجاوز SASS_REJECT_UNAUTHORIZED (rejectUnauthorized)[https://nodejs.org/docs/latest/api/tls.html#tls_tls_createserver_options_secureconnectionlistener].
يؤدي التثبيت إلى إجراء اختبارين فقط لـ Mocha لمعرفة ما إذا كان جهازك يمكنه استخدام LibSass المدمج مسبقًا والذي سيوفر بعض الوقت أثناء التثبيت. إذا فشلت أي اختبارات فسيتم البناء من المصدر.
تم تقديم هذه الوحدة إليك وصيانتها بواسطة الأشخاص التاليين:
مايكل ميفسود - قائد المشروع (Github / Twitter)
أندرو نيسبيت (جيثب / تويتر)
دين ماو (جيثب / تويتر)
بريت ويلكنز (جيثب / تويتر)
كيث سيركل (جيثب / تويتر)
لوران جودير (جيثب / تويتر)
نيك شونينج (جيثب / تويتر)
عادل مجاهد (جيثب / تويتر)
نحن <3 المساهمين لدينا! شكر خاص لجميع أولئك الذين قضوا بعض الوقت في تطوير هذا المشروع، ونحن نقدر حقًا عملكم الشاق. يمكنك العثور على قائمة كاملة بهؤلاء الأشخاص هنا.
تحقق من دليل المساهمة لدينا
حقوق الطبع والنشر (ج) 2015 لأندرو نيسبيت. راجع الترخيص للحصول على التفاصيل.