@grom.js/effect-tg 0.9.0 → 0.10.0

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 CHANGED
@@ -83,15 +83,22 @@ This design enables:
83
83
  ```ts
84
84
  import { FetchHttpClient } from '@effect/platform'
85
85
  import { BotApi, BotApiTransport, BotApiUrl } from '@grom.js/effect-tg'
86
- import { Effect, Layer } from 'effect'
86
+ import { Config, Effect, Layer } from 'effect'
87
87
 
88
+ // Use a shortcut to construct BotApi
89
+ const BotApiLive = Layer.provide(
90
+ BotApi.layerConfig({ token: Config.redacted('BOT_TOKEN') }),
91
+ FetchHttpClient.layer
92
+ )
93
+
94
+ // Or provide all layers manually
88
95
  const BotApiLive = BotApi.layer.pipe(
89
96
  Layer.provide(BotApiTransport.layer),
90
97
  Layer.provide(
91
- Layer.succeed(
98
+ Layer.effect(
92
99
  BotApiUrl.BotApiUrl,
93
- BotApiUrl.makeProd('YOUR_BOT_TOKEN')
94
- )
100
+ Effect.map(Config.string('BOT_API_TOKEN'), BotApiUrl.makeProd)
101
+ ),
95
102
  ),
96
103
  Layer.provide(FetchHttpClient.layer),
97
104
  )
package/dist/BotApi.d.ts CHANGED
@@ -1,8 +1,12 @@
1
+ import type * as Config from 'effect/Config';
2
+ import type * as ConfigError from 'effect/ConfigError';
1
3
  import type * as BotApiError from './BotApiError.ts';
2
4
  import type { MethodParams, MethodResults, BotApi as Service, Types } from './internal/botApi.gen.ts';
5
+ import * as HttpClient from '@effect/platform/HttpClient';
3
6
  import * as Context from 'effect/Context';
4
7
  import * as Effect from 'effect/Effect';
5
8
  import * as Layer from 'effect/Layer';
9
+ import * as Redacted from 'effect/Redacted';
6
10
  import * as BotApiTransport from './BotApiTransport.ts';
7
11
  export type { MethodParams, MethodResults, Service, Types };
8
12
  declare const BotApi_base: Context.TagClass<BotApi, "@grom.js/effect-tg/BotApi", Service>;
@@ -17,4 +21,32 @@ export declare const make: (args: {
17
21
  }) => Service;
18
22
  export declare const layer: Layer.Layer<BotApi, never, BotApiTransport.BotApiTransport>;
19
23
  type MethodArgs<TMethod extends keyof MethodParams> = void extends MethodParams[TMethod] ? [params?: MethodParams[TMethod]] : [params: MethodParams[TMethod]];
24
+ /**
25
+ * Constructs a `BotApi` layer from the given configuration.
26
+ */
27
+ export declare const layerConfig: (options: {
28
+ /**
29
+ * Bot API token from [@BotFather](https://t.me/BotFather).
30
+ */
31
+ readonly token: Config.Config<Redacted.Redacted>;
32
+ /**
33
+ * Target Bot API environment:
34
+ *
35
+ * - `prod` — production environment
36
+ * - `test` — [test environment](https://core.telegram.org/bots/features#dedicated-test-environment)
37
+ *
38
+ * @default 'prod'
39
+ */
40
+ readonly environment?: "prod" | "test";
41
+ /**
42
+ * A function to transform the underlying `BotApiTransport` before
43
+ * it's used to call Bot API methods.
44
+ *
45
+ * Useful for:
46
+ * - Adding custom middleware (logging, metrics, caching)
47
+ * - Adding custom retry logic or error handling
48
+ * - Integrating with monitoring or debugging tools
49
+ */
50
+ readonly transformTransport?: (transport: BotApiTransport.Service) => BotApiTransport.Service;
51
+ }) => Layer.Layer<BotApi, ConfigError.ConfigError, HttpClient.HttpClient>;
20
52
  //# sourceMappingURL=BotApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApi.d.ts","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,WAAW,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,MAAM,IAAI,OAAO,EACjB,KAAK,EACN,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAGvD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;;AAE3D,qBAAa,MAAO,SAAQ,WAGzB;CAAG;AAEN,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,MAAM,YAAY;IAC9D,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAC3C,aAAa,CAAC,OAAO,CAAC,EACtB,WAAW,CAAC,WAAW,EACvB,KAAK,CACN,CAAA;CACF;AAED,eAAO,MAAM,UAAU,EAAE,CAAC,OAAO,SAAS,MAAM,YAAY,EAC1D,MAAM,EAAE,OAAO,EACf,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,KACzB,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,OAAO,CAAC,EACtB,WAAW,CAAC,WAAW,EACvB,MAAM,CAMA,CAAA;AAER,eAAO,MAAM,IAAI,EAAE,CAAC,IAAI,EAAE;IACxB,SAAS,EAAE,eAAe,CAAC,OAAO,CAAA;CACnC,KAAK,OAAuB,CAAA;AAE7B,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,MAAM,EACN,KAAK,EACL,eAAe,CAAC,eAAe,CAOhC,CAAA;AAED,KAAK,UAAU,CAAC,OAAO,SAAS,MAAM,YAAY,IAChD,IAAI,SAAS,YAAY,CAAC,OAAO,CAAC,GAC9B,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,GAChC,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"BotApi.d.ts","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,WAAW,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,KAAK,WAAW,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,MAAM,IAAI,OAAO,EACjB,KAAK,EACN,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAIvD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;;AAE3D,qBAAa,MAAO,SAAQ,WAGzB;CAAG;AAEN,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,MAAM,YAAY;IAC9D,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAC3C,aAAa,CAAC,OAAO,CAAC,EACtB,WAAW,CAAC,WAAW,EACvB,KAAK,CACN,CAAA;CACF;AAED,eAAO,MAAM,UAAU,EAAE,CAAC,OAAO,SAAS,MAAM,YAAY,EAC1D,MAAM,EAAE,OAAO,EACf,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,KACzB,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,OAAO,CAAC,EACtB,WAAW,CAAC,WAAW,EACvB,MAAM,CAMA,CAAA;AAER,eAAO,MAAM,IAAI,EAAE,CAAC,IAAI,EAAE;IACxB,SAAS,EAAE,eAAe,CAAC,OAAO,CAAA;CACnC,KAAK,OAAuB,CAAA;AAE7B,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,MAAM,EACN,KAAK,EACL,eAAe,CAAC,eAAe,CAOhC,CAAA;AAED,KAAK,UAAU,CAAC,OAAO,SAAS,MAAM,YAAY,IAChD,IAAI,SAAS,YAAY,CAAC,OAAO,CAAC,GAC9B,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,GAChC,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;AAErC;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS;IACnC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAEhD;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAEtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO,CAAA;CAC9F,KAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAyBrE,CAAA"}
package/dist/BotApi.js CHANGED
@@ -1,11 +1,27 @@
1
+ import * as HttpClient from '@effect/platform/HttpClient';
1
2
  import * as Context from 'effect/Context';
2
3
  import * as Effect from 'effect/Effect';
4
+ import * as Function from 'effect/Function';
3
5
  import * as Layer from 'effect/Layer';
6
+ import * as Redacted from 'effect/Redacted';
4
7
  import * as BotApiTransport from "./BotApiTransport.js";
8
+ import * as BotApiUrl from "./BotApiUrl.js";
5
9
  import * as internal from "./internal/botApi.js";
6
10
  export class BotApi extends Context.Tag('@grom.js/effect-tg/BotApi')() {
7
11
  }
8
12
  export const callMethod = (method, params = undefined) => BotApi.pipe(Effect.flatMap(api => api[method](params)));
9
13
  export const make = internal.make;
10
14
  export const layer = Layer.effect(BotApi, Effect.andThen(BotApiTransport.BotApiTransport, transport => internal.make({ transport })));
15
+ /**
16
+ * Constructs a `BotApi` layer from the given configuration.
17
+ */
18
+ export const layerConfig = (options) => {
19
+ const { token, environment = 'prod', transformTransport, } = options;
20
+ return Layer.provide(layer, Layer.effect(BotApiTransport.BotApiTransport, Effect.all([
21
+ HttpClient.HttpClient,
22
+ token.pipe(Effect.map(token => (environment === 'prod'
23
+ ? BotApiUrl.makeProd(Redacted.value(token))
24
+ : BotApiUrl.makeTest(Redacted.value(token))))),
25
+ ]).pipe(Effect.map(([httpClient, botApiUrl]) => BotApiTransport.make({ httpClient, botApiUrl })), Effect.map(transformTransport ?? Function.identity))));
26
+ };
11
27
  //# sourceMappingURL=BotApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApi.js","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAIhD,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAGjE;CAAG;AAUN,MAAM,CAAC,MAAM,UAAU,GAOnB,CACF,MAAc,EACd,SAAkB,SAAS,EAC3B,EAAE,CAAC,MAAM,CAAC,IAAI,CACd,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,GAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAC7C,CAAA;AAER,MAAM,CAAC,MAAM,IAAI,GAED,QAAQ,CAAC,IAAI,CAAA;AAE7B,MAAM,CAAC,MAAM,KAAK,GAId,KAAK,CAAC,MAAM,CACd,MAAM,EACN,MAAM,CAAC,OAAO,CACZ,eAAe,CAAC,eAAe,EAC/B,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAC1C,CACF,CAAA"}
1
+ {"version":3,"file":"BotApi.js","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAIhD,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAGjE;CAAG;AAUN,MAAM,CAAC,MAAM,UAAU,GAOnB,CACF,MAAc,EACd,SAAkB,SAAS,EAC3B,EAAE,CAAC,MAAM,CAAC,IAAI,CACd,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,GAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAC7C,CAAA;AAER,MAAM,CAAC,MAAM,IAAI,GAED,QAAQ,CAAC,IAAI,CAAA;AAE7B,MAAM,CAAC,MAAM,KAAK,GAId,KAAK,CAAC,MAAM,CACd,MAAM,EACN,MAAM,CAAC,OAAO,CACZ,eAAe,CAAC,eAAe,EAC/B,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAC1C,CACF,CAAA;AAOD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OA0B3B,EAAuE,EAAE;IACxE,MAAM,EACJ,KAAK,EACL,WAAW,GAAG,MAAM,EACpB,kBAAkB,GACnB,GAAG,OAAO,CAAA;IACX,OAAO,KAAK,CAAC,OAAO,CAClB,KAAK,EACL,KAAK,CAAC,MAAM,CACV,eAAe,CAAC,eAAe,EAC/B,MAAM,CAAC,GAAG,CAAC;QACT,UAAU,CAAC,UAAU;QACrB,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAClB,WAAW,KAAK,MAAM;YACpB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAC9C,CAAC,CACH;KACF,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,EACxF,MAAM,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,CACpD,CACF,CACF,CAAA;AACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@grom.js/effect-tg",
3
3
  "type": "module",
4
- "version": "0.9.0",
4
+ "version": "0.10.0",
5
5
  "description": "Effectful library for crafting Telegram bots.",
6
6
  "author": {
7
7
  "name": "Vladislav Deryabkin",
package/src/BotApi.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type * as Config from 'effect/Config'
2
+ import type * as ConfigError from 'effect/ConfigError'
1
3
  import type * as BotApiError from './BotApiError.ts'
2
4
  import type {
3
5
  MethodParams,
@@ -5,10 +7,14 @@ import type {
5
7
  BotApi as Service,
6
8
  Types,
7
9
  } from './internal/botApi.gen.ts'
10
+ import * as HttpClient from '@effect/platform/HttpClient'
8
11
  import * as Context from 'effect/Context'
9
12
  import * as Effect from 'effect/Effect'
13
+ import * as Function from 'effect/Function'
10
14
  import * as Layer from 'effect/Layer'
15
+ import * as Redacted from 'effect/Redacted'
11
16
  import * as BotApiTransport from './BotApiTransport.ts'
17
+ import * as BotApiUrl from './BotApiUrl.ts'
12
18
  import * as internal from './internal/botApi.ts'
13
19
 
14
20
  export type { MethodParams, MethodResults, Service, Types }
@@ -60,3 +66,59 @@ type MethodArgs<TMethod extends keyof MethodParams> =
60
66
  void extends MethodParams[TMethod]
61
67
  ? [params?: MethodParams[TMethod]]
62
68
  : [params: MethodParams[TMethod]]
69
+
70
+ /**
71
+ * Constructs a `BotApi` layer from the given configuration.
72
+ */
73
+ export const layerConfig = (options: {
74
+ /**
75
+ * Bot API token from [@BotFather](https://t.me/BotFather).
76
+ */
77
+ readonly token: Config.Config<Redacted.Redacted>
78
+
79
+ /**
80
+ * Target Bot API environment:
81
+ *
82
+ * - `prod` — production environment
83
+ * - `test` — [test environment](https://core.telegram.org/bots/features#dedicated-test-environment)
84
+ *
85
+ * @default 'prod'
86
+ */
87
+ readonly environment?: 'prod' | 'test'
88
+
89
+ /**
90
+ * A function to transform the underlying `BotApiTransport` before
91
+ * it's used to call Bot API methods.
92
+ *
93
+ * Useful for:
94
+ * - Adding custom middleware (logging, metrics, caching)
95
+ * - Adding custom retry logic or error handling
96
+ * - Integrating with monitoring or debugging tools
97
+ */
98
+ readonly transformTransport?: (transport: BotApiTransport.Service) => BotApiTransport.Service
99
+ }): Layer.Layer<BotApi, ConfigError.ConfigError, HttpClient.HttpClient> => {
100
+ const {
101
+ token,
102
+ environment = 'prod',
103
+ transformTransport,
104
+ } = options
105
+ return Layer.provide(
106
+ layer,
107
+ Layer.effect(
108
+ BotApiTransport.BotApiTransport,
109
+ Effect.all([
110
+ HttpClient.HttpClient,
111
+ token.pipe(
112
+ Effect.map(token => (
113
+ environment === 'prod'
114
+ ? BotApiUrl.makeProd(Redacted.value(token))
115
+ : BotApiUrl.makeTest(Redacted.value(token))
116
+ )),
117
+ ),
118
+ ]).pipe(
119
+ Effect.map(([httpClient, botApiUrl]) => BotApiTransport.make({ httpClient, botApiUrl })),
120
+ Effect.map(transformTransport ?? Function.identity),
121
+ ),
122
+ ),
123
+ )
124
+ }