dfx 0.126.1 → 1.0.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.
Files changed (342) hide show
  1. package/.babel.cjs.json +11 -0
  2. package/.babel.mjs.json +10 -0
  3. package/.envrc +1 -0
  4. package/.gitmodules +3 -0
  5. package/.husky/pre-commit +2 -0
  6. package/.oxlintrc.json +72 -0
  7. package/.prettierignore +0 -0
  8. package/.prettierrc.json +5 -0
  9. package/.tool-versions +1 -0
  10. package/.vscode/debug.cjs +8 -0
  11. package/.vscode/launch.json +23 -0
  12. package/.vscode/settings.json +29 -0
  13. package/.vscode/tasks.json +44 -0
  14. package/AGENTS.md +15 -0
  15. package/CHANGELOG.md +1554 -0
  16. package/examples/.env.example +5 -0
  17. package/examples/interactions.ts +79 -0
  18. package/examples/readme.ts +56 -0
  19. package/examples/registry.ts +66 -0
  20. package/flake.lock +27 -0
  21. package/flake.nix +21 -0
  22. package/lerna.json +12 -0
  23. package/package.json +79 -36
  24. package/pnpm-workspace.yaml +7 -0
  25. package/scripts/generate-client.sh +10 -0
  26. package/scripts/worktree-setup.sh +8 -0
  27. package/src/Cache/memory.ts +5 -5
  28. package/src/Cache/memoryTTL.ts +11 -7
  29. package/src/Cache/prelude.ts +10 -8
  30. package/src/Cache.ts +31 -35
  31. package/src/DiscordConfig.ts +12 -16
  32. package/src/DiscordGateway/DiscordWS.ts +58 -32
  33. package/src/DiscordGateway/Messaging.ts +13 -15
  34. package/src/DiscordGateway/Shard/StateStore.ts +30 -25
  35. package/src/DiscordGateway/Shard/heartbeats.ts +25 -28
  36. package/src/DiscordGateway/Shard/identify.ts +11 -6
  37. package/src/DiscordGateway/Shard/sendEvents.ts +1 -1
  38. package/src/DiscordGateway/Shard/utils.ts +1 -1
  39. package/src/DiscordGateway/Shard.ts +39 -35
  40. package/src/DiscordGateway/ShardStore.ts +6 -7
  41. package/src/DiscordGateway/Sharder.ts +31 -29
  42. package/src/DiscordGateway.ts +15 -14
  43. package/src/DiscordREST/Generated.ts +660 -341
  44. package/src/DiscordREST/utils.ts +6 -3
  45. package/src/DiscordREST.ts +37 -41
  46. package/src/Helpers/flags.ts +10 -5
  47. package/src/Helpers/intents.ts +2 -2
  48. package/src/Helpers/interactions.ts +16 -14
  49. package/src/Helpers/members.ts +3 -3
  50. package/src/Helpers/permissions.ts +5 -5
  51. package/src/Helpers/ui.ts +16 -16
  52. package/src/Interactions/builder.ts +10 -10
  53. package/src/Interactions/commandHelper.ts +18 -29
  54. package/src/Interactions/context.ts +51 -65
  55. package/src/Interactions/definitions.ts +3 -3
  56. package/src/Interactions/gateway.ts +33 -45
  57. package/src/Interactions/handlers.ts +8 -5
  58. package/src/Interactions/index.ts +5 -5
  59. package/src/Interactions/utils.ts +6 -6
  60. package/src/Interactions/webhook.ts +31 -38
  61. package/src/RateLimit/memory.ts +3 -3
  62. package/src/RateLimit.ts +18 -15
  63. package/src/gateway.ts +21 -21
  64. package/src/index.ts +17 -17
  65. package/src/types.ts +18 -16
  66. package/src/utils/Effect.ts +38 -27
  67. package/src/webhooks.ts +7 -7
  68. package/test/index.test.ts +5 -0
  69. package/tsconfig.base.json +12 -6
  70. package/tsconfig.examples.json +0 -1
  71. package/vitest.config.ts +22 -0
  72. package/Cache/driver.d.ts +0 -24
  73. package/Cache/driver.d.ts.map +0 -1
  74. package/Cache/driver.js +0 -11
  75. package/Cache/driver.js.map +0 -1
  76. package/Cache/memory.d.ts +0 -5
  77. package/Cache/memory.d.ts.map +0 -1
  78. package/Cache/memory.js +0 -57
  79. package/Cache/memory.js.map +0 -1
  80. package/Cache/memoryTTL.d.ts +0 -23
  81. package/Cache/memoryTTL.d.ts.map +0 -1
  82. package/Cache/memoryTTL.js +0 -128
  83. package/Cache/memoryTTL.js.map +0 -1
  84. package/Cache/prelude.d.ts +0 -32
  85. package/Cache/prelude.d.ts.map +0 -1
  86. package/Cache/prelude.js +0 -143
  87. package/Cache/prelude.js.map +0 -1
  88. package/Cache.d.ts +0 -82
  89. package/Cache.d.ts.map +0 -1
  90. package/Cache.js +0 -144
  91. package/Cache.js.map +0 -1
  92. package/DiscordConfig.d.ts +0 -35
  93. package/DiscordConfig.d.ts.map +0 -1
  94. package/DiscordConfig.js +0 -42
  95. package/DiscordConfig.js.map +0 -1
  96. package/DiscordGateway/DiscordWS.d.ts +0 -37
  97. package/DiscordGateway/DiscordWS.d.ts.map +0 -1
  98. package/DiscordGateway/DiscordWS.js +0 -73
  99. package/DiscordGateway/DiscordWS.js.map +0 -1
  100. package/DiscordGateway/Messaging.d.ts +0 -393
  101. package/DiscordGateway/Messaging.d.ts.map +0 -1
  102. package/DiscordGateway/Messaging.js +0 -40
  103. package/DiscordGateway/Messaging.js.map +0 -1
  104. package/DiscordGateway/Shard/StateStore.d.ts +0 -24
  105. package/DiscordGateway/Shard/StateStore.d.ts.map +0 -1
  106. package/DiscordGateway/Shard/StateStore.js +0 -48
  107. package/DiscordGateway/Shard/StateStore.js.map +0 -1
  108. package/DiscordGateway/Shard/heartbeats.d.ts +0 -8
  109. package/DiscordGateway/Shard/heartbeats.d.ts.map +0 -1
  110. package/DiscordGateway/Shard/heartbeats.js +0 -28
  111. package/DiscordGateway/Shard/heartbeats.js.map +0 -1
  112. package/DiscordGateway/Shard/identify.d.ts +0 -12
  113. package/DiscordGateway/Shard/identify.d.ts.map +0 -1
  114. package/DiscordGateway/Shard/identify.js +0 -38
  115. package/DiscordGateway/Shard/identify.js.map +0 -1
  116. package/DiscordGateway/Shard/sendEvents.d.ts +0 -8
  117. package/DiscordGateway/Shard/sendEvents.d.ts.map +0 -1
  118. package/DiscordGateway/Shard/sendEvents.js +0 -39
  119. package/DiscordGateway/Shard/sendEvents.js.map +0 -1
  120. package/DiscordGateway/Shard/utils.d.ts +0 -6
  121. package/DiscordGateway/Shard/utils.d.ts.map +0 -1
  122. package/DiscordGateway/Shard/utils.js +0 -11
  123. package/DiscordGateway/Shard/utils.js.map +0 -1
  124. package/DiscordGateway/Shard.d.ts +0 -28
  125. package/DiscordGateway/Shard.d.ts.map +0 -1
  126. package/DiscordGateway/Shard.js +0 -149
  127. package/DiscordGateway/Shard.js.map +0 -1
  128. package/DiscordGateway/ShardStore.d.ts +0 -18
  129. package/DiscordGateway/ShardStore.d.ts.map +0 -1
  130. package/DiscordGateway/ShardStore.js +0 -31
  131. package/DiscordGateway/ShardStore.js.map +0 -1
  132. package/DiscordGateway/Sharder.d.ts +0 -13
  133. package/DiscordGateway/Sharder.d.ts.map +0 -1
  134. package/DiscordGateway/Sharder.js +0 -73
  135. package/DiscordGateway/Sharder.js.map +0 -1
  136. package/DiscordGateway.d.ts +0 -32
  137. package/DiscordGateway.d.ts.map +0 -1
  138. package/DiscordGateway.js +0 -28
  139. package/DiscordGateway.js.map +0 -1
  140. package/DiscordREST/Generated.d.ts +0 -5399
  141. package/DiscordREST/Generated.d.ts.map +0 -1
  142. package/DiscordREST/Generated.js +0 -2405
  143. package/DiscordREST/Generated.js.map +0 -1
  144. package/DiscordREST/utils.d.ts +0 -14
  145. package/DiscordREST/utils.d.ts.map +0 -1
  146. package/DiscordREST/utils.js +0 -31
  147. package/DiscordREST/utils.js.map +0 -1
  148. package/DiscordREST.d.ts +0 -23
  149. package/DiscordREST.d.ts.map +0 -1
  150. package/DiscordREST.js +0 -132
  151. package/DiscordREST.js.map +0 -1
  152. package/Helpers/flags.d.ts +0 -28
  153. package/Helpers/flags.d.ts.map +0 -1
  154. package/Helpers/flags.js +0 -48
  155. package/Helpers/flags.js.map +0 -1
  156. package/Helpers/intents.d.ts +0 -25
  157. package/Helpers/intents.d.ts.map +0 -1
  158. package/Helpers/intents.js +0 -34
  159. package/Helpers/intents.js.map +0 -1
  160. package/Helpers/interactions.d.ts +0 -116
  161. package/Helpers/interactions.d.ts.map +0 -1
  162. package/Helpers/interactions.js +0 -143
  163. package/Helpers/interactions.js.map +0 -1
  164. package/Helpers/members.d.ts +0 -10
  165. package/Helpers/members.d.ts.map +0 -1
  166. package/Helpers/members.js +0 -17
  167. package/Helpers/members.js.map +0 -1
  168. package/Helpers/permissions.d.ts +0 -42
  169. package/Helpers/permissions.d.ts.map +0 -1
  170. package/Helpers/permissions.js +0 -97
  171. package/Helpers/permissions.js.map +0 -1
  172. package/Helpers/ui.d.ts +0 -105
  173. package/Helpers/ui.d.ts.map +0 -1
  174. package/Helpers/ui.js +0 -162
  175. package/Helpers/ui.js.map +0 -1
  176. package/Interactions/builder.d.ts +0 -48
  177. package/Interactions/builder.d.ts.map +0 -1
  178. package/Interactions/builder.js +0 -64
  179. package/Interactions/builder.js.map +0 -1
  180. package/Interactions/commandHelper.d.ts +0 -99
  181. package/Interactions/commandHelper.d.ts.map +0 -1
  182. package/Interactions/commandHelper.js +0 -53
  183. package/Interactions/commandHelper.js.map +0 -1
  184. package/Interactions/context.d.ts +0 -54
  185. package/Interactions/context.d.ts.map +0 -1
  186. package/Interactions/context.js +0 -42
  187. package/Interactions/context.js.map +0 -1
  188. package/Interactions/definitions.d.ts +0 -44
  189. package/Interactions/definitions.d.ts.map +0 -1
  190. package/Interactions/definitions.js +0 -67
  191. package/Interactions/definitions.js.map +0 -1
  192. package/Interactions/error.d.ts +0 -2
  193. package/Interactions/error.d.ts.map +0 -1
  194. package/Interactions/error.js +0 -8
  195. package/Interactions/error.js.map +0 -1
  196. package/Interactions/gateway.d.ts +0 -21
  197. package/Interactions/gateway.d.ts.map +0 -1
  198. package/Interactions/gateway.js +0 -90
  199. package/Interactions/gateway.js.map +0 -1
  200. package/Interactions/handlers.d.ts +0 -15
  201. package/Interactions/handlers.d.ts.map +0 -1
  202. package/Interactions/handlers.js +0 -72
  203. package/Interactions/handlers.js.map +0 -1
  204. package/Interactions/index.d.ts +0 -16
  205. package/Interactions/index.d.ts.map +0 -1
  206. package/Interactions/index.js +0 -94
  207. package/Interactions/index.js.map +0 -1
  208. package/Interactions/utils.d.ts +0 -61
  209. package/Interactions/utils.d.ts.map +0 -1
  210. package/Interactions/utils.js +0 -35
  211. package/Interactions/utils.js.map +0 -1
  212. package/Interactions/webhook.d.ts +0 -73
  213. package/Interactions/webhook.d.ts.map +0 -1
  214. package/Interactions/webhook.js +0 -89
  215. package/Interactions/webhook.js.map +0 -1
  216. package/RateLimit/memory.d.ts +0 -3
  217. package/RateLimit/memory.d.ts.map +0 -1
  218. package/RateLimit/memory.js +0 -47
  219. package/RateLimit/memory.js.map +0 -1
  220. package/RateLimit/utils.d.ts +0 -3
  221. package/RateLimit/utils.d.ts.map +0 -1
  222. package/RateLimit/utils.js +0 -25
  223. package/RateLimit/utils.js.map +0 -1
  224. package/RateLimit.d.ts +0 -30
  225. package/RateLimit.d.ts.map +0 -1
  226. package/RateLimit.js +0 -35
  227. package/RateLimit.js.map +0 -1
  228. package/gateway.d.ts +0 -19
  229. package/gateway.d.ts.map +0 -1
  230. package/gateway.js +0 -72
  231. package/gateway.js.map +0 -1
  232. package/index.d.ts +0 -18
  233. package/index.d.ts.map +0 -1
  234. package/index.js +0 -71
  235. package/index.js.map +0 -1
  236. package/mjs/Cache/driver.mjs +0 -3
  237. package/mjs/Cache/driver.mjs.map +0 -1
  238. package/mjs/Cache/memory.mjs +0 -48
  239. package/mjs/Cache/memory.mjs.map +0 -1
  240. package/mjs/Cache/memoryTTL.mjs +0 -119
  241. package/mjs/Cache/memoryTTL.mjs.map +0 -1
  242. package/mjs/Cache/prelude.mjs +0 -131
  243. package/mjs/Cache/prelude.mjs.map +0 -1
  244. package/mjs/Cache.mjs +0 -89
  245. package/mjs/Cache.mjs.map +0 -1
  246. package/mjs/DiscordConfig.mjs +0 -32
  247. package/mjs/DiscordConfig.mjs.map +0 -1
  248. package/mjs/DiscordGateway/DiscordWS.mjs +0 -66
  249. package/mjs/DiscordGateway/DiscordWS.mjs.map +0 -1
  250. package/mjs/DiscordGateway/Messaging.mjs +0 -33
  251. package/mjs/DiscordGateway/Messaging.mjs.map +0 -1
  252. package/mjs/DiscordGateway/Shard/StateStore.mjs +0 -40
  253. package/mjs/DiscordGateway/Shard/StateStore.mjs.map +0 -1
  254. package/mjs/DiscordGateway/Shard/heartbeats.mjs +0 -20
  255. package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +0 -1
  256. package/mjs/DiscordGateway/Shard/identify.mjs +0 -30
  257. package/mjs/DiscordGateway/Shard/identify.mjs.map +0 -1
  258. package/mjs/DiscordGateway/Shard/sendEvents.mjs +0 -26
  259. package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +0 -1
  260. package/mjs/DiscordGateway/Shard/utils.mjs +0 -3
  261. package/mjs/DiscordGateway/Shard/utils.mjs.map +0 -1
  262. package/mjs/DiscordGateway/Shard.mjs +0 -142
  263. package/mjs/DiscordGateway/Shard.mjs.map +0 -1
  264. package/mjs/DiscordGateway/ShardStore.mjs +0 -24
  265. package/mjs/DiscordGateway/ShardStore.mjs.map +0 -1
  266. package/mjs/DiscordGateway/Sharder.mjs +0 -66
  267. package/mjs/DiscordGateway/Sharder.mjs.map +0 -1
  268. package/mjs/DiscordGateway.mjs +0 -21
  269. package/mjs/DiscordGateway.mjs.map +0 -1
  270. package/mjs/DiscordREST/Generated.mjs +0 -2396
  271. package/mjs/DiscordREST/Generated.mjs.map +0 -1
  272. package/mjs/DiscordREST/utils.mjs +0 -20
  273. package/mjs/DiscordREST/utils.mjs.map +0 -1
  274. package/mjs/DiscordREST.mjs +0 -124
  275. package/mjs/DiscordREST.mjs.map +0 -1
  276. package/mjs/Helpers/flags.mjs +0 -36
  277. package/mjs/Helpers/flags.mjs.map +0 -1
  278. package/mjs/Helpers/intents.mjs +0 -27
  279. package/mjs/Helpers/intents.mjs.map +0 -1
  280. package/mjs/Helpers/interactions.mjs +0 -115
  281. package/mjs/Helpers/interactions.mjs.map +0 -1
  282. package/mjs/Helpers/members.mjs +0 -9
  283. package/mjs/Helpers/members.mjs.map +0 -1
  284. package/mjs/Helpers/permissions.mjs +0 -84
  285. package/mjs/Helpers/permissions.mjs.map +0 -1
  286. package/mjs/Helpers/ui.mjs +0 -137
  287. package/mjs/Helpers/ui.mjs.map +0 -1
  288. package/mjs/Interactions/builder.mjs +0 -56
  289. package/mjs/Interactions/builder.mjs.map +0 -1
  290. package/mjs/Interactions/commandHelper.mjs +0 -45
  291. package/mjs/Interactions/commandHelper.mjs.map +0 -1
  292. package/mjs/Interactions/context.mjs +0 -29
  293. package/mjs/Interactions/context.mjs.map +0 -1
  294. package/mjs/Interactions/definitions.mjs +0 -51
  295. package/mjs/Interactions/definitions.mjs.map +0 -1
  296. package/mjs/Interactions/error.mjs +0 -2
  297. package/mjs/Interactions/error.mjs.map +0 -1
  298. package/mjs/Interactions/gateway.mjs +0 -81
  299. package/mjs/Interactions/gateway.mjs.map +0 -1
  300. package/mjs/Interactions/handlers.mjs +0 -63
  301. package/mjs/Interactions/handlers.mjs.map +0 -1
  302. package/mjs/Interactions/index.mjs +0 -11
  303. package/mjs/Interactions/index.mjs.map +0 -1
  304. package/mjs/Interactions/utils.mjs +0 -26
  305. package/mjs/Interactions/utils.mjs.map +0 -1
  306. package/mjs/Interactions/webhook.mjs +0 -76
  307. package/mjs/Interactions/webhook.mjs.map +0 -1
  308. package/mjs/RateLimit/memory.mjs +0 -39
  309. package/mjs/RateLimit/memory.mjs.map +0 -1
  310. package/mjs/RateLimit/utils.mjs +0 -18
  311. package/mjs/RateLimit/utils.mjs.map +0 -1
  312. package/mjs/RateLimit.mjs +0 -28
  313. package/mjs/RateLimit.mjs.map +0 -1
  314. package/mjs/gateway.mjs +0 -19
  315. package/mjs/gateway.mjs.map +0 -1
  316. package/mjs/index.mjs +0 -18
  317. package/mjs/index.mjs.map +0 -1
  318. package/mjs/types.mjs +0 -356
  319. package/mjs/types.mjs.map +0 -1
  320. package/mjs/utils/Effect.mjs +0 -18
  321. package/mjs/utils/Effect.mjs.map +0 -1
  322. package/mjs/version.mjs +0 -2
  323. package/mjs/version.mjs.map +0 -1
  324. package/mjs/webhooks.mjs +0 -6
  325. package/mjs/webhooks.mjs.map +0 -1
  326. package/src/version.ts +0 -1
  327. package/types.d.ts +0 -2457
  328. package/types.d.ts.map +0 -1
  329. package/types.js +0 -408
  330. package/types.js.map +0 -1
  331. package/utils/Effect.d.ts +0 -5
  332. package/utils/Effect.d.ts.map +0 -1
  333. package/utils/Effect.js +0 -27
  334. package/utils/Effect.js.map +0 -1
  335. package/version.d.ts +0 -2
  336. package/version.d.ts.map +0 -1
  337. package/version.js +0 -8
  338. package/version.js.map +0 -1
  339. package/webhooks.d.ts +0 -8
  340. package/webhooks.d.ts.map +0 -1
  341. package/webhooks.js +0 -55
  342. package/webhooks.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ DISCORD_BOT_TOKEN=xxx
