アルフレッドワークフローを簡単に作成します
nodeバイナリを見つけます。await 。.catch()トップレベルの約束をする必要はありません。 Node.js 18+およびAlfred 4以降は、有料のPowerPackアップグレードを使用する必要があります。
npm install alfy重要:スクリプトはESMとして実行されます。
新しい空白のアルフレッドワークフローを作成します。
Script Filterを追加します(キャンバス→ Inputs → Script Filterを右クリックします)、 /bin/bashにLanguageを設定し、次のスクリプトを追加します。
./node_modules/.bin/run-node index.js "$1"
MacOSのGUIアプリが$パスを継承しないため、 nodeを直接呼び出すことはできません。
ヒント:ジェネレーター - アルフレッドを使用して、
alfyベースのワークフローを足場にします。その場合、残りの手順をスキップし、index.jsに直接移動して、自分のことをすることができます。
ワークフローを呼び出すKeywordを設定します。
新しいワークフローディレクトリに移動します(サイドバーのワークフローを右クリック→ Open in Finder )。
npm initでレポを初期化します。
"type": "module"をpackage.jsonに追加します。
npm install 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は、フェッチまたはキャッシュオブジェクトを直接使用して、キャッシュデータの可能性を提供します。
注意すべき重要なことは、ワークフローを更新すると、キャッシュされたデータが自動的に無効になることです。これにより、開発者が無効な古いデータを心配することなく、ワークフロー間でキャッシュされたデータの構造を変更できる柔軟性を提供します。
alfy-init postinstallとして追加し、 alfy-cleanup preuninstallスクリプトとして追加することにより、PackalではなくNPMにパッケージを公開できます。これにより、パッケージは1つの単純な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
アルフレッドからの入力。ユーザーが入力ボックスに書いたもの。
Alfredに出力を返します。
タイプ: 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 。
Case-Insensitiveにinputが含まれるlist内のアイテムのstring[]を返します。
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()と同じですが、 inputとしてalfy.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
JSON.parseとセットを使用した応答本体を解析し、 application/jsonにヘッダーaccept 。
タイプ: 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を提供できるオプションの3番目の引数を受け入れます。 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に移動して、すべてを確認してください。
例:
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
ユーザーが外観の設定で選択したサブテキストモードを見つけてください。
ユーザビリティ注:これは、開発者がユーザーの選択モードに基づいて結果テキストを調整できるように利用可能ですが、ユーザーが一般的にサブテキストを非表示にする主な理由は、これに基づいてワークフローの結果テキストを不必要に肥大化するべきではありません。
例: '/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'
非同期のローカル設定は…/preferences/local/${preferencesLocalHash}/ Alfred.alfredpreferencesの下に保存されます。
アルフィーを使用したアルフレッドワークフロー