輕鬆創建Alfred工作流程
node二進制。await 。.catch()頂級承諾。 您需要Node.js 18+和Alfred 4或更高版本的付費PowerPack升級。
npm install alfy重要的是:您的腳本將作為ESM運行。
創建一個新的空白Alfred工作流程。
添加Script Filter (右鍵單擊帆布→ Inputs → Script Filter ),將Language設置為/bin/bash ,然後添加以下腳本:
./node_modules/.bin/run-node index.js "$1"
我們不能直接調用node ,因為MACOS上的GUI應用程序不會繼承$路徑。
提示:您可以使用Generator-Alfred來踩踏基於
alfy的工作流程。如果是這樣,您可以跳過其餘步驟,直接轉到index.js並做您的事情。
設置要調用工作流程的Keyword 。
轉到您的新工作流目錄(右鍵單擊側邊欄中的工作流→ Open in Finder )。
用npm init初始化回購。
將"type": "module"添加到package.json。
使用npm install alfy ALFY。
在工作流目錄中,創建一個index.js文件,導入alfy ,然後做您的事情。
在這裡,我們從占位符API中獲取一些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提供了緩存數據的可能性,無論是以fetch而直接通過緩存對象。
要注意的一個重要的事情是,當您更新工作流程時,緩存的數據會自動無效。這為開發人員提供了更改工作流程之間緩存數據的結構的靈活性,而不必擔心無效的舊數據。
通過將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'
}
] ) ;
} ) ; 開發工作流程時,在某些東西不起作用時能夠調試它可能會很有用。這是工作流調試器派上用場的時候。您可以在Alfred的工作流視圖中找到它。按下昆蟲圖標打開它。它將向您顯示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
}
) ; 
對Alfred Workflow調試器的日誌value 。
返回list中的項目的string[]該案例不敏感地包含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()頂級承諾。 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 in 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的Alfred工作流程