2
+
3
+ # For webhooks only
4
+ DISCORD_APP_ID=xxx
5
+ DISCORD_PUBLIC_KEY=xxx
@@ -0,0 +1,79 @@
1
+ import { NodeHttpClient, NodeSocket } from "@effect/platform-node"
2
+ import { Discord, DiscordConfig, Ix } from "dfx"
3
+ import { DiscordLive, runIx } from "dfx/gateway"
4
+ import Dotenv from "dotenv"
5
+ import { Config, Effect, Layer, pipe } from "effect"
6
+
7
+ Dotenv.config()
8
+
9
+ // Create the dependencies layer
10
+ const DiscordConfigLive = DiscordConfig.layerConfig({
11
+ token: Config.redacted("DISCORD_BOT_TOKEN"),
12
+ })
13
+
14
+ // Create your interaction definitions.
15
+ // Here we are creating a global application command.
16
+ const hello = Ix.global(
17
+ {
18
+ name: "hello",
19
+ description: "A basic command",
20
+ },
21
+ Effect.succeed({
22
+ type: 4,
23
+ data: {
24
+ content: "Hello!",
25
+ },
26
+ }),
27
+ )
28
+
29
+ // Optionally use the type safe helpers
30
+ const greeting = Ix.global(
31
+ {
32
+ name: "greeting",
33
+ description: "A basic command",
34
+ options: [
35
+ {
36
+ type: Discord.ApplicationCommandOptionType.STRING,
37
+ name: "who",
38
+ description: "who to greet",
39
+ required: true,
40
+ },
41
+ {
42
+ type: Discord.ApplicationCommandOptionType.STRING,
43
+ name: "greeting",
44
+ description: "What kind of greeting?",
45
+ },
46
+ ],
47
+ },
48
+ ix =>
49
+ Effect.succeed({
50
+ type: 4,
51
+ data: {
52
+ content: `${ix.optionValueOrElse("greeting", () => "Hello")} ${ix.optionValue("who")}!`,
53
+ },
54
+ // fail: ix.optionValue("fail"), // <- this would be a type error
55
+ }),
56
+ )
57
+
58
+ // Build your program use `Ix.builder`
59
+ const program = Effect.gen(function* () {
60
+ const interactions = pipe(
61
+ Ix.builder.add(hello).add(greeting),
62
+ runIx(Effect.catch(e => Effect.logError("CAUGHT INTERACTION ERROR", e))),
63
+ )
64
+
65
+ yield* Effect.asVoid(interactions)
66
+ })
67
+
68
+ const EnvLive = DiscordLive.pipe(
69
+ Layer.provide(NodeHttpClient.layerUndici),
70
+ Layer.provide(NodeSocket.layerWebSocketConstructor),
71
+ Layer.provide(DiscordConfigLive),
72
+ )
73
+
74
+ // Run it
75
+ program.pipe(
76
+ Effect.provide(EnvLive),
77
+ Effect.tapCause(Effect.logError),
78
+ Effect.runFork,
79
+ )
@@ -0,0 +1,56 @@
1
+ import { NodeHttpClient, NodeRuntime, NodeSocket } from "@effect/platform-node"
2
+ import { DiscordConfig, Ix } from "dfx"
3
+ import { DiscordIxLive, InteractionsRegistry } from "dfx/gateway"
4
+ import * as Dotenv from "dotenv"
5
+ import { Config, Effect, Layer } from "effect"
6
+
7
+ Dotenv.config()
8
+
9
+ // Create a layer for the discord services
10
+ const DiscordLayer = DiscordIxLive.pipe(
11
+ Layer.provide([
12
+ DiscordConfig.layerConfig({
13
+ token: Config.redacted("DISCORD_BOT_TOKEN"),
14
+ }),
15
+ NodeHttpClient.layerUndici,
16
+ NodeSocket.layerWebSocketConstructor,
17
+ ]),
18
+ )
19
+
20
+ // Create hello service
21
+ const HelloLayer = Layer.effectDiscard(
22
+ Effect.gen(function* () {
23
+ const registry = yield* InteractionsRegistry
24
+
25
+ // Create hello command that responds with "Hello!"
26
+ const hello = Ix.global(
27
+ {
28
+ name: "hello",
29
+ description: "A basic command",
30
+ },
31
+ Effect.succeed({
32
+ type: 4,
33
+ data: {
34
+ content: "Hello!",
35
+ },
36
+ }),
37
+ )
38
+
39
+ // register the command(s) and handle errors
40
+ yield* registry.register(
41
+ Ix.builder.add(hello).catchAllCause(Effect.logError),
42
+ )
43
+ }),
44
+ ).pipe(
45
+ // provide discord layer
46
+ Layer.provide(DiscordLayer),
47
+ )
48
+
49
+ // Construct the main layer
50
+ const MainLive = Layer.mergeAll(
51
+ // add your other services here
52
+ HelloLayer,
53
+ )
54
+
55
+ // run it
56
+ NodeRuntime.runMain(Layer.launch(MainLive))
@@ -0,0 +1,66 @@
1
+ import { NodeHttpClient, NodeRuntime, NodeSocket } from "@effect/platform-node"
2
+ import { Discord, DiscordConfig, Ix, UI } from "dfx"
3
+ import { DiscordIxLive, InteractionsRegistry } from "dfx/gateway"
4
+ import Dotenv from "dotenv"
5
+ import { Config, Effect, Layer } from "effect"
6
+
7
+ Dotenv.config()
8
+
9
+ // Create your service and register your interactions
10
+ const makeGreetService = Effect.gen(function* () {
11
+ const registry = yield* InteractionsRegistry
12
+
13
+ const greet = Ix.global(
14
+ {
15
+ name: "greet",
16
+ description: "A basic command",
17
+ options: [
18
+ {
19
+ name: "name",
20
+ description: "who to greet",
21
+ type: Discord.ApplicationCommandOptionType.STRING,
22
+ required: true,
23
+ },
24
+ ],
25
+ },
26
+ ix =>
27
+ Effect.succeed(
28
+ Ix.response({
29
+ type: Discord.InteractionCallbackTypes.CHANNEL_MESSAGE_WITH_SOURCE,
30
+ data: UI.components([
31
+ UI.textDisplay(`Hello ${ix.optionValue("name")}!`),
32
+ UI.row([
33
+ UI.button({ custom_id: "one", label: "Click me!" }),
34
+ UI.button({ custom_id: "two", label: "Click me 2!" }),
35
+ ]),
36
+ ]),
37
+ }),
38
+ ),
39
+ )
40
+
41
+ // create a builder
42
+ const ix = Ix.builder.add(greet).catchAllCause(Effect.logError)
43
+
44
+ // register the interactions
45
+ yield* registry.register(ix)
46
+ })
47
+
48
+ // Greet service layer
49
+ const GreetLive = Layer.effectDiscard(makeGreetService)
50
+
51
+ // Main layer
52
+ const MainLive = GreetLive.pipe(
53
+ Layer.provide(DiscordIxLive),
54
+ Layer.provide(NodeHttpClient.layerUndici),
55
+ Layer.provide(NodeSocket.layerWebSocketConstructor),
56
+ Layer.provide(
57
+ DiscordConfig.layerConfig({
58
+ token: Config.redacted("DISCORD_BOT_TOKEN"),
59
+ }),
60
+ ),
61
+ )
62
+
63
+ Layer.launch(MainLive).pipe(
64
+ Effect.catchCause(Effect.logError),
65
+ NodeRuntime.runMain,
66
+ )
package/flake.lock ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "nodes": {
3
+ "nixpkgs": {
4
+ "locked": {
5
+ "lastModified": 1747060738,
6
+ "narHash": "sha256-ByfPRQuqj+nhtVV0koinEpmJw0KLzNbgcgi9EF+NVow=",
7
+ "owner": "nixos",
8
+ "repo": "nixpkgs",
9
+ "rev": "eaeed9530c76ce5f1d2d8232e08bec5e26f18ec1",
10
+ "type": "github"
11
+ },
12
+ "original": {
13
+ "owner": "nixos",
14
+ "ref": "nixpkgs-unstable",
15
+ "repo": "nixpkgs",
16
+ "type": "github"
17
+ }
18
+ },
19
+ "root": {
20
+ "inputs": {
21
+ "nixpkgs": "nixpkgs"
22
+ }
23
+ }
24
+ },
25
+ "root": "root",
26
+ "version": 7
27
+ }
package/flake.nix ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ inputs = {
3
+ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4
+ };
5
+ outputs = {nixpkgs, ...}: let
6
+ forAllSystems = function:
7
+ nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed (
8
+ system: function nixpkgs.legacyPackages.${system}
9
+ );
10
+ in {
11
+ formatter = forAllSystems (pkgs: pkgs.alejandra);
12
+ devShells = forAllSystems (pkgs: {
13
+ default = pkgs.mkShell {
14
+ packages = with pkgs; [
15
+ corepack
16
+ nodejs
17
+ ];
18
+ };
19
+ });
20
+ };
21
+ }
package/lerna.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "packages": ["."],
3
+ "version": "independent",
4
+ "npmClient": "pnpm",
5
+ "command": {
6
+ "version": {
7
+ "allowBranch": "main",
8
+ "conventionalCommits": true,
9
+ "createRelease": "github"
10
+ }
11
+ }
12
+ }
package/package.json CHANGED
@@ -1,49 +1,92 @@
1
1
  {
2
2
  "name": "dfx",
3
- "version": "0.126.1",
3
+ "version": "1.0.0",
4
+ "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public",
8
+ "directory": "dist"
9
+ },
4
10
  "description": "Effect-TS discord library",
