قم بإنشاء سير عمل Alfred بسهولة
node الثنائية.await ..catch() على المستوى الأعلى. تحتاج إلى Node.js 18+ و Alfred 4 أو في وقت لاحق مع ترقية PowerPack المدفوعة.
npm install alfyهام: سيتم تشغيل البرنامج النصي الخاص بك كـ ESM.
إنشاء سير عمل فارغة جديدة ألفريد.
أضف Script Filter (انقر بزر الماوس الأيمن فوق القماش → Inputs → Script Filter ) ، وضبط Language على /bin/bash ، وأضف البرنامج النصي التالي:
./node_modules/.bin/run-node index.js "$1"
لا يمكننا استدعاء node مباشرة لأن تطبيقات واجهة المستخدم الرسومية على MacOS لا ترث مسار $.
نصيحة: يمكنك استخدام Generator-Alfred لسقوط سير عمل قائم على
alfy. إذا كان الأمر كذلك ، فيمكنك تخطي بقية الخطوات ، انتقل مباشرة إلىindex.jsوفعل الشيء الخاص بك.
اضبط Keyword التي تريد من خلالها استدعاء سير العمل الخاص بك.
انتقل إلى دليل سير العمل الجديد الخاص بك (انقر بزر الماوس الأيمن على سير العمل في الشريط الجانبي → Open in Finder ).
تهيئة repo مع npm init .
أضف "type": "module" إلى package.json.
تثبيت alfy مع npm install alfy .
في دليل سير العمل ، قم بإنشاء ملف index.js ، واستيراد alfy ، وقم بعملك.
هنا نأتي ببعض JSON من واجهة برمجة تطبيقات العنصر الوطني ونقدم العناصر المطابقة للمستخدم:
import alfy from 'alfy' ;
const data = await alfy . fetch ( 'https://jsonplaceholder.typicode.com/posts' ) ;
const items = alfy
. inputMatches ( data , 'title' )
. map ( element => ( {
title : element . title ,
subtitle : element . body ,
arg : element . id
} ) ) ;
alfy . output ( items ) ; 
بعض الأمثلة على الاستخدام في البرية: alfred-npms ، alfred-emoj ، alfred-ng .
يستخدم Alfy Alfred-Notifier في الخلفية لإظهار إشعار عند توفر تحديث لسير العمل الخاص بك.

