Создать рабочие процессы Альфреда с легкостью
node .await ..catch() Обещания верхнего уровня. Вам нужны Node.js 18+ и Alfred 4 или более поздней версии с платным обновлением PowerPack.
npm install alfyВАЖНО: Ваш сценарий будет выполнен как ESM.
Создайте новый пустой рабочий процесс Alfred.
Добавьте Script Filter (щелкните правой кнопкой мыши Canvas → Inputs → Script Filter ), установите Language в /bin/bash и добавьте следующий скрипт:
./node_modules/.bin/run-node index.js "$1"
Мы не можем позвонить в node непосредственно, так как приложения GUI на MacOS не наследуют путь $.
Совет: вы можете использовать генератор-полл-рефреда, чтобы использовать рабочий процесс на основе
alfy. Если это так, вы можете пропустить остальные шаги, перейдите прямо кindex.jsи сделайте свое дело.
Установите Keyword , с помощью которого вы хотите вызвать свой рабочий процесс.
Перейдите в свой новый каталог рабочих процессов (щелкните правой кнопкой мыши на рабочем процессе на боковой панели → Open in Finder ).
Инициализировать репо с npm init .
Добавить "type": "module" в package.json.
Установите Alfy с npm install alfy .
В каталоге рабочих процессов создайте файл index.js , импортируйте alfy и сделайте свое дело.
Здесь мы получаем несколько JSON от API -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Совет: Вместо того, чтобы вручную обновлять каждый рабочий процесс самостоятельно, используйте рабочий процесс Alfred-Updater, чтобы сделать это для вас.
Рабочие процессы могут быть легко протестированы с помощью Alfy-test. Вот небольшой пример.
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 журнала для отладчика рабочего процесса 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 ) ; Отобразить ошибку или сообщение об ошибке в Альфреда.
ПРИМЕЧАНИЕ. Вам не нужно .catch() на верхнем уровне. Альфи обрабатывает это для вас.
Тип: Error | string
Остановка ошибки или сообщения об ошибке.

Возвращает Promise , которое возвращает тело ответа.
Тип: string
URL, чтобы получить.
Тип: object
Любой из вариантов got и приведенные ниже варианты.
Тип: boolean
По умолчанию: true
Обратный орган Parse с 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
Узнайте, какой подтекст выбрал пользователь в предпочтениях появления.
Примечание для удобства использования: это доступно, чтобы разработчики могли настроить текст результата на основе выбранного режима пользователя, но текст результата рабочего процесса не должен быть раздутым без необходимости на основе этого, так как основная причина, по которой пользователи обычно скрывают подтекст, состоит в том, чтобы Альфред выглядел чище.
Пример: '/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