5
- "license": "MIT",
11
+ "author": "Tim Smart <hello@timsmart.co>",
6
12
  "repository": {
7
13
  "type": "git",
8
14
  "url": "https://github.com/tim-smart/dfx.git"
9
15
  },
10
- "publishConfig": {
11
- "access": "public"
12
- },
13
- "exports": {
14
- "./*": {
15
- "import": {
16
- "types": "./*.d.ts",
17
- "default": "./mjs/*.mjs"
18
- },
19
- "require": {
20
- "types": "./*.d.ts",
21
- "default": "./*.js"
22
- }
23
- },
24
- ".": {
25
- "import": {
26
- "types": "./index.d.ts",
27
- "default": "./mjs/index.mjs"
28
- },
29
- "require": {
30
- "types": "./index.d.ts",
31
- "default": "./index.js"
32
- }
33
- }
34
- },
35
- "sideEffects": [],
36
- "author": "Tim Smart <hello@timsmart.co>",
37
- "dependencies": {
38
- "discord-api-types": "^0.38.26"
16
+ "license": "MIT",
17
+ "scripts": {
18
+ "example": "ts-node --project tsconfig.examples.json",
19
+ "prepublishOnly": "pnpm build",
20
+ "types": "./scripts/generate-client.sh",
21
+ "clean": "rimraf build tsbuildinfo dist .cache",
22
+ "prebuild": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
23
+ "build": "pnpm prebuild && pnpm build-all && pnpm build-pack",
24
+ "build-cjs": "babel build/esm --config-file ./.babel.cjs.json --out-dir build/cjs --out-file-extension .js --source-maps",
25
+ "build-mjs": "babel build/esm --config-file ./.babel.mjs.json --out-dir build/mjs --out-file-extension .mjs --source-maps",
26
+ "build-post": "build-utils pack-v1",
27
+ "build-pack": "concurrently \"pnpm build-cjs\" \"pnpm build-mjs\" && pnpm build-post",
28
+ "build-all": "tsc -b tsconfig.json",
29
+ "build-watch": "tsc -b tsconfig.json --watch",
30
+ "check": "pnpm lint && pnpm tsgo -b tsconfig.json",
31
+ "lint": "oxlint src test examples",
32
+ "autofix": "pnpm lint --fix",
33
+ "circular": "madge --ts-config ./tsconfig.madge.json --circular --no-color --no-spinner --warning build/esm",
34
+ "test": "vitest",
35
+ "coverage": "vitest run --coverage",
36
+ "prepare": "husky && effect-language-service patch"
39
37
  },
40
38
  "peerDependencies": {
41
- "@effect/platform": "^0.92",
42
- "effect": "^3.18"
39
+ "effect": "4.0.0-beta.6"
43
40
  },
44
41
  "optionalDependencies": {
45
42
  "discord-verify": "^1.2.0"
46
43
  },
47
- "gitHead": "45e9bdbc303d77f39da3d5a93e284c8173db322f",
48
- "main": "./index.js"
49
- }
44
+ "devDependencies": {
45
+ "@babel/cli": "^7.28.6",
46
+ "@babel/core": "^7.29.0",
47
+ "@babel/plugin-syntax-import-attributes": "^7.28.6",
48
+ "@babel/plugin-transform-modules-commonjs": "^7.28.6",
49
+ "@changesets/changelog-github": "^0.5.2",
50
+ "@changesets/cli": "^2.29.8",
51
+ "@effect/babel-plugin": "^0.2.0",
52
+ "@effect/build-utils": "^0.8.9",
53
+ "@effect/language-service": "^0.74.0",
54
+ "@effect/platform-node": "4.0.0-beta.6",
55
+ "@tim-smart/openapi-gen": "^1.0.0",
56
+ "@types/chai": "^5.2.3",
57
+ "@types/node": "^25.2.3",
58
+ "@types/ws": "^8.18.1",
59
+ "@typescript/native-preview": "7.0.0-dev.20260219.1",
60
+ "@vitejs/plugin-react": "^5.1.4",
61
+ "@vitest/coverage-v8": "^4.0.18",
62
+ "babel-plugin-annotate-pure-calls": "^0.5.0",
63
+ "concurrently": "^9.2.1",
64
+ "dotenv": "^17.3.1",
65
+ "effect": "4.0.0-beta.6",
66
+ "husky": "^9.1.7",
67
+ "lerna": "^9.0.4",
68
+ "lint-staged": "^16.2.7",
69
+ "madge": "^8.0.0",
70
+ "oxlint": "^1.48.0",
71
+ "prettier": "^3.8.1",
72
+ "rimraf": "^6.1.3",
73
+ "ts-node": "^10.9.2",
74
+ "tsx": "^4.21.0",
75
+ "typescript": "^5.9.3",
76
+ "vite": "^7.3.1",
77
+ "vitest": "4.0.18"
78
+ },
79
+ "gitHead": "8f299caa1306c17bef8fa3bd2528bda36e55c462",
80
+ "dependencies": {
81
+ "discord-api-types": "^0.38.39"
82
+ },
83
+ "lint-staged": {
84
+ "*.{ts,tsx}": [
85
+ "oxlint --fix",
86
+ "prettier --write"
87
+ ],
88
+ "*.{json,md,yml,yaml}": [
89
+ "prettier --write"
90
+ ]
91
+ }
92
+ }
@@ -0,0 +1,7 @@
1
+ ignoredBuiltDependencies:
2
+ - esbuild
3
+ onlyBuiltDependencies:
4
+ - '@parcel/watcher'
5
+ - msgpackr-extract
6
+ - nx
7
+ - unrs-resolver
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+
3
+ mkdir -p tmp
4
+ curl https://raw.githubusercontent.com/discord/discord-api-spec/refs/heads/main/specs/openapi.json -o tmp/openapi.json
5
+ pnpm openapi-gen -n DiscordRest -s tmp/openapi.json > src/DiscordREST/Generated.ts
6
+
7
+ echo "// oxlint-disable no-shadow
8
+ $(cat src/DiscordREST/Generated.ts)" > src/DiscordREST/Generated.ts
9
+
10
+ pnpm prettier -w src/DiscordREST/Generated.ts
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ direnv allow
5
+ corepack install
6
+ pnpm install
7
+
8
+ git clone https://github.com/effect-ts/effect-smol.git --depth 1 .repos/effect
@@ -1,7 +1,7 @@
1
1
  import * as Option from "effect/Option"
