discord-digital-twin 0.0.1
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/CHANGELOG.md +14 -0
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/db.d.ts +4 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +18 -0
- package/dist/db.js.map +1 -0
- package/dist/gateway.d.ts +46 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +163 -0
- package/dist/gateway.js.map +1 -0
- package/dist/generated/browser.d.ts +55 -0
- package/dist/generated/browser.d.ts.map +1 -0
- package/dist/generated/browser.js +18 -0
- package/dist/generated/browser.js.map +1 -0
- package/dist/generated/client.d.ts +72 -0
- package/dist/generated/client.d.ts.map +1 -0
- package/dist/generated/client.js +36 -0
- package/dist/generated/client.js.map +1 -0
- package/dist/generated/commonInputTypes.d.ts +306 -0
- package/dist/generated/commonInputTypes.d.ts.map +1 -0
- package/dist/generated/commonInputTypes.js +11 -0
- package/dist/generated/commonInputTypes.js.map +1 -0
- package/dist/generated/enums.d.ts +2 -0
- package/dist/generated/enums.d.ts.map +1 -0
- package/dist/generated/enums.js +12 -0
- package/dist/generated/enums.js.map +1 -0
- package/dist/generated/internal/class.d.ts +226 -0
- package/dist/generated/internal/class.d.ts.map +1 -0
- package/dist/generated/internal/class.js +42 -0
- package/dist/generated/internal/class.js.map +1 -0
- package/dist/generated/internal/prismaNamespace.d.ts +1323 -0
- package/dist/generated/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/generated/internal/prismaNamespace.js +216 -0
- package/dist/generated/internal/prismaNamespace.js.map +1 -0
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +184 -0
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +186 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/generated/models/ApplicationCommand.d.ts +1204 -0
- package/dist/generated/models/ApplicationCommand.d.ts.map +1 -0
- package/dist/generated/models/ApplicationCommand.js +2 -0
- package/dist/generated/models/ApplicationCommand.js.map +1 -0
- package/dist/generated/models/Channel.d.ts +2061 -0
- package/dist/generated/models/Channel.d.ts.map +1 -0
- package/dist/generated/models/Channel.js +2 -0
- package/dist/generated/models/Channel.js.map +1 -0
- package/dist/generated/models/Guild.d.ts +1463 -0
- package/dist/generated/models/Guild.d.ts.map +1 -0
- package/dist/generated/models/Guild.js +2 -0
- package/dist/generated/models/Guild.js.map +1 -0
- package/dist/generated/models/GuildMember.d.ts +1401 -0
- package/dist/generated/models/GuildMember.d.ts.map +1 -0
- package/dist/generated/models/GuildMember.js +2 -0
- package/dist/generated/models/GuildMember.js.map +1 -0
- package/dist/generated/models/InteractionResponse.d.ts +1142 -0
- package/dist/generated/models/InteractionResponse.d.ts.map +1 -0
- package/dist/generated/models/InteractionResponse.js +2 -0
- package/dist/generated/models/InteractionResponse.js.map +1 -0
- package/dist/generated/models/Message.d.ts +1958 -0
- package/dist/generated/models/Message.d.ts.map +1 -0
- package/dist/generated/models/Message.js +2 -0
- package/dist/generated/models/Message.js.map +1 -0
- package/dist/generated/models/Reaction.d.ts +1173 -0
- package/dist/generated/models/Reaction.d.ts.map +1 -0
- package/dist/generated/models/Reaction.js +2 -0
- package/dist/generated/models/Reaction.js.map +1 -0
- package/dist/generated/models/Role.d.ts +1394 -0
- package/dist/generated/models/Role.d.ts.map +1 -0
- package/dist/generated/models/Role.js +2 -0
- package/dist/generated/models/Role.js.map +1 -0
- package/dist/generated/models/ThreadMember.d.ts +1104 -0
- package/dist/generated/models/ThreadMember.d.ts.map +1 -0
- package/dist/generated/models/ThreadMember.js +2 -0
- package/dist/generated/models/ThreadMember.js.map +1 -0
- package/dist/generated/models/User.d.ts +1288 -0
- package/dist/generated/models/User.d.ts.map +1 -0
- package/dist/generated/models/User.js +2 -0
- package/dist/generated/models/User.js.map +1 -0
- package/dist/generated/models.d.ts +12 -0
- package/dist/generated/models.d.ts.map +1 -0
- package/dist/generated/models.js +2 -0
- package/dist/generated/models.js.map +1 -0
- package/dist/index.d.ts +231 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +589 -0
- package/dist/index.js.map +1 -0
- package/dist/serializers.d.ts +16 -0
- package/dist/serializers.d.ts.map +1 -0
- package/dist/serializers.js +175 -0
- package/dist/serializers.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1530 -0
- package/dist/server.js.map +1 -0
- package/dist/snowflake.d.ts +2 -0
- package/dist/snowflake.d.ts.map +1 -0
- package/dist/snowflake.js +13 -0
- package/dist/snowflake.js.map +1 -0
- package/package.json +36 -0
- package/schema.prisma +159 -0
- package/src/db.ts +20 -0
- package/src/gateway.ts +249 -0
- package/src/generated/browser.ts +69 -0
- package/src/generated/client.ts +91 -0
- package/src/generated/commonInputTypes.ts +348 -0
- package/src/generated/enums.ts +15 -0
- package/src/generated/internal/class.ts +282 -0
- package/src/generated/internal/prismaNamespace.ts +1574 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +252 -0
- package/src/generated/models/ApplicationCommand.ts +1361 -0
- package/src/generated/models/Channel.ts +2266 -0
- package/src/generated/models/Guild.ts +1655 -0
- package/src/generated/models/GuildMember.ts +1585 -0
- package/src/generated/models/InteractionResponse.ts +1298 -0
- package/src/generated/models/Message.ts +2148 -0
- package/src/generated/models/Reaction.ts +1348 -0
- package/src/generated/models/Role.ts +1568 -0
- package/src/generated/models/ThreadMember.ts +1273 -0
- package/src/generated/models/User.ts +1460 -0
- package/src/generated/models.ts +21 -0
- package/src/index.ts +934 -0
- package/src/serializers.ts +221 -0
- package/src/server.ts +1821 -0
- package/src/snowflake.ts +14 -0
- package/tests/guilds.test.ts +188 -0
- package/tests/interactions.test.ts +462 -0
- package/tests/messages.test.ts +166 -0
- package/tests/sdk-compat.test.ts +88 -0
- package/tests/threads.test.ts +181 -0
- package/tsconfig.json +27 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.0.1
|
|
4
|
+
|
|
5
|
+
Initial release.
|
|
6
|
+
|
|
7
|
+
- Local Discord API twin (REST + Gateway WebSocket) for testing discord.js bots
|
|
8
|
+
- In-memory state with Prisma + libsql
|
|
9
|
+
- Full message lifecycle: create, edit, delete, reactions
|
|
10
|
+
- Thread management: create, archive, unarchive, thread members
|
|
11
|
+
- Interaction flows: slash commands, buttons, select menus, modals
|
|
12
|
+
- Guild management: channels, roles, members, active threads
|
|
13
|
+
- Playwright-style actor API: `discord.user(id).sendMessage(...)`, `.runSlashCommand(...)`, etc.
|
|
14
|
+
- Wait helpers: `waitForThread`, `waitForMessage`, `waitForBotReply`, `waitForInteractionAck`
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Kimaki
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Discord Digital Twin
|
|
2
|
+
|
|
3
|
+
> **Experimental and unstable.** APIs may change without notice between versions.
|
|
4
|
+
|
|
5
|
+
`discord-digital-twin` is a local Discord API twin for tests.
|
|
6
|
+
It runs:
|
|
7
|
+
|
|
8
|
+
- Discord-like REST routes on `/api/v10/*`
|
|
9
|
+
- Discord-like Gateway WebSocket on `/gateway`
|
|
10
|
+
- In-memory state with Prisma + libsql
|
|
11
|
+
|
|
12
|
+
The goal is testing real `discord.js` flows without calling Discord servers.
|
|
13
|
+
|
|
14
|
+
## Use Cases
|
|
15
|
+
|
|
16
|
+
- Integration test slash command flows end-to-end
|
|
17
|
+
- Verify message/thread/reaction behavior with real `discord.js` clients
|
|
18
|
+
- Reproduce interaction bugs locally with deterministic state
|
|
19
|
+
- Run fast CI tests without Discord network dependency
|
|
20
|
+
|
|
21
|
+
## How It Works
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
┌─────────────┐
|
|
25
|
+
│ vitest test │
|
|
26
|
+
└──────┬──────┘
|
|
27
|
+
│ 1) login() with rest.api override
|
|
28
|
+
▼
|
|
29
|
+
┌────────┬────────────┐ ┌───────────────────────────┐
|
|
30
|
+
│ discord.js Client │─ HTTP ───▶│ DigitalDiscord REST │
|
|
31
|
+
│ │ │ (/api/v10/*) │
|
|
32
|
+
└────────┬────────────┘ └─────────┬─────────────────┘
|
|
33
|
+
│ 2) Gateway events │ 3) route handlers
|
|
34
|
+
▼ ▼
|
|
35
|
+
┌────────┬─────────┐ ┌────────────┬─────────────────┐
|
|
36
|
+
│ Gateway WS │◀──────────│ Prisma + libsql (memory) │
|
|
37
|
+
└──────────────────┘ └──────────────────────────────┘
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Quick Start
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { ChannelType } from 'discord-api-types/v10'
|
|
44
|
+
import { DigitalDiscord } from 'discord-digital-twin'
|
|
45
|
+
|
|
46
|
+
const discord = new DigitalDiscord({
|
|
47
|
+
guild: { name: 'Test Server' },
|
|
48
|
+
channels: [
|
|
49
|
+
{
|
|
50
|
+
name: 'general',
|
|
51
|
+
type: ChannelType.GuildText,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
users: [{ username: 'TestUser' }],
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
await discord.start()
|
|
58
|
+
// use discord.restUrl in discord.js Client rest.api
|
|
59
|
+
// use discord.botToken in client.login()
|
|
60
|
+
await discord.stop()
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Example Vitest Interaction Test
|
|
64
|
+
|
|
65
|
+
This example shows a full interaction flow:
|
|
66
|
+
|
|
67
|
+
1. simulate a slash command from a user actor
|
|
68
|
+
2. handle `interactionCreate` in `discord.js`
|
|
69
|
+
3. send `interaction.reply()`
|
|
70
|
+
4. assert ack + bot message persisted
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { describe, test, expect, beforeAll, afterAll } from 'vitest'
|
|
74
|
+
import { Client, GatewayIntentBits, ChannelType } from 'discord.js'
|
|
75
|
+
import { DigitalDiscord } from 'discord-digital-twin'
|
|
76
|
+
|
|
77
|
+
describe('slash command interaction', () => {
|
|
78
|
+
let discord: DigitalDiscord
|
|
79
|
+
let client: Client
|
|
80
|
+
let channelId: string
|
|
81
|
+
let userId: string
|
|
82
|
+
|
|
83
|
+
beforeAll(async () => {
|
|
84
|
+
discord = new DigitalDiscord({
|
|
85
|
+
channels: [{ name: 'general', type: ChannelType.GuildText }],
|
|
86
|
+
users: [{ username: 'TestUser' }],
|
|
87
|
+
})
|
|
88
|
+
await discord.start()
|
|
89
|
+
|
|
90
|
+
const channels = await discord.prisma.channel.findMany()
|
|
91
|
+
channelId = channels[0]!.id
|
|
92
|
+
userId = (await discord.getFirstNonBotUserId())!
|
|
93
|
+
|
|
94
|
+
client = new Client({
|
|
95
|
+
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
|
|
96
|
+
rest: { api: discord.restUrl, version: '10' },
|
|
97
|
+
})
|
|
98
|
+
await client.login(discord.botToken)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
afterAll(async () => {
|
|
102
|
+
client.destroy()
|
|
103
|
+
await discord.stop()
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
test('acknowledges and replies to slash command', async () => {
|
|
107
|
+
const commandName = 'status'
|
|
108
|
+
|
|
109
|
+
const handled = new Promise<void>((resolve) => {
|
|
110
|
+
client.once('interactionCreate', async (interaction) => {
|
|
111
|
+
if (!interaction.isChatInputCommand()) {
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
if (interaction.commandName !== commandName) {
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
await interaction.reply({ content: 'ok' })
|
|
118
|
+
resolve()
|
|
119
|
+
})
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
const interaction = await discord.user(userId).runSlashCommand({
|
|
123
|
+
channelId,
|
|
124
|
+
name: commandName,
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
const ack = await discord.waitForInteractionAck({
|
|
128
|
+
interactionId: interaction.id,
|
|
129
|
+
})
|
|
130
|
+
await handled
|
|
131
|
+
|
|
132
|
+
expect(ack.acknowledged).toBe(true)
|
|
133
|
+
|
|
134
|
+
const reply = await discord.waitForBotReply({ channelId })
|
|
135
|
+
expect(reply.content).toBe('ok')
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
```
|
package/dist/db.d.ts
ADDED
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,CAS/D"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Prisma client initialization with in-memory libsql.
|
|
2
|
+
// Vitest runs each test file in a separate worker thread, so all
|
|
3
|
+
// instances within the same file share file::memory:?cache=shared
|
|
4
|
+
// and cross-file isolation comes from separate processes/threads.
|
|
5
|
+
import { PrismaLibSql } from '@prisma/adapter-libsql';
|
|
6
|
+
import { PrismaClient } from './generated/client.js';
|
|
7
|
+
export { PrismaClient };
|
|
8
|
+
export function createPrismaClient(dbUrl) {
|
|
9
|
+
// cache=shared is required because libsql's transaction() creates a
|
|
10
|
+
// new Database() internally. Without shared cache, the new connection
|
|
11
|
+
// gets a separate empty in-memory DB, silently breaking upsert/$transaction.
|
|
12
|
+
// The old `mode=memory` URL param is not supported by @prisma/adapter-libsql.
|
|
13
|
+
// Pass a file: URL (e.g. "file:./test.db") for persistent/debuggable storage.
|
|
14
|
+
const url = dbUrl ?? 'file::memory:?cache=shared';
|
|
15
|
+
const adapter = new PrismaLibSql({ url });
|
|
16
|
+
return new PrismaClient({ adapter });
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,iEAAiE;AACjE,kEAAkE;AAClE,kEAAkE;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,oEAAoE;IACpE,sEAAsE;IACtE,6EAA6E;IAC7E,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,GAAG,GAAG,KAAK,IAAI,4BAA4B,CAAA;IACjD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IACzC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type http from 'node:http';
|
|
2
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
3
|
+
import type { APIUser, APIGuild, APIGuildMember, APIChannel, APIMessage } from 'discord-api-types/v10';
|
|
4
|
+
interface ConnectedClient {
|
|
5
|
+
ws: WebSocket;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
sequence: number;
|
|
8
|
+
identified: boolean;
|
|
9
|
+
intents: number;
|
|
10
|
+
}
|
|
11
|
+
export interface GatewayGuildState {
|
|
12
|
+
id: string;
|
|
13
|
+
apiGuild: APIGuild;
|
|
14
|
+
joinedAt: string;
|
|
15
|
+
members: APIGuildMember[];
|
|
16
|
+
channels: APIChannel[];
|
|
17
|
+
}
|
|
18
|
+
export interface GatewayState {
|
|
19
|
+
botUser: APIUser;
|
|
20
|
+
guilds: GatewayGuildState[];
|
|
21
|
+
}
|
|
22
|
+
export declare class DiscordGateway {
|
|
23
|
+
wss: WebSocketServer;
|
|
24
|
+
clients: ConnectedClient[];
|
|
25
|
+
private loadState;
|
|
26
|
+
private port;
|
|
27
|
+
private expectedToken;
|
|
28
|
+
constructor({ httpServer, port, loadState, expectedToken, }: {
|
|
29
|
+
httpServer: http.Server;
|
|
30
|
+
port: number;
|
|
31
|
+
loadState: () => Promise<GatewayState>;
|
|
32
|
+
expectedToken: string;
|
|
33
|
+
});
|
|
34
|
+
broadcast<T>(event: string, data: T): void;
|
|
35
|
+
broadcastMessageCreate(message: APIMessage, guildId: string): void;
|
|
36
|
+
close(): void;
|
|
37
|
+
private send;
|
|
38
|
+
private sendHello;
|
|
39
|
+
private sendHeartbeatAck;
|
|
40
|
+
private sendDispatch;
|
|
41
|
+
private handleConnection;
|
|
42
|
+
private handleMessage;
|
|
43
|
+
private sendReadySequence;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAM/C,OAAO,KAAK,EAOV,OAAO,EACP,QAAQ,EACR,cAAc,EACd,UAAU,EACV,UAAU,EAKX,MAAM,uBAAuB,CAAA;AAE9B,UAAU,eAAe;IACvB,EAAE,EAAE,SAAS,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAC5B;AAED,qBAAa,cAAc;IACzB,GAAG,EAAE,eAAe,CAAA;IACpB,OAAO,EAAE,eAAe,EAAE,CAAK;IAC/B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,aAAa,CAAQ;gBAEjB,EACV,UAAU,EACV,IAAI,EACJ,SAAS,EACT,aAAa,GACd,EAAE;QACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;QACvB,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAA;QACtC,aAAa,EAAE,MAAM,CAAA;KACtB;IAUD,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAQ1C,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASlE,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,gBAAgB;YAuBV,aAAa;YA6Bb,iBAAiB;CAuDhC"}
|
package/dist/gateway.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// Discord Gateway WebSocket server.
|
|
2
|
+
// Implements the minimum Gateway protocol needed for discord.js to connect:
|
|
3
|
+
// Hello -> Identify -> Ready -> GUILD_CREATE, plus heartbeat keep-alive.
|
|
4
|
+
// REST routes call gateway.broadcast() to push events to connected clients.
|
|
5
|
+
import crypto from 'node:crypto';
|
|
6
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
7
|
+
import { GatewayOpcodes, GatewayDispatchEvents, ApplicationFlags, } from 'discord-api-types/v10';
|
|
8
|
+
export class DiscordGateway {
|
|
9
|
+
wss;
|
|
10
|
+
clients = [];
|
|
11
|
+
loadState;
|
|
12
|
+
port;
|
|
13
|
+
expectedToken;
|
|
14
|
+
constructor({ httpServer, port, loadState, expectedToken, }) {
|
|
15
|
+
this.port = port;
|
|
16
|
+
this.loadState = loadState;
|
|
17
|
+
this.expectedToken = expectedToken;
|
|
18
|
+
this.wss = new WebSocketServer({ server: httpServer, path: '/gateway' });
|
|
19
|
+
this.wss.on('connection', (ws) => {
|
|
20
|
+
this.handleConnection(ws);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
broadcast(event, data) {
|
|
24
|
+
for (const client of this.clients) {
|
|
25
|
+
if (client.identified) {
|
|
26
|
+
this.sendDispatch(client, event, data);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
broadcastMessageCreate(message, guildId) {
|
|
31
|
+
const data = {
|
|
32
|
+
...message,
|
|
33
|
+
guild_id: guildId,
|
|
34
|
+
mentions: [],
|
|
35
|
+
};
|
|
36
|
+
this.broadcast(GatewayDispatchEvents.MessageCreate, data);
|
|
37
|
+
}
|
|
38
|
+
close() {
|
|
39
|
+
for (const client of this.clients) {
|
|
40
|
+
client.ws.close();
|
|
41
|
+
}
|
|
42
|
+
this.clients = [];
|
|
43
|
+
this.wss.close();
|
|
44
|
+
}
|
|
45
|
+
send(client, payload) {
|
|
46
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
47
|
+
client.ws.send(JSON.stringify(payload));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
sendHello(client) {
|
|
51
|
+
this.send(client, {
|
|
52
|
+
op: GatewayOpcodes.Hello,
|
|
53
|
+
d: { heartbeat_interval: 45000 },
|
|
54
|
+
s: null,
|
|
55
|
+
t: null,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
sendHeartbeatAck(client) {
|
|
59
|
+
this.send(client, {
|
|
60
|
+
op: GatewayOpcodes.HeartbeatAck,
|
|
61
|
+
s: null,
|
|
62
|
+
t: null,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
sendDispatch(client, event, data) {
|
|
66
|
+
client.sequence++;
|
|
67
|
+
this.send(client, {
|
|
68
|
+
op: GatewayOpcodes.Dispatch,
|
|
69
|
+
t: event,
|
|
70
|
+
s: client.sequence,
|
|
71
|
+
d: data,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
handleConnection(ws) {
|
|
75
|
+
const client = {
|
|
76
|
+
ws,
|
|
77
|
+
sessionId: crypto.randomUUID(),
|
|
78
|
+
sequence: 0,
|
|
79
|
+
identified: false,
|
|
80
|
+
intents: 0,
|
|
81
|
+
};
|
|
82
|
+
this.clients.push(client);
|
|
83
|
+
this.sendHello(client);
|
|
84
|
+
ws.on('message', (raw) => {
|
|
85
|
+
void this.handleMessage(client, raw.toString());
|
|
86
|
+
});
|
|
87
|
+
ws.on('close', () => {
|
|
88
|
+
const idx = this.clients.indexOf(client);
|
|
89
|
+
if (idx !== -1) {
|
|
90
|
+
this.clients.splice(idx, 1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async handleMessage(client, raw) {
|
|
95
|
+
// JSON.parse returns unknown -- `as` is the only option for untyped JSON
|
|
96
|
+
const payload = JSON.parse(raw);
|
|
97
|
+
switch (payload.op) {
|
|
98
|
+
case GatewayOpcodes.Heartbeat: {
|
|
99
|
+
this.sendHeartbeatAck(client);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case GatewayOpcodes.Identify: {
|
|
103
|
+
// Switch on `op` narrows GatewaySendPayload to GatewayIdentify,
|
|
104
|
+
// so payload.d is already GatewayIdentifyData -- no cast needed
|
|
105
|
+
const { token, intents } = payload.d;
|
|
106
|
+
const cleanToken = token.replace(/^Bot\s+/i, '');
|
|
107
|
+
if (cleanToken !== this.expectedToken) {
|
|
108
|
+
client.ws.close(4004, 'Authentication failed');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
client.identified = true;
|
|
112
|
+
client.intents = intents;
|
|
113
|
+
await this.sendReadySequence(client);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async sendReadySequence(client) {
|
|
119
|
+
const state = await this.loadState();
|
|
120
|
+
const readyData = {
|
|
121
|
+
v: 10,
|
|
122
|
+
user: state.botUser,
|
|
123
|
+
guilds: state.guilds.map((g) => ({
|
|
124
|
+
id: g.id,
|
|
125
|
+
unavailable: true,
|
|
126
|
+
})),
|
|
127
|
+
session_id: client.sessionId,
|
|
128
|
+
resume_gateway_url: `ws://localhost:${this.port}/gateway`,
|
|
129
|
+
application: {
|
|
130
|
+
id: state.botUser.id,
|
|
131
|
+
flags: ApplicationFlags.GatewayPresence |
|
|
132
|
+
ApplicationFlags.GatewayGuildMembers |
|
|
133
|
+
ApplicationFlags.GatewayMessageContent,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
this.sendDispatch(client, GatewayDispatchEvents.Ready, readyData);
|
|
137
|
+
// Typed empty arrays so TS doesn't infer never[]
|
|
138
|
+
const emptyVoiceStates = [];
|
|
139
|
+
const emptyPresences = [];
|
|
140
|
+
const emptyStageInstances = [];
|
|
141
|
+
const emptyScheduledEvents = [];
|
|
142
|
+
const emptySoundboardSounds = [];
|
|
143
|
+
for (const guild of state.guilds) {
|
|
144
|
+
const guildData = {
|
|
145
|
+
...guild.apiGuild,
|
|
146
|
+
joined_at: guild.joinedAt,
|
|
147
|
+
large: false,
|
|
148
|
+
unavailable: false,
|
|
149
|
+
member_count: guild.members.length,
|
|
150
|
+
voice_states: emptyVoiceStates,
|
|
151
|
+
members: guild.members,
|
|
152
|
+
channels: guild.channels,
|
|
153
|
+
threads: [],
|
|
154
|
+
presences: emptyPresences,
|
|
155
|
+
stage_instances: emptyStageInstances,
|
|
156
|
+
guild_scheduled_events: emptyScheduledEvents,
|
|
157
|
+
soundboard_sounds: emptySoundboardSounds,
|
|
158
|
+
};
|
|
159
|
+
this.sendDispatch(client, GatewayDispatchEvents.GuildCreate, guildData);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as Prisma from './internal/prismaNamespaceBrowser.js';
|
|
2
|
+
export { Prisma };
|
|
3
|
+
export * as $Enums from './enums.js';
|
|
4
|
+
export * from './enums.js';
|
|
5
|
+
/**
|
|
6
|
+
* Model Guild
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
export type Guild = Prisma.GuildModel;
|
|
10
|
+
/**
|
|
11
|
+
* Model Channel
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
export type Channel = Prisma.ChannelModel;
|
|
15
|
+
/**
|
|
16
|
+
* Model Message
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
export type Message = Prisma.MessageModel;
|
|
20
|
+
/**
|
|
21
|
+
* Model User
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
export type User = Prisma.UserModel;
|
|
25
|
+
/**
|
|
26
|
+
* Model GuildMember
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
export type GuildMember = Prisma.GuildMemberModel;
|
|
30
|
+
/**
|
|
31
|
+
* Model Role
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
export type Role = Prisma.RoleModel;
|
|
35
|
+
/**
|
|
36
|
+
* Model Reaction
|
|
37
|
+
*
|
|
38
|
+
*/
|
|
39
|
+
export type Reaction = Prisma.ReactionModel;
|
|
40
|
+
/**
|
|
41
|
+
* Model ThreadMember
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
export type ThreadMember = Prisma.ThreadMemberModel;
|
|
45
|
+
/**
|
|
46
|
+
* Model ApplicationCommand
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
export type ApplicationCommand = Prisma.ApplicationCommandModel;
|
|
50
|
+
/**
|
|
51
|
+
* Model InteractionResponse
|
|
52
|
+
*
|
|
53
|
+
*/
|
|
54
|
+
export type InteractionResponse = Prisma.InteractionResponseModel;
|
|
55
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/generated/browser.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAC;AAC3B;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAA;AACrC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAA;AACjD;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAA;AAC3C;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAA;AACnD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAA;AAC/D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated file
|
|
4
|
+
// @ts-nocheck
|
|
5
|
+
/*
|
|
6
|
+
* This file should be your main import to use Prisma-related types and utilities in a browser.
|
|
7
|
+
* Use it to get access to models, enums, and input types.
|
|
8
|
+
*
|
|
9
|
+
* This file does not contain a `PrismaClient` class, nor several other helpers that are intended as server-side only.
|
|
10
|
+
* See `client.ts` for the standard, server-side entry point.
|
|
11
|
+
*
|
|
12
|
+
* 🟢 You can import this file directly.
|
|
13
|
+
*/
|
|
14
|
+
import * as Prisma from './internal/prismaNamespaceBrowser.js';
|
|
15
|
+
export { Prisma };
|
|
16
|
+
export * as $Enums from './enums.js';
|
|
17
|
+
export * from './enums.js';
|
|
18
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/generated/browser.ts"],"names":[],"mappings":"AACA,qEAAqE;AACrE,oBAAoB;AACpB,wCAAwC;AACxC,eAAe;AACf;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as runtime from "@prisma/client/runtime/client";
|
|
2
|
+
import * as $Class from "./internal/class.js";
|
|
3
|
+
import * as Prisma from "./internal/prismaNamespace.js";
|
|
4
|
+
export * as $Enums from './enums.js';
|
|
5
|
+
export * from "./enums.js";
|
|
6
|
+
/**
|
|
7
|
+
* ## Prisma Client
|
|
8
|
+
*
|
|
9
|
+
* Type-safe database client for TypeScript
|
|
10
|
+
* @example
|
|
11
|
+
* ```
|
|
12
|
+
* const prisma = new PrismaClient()
|
|
13
|
+
* // Fetch zero or more Guilds
|
|
14
|
+
* const guilds = await prisma.guild.findMany()
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Read more in our [docs](https://pris.ly/d/client).
|
|
18
|
+
*/
|
|
19
|
+
export declare const PrismaClient: $Class.PrismaClientConstructor;
|
|
20
|
+
export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>;
|
|
21
|
+
export { Prisma };
|
|
22
|
+
/**
|
|
23
|
+
* Model Guild
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
export type Guild = Prisma.GuildModel;
|
|
27
|
+
/**
|
|
28
|
+
* Model Channel
|
|
29
|
+
*
|
|
30
|
+
*/
|
|
31
|
+
export type Channel = Prisma.ChannelModel;
|
|
32
|
+
/**
|
|
33
|
+
* Model Message
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
export type Message = Prisma.MessageModel;
|
|
37
|
+
/**
|
|
38
|
+
* Model User
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
export type User = Prisma.UserModel;
|
|
42
|
+
/**
|
|
43
|
+
* Model GuildMember
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
export type GuildMember = Prisma.GuildMemberModel;
|
|
47
|
+
/**
|
|
48
|
+
* Model Role
|
|
49
|
+
*
|
|
50
|
+
*/
|
|
51
|
+
export type Role = Prisma.RoleModel;
|
|
52
|
+
/**
|
|
53
|
+
* Model Reaction
|
|
54
|
+
*
|
|
55
|
+
*/
|
|
56
|
+
export type Reaction = Prisma.ReactionModel;
|
|
57
|
+
/**
|
|
58
|
+
* Model ThreadMember
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
export type ThreadMember = Prisma.ThreadMemberModel;
|
|
62
|
+
/**
|
|
63
|
+
* Model ApplicationCommand
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
export type ApplicationCommand = Prisma.ApplicationCommandModel;
|
|
67
|
+
/**
|
|
68
|
+
* Model InteractionResponse
|
|
69
|
+
*
|
|
70
|
+
*/
|
|
71
|
+
export type InteractionResponse = Prisma.InteractionResponseModel;
|
|
72
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/generated/client.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAA;AAExD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,gCAAgC,CAAA;AACzD,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,SAAS,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;AAC3S,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAA;AACrC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;AACzC;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAA;AACjD;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;AACnC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAA;AAC3C;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAA;AACnD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAA;AAC/D;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated file
|
|
4
|
+
// @ts-nocheck
|
|
5
|
+
/*
|
|
6
|
+
* This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.
|
|
7
|
+
* If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.
|
|
8
|
+
*
|
|
9
|
+
* 🟢 You can import this file directly.
|
|
10
|
+
*/
|
|
11
|
+
import * as process from 'node:process';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
globalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
import * as runtime from "@prisma/client/runtime/client";
|
|
16
|
+
import * as $Enums from "./enums.js";
|
|
17
|
+
import * as $Class from "./internal/class.js";
|
|
18
|
+
import * as Prisma from "./internal/prismaNamespace.js";
|
|
19
|
+
export * as $Enums from './enums.js';
|
|
20
|
+
export * from "./enums.js";
|
|
21
|
+
/**
|
|
22
|
+
* ## Prisma Client
|
|
23
|
+
*
|
|
24
|
+
* Type-safe database client for TypeScript
|
|
25
|
+
* @example
|
|
26
|
+
* ```
|
|
27
|
+
* const prisma = new PrismaClient()
|
|
28
|
+
* // Fetch zero or more Guilds
|
|
29
|
+
* const guilds = await prisma.guild.findMany()
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Read more in our [docs](https://pris.ly/d/client).
|
|
33
|
+
*/
|
|
34
|
+
export const PrismaClient = $Class.getPrismaClientClass();
|
|
35
|
+
export { Prisma };
|
|
36
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/generated/client.ts"],"names":[],"mappings":"AACA,qEAAqE;AACrE,oBAAoB;AACpB,wCAAwC;AACxC,eAAe;AACf;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEtE,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAA;AACxD,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,KAAK,MAAM,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAA;AAEzD,OAAO,EAAE,MAAM,EAAE,CAAA"}
|