يوفر Alfy إمكانية تخزين بيانات التخزين المؤقت ، إما مع الجلب أو مباشرة من خلال كائن ذاكرة التخزين المؤقت.
الشيء المهم الذي يجب ملاحظته هو أن البيانات المخزنة مؤقتًا يتم إبطالها تلقائيًا عند تحديث سير العمل الخاص بك. يوفر هذا المرونة للمطورين لتغيير بنية البيانات المخزنة مؤقتًا بين مهام سير العمل دون الحاجة إلى القلق بشأن البيانات القديمة غير صالحة.
من خلال إضافة alfy-init باعتباره postinstall و alfy-cleanup كنص preuninstall ، يمكنك نشر الحزمة الخاصة بك إلى NPM بدلاً من Packal. وبهذه الطريقة ، فإن حزمك ليست سوى أمر npm install واحد فقط.
{
"name" : " alfred-unicorn " ,
"version" : " 1.0.0 " ,
"description" : " My awesome unicorn workflow " ,
"author" : {
"name" : " Sindre Sorhus " ,
"email" : " [email protected] " ,
"url" : " https://sindresorhus.com "
},
"scripts" : {
"postinstall" : " alfy-init " ,
"preuninstall" : " alfy-cleanup "
},
"dependencies" : {
"alfy" : " * "
}
}نصيحة: بادئة سير العمل الخاص بك مع
alfred-لجعلها سهلة للبحث من خلال NPM.
يمكنك إزالة هذه الخصائص من ملف info.plist الخاص بك حيث يتم إضافتها تلقائيًا في وقت التثبيت.
بعد نشر سير العمل الخاص بك إلى NPM ، يمكن للمستخدمين بسهولة تثبيت سير العمل أو تحديثه.
npm install --global alfred-unicornنصيحة: بدلاً من تحديث كل سير عمل بنفسك يدويًا ، استخدم سير عمل Alfred-Updater للقيام بذلك نيابة عنك.
يمكن بسهولة اختبار مهام سير العمل باستخدام اختبار Alfy. هنا مثال صغير.
import test from 'ava' ;
import alfyTest from 'alfy-test' ;
test ( 'main' , async t => {
const alfy = alfyTest ( ) ;
const result = await alfy ( 'workflow input' ) ;
t . deepEqual ( result , [
{
title : 'foo' ,
subtitle : 'bar'
}
] ) ;
} ) ; عند تطوير سير العمل الخاص بك ، قد يكون من المفيد أن تكون قادرًا على تصحيحه عندما لا يعمل شيء ما. هذا هو عندما يكون تصحيح تصحيح سير العمل في متناول يدي. يمكنك العثور عليه في عرض سير العمل الخاص بك في ألفريد. اضغط على أيقونة الحشرات لفتحه. سيظهر لك إخراج النص العادي لـ alfy.output() وأي شيء تقوم بتسجيله مع alfy.log() :
import alfy from 'alfy' ;
const unicorn = getUnicorn ( ) ;
alfy . log ( unicorn ) ; يتيح Alfred للمستخدمين تعيين متغيرات البيئة لسير عمل يمكن استخدامه بعد ذلك بواسطة سير العمل هذا. يمكن أن يكون هذا مفيدًا إذا كنت بحاجة إلى المستخدم لتحديد رمز API للخدمة. يمكنك الوصول إلى متغيرات بيئة سير العمل من process.env . على سبيل المثال process.env.apiToken .
اكتب: string
مدخلات من ألفريد. ما كتبه المستخدم في مربع الإدخال.
إرجاع الإرجاع إلى ألفريد.
النوع: object[]
قائمة object مع أي من الخصائص المدعومة.
مثال:
import alfy from 'alfy' ;
alfy . output ( [
{
title : 'Unicorn'
} ,
{
title : 'Rainbow'
}
] ) ; النوع: object
النوع: number (ثواني)
القيم: 0.1...5.0
يمكن تعيين برنامج نصي لإعادة تشغيله تلقائيًا بعد بعض الفاصل الزمني. سيتم إعادة تشغيل البرنامج النصي فقط إذا كان مرشح البرنامج النصي لا يزال نشطًا ولم يغير المستخدم حالة المرشح عن طريق كتابة وإعادة تشغيل إعادة التشغيل. مزيد من المعلومات.
على سبيل المثال ، يمكن استخدامه لتحديث تقدم مهمة معينة:
import alfy from 'alfy' ;
alfy . output (
[
{
title : 'Downloading Unicorns…' ,
subtitle : ` ${ progress } %` ,
}
] ,
{
// Re-run and update progress every 3 seconds.
rerunInterval : 3
}
) ; 
تسجيل value لتصحيح أخطاء سير العمل Alfred.
إرجاع string[] من العناصر الموجودة في list التي تحتوي على حالة تعريض input .
import alfy from 'alfy' ;
alfy . matches ( 'Corn' , [ 'foo' , 'unicorn' ] ) ;
//=> ['unicorn'] اكتب: string
نص لتطابق مع عناصر list .
اكتب: string[]
قائمة لتكون مطابقة ضد.
النوع: string | Function
بشكل افتراضي ، سوف يتطابق مع عناصر list .
حدد سلسلة لتتناسب مع خاصية كائن:
import alfy from 'alfy' ;
const list = [
{
title : 'foo'
} ,
{
title : 'unicorn'
}
] ;
alfy . matches ( 'Unicorn' , list , 'title' ) ;
//=> [{title: 'unicorn'}]أو الممتلكات المتداخلة:
import alfy from 'alfy' ;
const list = [
{
name : {
first : 'John' ,
last : 'Doe'
}
} ,
{
name : {
first : 'Sindre' ,
last : 'Sorhus'
}
}
] ;
alfy . matches ( 'sindre' , list , 'name.first' ) ;
//=> [{name: {first: 'Sindre', last: 'Sorhus'}}]حدد وظيفة للتعامل مع المطابقة بنفسك. تستقبل الوظيفة عنصر القائمة والإدخال ، كلاهما منخفض ، كوسائط ، ومن المتوقع أن يعيد منطقية ما إذا كان يتطابق:
import alfy from 'alfy' ;
const list = [ 'foo' , 'unicorn' ] ;
// Here we do an exact match.
// `Foo` matches the item since it's lowercased for you.
alfy . matches ( 'Foo' , list , ( item , input ) => item === input ) ;
//=> ['foo'] مثل matches() ، ولكن مع alfy.input input .
إذا كنت ترغب في المطابقة مع عناصر متعددة ، فيجب عليك تحديد وظيفة المطابقة الخاصة بك (كما هو موضح هنا). دعنا نوسع المثال من البداية للبحث عن كلمة رئيسية تظهر إما داخل title أو خاصية body أو كليهما.
import alfy from 'alfy' ;
const data = await alfy . fetch ( 'https://jsonplaceholder.typicode.com/posts' ) ;
const items = alfy
. inputMatches (
data ,
( item , input ) =>
item . title ?. toLowerCase ( ) . includes ( input ) ||
item . body ?. toLowerCase ( ) . includes ( input )
)
. map ( ( element ) => ( {
title : element . title ,
subtitle : element . body ,
arg : element . id ,
} ) ) ;
alfy . output ( items ) ; عرض خطأ أو رسالة خطأ في Alfred.
ملاحظة: لا تحتاج إلى .catch() وعود المستوى الأعلى. ألفي يتعامل مع ذلك لك.
النوع: Error | string
خطأ أو رسالة خطأ ليتم عرضها.

