0.0.2 • Published 5 months ago
raycast-effect v0.0.2
Raycast Effect
This library allows you to create Raycast Extensions using Effect.
Getting Started
- Follow the "Create your first extension" guide
- Convert to a module (because I don't know how to properly package Typescript
packages, plz help).
- Add
"type": "module",
to yourpackage.json
- Change
module
tonode16
intsconfig.json
- Add
"moduleResolution": "node16",
intsconfig.json
- Add
Create a
./src/lib/Runtime.ts
file:import { NodeContext, NodeHttpClient } from "@effect/platform-node"; import { Layer, ManagedRuntime } from "effect"; import Raycast from "raycast-effect"; // Compose your runtime here by adding services with Layer.merge export const Runtime = ManagedRuntime.make( pipe(Raycast.layer, Layer.merge(NodeContext.layer), Layer.merge(NodeHttpClient.layer)), ); export const effectCommand = Raycast.command(Runtime); export const effectView = Raycast.view(Runtime); export const useEffectFn = Raycast.use(Runtime);
Creating Views
import { Effect } from 'effect'
import { effectView, useEffectFn } from './lib/Runtime.js'
import { LaunchProps, Arguments, Detail } from '@raycast/api'
export default effectView(
Effect.fn(
function* (params: LaunchProps<{ arguments: Arguments.ViewCommand }>) {
// define a callback
const callback = useEffectFn(
Effect.fn(function* (/* define some arguments */) {
// do some stuff
},
// Catch callback errors here with Effect.catchTag
)
)
// return a view here
return <Detail />
},
// Catch errors here with Effect.catchTag
)
)
Creating Commands
import { Toast } from "@raycast/api";
import { effectCommand } from "./lib/Runtime.js";
import { Effect } from "effect";
import Raycast from "raycast-effect";
export default effectCommand(
Effect.fn(
function* () {
const now = new Date();
yield* Raycast.Clipboard.copy(now.toLocaleDateString());
yield* Raycast.Feedback.showHUD("Copied date to clipboard");
},
Effect.catchTag("@raycast/ClipboardError", (e) =>
Raycast.Feedback.showToast({
title: "Something went wrong...",
message: e.message,
style: Toast.Style.Failure,
}),
),
),
);