Crie fluxos de trabalho Alfred com facilidade
node .await ..catch() . Você precisa de Node.js 18+ e Alfred 4 ou posterior com a atualização do PowerPack pago.
npm install alfyIMPORTANTE: Seu script será executado como ESM.
Crie um novo fluxo de trabalho em branco Alfred.
Adicione um Script Filter (clique com o botão direito do mouse na tela → Inputs → Script Filter ), defina Language como /bin/bash e adicione o seguinte script:
./node_modules/.bin/run-node index.js "$1"
Não podemos chamar node diretamente, pois os aplicativos GUI no macOS não herdam o $ PATH.
Dica: você pode usar o gerador-amaldred para andaimes em um fluxo de trabalho baseado
alfy. Nesse caso, você pode pular o restante das etapas, ir direto para oindex.jse fazer o que você gosta.
Defina a Keyword pela qual você deseja invocar seu fluxo de trabalho.
Vá para o seu novo diretório de fluxo de trabalho (clique com o botão direito do mouse no fluxo de trabalho na barra lateral → Open in Finder ).
Inicialize um repositório com npm init .
Adicione "type": "module" ao package.json.
Instale o Alfy com npm install alfy .
No diretório do fluxo de trabalho, crie um arquivo index.js , importe alfy e faça o seu problema.
Aqui, buscamos algum JSON de uma API de espaço reservado e apresentamos itens correspondentes ao usuário:
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 ) ; 
Alguns exemplos de uso na natureza: alfred-npms , alfred-emoj , alfred-ng .
A Alfy usa o Alfred-Notifier em segundo plano para mostrar uma notificação quando uma atualização para o seu fluxo de trabalho está disponível.

A Alfy oferece a possibilidade de dados de cache, com a busca ou diretamente através do objeto de cache.
Uma coisa importante a ser observada é que os dados em cache são invalidados automaticamente quando você atualiza seu fluxo de trabalho. Isso oferece a flexibilidade para os desenvolvedores alterarem a estrutura dos dados em cache entre os fluxos de trabalho sem precisar se preocupar com dados mais antigos inválidos.
Ao adicionar alfy-init como postinstall e alfy-cleanup como script preuninstall , você pode publicar seu pacote no NPM em vez de embalar. Dessa forma, seus pacotes são apenas um comando simples 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" : " * "
}
}Dica: Prefixo seu fluxo de trabalho com
alfred-para facilitar a pesquisa através do NPM.
Você pode remover essas propriedades do seu arquivo info.plist , pois elas estão sendo adicionadas automaticamente no horário de instalação.
Depois de publicar seu fluxo de trabalho no NPM, seus usuários podem instalar ou atualizar facilmente o fluxo de trabalho.
npm install --global alfred-unicornDica: em vez de atualizar manualmente cada fluxo de trabalho, use o fluxo de trabalho Alfred Updater para fazer isso por você.
Os fluxos de trabalho podem ser facilmente testados com o teste ALFY. Aqui está um pequeno exemplo.
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'
}
] ) ;
} ) ; Ao desenvolver seu fluxo de trabalho, pode ser útil poder depurar quando algo não estiver funcionando. É quando o depurador do fluxo de trabalho é útil. Você pode encontrá -lo em sua exibição de fluxo de trabalho em Alfred. Pressione o ícone do inseto para abri -lo. Ele mostrará a saída de texto sem formatação de alfy.output() e qualquer coisa que você registra com alfy.log() :
import alfy from 'alfy' ;
const unicorn = getUnicorn ( ) ;
alfy . log ( unicorn ) ; Alfred permite que os usuários defina variáveis de ambiente para um fluxo de trabalho que pode ser usado por esse fluxo de trabalho. Isso pode ser útil se você, por exemplo, precisar do usuário especificar um token da API para um serviço. Você pode acessar as variáveis de ambiente de fluxo de trabalho do process.env . Por exemplo, process.env.apiToken .
Tipo: string
Entrada de Alfred. O que o usuário escreveu na caixa de entrada.
Retornar a saída para o Alfred.
Tipo: object[]
Lista de object com qualquer uma das propriedades suportadas.
Exemplo:
import alfy from 'alfy' ;
alfy . output ( [
{
title : 'Unicorn'
} ,
{
title : 'Rainbow'
}
] ) ; Tipo: object
Tipo: number (segundos)
Valores: 0.1...5.0
Um script pode ser definido como re-executado automaticamente após algum intervalo. O script só será executado se o filtro de script ainda estiver ativo e o usuário não alterar o estado do filtro digitando e acionando uma re-execução. Mais informações.
Por exemplo, pode ser usado para atualizar o progresso de uma tarefa específica:
import alfy from 'alfy' ;
alfy . output (
[
{
title : 'Downloading Unicorns…' ,
subtitle : ` ${ progress } %` ,
}
] ,
{
// Re-run and update progress every 3 seconds.
rerunInterval : 3
}
) ; 
value log para o depurador do fluxo de trabalho Alfred.
Retorna uma string[] de itens na list que contém insensivelmente input .
import alfy from 'alfy' ;
alfy . matches ( 'Corn' , [ 'foo' , 'unicorn' ] ) ;
//=> ['unicorn'] Tipo: string
Texto para combinar com os itens list .
Tipo: string[]
Lista a ser comparada contra.
Tipo: string | Function
Por padrão, ele corresponderá aos itens list .
Especifique uma string para combinar com uma propriedade de objeto:
import alfy from 'alfy' ;
const list = [
{
title : 'foo'
} ,
{
title : 'unicorn'
}
] ;
alfy . matches ( 'Unicorn' , list , 'title' ) ;
//=> [{title: 'unicorn'}]Ou propriedade aninhada:
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'}}]Especifique uma função para lidar com a combinação de si mesmo. A função recebe o item e a entrada da lista, ambos com base mais baixa, como argumentos, e espera -se que devolva um booleano para corresponder:
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'] O mesmo que matches() , mas com alfy.input como input .
Se você deseja combinar com vários itens, deve definir sua própria função correspondente (como mostrado aqui). Vamos estender o exemplo desde o início para procurar uma palavra -chave que apareça dentro do title ou propriedade body ou de ambos.
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 ) ; Exiba uma mensagem de erro ou erro no Alfred.
Nota: você não precisa .catch() Alfy lida com isso para você.
Tipo: Error | string
Erro ou mensagem de erro a ser exibida.

