Buat Alfred Workflows dengan mudah
node .await tingkat atas..catch() janji tingkat atas. Anda memerlukan node.js 18+ dan Alfred 4 atau lebih baru dengan upgrade PowerPack berbayar.
npm install alfyPenting: Skrip Anda akan dijalankan sebagai ESM.
Buat alur kerja Alfred kosong baru.
Tambahkan Script Filter (klik kanan kanvas → Inputs → Script Filter ), atur Language ke /bin/bash , dan tambahkan skrip berikut:
./node_modules/.bin/run-node index.js "$1"
Kami tidak dapat memanggil node secara langsung karena aplikasi GUI di macOS tidak mewarisi $ path.
Kiat: Anda dapat menggunakan Generator-Alfred untuk perancah alur kerja berbasis
alfy. Jika demikian, Anda dapat melewatkan sisa langkah, langsung keindex.jsdan lakukan pekerjaan Anda.
Atur Keyword yang Anda inginkan untuk memohon alur kerja Anda.
Buka direktori alur kerja baru Anda (klik kanan pada alur kerja di bilah sisi → Open in Finder ).
Inisialisasi repo dengan npm init .
Tambahkan "type": "module" ke package.json.
Instal ALFY dengan npm install alfy .
Di direktori alur kerja, buat file index.js , impor alfy , dan lakukan hal Anda.
Di sini kami mengambil beberapa JSON dari API placeholder dan menyajikan item yang cocok untuk pengguna:
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 ) ; 
Beberapa contoh penggunaan di alam liar: alfred-npms , alfred-emoj , alfred-ng .
Alfy menggunakan Alfred-Notifier di latar belakang untuk menunjukkan pemberitahuan ketika pembaruan untuk alur kerja Anda tersedia.

