Erstellen Sie mühelos Alfred -Workflows
node binär.await ..catch() manuell zu versprechen. Sie benötigen Node.js 18+ und Alfred 4 oder später mit dem kostenpflichtigen PowerPack -Upgrade.
npm install alfyWichtig: Ihr Skript wird als ESM ausgeführt.
Erstellen Sie einen neuen leeren Alfred -Workflow.
Fügen Sie einen Script Filter hinzu (klicken Sie mit der rechten Maustaste auf die Leinwand → Inputs → Script Filter ), setzen Sie Language auf /bin/bash und fügen Sie das folgende Skript hinzu:
./node_modules/.bin/run-node index.js "$1"
Wir können node nicht direkt anrufen, da GUI -Apps auf MacOS den $ path nicht erben.
TIPP: Mit dem Generator-Alfred können Sie einen
alfybasierten Workflow erstellen. In diesem Fall können Sie den Rest der Schritte überspringen, direkt zumindex.jsgehen und Ihr Ding tun.
Setzen Sie das Keyword , mit dem Sie Ihren Workflow aufrufen möchten.
Gehen Sie zu Ihrem neuen Workflow-Verzeichnis (klicken Sie in der Seitenleiste mit der rechten Maustaste auf den Workflow → Open in Finder ).
Initialisieren Sie ein Repo mit npm init .
Fügen Sie "type": "module" zu package.json hinzu.
Installieren Sie Alfy mit npm install alfy .
Erstellen Sie im Workflow -Verzeichnis eine index.js -Datei, importieren Sie alfy und machen Sie Ihr Ding.
Hier holen wir etwas JSON von einer Platzhalter -API und präsentieren dem Benutzer passende Elemente:
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 ) ; 
Einige Beispielverbrauch in freier Wildbahn: alfred-npms , alfred-emoj , alfred-ng .
Alfy verwendet Alfred-Notifier im Hintergrund, um eine Benachrichtigung anzuzeigen, wenn ein Update für Ihren Workflow verfügbar ist.