2
2
  import * as Effect from "effect/Effect"
3
- import type { CacheDriver, ParentCacheDriver } from "dfx/Cache/driver"
4
- import { createDriver, createParentDriver } from "dfx/Cache/driver"
3
+ import type { CacheDriver, ParentCacheDriver } from "./driver.ts"
4
+ import { createDriver, createParentDriver } from "./driver.ts"
5
5
 
6
6
  export const createWithParent = <T>(): Effect.Effect<
7
7
  ParentCacheDriver<never, T>
@@ -24,11 +24,11 @@ export const createWithParent = <T>(): Effect.Effect<
24
24
  get: (parentId, resourceId) =>
25
25
  Effect.sync(
26
26
  (): Option.Option<T> =>
27
- Option.fromNullable(map.get(parentId)?.get(resourceId)),
27
+ Option.fromNullishOr(map.get(parentId)?.get(resourceId)),
28
28
  ),
29
29
 
30
30
  getForParent: parentId =>
31
- Effect.sync(() => Option.fromNullable(map.get(parentId))),
31
+ Effect.sync(() => Option.fromNullishOr(map.get(parentId))),
32
32
 
33
33
  set: (parentId, resourceId, resource) =>
34
34
  Effect.sync(() => {
@@ -63,7 +63,7 @@ export const create = <T>(): Effect.Effect<CacheDriver<never, T>> =>
63
63
 
64
64
  get: resourceId =>
65
65
  Effect.sync(
66
- (): Option.Option<T> => Option.fromNullable(map.get(resourceId)),
66
+ (): Option.Option<T> => Option.fromNullishOr(map.get(resourceId)),
67
67
  ),
68
68
 
69
69
  set: (resourceId, resource) =>
@@ -1,10 +1,14 @@
1
- import type { CacheDriver, ParentCacheDriver } from "dfx/Cache/driver"
2
- import { createDriver, createParentDriver } from "dfx/Cache/driver"
1
+ import type { CacheDriver, ParentCacheDriver } from "./driver.ts"
2
+ import { createDriver, createParentDriver } from "./driver.ts"
3
3
  import * as Array from "effect/Array"
4
4
  import * as Duration from "effect/Duration"
5
5
  import * as Effect from "effect/Effect"
6
6
  import * as Option from "effect/Option"
7
7
 
8
+ declare const global: typeof globalThis & {
9
+ gc?: () => void
10
+ }
11
+
8
12
  export interface MemoryTTLOpts {
9
13
  /** The approx. number of milliseconds to keep items */
10
14
  readonly ttl: Duration.Duration
@@ -99,7 +103,7 @@ const make = <T>({
99
103
 
100
104
  get: resourceId =>
101
105
  Effect.sync(
102
- (): Option.Option<T> => Option.fromNullable(getSync(resourceId)),
106
+ (): Option.Option<T> => Option.fromNullishOr(getSync(resourceId)),
103
107
  ),
104
108
 
105
109
  refreshTTL: id =>
@@ -153,7 +157,7 @@ export const createWithParent = <T>(
153
157
  get: (_, id) => store.get(id),
154
158
 
155
159
  getForParent: parentId =>
156
- Option.fromNullable(parentIds.get(parentId)).pipe(
160
+ Effect.fromNullishOr(parentIds.get(parentId)).pipe(
157
161
  Effect.flatMap(ids =>
158
162
  Effect.forEach(
159
163
  ids,
@@ -176,11 +180,11 @@ export const createWithParent = <T>(
176
180
  item._tag === "Some" ? acc.set(id, item.value) : acc,
177
181
  ),
178
182
  ),
179
- Effect.option,
183
+ Effect.catchNoSuchElement,
180
184
  ),
181
185
 
182
186
  set: (parentId, resourceId, resource) =>
183
- Effect.zipRight(
187
+ Effect.andThen(
184
188
  store.set(resourceId, resource),
185
189
  Effect.sync(() => {
186
190
  if (!parentIds.has(parentId)) {
@@ -191,7 +195,7 @@ export const createWithParent = <T>(
191
195
  ),
192
196
 
193
197
  delete: (parentId, resourceId) =>
194
- Effect.zipRight(
198
+ Effect.andThen(
195
199
  store.delete(resourceId),
196
200
  Effect.sync(() => {
197
201
  parentIds.get(parentId)?.delete(resourceId)
@@ -1,8 +1,8 @@
1
1
  import * as Effect from "effect/Effect"
2
2
  import type * as Scope from "effect/Scope"
3
3
  import * as Stream from "effect/Stream"
4
- import type { DiscordRESTError } from "dfx/DiscordREST"
5
- import { DiscordREST } from "dfx/DiscordREST"
4
+ import type { DiscordRESTError } from "../DiscordREST.ts"
5
+ import { DiscordREST } from "../DiscordREST.ts"
6
6
  import type {
7
7
  CacheDriver,
8
8
  CacheOp,
@@ -10,10 +10,10 @@ import type {
10
10
  ParentCacheOp,
11
11
  Cache,
12
12
  ParentCache,
13
- } from "dfx/Cache"
14
- import { CacheMissError, make, makeWithParent } from "dfx/Cache"
15
- import { DiscordGateway } from "dfx/DiscordGateway"
16
- import type * as Discord from "dfx/types"
13
+ } from "../Cache.ts"
14
+ import { CacheMissError, make, makeWithParent } from "../Cache.ts"
15
+ import { DiscordGateway } from "../DiscordGateway.ts"
16
+ import type * as Discord from "../types.ts"
17
17
 
18
18
  export interface OptsWithParentOptions<E, A> {
19
19
  readonly id: (a: A) => string
@@ -210,8 +210,10 @@ export const channels = <RM, EM, E>(
210
210
  }),
211
211
  onMiss: (_, id) => rest.getChannel(id),
212
212
  onParentMiss: guildId =>
213
- Effect.map(rest.listGuildChannels(guildId), a =>
214
- a.map(a => [a.id, a as Discord.GetChannel200] as const),
213
+ Effect.map(rest.listGuildChannels(guildId), guildChannels =>
214
+ guildChannels.map(
215
+ channel => [channel.id, channel as Discord.GetChannel200] as const,
216
+ ),
215
217
  ),
216
218
  })
217
219
  })