Alfy menawarkan kemungkinan caching data, baik dengan pengambilan atau langsung melalui objek cache.
Suatu hal yang penting untuk dicatat adalah bahwa data yang di -cache menjadi tidak valid secara otomatis ketika Anda memperbarui alur kerja Anda. Ini menawarkan fleksibilitas bagi pengembang untuk mengubah struktur data yang di -cache antara alur kerja tanpa harus khawatir tentang data yang lebih lama tidak valid.
Dengan menambahkan alfy-init sebagai postinstall dan alfy-cleanup sebagai skrip preuninstall , Anda dapat menerbitkan paket Anda ke NPM alih-alih untuk paket. Dengan cara ini, paket Anda hanya satu perintah npm install sederhana.
{
"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" : " * "
}
}Kiat: Presentasikan alur kerja Anda dengan
alfred-untuk membuatnya mudah dicari melalui NPM.
Anda dapat menghapus properti ini dari file info.plist Anda saat ditambahkan secara otomatis pada waktu instalasi.
Setelah menerbitkan alur kerja Anda ke NPM, pengguna Anda dapat dengan mudah menginstal atau memperbarui alur kerja.
npm install --global alfred-unicornKiat: Alih-alih memperbarui sendiri secara manual setiap alur kerja, gunakan Alfred-updater Workflow untuk melakukannya untuk Anda.
Alur kerja dapat dengan mudah diuji dengan alfy-test. Ini contoh kecil.
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'
}
] ) ;
} ) ; Saat mengembangkan alur kerja Anda, dapat bermanfaat untuk dapat men -debug ketika sesuatu tidak berfungsi. Inilah saat debugger alur kerja sangat berguna. Anda dapat menemukannya dalam tampilan alur kerja Anda di Alfred. Tekan ikon serangga untuk membukanya. Ini akan menunjukkan kepada Anda output teks biasa dari alfy.output() dan apa pun yang Anda log dengan alfy.log() :
import alfy from 'alfy' ;
const unicorn = getUnicorn ( ) ;
alfy . log ( unicorn ) ; Alfred memungkinkan pengguna mengatur variabel lingkungan untuk alur kerja yang kemudian dapat digunakan oleh alur kerja itu. Ini bisa berguna jika Anda, misalnya, membutuhkan pengguna untuk menentukan token API untuk suatu layanan. Anda dapat mengakses variabel lingkungan alur kerja dari process.env . Misalnya process.env.apiToken .
Ketik: string
Masukan dari Alfred. Apa yang ditulis pengguna di kotak input.
Output kembali ke Alfred.
Jenis: object[]
Daftar object dengan salah satu properti yang didukung.
Contoh:
import alfy from 'alfy' ;
alfy . output ( [
{
title : 'Unicorn'
} ,
{
title : 'Rainbow'
}
] ) ; Jenis: object
Jenis: number (detik)
Nilai: 0.1...5.0
Skrip dapat diatur untuk menjalankan kembali secara otomatis setelah beberapa interval. Script hanya akan dijalankan kembali jika filter skrip masih aktif dan pengguna belum mengubah status filter dengan mengetik dan memicu ulang. Info lebih lanjut.
Misalnya, ini dapat digunakan untuk memperbarui kemajuan tugas tertentu:
import alfy from 'alfy' ;
alfy . output (
[
{
title : 'Downloading Unicorns…' ,
subtitle : ` ${ progress } %` ,
}
] ,
{
// Re-run and update progress every 3 seconds.
rerunInterval : 3
}
) ; 
value log ke Alfred Workflow Debugger.
Mengembalikan string[] item dalam list yang tidak sensitif berisi input .
import alfy from 'alfy' ;
alfy . matches ( 'Corn' , [ 'foo' , 'unicorn' ] ) ;
//=> ['unicorn'] Ketik: string
Teks yang cocok dengan item list .
Jenis: string[]
Daftar yang akan dicocokkan dengan.
Jenis: string | Function
Secara default, itu akan cocok dengan item list .
Tentukan string yang cocok dengan properti objek:
import alfy from 'alfy' ;
const list = [
{
title : 'foo'
} ,
{
title : 'unicorn'
}
] ;
alfy . matches ( 'Unicorn' , list , 'title' ) ;
//=> [{title: 'unicorn'}]Atau properti bersarang:
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'}}]Tentukan fungsi untuk menangani sendiri yang cocok. Fungsi menerima item daftar dan input, keduanya lebih rendah, sebagai argumen, dan diharapkan untuk mengembalikan boolean apakah itu cocok:
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'] Sama seperti matches() , tetapi dengan alfy.input sebagai input .
Jika Anda ingin mencocokkan dengan beberapa item, Anda harus menentukan fungsi pencocokan Anda sendiri (seperti yang ditunjukkan di sini). Mari kita perluas contoh dari awal untuk mencari kata kunci yang muncul dalam title atau properti body atau keduanya.
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 ) ; Tampilkan pesan kesalahan atau kesalahan di Alfred.
Catatan: Anda tidak perlu .catch() janji tingkat atas. Alfy menangani itu untukmu.
Jenis: Error | string
Pesan kesalahan atau kesalahan yang akan ditampilkan.

