@distilled.cloud/fly-io 0.2.5-alpha2 → 0.3.0-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # @distilled.cloud/fly-io
2
+
3
+ Effect-native Fly.io SDK generated from the [Fly.io OpenAPI specification](https://docs.machines.dev). Manage apps, machines, volumes, secrets, certificates, and more with exhaustive error typing.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @distilled.cloud/fly-io effect
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { Effect, Layer } from "effect";
15
+ import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
16
+ import { AppsList } from "@distilled.cloud/fly-io/Operations";
17
+ import { CredentialsFromEnv } from "@distilled.cloud/fly-io";
18
+
19
+ const program = Effect.gen(function* () {
20
+ const apps = yield* AppsList({ org_slug: "my-org" });
21
+ return apps;
22
+ });
23
+
24
+ const FlyLive = Layer.mergeAll(FetchHttpClient.layer, CredentialsFromEnv);
25
+
26
+ program.pipe(Effect.provide(FlyLive), Effect.runPromise);
27
+ ```
28
+
29
+ ## Configuration
30
+
31
+ Set the following environment variable:
32
+
33
+ ```bash
34
+ FLY_IO_API_KEY=your-api-token
35
+ ```
36
+
37
+ Create a personal access token with `flyctl tokens create` or in the [Fly.io dashboard](https://fly.io/dashboard/) under **Account > Access Tokens**. For deploy tokens scoped to a single app, use `flyctl tokens create deploy`.
38
+
39
+ ## Error Handling
40
+
41
+ ```typescript
42
+ import { AppsShow } from "@distilled.cloud/fly-io/Operations";
43
+
44
+ AppsShow({ app_name: "missing-app" }).pipe(
45
+ Effect.catchTags({
46
+ NotFound: () => Effect.succeed(null),
47
+ UnknownFlyIoError: (e) => Effect.fail(new Error(`Unknown: ${e.message}`)),
48
+ }),
49
+ );
50
+ ```
51
+
52
+ ## Services
53
+
54
+ Key operation areas include:
55
+
56
+ - **Apps** -- list, create, show, delete, deploy tokens
57
+ - **Machines** -- full lifecycle (create, start, stop, suspend, restart, signal, exec, wait), plus metadata, leases, memory management, events, and versions
58
+ - **Volumes** -- create, list, update, delete, extend, snapshots
59
+ - **Secrets** -- create, list, get, delete, update
60
+ - **Secret Keys** -- generate, encrypt, decrypt, sign, verify (KMS)
61
+ - **Certificates** -- ACME and custom TLS certificates
62
+ - **IP Assignments** -- allocate and release IP addresses
63
+ - **Tokens** -- OIDC and KMS token requests
64
+ - **Platform** -- regions and placement queries
65
+
66
+ ## License
67
+
68
+ MIT
package/lib/client.d.ts CHANGED
@@ -1,10 +1,3 @@
1
- /**
2
- * Fly-io API Client.
3
- *
4
- * Wraps the shared REST client from sdk-core with Fly-io-specific
5
- * error matching and credential handling.
6
- */
7
- import * as Effect from "effect/Effect";
8
1
  import * as Schema from "effect/Schema";
9
2
  export { UnknownFlyIoError } from "./errors.ts";
10
3
  /**
@@ -12,6 +5,6 @@ export { UnknownFlyIoError } from "./errors.ts";
12
5
  */
13
6
  export declare const API: {
14
7
  make: <I extends Schema.Top, O extends Schema.Top, const E extends readonly import("@distilled.cloud/core/client").ApiErrorClass[] = readonly []>(configFn: () => import("@distilled.cloud/core/client").OperationConfig<I, O, E>) => any;
15
- makePaginated: <I extends Schema.Top, O extends Schema.Top, const E extends readonly import("@distilled.cloud/core/client").ApiErrorClass[] = readonly []>(configFn: () => import("@distilled.cloud/core/client").PaginatedOperationConfig<I, O, E>, paginateFn?: ((baseFn: (input: any) => Effect.Effect<any, any, any>, input: any, pagination: import("@distilled.cloud/core/pagination").PaginatedTrait) => import("effect/Stream").Stream<any, any, any>) | undefined) => any;
8
+ makePaginated: <I extends Schema.Top, O extends Schema.Top, const E extends readonly import("@distilled.cloud/core/client").ApiErrorClass[] = readonly []>(configFn: () => import("@distilled.cloud/core/client").PaginatedOperationConfig<I, O, E>, paginateFn?: import("@distilled.cloud/core/pagination").PaginationStrategy | undefined) => any;
16
9
  };
17
10
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AASxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAkChD;;GAEG;AACH,eAAO,MAAM,GAAG;;;CAQd,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AASxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAkChD;;GAEG;AACH,eAAO,MAAM,GAAG;;;CAQd,CAAC"}
package/lib/client.js CHANGED
@@ -5,6 +5,7 @@
5
5
  * error matching and credential handling.
6
6
  */
7
7
  import * as Effect from "effect/Effect";
8
+ import * as Redacted from "effect/Redacted";
8
9
  import * as Schema from "effect/Schema";
9
10
  import { makeAPI } from "@distilled.cloud/core/client";
10
11
  import { HTTP_STATUS_MAP, UnknownFlyIoError, FlyIoParseError, } from "./errors.js";
@@ -43,7 +44,7 @@ export const API = makeAPI({
43
44
  credentials: Credentials,
44
45
  getBaseUrl: (creds) => creds.apiBaseUrl,
45
46
  getAuthHeaders: (creds) => ({
46
- Authorization: `Bearer ${creds.apiKey}`,
47
+ Authorization: `Bearer ${Redacted.value(creds.apiKey)}`,
47
48
  }),
48
49
  matchError,
49
50
  ParseError: FlyIoParseError,
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,wCAAwC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,4BAA4B;AAC5B,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,MAAc,EACd,SAAkB,EACa,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,UAAU,GAAI,eAAuB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,iBAAiB,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,SAAS;SAChB,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC;IACzB,WAAW,EAAE,WAAkB;IAC/B,UAAU,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC5C,cAAc,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;QAC/B,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,EAAE;KACxC,CAAC;IACF,UAAU;IACV,UAAU,EAAE,eAAsB;CACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,wCAAwC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,4BAA4B;AAC5B,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,MAAc,EACd,SAAkB,EACa,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,UAAU,GAAI,eAAuB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,iBAAiB,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,SAAS;SAChB,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC;IACzB,WAAW,EAAE,WAAkB;IAC/B,UAAU,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC5C,cAAc,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;QAC/B,aAAa,EAAE,UAAU,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KACxD,CAAC;IACF,UAAU;IACV,UAAU,EAAE,eAAsB;CACnC,CAAC,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import * as Layer from "effect/Layer";
2
+ import * as Redacted from "effect/Redacted";
2
3
  import * as ServiceMap from "effect/ServiceMap";
3
4
  import { ConfigError } from "@distilled.cloud/core/errors";
4
5
  export declare const DEFAULT_API_BASE_URL = "https://api.fly-io.com";
5
6
  export interface Config {
6
- readonly apiKey: string;
7
+ readonly apiKey: Redacted.Redacted<string>;
7
8
  readonly apiBaseUrl: string;
8
9
  }
9
10
  declare const Credentials_base: ServiceMap.ServiceClass<Credentials, "Fly-ioCredentials", Config>;
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAE7D,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;;AAED,qBAAa,WAAY,SAAQ,gBAEhC;CAAG;AAEJ,eAAO,MAAM,kBAAkB,8CAa9B,CAAC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAE7D,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;;AAED,qBAAa,WAAY,SAAQ,gBAEhC;CAAG;AAEJ,eAAO,MAAM,kBAAkB,8CAa9B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import * as Effect from "effect/Effect";
2
2
  import * as Layer from "effect/Layer";
3
+ import * as Redacted from "effect/Redacted";
3
4
  import * as ServiceMap from "effect/ServiceMap";
4
5
  import { ConfigError } from "@distilled.cloud/core/errors";
5
6
  export const DEFAULT_API_BASE_URL = "https://api.fly-io.com";
@@ -12,6 +13,6 @@ export const CredentialsFromEnv = Layer.effect(Credentials, Effect.gen(function*
12
13
  message: "FLY_IO_API_KEY environment variable is required",
13
14
  });
14
15
  }
15
- return { apiKey, apiBaseUrl: DEFAULT_API_BASE_URL };
16
+ return { apiKey: Redacted.make(apiKey), apiBaseUrl: DEFAULT_API_BASE_URL };
16
17
  }));
17
18
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAO7D,MAAM,OAAO,WAAY,SAAQ,UAAU,CAAC,OAAO,EAAuB,CACxE,mBAAmB,CACpB;CAAG;AAEJ,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,WAAW,EACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC;YAC5B,OAAO,EAAE,iDAAiD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;AACtD,CAAC,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAO7D,MAAM,OAAO,WAAY,SAAQ,UAAU,CAAC,OAAO,EAAuB,CACxE,mBAAmB,CACpB;CAAG;AAEJ,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,WAAW,EACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC;YAC5B,OAAO,EAAE,iDAAiD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;AAC7E,CAAC,CAAC,CACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@distilled.cloud/fly-io",
3
- "version": "0.2.5-alpha2",
3
+ "version": "0.3.0-alpha",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/alchemy-run/distilled",
@@ -73,7 +73,7 @@
73
73
  "specs:update": "git -C specs/distilled-spec-fly-io fetch && git -C specs/distilled-spec-fly-io checkout main && git -C specs/distilled-spec-fly-io pull"
74
74
  },
75
75
  "dependencies": {
76
- "@distilled.cloud/core": "0.2.5-alpha2",
76
+ "@distilled.cloud/core": "0.3.0-alpha",
77
77
  "effect": "4.0.0-beta.30"
78
78
  },
79
79
  "devDependencies": {
package/src/client.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  * error matching and credential handling.
6
6
  */
7
7
  import * as Effect from "effect/Effect";
8
+ import * as Redacted from "effect/Redacted";
8
9
  import * as Schema from "effect/Schema";
9
10
  import { makeAPI } from "@distilled.cloud/core/client";
10
11
  import {
@@ -55,7 +56,7 @@ export const API = makeAPI({
55
56
  credentials: Credentials as any,
56
57
  getBaseUrl: (creds: any) => creds.apiBaseUrl,
57
58
  getAuthHeaders: (creds: any) => ({
58
- Authorization: `Bearer ${creds.apiKey}`,
59
+ Authorization: `Bearer ${Redacted.value(creds.apiKey)}`,
59
60
  }),
60
61
  matchError,
61
62
  ParseError: FlyIoParseError as any,
@@ -1,12 +1,13 @@
1
1
  import * as Effect from "effect/Effect";
2
2
  import * as Layer from "effect/Layer";
3
+ import * as Redacted from "effect/Redacted";
3
4
  import * as ServiceMap from "effect/ServiceMap";
4
5
  import { ConfigError } from "@distilled.cloud/core/errors";
5
6
 
6
7
  export const DEFAULT_API_BASE_URL = "https://api.fly-io.com";
7
8
 
8
9
  export interface Config {
9
- readonly apiKey: string;
10
+ readonly apiKey: Redacted.Redacted<string>;
10
11
  readonly apiBaseUrl: string;
11
12
  }
12
13
 
@@ -25,6 +26,6 @@ export const CredentialsFromEnv = Layer.effect(
25
26
  });
26
27
  }
27
28
 
28
- return { apiKey, apiBaseUrl: DEFAULT_API_BASE_URL };
29
+ return { apiKey: Redacted.make(apiKey), apiBaseUrl: DEFAULT_API_BASE_URL };
29
30
  }),
30
31
  );