Alfy bietet die Möglichkeit, Daten entweder mit dem Fetch oder direkt über das Cache -Objekt zu zwischenstrichen.
Eine wichtige Sache zu beachten ist, dass die zwischengespeicherten Daten beim Aktualisieren Ihres Workflows automatisch ungültig werden. Dies bietet den Entwicklern die Flexibilität, die Struktur der zwischengespeicherten Daten zwischen Workflows zu ändern, ohne sich um ungültige ältere Daten Sorgen machen zu müssen.
Wenn Sie alfy-init als postinstall und alfy-cleanup als preuninstall -Skript hinzufügen, können Sie Ihr Paket an NPM anstelle von Packal veröffentlichen. Auf diese Weise sind Ihre Pakete nur ein einfacher Befehl npm install entfernt.
{
"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" : " * "
}
}Tipp: Präfix Ihren Workflow mit
alfred-, um sie durch NPM einfach durchsuchbar zu machen.
Sie können diese Eigenschaften aus Ihrer info.plist -Datei entfernen, da sie zum Installationszeit automatisch hinzugefügt werden.
Nachdem Sie Ihren Workflow an NPM veröffentlicht haben, können Ihre Benutzer den Workflow einfach installieren oder aktualisieren.
npm install --global alfred-unicornTipp: Anstatt jeden Workflow selbst manuell zu aktualisieren, verwenden Sie den Alfred-Updater-Workflow, um dies für Sie zu tun.
Workflows können leicht mit Alfy-Test getestet werden. Hier ist ein kleines Beispiel.
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'
}
] ) ;
} ) ; Bei der Entwicklung Ihres Workflows kann es nützlich sein, ihn zu debuggen, wenn etwas nicht funktioniert. Dies ist der Zeitpunkt, an dem der Workflow -Debugger nützlich ist. Sie finden es in Ihrer Workflow -Ansicht in Alfred. Drücken Sie das Insektensymbol, um es zu öffnen. Es zeigt Ihnen die einfache Textausgabe von alfy.output() und alles, was Sie bei alfy.log() anmelden:
import alfy from 'alfy' ;
const unicorn = getUnicorn ( ) ;
alfy . log ( unicorn ) ; Mit Alfred können Benutzer Umgebungsvariablen für einen Workflow festlegen, der dann von diesem Workflow verwendet werden kann. Dies kann nützlich sein, wenn Sie beispielsweise den Benutzer benötigen, um ein API -Token für einen Dienst anzugeben. Sie können auf die Workflow -Umgebungsvariablen von process.env zugreifen. Zum Beispiel process.env.apiToken .
Typ: string
Eingabe von Alfred. Was der Benutzer im Eingabefeld geschrieben hat.
Return Output an Alfred.
Typ: object[]
Liste des object mit einem der unterstützten Eigenschaften.
Beispiel:
import alfy from 'alfy' ;
alfy . output ( [
{
title : 'Unicorn'
} ,
{
title : 'Rainbow'
}
] ) ; Typ: object
Typ: number (Sekunden)
Werte: 0.1...5.0
Ein Skript kann nach einem Intervall automatisch neu geführt werden. Das Skript wird nur erneut ausgeführt, wenn der Skriptfilter noch aktiv ist und der Benutzer den Status des Filters nicht geändert hat, indem ein Wiederholungsverlauf eingeben und ausgelöst wird. Weitere Informationen.
Zum Beispiel könnte es verwendet werden, um den Fortschritt einer bestimmten Aufgabe zu aktualisieren:
import alfy from 'alfy' ;
alfy . output (
[
{
title : 'Downloading Unicorns…' ,
subtitle : ` ${ progress } %` ,
}
] ,
{
// Re-run and update progress every 3 seconds.
rerunInterval : 3
}
) ; 
value für den Alfred Workflow -Debugger.
Gibt einen string[] von Elementen in list zurück, in denen der Fall-insitiv input enthält.
import alfy from 'alfy' ;
alfy . matches ( 'Corn' , [ 'foo' , 'unicorn' ] ) ;
//=> ['unicorn'] Typ: string
Text, der mit den list übereinstimmt.
Typ: string[]
Liste, gegen die er abgestimmt ist.
Typ: string | Function
Standardmäßig stimmt es mit den list überein.
Geben Sie eine Zeichenfolge an, die mit einer Objekteigenschaft übereinstimmt:
import alfy from 'alfy' ;
const list = [
{
title : 'foo'
} ,
{
title : 'unicorn'
}
] ;
alfy . matches ( 'Unicorn' , list , 'title' ) ;
//=> [{title: 'unicorn'}]Oder verschachteltes Eigentum:
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'}}]Geben Sie eine Funktion an, um die Übereinstimmung selbst zu verarbeiten. Die Funktion empfängt das Listenelement und die Eingabe, die beide als Argumente niedriger sind, und es wird erwartet, dass sie einen Booleschen, ob sie übereinstimmt:
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'] Gleich wie matches() , aber mit alfy.input als input .
Wenn Sie mit mehreren Elementen übereinstimmen möchten, müssen Sie Ihre eigene Matching -Funktion definieren (wie hier gezeigt). Erweitern wir das Beispiel von Anfang an, um nach einem Schlüsselwort zu suchen, das entweder innerhalb des title oder in body oder beides angezeigt wird.
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 ) ; Zeigen Sie eine Fehler- oder Fehlermeldung in Alfred an.
Hinweis: Sie müssen keine Versprechen auf .catch() Ebene. Alfy verarbeitet das für Sie.
Typ: Error | string
Fehler- oder Fehlermeldung zu angezeigt werden.