Mengembalikan Promise yang mengembalikan tubuh respons.
Ketik: string
URL untuk mengambil.
Jenis: object
Salah satu opsi got dan opsi di bawah ini.
Jenis: boolean
Default: true
Badan respons parse dengan JSON.parse dan atur header accept ke application/json .
Jenis: number
Jumlah milidetik permintaan ini harus di -cache.
Jenis: boolean
Default: true
Apakah akan menyelesaikan dengan hanya tubuh atau respons penuh.
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'
}
}
*/ Jenis: Function
Ubah badan respons sebelum di -cache.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
transform : body => {
body . foo = 'bar' ;
return body ;
}
} )Mengubah respons.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
resolveBodyOnly : false ,
transform : response => {
response . body . foo = 'bar' ;
return response ;
}
} )Anda juga dapat mengembalikan janji.
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 )
} ) Jenis: object
Data konfigurasi bertahan.
Mengekspor instance conf dengan set jalur konfigurasi yang benar.
Contoh:
import alfy from 'alfy' ;
alfy . config . set ( 'unicorn' , '?' ) ;
alfy . config . get ( 'unicorn' ) ;
//=> '?' Jenis: Map
Mengekspor peta dengan konfigurasi alur kerja pengguna. Konfigurasi alur kerja memungkinkan pengguna Anda untuk memberikan informasi konfigurasi untuk alur kerja. Misalnya, jika Anda mengembangkan alur kerja GitHub, Anda dapat membiarkan pengguna Anda menyediakan token API mereka sendiri.
Lihat alfred-config untuk lebih jelasnya.
Contoh:
import alfy from 'alfy' ;
alfy . userConfig . get ( 'apiKey' ) ;
//=> '16811cad1b8547478b3e53eae2e0f083' Jenis: object
Bertahan data cache.
Ekspor contoh conf yang dimodifikasi dengan set jalur cache yang benar.
Contoh:
import alfy from 'alfy' ;
alfy . cache . set ( 'unicorn' , '?' ) ;
alfy . cache . get ( 'unicorn' ) ;
//=> '?' Metode set dari instance ini menerima argumen ketiga opsional di mana Anda dapat memberikan opsi maxAge . maxAge adalah jumlah milidetik nilainya valid dalam cache.
Contoh:
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 Jenis: boolean
Apakah pengguna saat ini memiliki debugger alur kerja terbuka.
Jenis: object
Kunci: 'info' | 'warning' | 'error' | 'alert' | 'like' | 'delete'
Dapatkan berbagai ikon sistem default.
Yang paling berguna dimasukkan sebagai kunci. Sisanya bisa Anda dapatkan dengan icon.get() . Pergi ke /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources in Finder untuk melihat semuanya.
Contoh:
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' Jenis: object
Contoh:
{
name : 'Emoj' ,
version : '0.2.5' ,
uid : 'user.workflow.B0AC54EC-601C-479A-9428-01F9FD732959' ,
bundleId : 'com.sindresorhus.emoj'
} Jenis: object
Alfred Metadata.
Contoh: '3.0.2'
Cari tahu versi mana yang sedang dijalankan pengguna. Ini mungkin berguna jika alur kerja Anda tergantung pada fitur versi Alfred tertentu.
Contoh: 'alfred.theme.yosemite'
Tema saat ini digunakan.
Contoh: 'rgba(255,255,255,0.98)'
Jika Anda membuat ikon dengan cepat, ini memungkinkan Anda untuk mengetahui warna latar belakang tema.
Contoh: 'rgba(255,255,255,0.98)'
Warna hasil yang dipilih.
Contoh: 3
Cari tahu mode subteks apa yang telah dipilih pengguna dalam preferensi penampilan.
Catatan Kegunaan: Ini tersedia sehingga pengembang dapat mengubah teks hasil berdasarkan mode yang dipilih pengguna, tetapi teks hasil alur kerja tidak boleh membengkak secara tidak perlu berdasarkan ini, karena alasan utama pengguna umumnya menyembunyikan subteks adalah membuat Alfred terlihat lebih bersih.
Contoh: '/Users/sindresorhus/Library/Application Support/Alfred/Workflow Data/com.sindresorhus.npms'
Lokasi yang disarankan untuk data non-volatile. Cukup gunakan alfy.data yang menggunakan jalur ini.
Contoh: '/Users/sindresorhus/Library/Caches/com.runningwithcrayons.Alfred/Workflow Data/com.sindresorhus.npms'
Lokasi yang disarankan untuk data yang mudah menguap. Cukup gunakan alfy.cache yang menggunakan jalur ini.
Contoh: '/Users/sindresorhus/Dropbox/Alfred/Alfred.alfredpreferences'
Ini adalah lokasi Alfred.alfredpreferences . Jika pengguna telah menyinkronkan pengaturan mereka, ini akan memungkinkan Anda untuk mengetahui di mana pengaturan mereka terlepas dari keadaan sinkronisasi.
Contoh: 'adbd4f66bc3ae8493832af61a41ee609b20d8705'
Preferensi lokal yang tidak disinkronkan disimpan dalam Alfred.alfredpreferences di bawah …/preferences/local/${preferencesLocalHash}/ .
Alfred Workflows Menggunakan Alfy