Retorna uma Promise que devolve o corpo da resposta.
Tipo: string
URL para buscar.
Tipo: object
Qualquer uma das opções got e as opções abaixo.
Tipo: boolean
Padrão: true
Exceder o corpo de resposta com JSON.parse e definir o cabeçalho accept para application/json .
Tipo: number
Número de milissegundos Esta solicitação deve ser armazenada em cache.
Tipo: boolean
Padrão: true
Se deve resolver apenas com o corpo ou uma resposta completa.
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'
}
}
*/ Tipo: Function
Transforme o corpo de resposta antes de ser armazenado em cache.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
transform : body => {
body . foo = 'bar' ;
return body ;
}
} )Transforme a resposta.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
resolveBodyOnly : false ,
transform : response => {
response . body . foo = 'bar' ;
return response ;
}
} )Você também pode devolver uma promessa.
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 )
} ) Tipo: object
Persiste dados de configuração.
Exporta uma instância conf com o conjunto de caminho de configuração correto.
Exemplo:
import alfy from 'alfy' ;
alfy . config . set ( 'unicorn' , '?' ) ;
alfy . config . get ( 'unicorn' ) ;
//=> '?' Tipo: Map
Exporta um mapa com a configuração do fluxo de trabalho do usuário. Uma configuração de fluxo de trabalho permite que seus usuários forneçam informações de configuração para o fluxo de trabalho. Por exemplo, se você estiver desenvolvendo um fluxo de trabalho do GitHub, poderá permitir que seus usuários forneçam seus próprios tokens de API.
Consulte alfred-config para obter mais detalhes.
Exemplo:
import alfy from 'alfy' ;
alfy . userConfig . get ( 'apiKey' ) ;
//=> '16811cad1b8547478b3e53eae2e0f083' Tipo: object
Persiste dados de cache.
Exporta uma instância confiada conf com o conjunto de caminho de cache correto.
Exemplo:
import alfy from 'alfy' ;
alfy . cache . set ( 'unicorn' , '?' ) ;
alfy . cache . get ( 'unicorn' ) ;
//=> '?' O método set desta instância aceita um terceiro argumento opcional, onde você pode fornecer uma opção maxAge . maxAge é o número de milissegundos que o valor é válido no cache.
Exemplo:
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 Tipo: boolean
Se o usuário atualmente tem o depurador de fluxo de trabalho aberto.
Tipo: object
Chaves: 'info' | 'warning' | 'error' | 'alert' | 'like' | 'delete'
Obtenha vários ícones do sistema padrão.
Os mais úteis são incluídos como chaves. O restante que você pode obter com icon.get() . Vá para /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources no Finder para vê -los todos.
Exemplo:
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' Tipo: object
Exemplo:
{
name : 'Emoj' ,
version : '0.2.5' ,
uid : 'user.workflow.B0AC54EC-601C-479A-9428-01F9FD732959' ,
bundleId : 'com.sindresorhus.emoj'
} Tipo: object
Alfred Metadata.
Exemplo: '3.0.2'
Descubra qual versão o usuário está em execução no momento. Isso pode ser útil se o seu fluxo de trabalho depende dos recursos de uma versão alfred específica.
Exemplo: 'alfred.theme.yosemite'
Tema atual usado.
Exemplo: 'rgba(255,255,255,0.98)'
Se você está criando ícones em tempo real, isso permite descobrir a cor do fundo do tema.
Exemplo: 'rgba(255,255,255,0.98)'
A cor do resultado selecionado.
Exemplo: 3
Descubra qual modo de subtexto o usuário selecionou nas preferências de aparência.
NOTA DE USABILIDADE: Isso está disponível para que os desenvolvedores possam ajustar o texto do resultado com base no modo selecionado do usuário, mas o texto de um fluxo de trabalho não deve ser inchado desnecessariamente com base nisso, pois a principal razão pela qual os usuários geralmente ocultam o subtexto é fazer com que o Alfred pareça mais limpo.
Exemplo: '/Users/sindresorhus/Library/Application Support/Alfred/Workflow Data/com.sindresorhus.npms'
Localização recomendada para dados não voláteis. Basta usar alfy.data que usa esse caminho.
Exemplo: '/Users/sindresorhus/Library/Caches/com.runningwithcrayons.Alfred/Workflow Data/com.sindresorhus.npms'
Localização recomendada para dados voláteis. Basta usar alfy.cache , que usa esse caminho.
Exemplo: '/Users/sindresorhus/Dropbox/Alfred/Alfred.alfredpreferences'
Esta é a localização do Alfred.alfredpreferences . Se um usuário tiver sincronizar suas configurações, isso permitirá descobrir onde suas configurações são independentemente do estado de sincronização.
Exemplo: 'adbd4f66bc3ae8493832af61a41ee609b20d8705'
As preferências locais não sincronizadas são armazenadas no Alfred.alfredpreferences em …/preferences/local/${preferencesLocalHash}/ .
Alfred Work Flows usando Alfy