يعيد Promise الذي يعيد جسم الاستجابة.
اكتب: string
عنوان URL لجلب.
النوع: object
أي من خيارات got والخيارات أدناه.
النوع: boolean
الافتراضي: true
BARSE RESSEPTRY BOTH مع JSON.parse ومجموعة accept الرأس application/json .
النوع: number
عدد المللي ثانية يجب أن يكون هذا الطلب مخبأة.
النوع: boolean
الافتراضي: true
سواء كنت يجب حل مع الجسم فقط أو استجابة كاملة.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' ) ;
//=> {foo: 'bar'}
await alfy . fetch ( 'https://api.foo.com' , {
resolveBodyOnly : false
} ) ;
/*
{
body: {
foo: 'bar'
},
headers: {
'content-type': 'application/json'
}
}
*/ النوع: Function
تحويل جسم الاستجابة قبل أن يتم تخزينه مؤقتًا.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
transform : body => {
body . foo = 'bar' ;
return body ;
}
} )تحويل الاستجابة.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
resolveBodyOnly : false ,
transform : response => {
response . body . foo = 'bar' ;
return response ;
}
} )يمكنك أيضا إعادة الوعد.
import alfy from 'alfy' ;
import xml2js from 'xml2js' ;
import pify from 'pify' ;
const parseString = pify ( xml2js . parseString ) ;
await alfy . fetch ( 'https://api.foo.com' , {
transform : body => parseString ( body )
} ) النوع: object
استمر بيانات التكوين.
يصدر مثيل conf مع مجموعة مسار التكوين الصحيح.
مثال:
import alfy from 'alfy' ;
alfy . config . set ( 'unicorn' , '?' ) ;
alfy . config . get ( 'unicorn' ) ;
//=> '?' النوع: Map
يصدر خريطة مع تكوين سير عمل المستخدم. يتيح تكوين سير العمل للمستخدمين توفير معلومات التكوين لسير العمل. على سبيل المثال ، إذا كنت تقوم بتطوير سير عمل GitHub ، فيمكنك السماح للمستخدمين بتقديم رموز API الخاصة بهم.
انظر alfred-config لمزيد من التفاصيل.
مثال:
import alfy from 'alfy' ;
alfy . userConfig . get ( 'apiKey' ) ;
//=> '16811cad1b8547478b3e53eae2e0f083' النوع: object
استمر بيانات ذاكرة التخزين المؤقت.
يصدر مثيل conf المعدل مع مجموعة مسار ذاكرة التخزين المؤقت الصحيح.
مثال:
import alfy from 'alfy' ;
alfy . cache . set ( 'unicorn' , '?' ) ;
alfy . cache . get ( 'unicorn' ) ;
//=> '?' تقبل طريقة set لهذا المثيل وسيطة ثالثة اختيارية حيث يمكنك توفير خيار maxAge . maxAge هو عدد المللي ثانية ، القيمة صالحة في ذاكرة التخزين المؤقت.
مثال:
import alfy from 'alfy' ;
import delay from 'delay' ;
alfy . cache . set ( 'foo' , 'bar' , { maxAge : 5000 } ) ;
alfy . cache . get ( 'foo' ) ;
//=> 'bar'
// Wait 5 seconds
await delay ( 5000 ) ;
alfy . cache . get ( 'foo' ) ;
//=> undefined النوع: boolean
ما إذا كان المستخدم حاليًا لديه تصحيح سير العمل المفتوح.
النوع: object
المفاتيح: 'info' | 'warning' | 'error' | 'alert' | 'like' | 'delete'
احصل على أيقونات النظام الافتراضية المختلفة.
يتم تضمين أكثرها فائدة كمفاتيح. الباقي يمكنك الحصول عليه مع icon.get() . انتقل إلى /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources في Finder لرؤيتها جميعًا.
مثال:
import alfy from 'alfy' ;
console . log ( alfy . icon . error ) ;
//=> '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/AlertStopIcon.icns'
console . log ( alfy . icon . get ( 'Clock' ) ) ;
//=> '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/Clock.icns' النوع: object
مثال:
{
name : 'Emoj' ,
version : '0.2.5' ,
uid : 'user.workflow.B0AC54EC-601C-479A-9428-01F9FD732959' ,
bundleId : 'com.sindresorhus.emoj'
} النوع: object
ألفريد بيانات التعريف.
مثال: '3.0.2'
اكتشف الإصدار الذي يعمل عليه المستخدم حاليًا. قد يكون هذا مفيدًا إذا كان سير العمل الخاص بك يعتمد على ميزات إصدار Alfred معينة.
مثال: 'alfred.theme.yosemite'
الموضوع الحالي المستخدم.
مثال: 'rgba(255,255,255,0.98)'
إذا كنت تقوم بإنشاء أيقونات أثناء الطيران ، فهذا يتيح لك معرفة لون خلفية السمة.
مثال: 'rgba(255,255,255,0.98)'
لون النتيجة المحددة.
مثال: 3
تعرف على وضع النص الفرعي الذي حدده المستخدم في تفضيلات المظهر.
ملاحظة قابلية الاستخدام: هذا متاح حتى يتمكن المطورون من تعديل نص النتيجة استنادًا إلى الوضع المحدد للمستخدم ، ولكن لا ينبغي أن ينفجر نص نتيجة سير العمل بشكل غير ضروري على هذا ، لأن السبب الرئيسي وراء إخفاء المستخدمين في النص الفرعي هو جعل Alfred يبدو أنظف.
مثال: '/Users/sindresorhus/Library/Application Support/Alfred/Workflow Data/com.sindresorhus.npms'
الموقع الموصى به للبيانات غير المتطايرة. فقط استخدم alfy.data الذي يستخدم هذا المسار.
مثال: '/Users/sindresorhus/Library/Caches/com.runningwithcrayons.Alfred/Workflow Data/com.sindresorhus.npms'
الموقع الموصى به للبيانات المتقلبة. فقط استخدم alfy.cache الذي يستخدم هذا المسار.
مثال: '/Users/sindresorhus/Dropbox/Alfred/Alfred.alfredpreferences'
هذا هو موقع Alfred.alfredpreferences . إذا قام المستخدم بمزامنة إعداداته ، فسيسمح لك ذلك بمعرفة مكان إعداداته بغض النظر عن حالة المزامنة.
مثال: 'adbd4f66bc3ae8493832af61a41ee609b20d8705'
يتم تخزين التفضيلات المحلية غير المتزامنة داخل Alfred.alfredpreferences ضمن …/preferences/local/${preferencesLocalHash}/ .
سير عمل ألفريد باستخدام Alfy