Gibt ein Promise zurück, das den Körper der Reaktion zurückgibt.
Typ: string
URL zum Abrufen.
Typ: object
Eine der got und die folgenden Optionen.
Typ: boolean
Standard: true
Analysieren Sie die Reaktionsbehörde mit JSON.parse und setzen Sie accept Header für application/json an.
Typ: number
Anzahl der Millisekunden Diese Anfrage sollte zwischengespeichert werden.
Typ: boolean
Standard: true
Ob Sie nur mit Körper oder einer vollständigen Antwort auflösen sollen.
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'
}
}
*/ Typ: Function
Verwandeln Sie den Reaktionskörper, bevor er zwischengespeichert wird.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
transform : body => {
body . foo = 'bar' ;
return body ;
}
} )Transformieren die Antwort.
import alfy from 'alfy' ;
await alfy . fetch ( 'https://api.foo.com' , {
resolveBodyOnly : false ,
transform : response => {
response . body . foo = 'bar' ;
return response ;
}
} )Sie können auch ein Versprechen zurückgeben.
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 )
} ) Typ: object
Persist -Konfigurationsdaten.
Exportiert eine conf -Instanz mit dem richtigen Konfigurationsweg.
Beispiel:
import alfy from 'alfy' ;
alfy . config . set ( 'unicorn' , '?' ) ;
alfy . config . get ( 'unicorn' ) ;
//=> '?' Typ: Map
Exportiert eine Karte mit der Benutzer -Workflow -Konfiguration. Mit einer Workflow -Konfiguration können Ihre Benutzer Konfigurationsinformationen für den Workflow bereitstellen. Wenn Sie beispielsweise einen GitHub -Workflow entwickeln, können Sie Ihre Benutzer ihre eigenen API -Token zur Verfügung stellen.
Weitere Informationen finden Sie unter alfred-config .
Beispiel:
import alfy from 'alfy' ;
alfy . userConfig . get ( 'apiKey' ) ;
//=> '16811cad1b8547478b3e53eae2e0f083' Typ: object
Prosist Cache -Daten.
Exportiert eine modifizierte conf -Instanz mit dem richtigen Cache -Pfadsatz.
Beispiel:
import alfy from 'alfy' ;
alfy . cache . set ( 'unicorn' , '?' ) ;
alfy . cache . get ( 'unicorn' ) ;
//=> '?' Die set Methode dieser Instanz akzeptiert ein optionales drittes Argument, bei dem Sie eine maxAge -Option angeben können. maxAge ist die Anzahl der Millisekunden. Der Wert ist im Cache gültig.
Beispiel:
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 Typ: boolean
Ob der Benutzer derzeit den Workflow -Debugger geöffnet hat.
Typ: object
Schlüssel: 'info' | 'warning' | 'error' | 'alert' | 'like' | 'delete'
Erhalten Sie verschiedene Standardsystemsymbole.
Die nützlichsten sind als Schlüssel enthalten. Der Rest können Sie mit icon.get() bekommen. Gehen Sie in Finder zu /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources in Finder.
Beispiel:
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' Typ: object
Beispiel:
{
name : 'Emoj' ,
version : '0.2.5' ,
uid : 'user.workflow.B0AC54EC-601C-479A-9428-01F9FD732959' ,
bundleId : 'com.sindresorhus.emoj'
} Typ: object
Alfred Metadaten.
Beispiel: '3.0.2'
Finden Sie heraus, in welcher Version der Benutzer derzeit ausgeführt wird. Dies kann nützlich sein, wenn Ihr Workflow von den Funktionen einer bestimmten Alfred -Version abhängt.
Beispiel: 'alfred.theme.yosemite'
Aktuelles Thema verwendet.
Beispiel: 'rgba(255,255,255,0.98)'
Wenn Sie im laufenden Fliegen Symbole erstellen, können Sie die Farbe des Themenhintergrunds herausfinden.
Beispiel: 'rgba(255,255,255,0.98)'
Die Farbe des ausgewählten Ergebniss.
Beispiel: 3
Finden Sie heraus, welchen Subtextmodus der Benutzer in den Erscheinungseinstellungen ausgewählt hat.
Usability -Hinweis: Dies ist verfügbar, sodass Entwickler den Ergebnistext basierend auf dem ausgewählten Modus des Benutzers optimieren können. Der Ergebnistext eines Workflows sollte jedoch basierend auf diesem Grund nicht unnötig aufgebläht werden, da der Hauptgrund, warum Benutzer im Allgemeinen den Subtext ausblenden, darin besteht, Alfred sauberer aussehen zu lassen.
Beispiel: '/Users/sindresorhus/Library/Application Support/Alfred/Workflow Data/com.sindresorhus.npms'
Empfohlener Ort für nichtflüchtige Daten. Verwenden Sie einfach alfy.data , der diesen Weg verwendet.
Beispiel: '/Users/sindresorhus/Library/Caches/com.runningwithcrayons.Alfred/Workflow Data/com.sindresorhus.npms'
Empfohlener Ort für volatile Daten. Verwenden Sie einfach alfy.cache , der diesen Pfad verwendet.
Beispiel: '/Users/sindresorhus/Dropbox/Alfred/Alfred.alfredpreferences'
Dies ist der Ort der Alfred.alfredpreferences . Wenn ein Benutzer seine Einstellungen synchronisiert hat, können Sie herausfinden, wo sich seine Einstellungen unabhängig vom Synchronisierungszustand befinden.
Beispiel: 'adbd4f66bc3ae8493832af61a41ee609b20d8705'
Nicht synchronisierte lokale Präferenzen werden in Alfred.alfredpreferences unter …/preferences/local/${preferencesLocalHash}/ gespeichert.
Alfred -Workflows mit Alfy