สร้างเวิร์กโฟลว์อัลเฟรดได้อย่างง่ายดาย
node ไบนารีawait ระดับบนสุด.catch() ตามสัญญาระดับสูงสุดด้วยตนเอง คุณต้องการ Node.js 18+ และ Alfred 4 หรือหลังจากนั้นด้วยการอัพเกรด Powerpack แบบชำระเงิน
npm install alfyสำคัญ: สคริปต์ของคุณจะทำงานเป็น ESM
สร้างเวิร์กโฟลว์อัลเฟรดว่างเปล่าใหม่
เพิ่ม Script Filter (คลิกขวาที่ Canvas → Inputs → Script Filter ) ตั้งค่า Language เป็น /bin/bash และเพิ่มสคริปต์ต่อไปนี้:
./node_modules/.bin/run-node index.js "$1"
เราไม่สามารถโทรหา node ได้โดยตรงเนื่องจากแอพ GUI บน 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 จาก API ตัวยึดและนำเสนอรายการที่จับคู่กับผู้ใช้:
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เคล็ดลับ: แทนที่จะอัปเดตเวิร์กโฟลว์ทุกครั้งด้วยตนเองให้ใช้เวิร์กโฟลว์อัลเฟรดอัพเดทเพื่อทำสิ่งนั้นเพื่อคุณ
เวิร์กโฟลว์สามารถทดสอบได้อย่างง่ายดายด้วยการทดสอบ 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 ) ; อัลเฟรดให้ผู้ใช้ตั้งค่าตัวแปรสภาพแวดล้อมสำหรับเวิร์กโฟลว์ซึ่งสามารถใช้งานได้โดยเวิร์กโฟลว์นั้น สิ่งนี้จะมีประโยชน์หากคุณต้องการผู้ใช้เพื่อระบุโทเค็น 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 บันทึกไปยังตัวดีบักเวิร์กโฟลว์อัลเฟรด
ส่งคืน 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 ) ; แสดงข้อผิดพลาดหรือข้อความแสดงข้อผิดพลาดในอัลเฟรด
หมายเหตุ: คุณไม่จำเป็นต้อง .catch() สัญญาระดับบนสุด Alfy จัดการสิ่งนั้นให้คุณ
ประเภท: Error | string
ข้อผิดพลาดหรือข้อความแสดงข้อผิดพลาดที่จะแสดง

ส่งคืน Promise ที่ส่งคืนร่างของการตอบสนอง
ประเภท: string
URL เพื่อดึงข้อมูล
ประเภท: object
ตัวเลือก got ใด ๆ และตัวเลือกด้านล่าง
ประเภท: boolean
ค่าเริ่มต้น: true
แยกวิเคราะห์การตอบสนองด้วย 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.theme.yosemite'
ธีมปัจจุบันใช้
ตัวอย่าง: 'rgba(255,255,255,0.98)'
หากคุณกำลังสร้างไอคอนได้ทันทีสิ่งนี้จะช่วยให้คุณสามารถค้นหาสีของพื้นหลังธีมได้
ตัวอย่าง: 'rgba(255,255,255,0.98)'
สีของผลลัพธ์ที่เลือก
ตัวอย่าง: 3
ค้นหาโหมดย่อยที่ผู้ใช้เลือกในการตั้งค่าลักษณะที่ปรากฏ
หมายเหตุการใช้งาน: สิ่งนี้มีอยู่เพื่อให้นักพัฒนาสามารถปรับแต่งข้อความผลลัพธ์ตามโหมดที่เลือกของผู้ใช้ แต่ข้อความผลลัพธ์ของเวิร์กโฟลว์ไม่ควรถูกป่องโดยไม่จำเป็นเนื่องจากเหตุผลหลักที่ผู้ใช้มักจะซ่อนข้อความย่อยคือทำให้อัลเฟรดดูสะอาดขึ้น
ตัวอย่าง: '/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