@playcademy/sdk 0.0.4 → 0.0.6
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/dist/index.d.ts +3998 -7
- package/dist/index.js +1770 -1750
- package/dist/types.d.ts +4224 -28
- package/dist/types.js +1 -748
- package/package.json +5 -3
- package/dist/core/auth/flows/popup.d.ts +0 -14
- package/dist/core/auth/flows/redirect.d.ts +0 -15
- package/dist/core/auth/flows/unified.d.ts +0 -11
- package/dist/core/auth/login.d.ts +0 -20
- package/dist/core/auth/oauth.d.ts +0 -115
- package/dist/core/auth/utils.d.ts +0 -23
- package/dist/core/cache/cooldown-cache.d.ts +0 -31
- package/dist/core/cache/index.d.ts +0 -14
- package/dist/core/cache/permanent-cache.d.ts +0 -39
- package/dist/core/cache/singleton-cache.d.ts +0 -29
- package/dist/core/cache/ttl-cache.d.ts +0 -54
- package/dist/core/cache/types.d.ts +0 -23
- package/dist/core/client.d.ts +0 -520
- package/dist/core/errors.d.ts +0 -11
- package/dist/core/namespaces/achievements.d.ts +0 -84
- package/dist/core/namespaces/admin.d.ts +0 -385
- package/dist/core/namespaces/auth.d.ts +0 -54
- package/dist/core/namespaces/character.d.ts +0 -205
- package/dist/core/namespaces/credits.d.ts +0 -51
- package/dist/core/namespaces/dev.d.ts +0 -323
- package/dist/core/namespaces/games.d.ts +0 -173
- package/dist/core/namespaces/identity.d.ts +0 -91
- package/dist/core/namespaces/index.d.ts +0 -19
- package/dist/core/namespaces/leaderboard.d.ts +0 -48
- package/dist/core/namespaces/levels.d.ts +0 -90
- package/dist/core/namespaces/maps.d.ts +0 -93
- package/dist/core/namespaces/realtime.client.d.ts +0 -129
- package/dist/core/namespaces/realtime.d.ts +0 -90
- package/dist/core/namespaces/runtime.d.ts +0 -222
- package/dist/core/namespaces/scores.d.ts +0 -55
- package/dist/core/namespaces/shop.d.ts +0 -25
- package/dist/core/namespaces/sprites.d.ts +0 -35
- package/dist/core/namespaces/telemetry.d.ts +0 -28
- package/dist/core/namespaces/timeback.d.ts +0 -111
- package/dist/core/namespaces/users.d.ts +0 -172
- package/dist/core/request.d.ts +0 -24
- package/dist/core/static/identity.d.ts +0 -37
- package/dist/core/static/index.d.ts +0 -3
- package/dist/core/static/init.d.ts +0 -21
- package/dist/core/static/login.d.ts +0 -34
- package/dist/messaging.d.ts +0 -544
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,4001 @@
|
|
|
1
|
+
import * as _playcademy_realtime_server_types from '@playcademy/realtime/server/types';
|
|
2
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
3
|
+
import * as drizzle_zod from 'drizzle-zod';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
|
-
*
|
|
7
|
+
* SDK Constants
|
|
8
|
+
* These are re-exported from @playcademy/data but defined here
|
|
9
|
+
* to avoid bundling issues with API Extractor
|
|
10
|
+
*/
|
|
11
|
+
declare const CURRENCIES: {
|
|
12
|
+
readonly PRIMARY: "PLAYCADEMY_CREDITS";
|
|
13
|
+
readonly XP: "PLAYCADEMY_XP";
|
|
14
|
+
};
|
|
15
|
+
declare const BADGES: {
|
|
16
|
+
readonly FOUNDING_MEMBER: "FOUNDING_MEMBER_BADGE";
|
|
17
|
+
readonly EARLY_ADOPTER: "EARLY_ADOPTER_BADGE";
|
|
18
|
+
readonly FIRST_GAME: "FIRST_GAME_BADGE";
|
|
19
|
+
};
|
|
20
|
+
declare const AuthProvider: {
|
|
21
|
+
readonly TIMEBACK: "TIMEBACK";
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
declare const users: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
25
|
+
name: "user";
|
|
26
|
+
schema: undefined;
|
|
27
|
+
columns: {
|
|
28
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
29
|
+
name: "id";
|
|
30
|
+
tableName: "user";
|
|
31
|
+
dataType: "string";
|
|
32
|
+
columnType: "PgText";
|
|
33
|
+
data: string;
|
|
34
|
+
driverParam: string;
|
|
35
|
+
notNull: true;
|
|
36
|
+
hasDefault: true;
|
|
37
|
+
isPrimaryKey: true;
|
|
38
|
+
isAutoincrement: false;
|
|
39
|
+
hasRuntimeDefault: true;
|
|
40
|
+
enumValues: [string, ...string[]];
|
|
41
|
+
baseColumn: never;
|
|
42
|
+
identity: undefined;
|
|
43
|
+
generated: undefined;
|
|
44
|
+
}, {}, {}>;
|
|
45
|
+
name: drizzle_orm_pg_core.PgColumn<{
|
|
46
|
+
name: "name";
|
|
47
|
+
tableName: "user";
|
|
48
|
+
dataType: "string";
|
|
49
|
+
columnType: "PgText";
|
|
50
|
+
data: string;
|
|
51
|
+
driverParam: string;
|
|
52
|
+
notNull: true;
|
|
53
|
+
hasDefault: false;
|
|
54
|
+
isPrimaryKey: false;
|
|
55
|
+
isAutoincrement: false;
|
|
56
|
+
hasRuntimeDefault: false;
|
|
57
|
+
enumValues: [string, ...string[]];
|
|
58
|
+
baseColumn: never;
|
|
59
|
+
identity: undefined;
|
|
60
|
+
generated: undefined;
|
|
61
|
+
}, {}, {}>;
|
|
62
|
+
username: drizzle_orm_pg_core.PgColumn<{
|
|
63
|
+
name: "username";
|
|
64
|
+
tableName: "user";
|
|
65
|
+
dataType: "string";
|
|
66
|
+
columnType: "PgText";
|
|
67
|
+
data: string;
|
|
68
|
+
driverParam: string;
|
|
69
|
+
notNull: false;
|
|
70
|
+
hasDefault: false;
|
|
71
|
+
isPrimaryKey: false;
|
|
72
|
+
isAutoincrement: false;
|
|
73
|
+
hasRuntimeDefault: false;
|
|
74
|
+
enumValues: [string, ...string[]];
|
|
75
|
+
baseColumn: never;
|
|
76
|
+
identity: undefined;
|
|
77
|
+
generated: undefined;
|
|
78
|
+
}, {}, {}>;
|
|
79
|
+
email: drizzle_orm_pg_core.PgColumn<{
|
|
80
|
+
name: "email";
|
|
81
|
+
tableName: "user";
|
|
82
|
+
dataType: "string";
|
|
83
|
+
columnType: "PgText";
|
|
84
|
+
data: string;
|
|
85
|
+
driverParam: string;
|
|
86
|
+
notNull: true;
|
|
87
|
+
hasDefault: false;
|
|
88
|
+
isPrimaryKey: false;
|
|
89
|
+
isAutoincrement: false;
|
|
90
|
+
hasRuntimeDefault: false;
|
|
91
|
+
enumValues: [string, ...string[]];
|
|
92
|
+
baseColumn: never;
|
|
93
|
+
identity: undefined;
|
|
94
|
+
generated: undefined;
|
|
95
|
+
}, {}, {}>;
|
|
96
|
+
timebackId: drizzle_orm_pg_core.PgColumn<{
|
|
97
|
+
name: "timeback_id";
|
|
98
|
+
tableName: "user";
|
|
99
|
+
dataType: "string";
|
|
100
|
+
columnType: "PgText";
|
|
101
|
+
data: string;
|
|
102
|
+
driverParam: string;
|
|
103
|
+
notNull: false;
|
|
104
|
+
hasDefault: false;
|
|
105
|
+
isPrimaryKey: false;
|
|
106
|
+
isAutoincrement: false;
|
|
107
|
+
hasRuntimeDefault: false;
|
|
108
|
+
enumValues: [string, ...string[]];
|
|
109
|
+
baseColumn: never;
|
|
110
|
+
identity: undefined;
|
|
111
|
+
generated: undefined;
|
|
112
|
+
}, {}, {}>;
|
|
113
|
+
emailVerified: drizzle_orm_pg_core.PgColumn<{
|
|
114
|
+
name: "email_verified";
|
|
115
|
+
tableName: "user";
|
|
116
|
+
dataType: "boolean";
|
|
117
|
+
columnType: "PgBoolean";
|
|
118
|
+
data: boolean;
|
|
119
|
+
driverParam: boolean;
|
|
120
|
+
notNull: true;
|
|
121
|
+
hasDefault: true;
|
|
122
|
+
isPrimaryKey: false;
|
|
123
|
+
isAutoincrement: false;
|
|
124
|
+
hasRuntimeDefault: false;
|
|
125
|
+
enumValues: undefined;
|
|
126
|
+
baseColumn: never;
|
|
127
|
+
identity: undefined;
|
|
128
|
+
generated: undefined;
|
|
129
|
+
}, {}, {}>;
|
|
130
|
+
image: drizzle_orm_pg_core.PgColumn<{
|
|
131
|
+
name: "image";
|
|
132
|
+
tableName: "user";
|
|
133
|
+
dataType: "string";
|
|
134
|
+
columnType: "PgText";
|
|
135
|
+
data: string;
|
|
136
|
+
driverParam: string;
|
|
137
|
+
notNull: false;
|
|
138
|
+
hasDefault: false;
|
|
139
|
+
isPrimaryKey: false;
|
|
140
|
+
isAutoincrement: false;
|
|
141
|
+
hasRuntimeDefault: false;
|
|
142
|
+
enumValues: [string, ...string[]];
|
|
143
|
+
baseColumn: never;
|
|
144
|
+
identity: undefined;
|
|
145
|
+
generated: undefined;
|
|
146
|
+
}, {}, {}>;
|
|
147
|
+
role: drizzle_orm_pg_core.PgColumn<{
|
|
148
|
+
name: "role";
|
|
149
|
+
tableName: "user";
|
|
150
|
+
dataType: "string";
|
|
151
|
+
columnType: "PgEnumColumn";
|
|
152
|
+
data: "admin" | "player" | "developer";
|
|
153
|
+
driverParam: string;
|
|
154
|
+
notNull: true;
|
|
155
|
+
hasDefault: true;
|
|
156
|
+
isPrimaryKey: false;
|
|
157
|
+
isAutoincrement: false;
|
|
158
|
+
hasRuntimeDefault: false;
|
|
159
|
+
enumValues: ["admin", "player", "developer"];
|
|
160
|
+
baseColumn: never;
|
|
161
|
+
identity: undefined;
|
|
162
|
+
generated: undefined;
|
|
163
|
+
}, {}, {}>;
|
|
164
|
+
developerStatus: drizzle_orm_pg_core.PgColumn<{
|
|
165
|
+
name: "developer_status";
|
|
166
|
+
tableName: "user";
|
|
167
|
+
dataType: "string";
|
|
168
|
+
columnType: "PgEnumColumn";
|
|
169
|
+
data: "none" | "pending" | "approved";
|
|
170
|
+
driverParam: string;
|
|
171
|
+
notNull: true;
|
|
172
|
+
hasDefault: true;
|
|
173
|
+
isPrimaryKey: false;
|
|
174
|
+
isAutoincrement: false;
|
|
175
|
+
hasRuntimeDefault: false;
|
|
176
|
+
enumValues: ["none", "pending", "approved"];
|
|
177
|
+
baseColumn: never;
|
|
178
|
+
identity: undefined;
|
|
179
|
+
generated: undefined;
|
|
180
|
+
}, {}, {}>;
|
|
181
|
+
characterCreated: drizzle_orm_pg_core.PgColumn<{
|
|
182
|
+
name: "character_created";
|
|
183
|
+
tableName: "user";
|
|
184
|
+
dataType: "boolean";
|
|
185
|
+
columnType: "PgBoolean";
|
|
186
|
+
data: boolean;
|
|
187
|
+
driverParam: boolean;
|
|
188
|
+
notNull: true;
|
|
189
|
+
hasDefault: true;
|
|
190
|
+
isPrimaryKey: false;
|
|
191
|
+
isAutoincrement: false;
|
|
192
|
+
hasRuntimeDefault: false;
|
|
193
|
+
enumValues: undefined;
|
|
194
|
+
baseColumn: never;
|
|
195
|
+
identity: undefined;
|
|
196
|
+
generated: undefined;
|
|
197
|
+
}, {}, {}>;
|
|
198
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
199
|
+
name: "created_at";
|
|
200
|
+
tableName: "user";
|
|
201
|
+
dataType: "date";
|
|
202
|
+
columnType: "PgTimestamp";
|
|
203
|
+
data: Date;
|
|
204
|
+
driverParam: string;
|
|
205
|
+
notNull: true;
|
|
206
|
+
hasDefault: false;
|
|
207
|
+
isPrimaryKey: false;
|
|
208
|
+
isAutoincrement: false;
|
|
209
|
+
hasRuntimeDefault: false;
|
|
210
|
+
enumValues: undefined;
|
|
211
|
+
baseColumn: never;
|
|
212
|
+
identity: undefined;
|
|
213
|
+
generated: undefined;
|
|
214
|
+
}, {}, {}>;
|
|
215
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
216
|
+
name: "updated_at";
|
|
217
|
+
tableName: "user";
|
|
218
|
+
dataType: "date";
|
|
219
|
+
columnType: "PgTimestamp";
|
|
220
|
+
data: Date;
|
|
221
|
+
driverParam: string;
|
|
222
|
+
notNull: true;
|
|
223
|
+
hasDefault: false;
|
|
224
|
+
isPrimaryKey: false;
|
|
225
|
+
isAutoincrement: false;
|
|
226
|
+
hasRuntimeDefault: false;
|
|
227
|
+
enumValues: undefined;
|
|
228
|
+
baseColumn: never;
|
|
229
|
+
identity: undefined;
|
|
230
|
+
generated: undefined;
|
|
231
|
+
}, {}, {}>;
|
|
232
|
+
};
|
|
233
|
+
dialect: "pg";
|
|
234
|
+
}>;
|
|
235
|
+
|
|
236
|
+
type GameMetadata = {
|
|
237
|
+
description?: string;
|
|
238
|
+
emoji?: string;
|
|
239
|
+
[key: string]: unknown;
|
|
240
|
+
};
|
|
241
|
+
declare const games: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
242
|
+
name: "games";
|
|
243
|
+
schema: undefined;
|
|
244
|
+
columns: {
|
|
245
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
246
|
+
name: "id";
|
|
247
|
+
tableName: "games";
|
|
248
|
+
dataType: "string";
|
|
249
|
+
columnType: "PgUUID";
|
|
250
|
+
data: string;
|
|
251
|
+
driverParam: string;
|
|
252
|
+
notNull: true;
|
|
253
|
+
hasDefault: true;
|
|
254
|
+
isPrimaryKey: true;
|
|
255
|
+
isAutoincrement: false;
|
|
256
|
+
hasRuntimeDefault: false;
|
|
257
|
+
enumValues: undefined;
|
|
258
|
+
baseColumn: never;
|
|
259
|
+
identity: undefined;
|
|
260
|
+
generated: undefined;
|
|
261
|
+
}, {}, {}>;
|
|
262
|
+
developerId: drizzle_orm_pg_core.PgColumn<{
|
|
263
|
+
name: "developer_id";
|
|
264
|
+
tableName: "games";
|
|
265
|
+
dataType: "string";
|
|
266
|
+
columnType: "PgText";
|
|
267
|
+
data: string;
|
|
268
|
+
driverParam: string;
|
|
269
|
+
notNull: false;
|
|
270
|
+
hasDefault: false;
|
|
271
|
+
isPrimaryKey: false;
|
|
272
|
+
isAutoincrement: false;
|
|
273
|
+
hasRuntimeDefault: false;
|
|
274
|
+
enumValues: [string, ...string[]];
|
|
275
|
+
baseColumn: never;
|
|
276
|
+
identity: undefined;
|
|
277
|
+
generated: undefined;
|
|
278
|
+
}, {}, {}>;
|
|
279
|
+
slug: drizzle_orm_pg_core.PgColumn<{
|
|
280
|
+
name: "slug";
|
|
281
|
+
tableName: "games";
|
|
282
|
+
dataType: "string";
|
|
283
|
+
columnType: "PgVarchar";
|
|
284
|
+
data: string;
|
|
285
|
+
driverParam: string;
|
|
286
|
+
notNull: true;
|
|
287
|
+
hasDefault: false;
|
|
288
|
+
isPrimaryKey: false;
|
|
289
|
+
isAutoincrement: false;
|
|
290
|
+
hasRuntimeDefault: false;
|
|
291
|
+
enumValues: [string, ...string[]];
|
|
292
|
+
baseColumn: never;
|
|
293
|
+
identity: undefined;
|
|
294
|
+
generated: undefined;
|
|
295
|
+
}, {}, {
|
|
296
|
+
length: 255;
|
|
297
|
+
}>;
|
|
298
|
+
displayName: drizzle_orm_pg_core.PgColumn<{
|
|
299
|
+
name: "display_name";
|
|
300
|
+
tableName: "games";
|
|
301
|
+
dataType: "string";
|
|
302
|
+
columnType: "PgVarchar";
|
|
303
|
+
data: string;
|
|
304
|
+
driverParam: string;
|
|
305
|
+
notNull: true;
|
|
306
|
+
hasDefault: false;
|
|
307
|
+
isPrimaryKey: false;
|
|
308
|
+
isAutoincrement: false;
|
|
309
|
+
hasRuntimeDefault: false;
|
|
310
|
+
enumValues: [string, ...string[]];
|
|
311
|
+
baseColumn: never;
|
|
312
|
+
identity: undefined;
|
|
313
|
+
generated: undefined;
|
|
314
|
+
}, {}, {
|
|
315
|
+
length: 255;
|
|
316
|
+
}>;
|
|
317
|
+
version: drizzle_orm_pg_core.PgColumn<{
|
|
318
|
+
name: "version";
|
|
319
|
+
tableName: "games";
|
|
320
|
+
dataType: "string";
|
|
321
|
+
columnType: "PgVarchar";
|
|
322
|
+
data: string;
|
|
323
|
+
driverParam: string;
|
|
324
|
+
notNull: true;
|
|
325
|
+
hasDefault: false;
|
|
326
|
+
isPrimaryKey: false;
|
|
327
|
+
isAutoincrement: false;
|
|
328
|
+
hasRuntimeDefault: false;
|
|
329
|
+
enumValues: [string, ...string[]];
|
|
330
|
+
baseColumn: never;
|
|
331
|
+
identity: undefined;
|
|
332
|
+
generated: undefined;
|
|
333
|
+
}, {}, {
|
|
334
|
+
length: 50;
|
|
335
|
+
}>;
|
|
336
|
+
gameType: drizzle_orm_pg_core.PgColumn<{
|
|
337
|
+
name: "game_type";
|
|
338
|
+
tableName: "games";
|
|
339
|
+
dataType: "string";
|
|
340
|
+
columnType: "PgEnumColumn";
|
|
341
|
+
data: "hosted" | "external";
|
|
342
|
+
driverParam: string;
|
|
343
|
+
notNull: true;
|
|
344
|
+
hasDefault: true;
|
|
345
|
+
isPrimaryKey: false;
|
|
346
|
+
isAutoincrement: false;
|
|
347
|
+
hasRuntimeDefault: false;
|
|
348
|
+
enumValues: ["hosted", "external"];
|
|
349
|
+
baseColumn: never;
|
|
350
|
+
identity: undefined;
|
|
351
|
+
generated: undefined;
|
|
352
|
+
}, {}, {}>;
|
|
353
|
+
assetBundleBase: drizzle_orm_pg_core.PgColumn<{
|
|
354
|
+
name: "asset_bundle_base";
|
|
355
|
+
tableName: "games";
|
|
356
|
+
dataType: "string";
|
|
357
|
+
columnType: "PgText";
|
|
358
|
+
data: string;
|
|
359
|
+
driverParam: string;
|
|
360
|
+
notNull: false;
|
|
361
|
+
hasDefault: false;
|
|
362
|
+
isPrimaryKey: false;
|
|
363
|
+
isAutoincrement: false;
|
|
364
|
+
hasRuntimeDefault: false;
|
|
365
|
+
enumValues: [string, ...string[]];
|
|
366
|
+
baseColumn: never;
|
|
367
|
+
identity: undefined;
|
|
368
|
+
generated: undefined;
|
|
369
|
+
}, {}, {}>;
|
|
370
|
+
externalUrl: drizzle_orm_pg_core.PgColumn<{
|
|
371
|
+
name: "external_url";
|
|
372
|
+
tableName: "games";
|
|
373
|
+
dataType: "string";
|
|
374
|
+
columnType: "PgText";
|
|
375
|
+
data: string;
|
|
376
|
+
driverParam: string;
|
|
377
|
+
notNull: false;
|
|
378
|
+
hasDefault: false;
|
|
379
|
+
isPrimaryKey: false;
|
|
380
|
+
isAutoincrement: false;
|
|
381
|
+
hasRuntimeDefault: false;
|
|
382
|
+
enumValues: [string, ...string[]];
|
|
383
|
+
baseColumn: never;
|
|
384
|
+
identity: undefined;
|
|
385
|
+
generated: undefined;
|
|
386
|
+
}, {}, {}>;
|
|
387
|
+
platform: drizzle_orm_pg_core.PgColumn<{
|
|
388
|
+
name: "platform";
|
|
389
|
+
tableName: "games";
|
|
390
|
+
dataType: "string";
|
|
391
|
+
columnType: "PgEnumColumn";
|
|
392
|
+
data: "web" | "godot" | "unity";
|
|
393
|
+
driverParam: string;
|
|
394
|
+
notNull: true;
|
|
395
|
+
hasDefault: true;
|
|
396
|
+
isPrimaryKey: false;
|
|
397
|
+
isAutoincrement: false;
|
|
398
|
+
hasRuntimeDefault: false;
|
|
399
|
+
enumValues: ["web", "godot", "unity"];
|
|
400
|
+
baseColumn: never;
|
|
401
|
+
identity: undefined;
|
|
402
|
+
generated: undefined;
|
|
403
|
+
}, {}, {}>;
|
|
404
|
+
mapElementId: drizzle_orm_pg_core.PgColumn<{
|
|
405
|
+
name: "map_element_id";
|
|
406
|
+
tableName: "games";
|
|
407
|
+
dataType: "string";
|
|
408
|
+
columnType: "PgUUID";
|
|
409
|
+
data: string;
|
|
410
|
+
driverParam: string;
|
|
411
|
+
notNull: false;
|
|
412
|
+
hasDefault: false;
|
|
413
|
+
isPrimaryKey: false;
|
|
414
|
+
isAutoincrement: false;
|
|
415
|
+
hasRuntimeDefault: false;
|
|
416
|
+
enumValues: undefined;
|
|
417
|
+
baseColumn: never;
|
|
418
|
+
identity: undefined;
|
|
419
|
+
generated: undefined;
|
|
420
|
+
}, {}, {}>;
|
|
421
|
+
metadata: drizzle_orm_pg_core.PgColumn<{
|
|
422
|
+
name: "metadata";
|
|
423
|
+
tableName: "games";
|
|
424
|
+
dataType: "json";
|
|
425
|
+
columnType: "PgJsonb";
|
|
426
|
+
data: GameMetadata;
|
|
427
|
+
driverParam: unknown;
|
|
428
|
+
notNull: true;
|
|
429
|
+
hasDefault: true;
|
|
430
|
+
isPrimaryKey: false;
|
|
431
|
+
isAutoincrement: false;
|
|
432
|
+
hasRuntimeDefault: false;
|
|
433
|
+
enumValues: undefined;
|
|
434
|
+
baseColumn: never;
|
|
435
|
+
identity: undefined;
|
|
436
|
+
generated: undefined;
|
|
437
|
+
}, {}, {
|
|
438
|
+
$type: GameMetadata;
|
|
439
|
+
}>;
|
|
440
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
441
|
+
name: "created_at";
|
|
442
|
+
tableName: "games";
|
|
443
|
+
dataType: "date";
|
|
444
|
+
columnType: "PgTimestamp";
|
|
445
|
+
data: Date;
|
|
446
|
+
driverParam: string;
|
|
447
|
+
notNull: false;
|
|
448
|
+
hasDefault: true;
|
|
449
|
+
isPrimaryKey: false;
|
|
450
|
+
isAutoincrement: false;
|
|
451
|
+
hasRuntimeDefault: false;
|
|
452
|
+
enumValues: undefined;
|
|
453
|
+
baseColumn: never;
|
|
454
|
+
identity: undefined;
|
|
455
|
+
generated: undefined;
|
|
456
|
+
}, {}, {}>;
|
|
457
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
458
|
+
name: "updated_at";
|
|
459
|
+
tableName: "games";
|
|
460
|
+
dataType: "date";
|
|
461
|
+
columnType: "PgTimestamp";
|
|
462
|
+
data: Date;
|
|
463
|
+
driverParam: string;
|
|
464
|
+
notNull: false;
|
|
465
|
+
hasDefault: true;
|
|
466
|
+
isPrimaryKey: false;
|
|
467
|
+
isAutoincrement: false;
|
|
468
|
+
hasRuntimeDefault: false;
|
|
469
|
+
enumValues: undefined;
|
|
470
|
+
baseColumn: never;
|
|
471
|
+
identity: undefined;
|
|
472
|
+
generated: undefined;
|
|
473
|
+
}, {}, {}>;
|
|
474
|
+
};
|
|
475
|
+
dialect: "pg";
|
|
476
|
+
}>;
|
|
477
|
+
declare const items: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
478
|
+
name: "items";
|
|
479
|
+
schema: undefined;
|
|
480
|
+
columns: {
|
|
481
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
482
|
+
name: "id";
|
|
483
|
+
tableName: "items";
|
|
484
|
+
dataType: "string";
|
|
485
|
+
columnType: "PgUUID";
|
|
486
|
+
data: string;
|
|
487
|
+
driverParam: string;
|
|
488
|
+
notNull: true;
|
|
489
|
+
hasDefault: true;
|
|
490
|
+
isPrimaryKey: true;
|
|
491
|
+
isAutoincrement: false;
|
|
492
|
+
hasRuntimeDefault: false;
|
|
493
|
+
enumValues: undefined;
|
|
494
|
+
baseColumn: never;
|
|
495
|
+
identity: undefined;
|
|
496
|
+
generated: undefined;
|
|
497
|
+
}, {}, {}>;
|
|
498
|
+
slug: drizzle_orm_pg_core.PgColumn<{
|
|
499
|
+
name: "slug";
|
|
500
|
+
tableName: "items";
|
|
501
|
+
dataType: "string";
|
|
502
|
+
columnType: "PgText";
|
|
503
|
+
data: string;
|
|
504
|
+
driverParam: string;
|
|
505
|
+
notNull: true;
|
|
506
|
+
hasDefault: false;
|
|
507
|
+
isPrimaryKey: false;
|
|
508
|
+
isAutoincrement: false;
|
|
509
|
+
hasRuntimeDefault: false;
|
|
510
|
+
enumValues: [string, ...string[]];
|
|
511
|
+
baseColumn: never;
|
|
512
|
+
identity: undefined;
|
|
513
|
+
generated: undefined;
|
|
514
|
+
}, {}, {}>;
|
|
515
|
+
gameId: drizzle_orm_pg_core.PgColumn<{
|
|
516
|
+
name: "game_id";
|
|
517
|
+
tableName: "items";
|
|
518
|
+
dataType: "string";
|
|
519
|
+
columnType: "PgUUID";
|
|
520
|
+
data: string;
|
|
521
|
+
driverParam: string;
|
|
522
|
+
notNull: false;
|
|
523
|
+
hasDefault: false;
|
|
524
|
+
isPrimaryKey: false;
|
|
525
|
+
isAutoincrement: false;
|
|
526
|
+
hasRuntimeDefault: false;
|
|
527
|
+
enumValues: undefined;
|
|
528
|
+
baseColumn: never;
|
|
529
|
+
identity: undefined;
|
|
530
|
+
generated: undefined;
|
|
531
|
+
}, {}, {}>;
|
|
532
|
+
displayName: drizzle_orm_pg_core.PgColumn<{
|
|
533
|
+
name: "display_name";
|
|
534
|
+
tableName: "items";
|
|
535
|
+
dataType: "string";
|
|
536
|
+
columnType: "PgText";
|
|
537
|
+
data: string;
|
|
538
|
+
driverParam: string;
|
|
539
|
+
notNull: true;
|
|
540
|
+
hasDefault: false;
|
|
541
|
+
isPrimaryKey: false;
|
|
542
|
+
isAutoincrement: false;
|
|
543
|
+
hasRuntimeDefault: false;
|
|
544
|
+
enumValues: [string, ...string[]];
|
|
545
|
+
baseColumn: never;
|
|
546
|
+
identity: undefined;
|
|
547
|
+
generated: undefined;
|
|
548
|
+
}, {}, {}>;
|
|
549
|
+
description: drizzle_orm_pg_core.PgColumn<{
|
|
550
|
+
name: "description";
|
|
551
|
+
tableName: "items";
|
|
552
|
+
dataType: "string";
|
|
553
|
+
columnType: "PgText";
|
|
554
|
+
data: string;
|
|
555
|
+
driverParam: string;
|
|
556
|
+
notNull: false;
|
|
557
|
+
hasDefault: false;
|
|
558
|
+
isPrimaryKey: false;
|
|
559
|
+
isAutoincrement: false;
|
|
560
|
+
hasRuntimeDefault: false;
|
|
561
|
+
enumValues: [string, ...string[]];
|
|
562
|
+
baseColumn: never;
|
|
563
|
+
identity: undefined;
|
|
564
|
+
generated: undefined;
|
|
565
|
+
}, {}, {}>;
|
|
566
|
+
type: drizzle_orm_pg_core.PgColumn<{
|
|
567
|
+
name: "type";
|
|
568
|
+
tableName: "items";
|
|
569
|
+
dataType: "string";
|
|
570
|
+
columnType: "PgEnumColumn";
|
|
571
|
+
data: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
|
|
572
|
+
driverParam: string;
|
|
573
|
+
notNull: true;
|
|
574
|
+
hasDefault: true;
|
|
575
|
+
isPrimaryKey: false;
|
|
576
|
+
isAutoincrement: false;
|
|
577
|
+
hasRuntimeDefault: false;
|
|
578
|
+
enumValues: ["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"];
|
|
579
|
+
baseColumn: never;
|
|
580
|
+
identity: undefined;
|
|
581
|
+
generated: undefined;
|
|
582
|
+
}, {}, {}>;
|
|
583
|
+
isPlaceable: drizzle_orm_pg_core.PgColumn<{
|
|
584
|
+
name: "is_placeable";
|
|
585
|
+
tableName: "items";
|
|
586
|
+
dataType: "boolean";
|
|
587
|
+
columnType: "PgBoolean";
|
|
588
|
+
data: boolean;
|
|
589
|
+
driverParam: boolean;
|
|
590
|
+
notNull: true;
|
|
591
|
+
hasDefault: true;
|
|
592
|
+
isPrimaryKey: false;
|
|
593
|
+
isAutoincrement: false;
|
|
594
|
+
hasRuntimeDefault: false;
|
|
595
|
+
enumValues: undefined;
|
|
596
|
+
baseColumn: never;
|
|
597
|
+
identity: undefined;
|
|
598
|
+
generated: undefined;
|
|
599
|
+
}, {}, {}>;
|
|
600
|
+
imageUrl: drizzle_orm_pg_core.PgColumn<{
|
|
601
|
+
name: "image_url";
|
|
602
|
+
tableName: "items";
|
|
603
|
+
dataType: "string";
|
|
604
|
+
columnType: "PgText";
|
|
605
|
+
data: string;
|
|
606
|
+
driverParam: string;
|
|
607
|
+
notNull: false;
|
|
608
|
+
hasDefault: false;
|
|
609
|
+
isPrimaryKey: false;
|
|
610
|
+
isAutoincrement: false;
|
|
611
|
+
hasRuntimeDefault: false;
|
|
612
|
+
enumValues: [string, ...string[]];
|
|
613
|
+
baseColumn: never;
|
|
614
|
+
identity: undefined;
|
|
615
|
+
generated: undefined;
|
|
616
|
+
}, {}, {}>;
|
|
617
|
+
metadata: drizzle_orm_pg_core.PgColumn<{
|
|
618
|
+
name: "metadata";
|
|
619
|
+
tableName: "items";
|
|
620
|
+
dataType: "json";
|
|
621
|
+
columnType: "PgJsonb";
|
|
622
|
+
data: unknown;
|
|
623
|
+
driverParam: unknown;
|
|
624
|
+
notNull: false;
|
|
625
|
+
hasDefault: true;
|
|
626
|
+
isPrimaryKey: false;
|
|
627
|
+
isAutoincrement: false;
|
|
628
|
+
hasRuntimeDefault: false;
|
|
629
|
+
enumValues: undefined;
|
|
630
|
+
baseColumn: never;
|
|
631
|
+
identity: undefined;
|
|
632
|
+
generated: undefined;
|
|
633
|
+
}, {}, {}>;
|
|
634
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
635
|
+
name: "created_at";
|
|
636
|
+
tableName: "items";
|
|
637
|
+
dataType: "date";
|
|
638
|
+
columnType: "PgTimestamp";
|
|
639
|
+
data: Date;
|
|
640
|
+
driverParam: string;
|
|
641
|
+
notNull: true;
|
|
642
|
+
hasDefault: true;
|
|
643
|
+
isPrimaryKey: false;
|
|
644
|
+
isAutoincrement: false;
|
|
645
|
+
hasRuntimeDefault: false;
|
|
646
|
+
enumValues: undefined;
|
|
647
|
+
baseColumn: never;
|
|
648
|
+
identity: undefined;
|
|
649
|
+
generated: undefined;
|
|
650
|
+
}, {}, {}>;
|
|
651
|
+
};
|
|
652
|
+
dialect: "pg";
|
|
653
|
+
}>;
|
|
654
|
+
declare const inventoryItems: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
655
|
+
name: "inventory_items";
|
|
656
|
+
schema: undefined;
|
|
657
|
+
columns: {
|
|
658
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
659
|
+
name: "id";
|
|
660
|
+
tableName: "inventory_items";
|
|
661
|
+
dataType: "string";
|
|
662
|
+
columnType: "PgUUID";
|
|
663
|
+
data: string;
|
|
664
|
+
driverParam: string;
|
|
665
|
+
notNull: true;
|
|
666
|
+
hasDefault: true;
|
|
667
|
+
isPrimaryKey: true;
|
|
668
|
+
isAutoincrement: false;
|
|
669
|
+
hasRuntimeDefault: false;
|
|
670
|
+
enumValues: undefined;
|
|
671
|
+
baseColumn: never;
|
|
672
|
+
identity: undefined;
|
|
673
|
+
generated: undefined;
|
|
674
|
+
}, {}, {}>;
|
|
675
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
676
|
+
name: "user_id";
|
|
677
|
+
tableName: "inventory_items";
|
|
678
|
+
dataType: "string";
|
|
679
|
+
columnType: "PgText";
|
|
680
|
+
data: string;
|
|
681
|
+
driverParam: string;
|
|
682
|
+
notNull: true;
|
|
683
|
+
hasDefault: false;
|
|
684
|
+
isPrimaryKey: false;
|
|
685
|
+
isAutoincrement: false;
|
|
686
|
+
hasRuntimeDefault: false;
|
|
687
|
+
enumValues: [string, ...string[]];
|
|
688
|
+
baseColumn: never;
|
|
689
|
+
identity: undefined;
|
|
690
|
+
generated: undefined;
|
|
691
|
+
}, {}, {}>;
|
|
692
|
+
itemId: drizzle_orm_pg_core.PgColumn<{
|
|
693
|
+
name: "item_id";
|
|
694
|
+
tableName: "inventory_items";
|
|
695
|
+
dataType: "string";
|
|
696
|
+
columnType: "PgUUID";
|
|
697
|
+
data: string;
|
|
698
|
+
driverParam: string;
|
|
699
|
+
notNull: true;
|
|
700
|
+
hasDefault: false;
|
|
701
|
+
isPrimaryKey: false;
|
|
702
|
+
isAutoincrement: false;
|
|
703
|
+
hasRuntimeDefault: false;
|
|
704
|
+
enumValues: undefined;
|
|
705
|
+
baseColumn: never;
|
|
706
|
+
identity: undefined;
|
|
707
|
+
generated: undefined;
|
|
708
|
+
}, {}, {}>;
|
|
709
|
+
quantity: drizzle_orm_pg_core.PgColumn<{
|
|
710
|
+
name: "quantity";
|
|
711
|
+
tableName: "inventory_items";
|
|
712
|
+
dataType: "number";
|
|
713
|
+
columnType: "PgInteger";
|
|
714
|
+
data: number;
|
|
715
|
+
driverParam: string | number;
|
|
716
|
+
notNull: true;
|
|
717
|
+
hasDefault: true;
|
|
718
|
+
isPrimaryKey: false;
|
|
719
|
+
isAutoincrement: false;
|
|
720
|
+
hasRuntimeDefault: false;
|
|
721
|
+
enumValues: undefined;
|
|
722
|
+
baseColumn: never;
|
|
723
|
+
identity: undefined;
|
|
724
|
+
generated: undefined;
|
|
725
|
+
}, {}, {}>;
|
|
726
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
727
|
+
name: "updated_at";
|
|
728
|
+
tableName: "inventory_items";
|
|
729
|
+
dataType: "date";
|
|
730
|
+
columnType: "PgTimestamp";
|
|
731
|
+
data: Date;
|
|
732
|
+
driverParam: string;
|
|
733
|
+
notNull: false;
|
|
734
|
+
hasDefault: true;
|
|
735
|
+
isPrimaryKey: false;
|
|
736
|
+
isAutoincrement: false;
|
|
737
|
+
hasRuntimeDefault: false;
|
|
738
|
+
enumValues: undefined;
|
|
739
|
+
baseColumn: never;
|
|
740
|
+
identity: undefined;
|
|
741
|
+
generated: undefined;
|
|
742
|
+
}, {}, {}>;
|
|
743
|
+
};
|
|
744
|
+
dialect: "pg";
|
|
745
|
+
}>;
|
|
746
|
+
declare const shopListings: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
747
|
+
name: "shop_listings";
|
|
748
|
+
schema: undefined;
|
|
749
|
+
columns: {
|
|
750
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
751
|
+
name: "id";
|
|
752
|
+
tableName: "shop_listings";
|
|
753
|
+
dataType: "string";
|
|
754
|
+
columnType: "PgUUID";
|
|
755
|
+
data: string;
|
|
756
|
+
driverParam: string;
|
|
757
|
+
notNull: true;
|
|
758
|
+
hasDefault: true;
|
|
759
|
+
isPrimaryKey: true;
|
|
760
|
+
isAutoincrement: false;
|
|
761
|
+
hasRuntimeDefault: false;
|
|
762
|
+
enumValues: undefined;
|
|
763
|
+
baseColumn: never;
|
|
764
|
+
identity: undefined;
|
|
765
|
+
generated: undefined;
|
|
766
|
+
}, {}, {}>;
|
|
767
|
+
itemId: drizzle_orm_pg_core.PgColumn<{
|
|
768
|
+
name: "item_id";
|
|
769
|
+
tableName: "shop_listings";
|
|
770
|
+
dataType: "string";
|
|
771
|
+
columnType: "PgUUID";
|
|
772
|
+
data: string;
|
|
773
|
+
driverParam: string;
|
|
774
|
+
notNull: true;
|
|
775
|
+
hasDefault: false;
|
|
776
|
+
isPrimaryKey: false;
|
|
777
|
+
isAutoincrement: false;
|
|
778
|
+
hasRuntimeDefault: false;
|
|
779
|
+
enumValues: undefined;
|
|
780
|
+
baseColumn: never;
|
|
781
|
+
identity: undefined;
|
|
782
|
+
generated: undefined;
|
|
783
|
+
}, {}, {}>;
|
|
784
|
+
currencyId: drizzle_orm_pg_core.PgColumn<{
|
|
785
|
+
name: "currency_id";
|
|
786
|
+
tableName: "shop_listings";
|
|
787
|
+
dataType: "string";
|
|
788
|
+
columnType: "PgUUID";
|
|
789
|
+
data: string;
|
|
790
|
+
driverParam: string;
|
|
791
|
+
notNull: true;
|
|
792
|
+
hasDefault: false;
|
|
793
|
+
isPrimaryKey: false;
|
|
794
|
+
isAutoincrement: false;
|
|
795
|
+
hasRuntimeDefault: false;
|
|
796
|
+
enumValues: undefined;
|
|
797
|
+
baseColumn: never;
|
|
798
|
+
identity: undefined;
|
|
799
|
+
generated: undefined;
|
|
800
|
+
}, {}, {}>;
|
|
801
|
+
price: drizzle_orm_pg_core.PgColumn<{
|
|
802
|
+
name: "price";
|
|
803
|
+
tableName: "shop_listings";
|
|
804
|
+
dataType: "number";
|
|
805
|
+
columnType: "PgInteger";
|
|
806
|
+
data: number;
|
|
807
|
+
driverParam: string | number;
|
|
808
|
+
notNull: true;
|
|
809
|
+
hasDefault: false;
|
|
810
|
+
isPrimaryKey: false;
|
|
811
|
+
isAutoincrement: false;
|
|
812
|
+
hasRuntimeDefault: false;
|
|
813
|
+
enumValues: undefined;
|
|
814
|
+
baseColumn: never;
|
|
815
|
+
identity: undefined;
|
|
816
|
+
generated: undefined;
|
|
817
|
+
}, {}, {}>;
|
|
818
|
+
sellBackPercentage: drizzle_orm_pg_core.PgColumn<{
|
|
819
|
+
name: "sell_back_percentage";
|
|
820
|
+
tableName: "shop_listings";
|
|
821
|
+
dataType: "number";
|
|
822
|
+
columnType: "PgInteger";
|
|
823
|
+
data: number;
|
|
824
|
+
driverParam: string | number;
|
|
825
|
+
notNull: false;
|
|
826
|
+
hasDefault: false;
|
|
827
|
+
isPrimaryKey: false;
|
|
828
|
+
isAutoincrement: false;
|
|
829
|
+
hasRuntimeDefault: false;
|
|
830
|
+
enumValues: undefined;
|
|
831
|
+
baseColumn: never;
|
|
832
|
+
identity: undefined;
|
|
833
|
+
generated: undefined;
|
|
834
|
+
}, {}, {}>;
|
|
835
|
+
stock: drizzle_orm_pg_core.PgColumn<{
|
|
836
|
+
name: "stock";
|
|
837
|
+
tableName: "shop_listings";
|
|
838
|
+
dataType: "number";
|
|
839
|
+
columnType: "PgInteger";
|
|
840
|
+
data: number;
|
|
841
|
+
driverParam: string | number;
|
|
842
|
+
notNull: false;
|
|
843
|
+
hasDefault: false;
|
|
844
|
+
isPrimaryKey: false;
|
|
845
|
+
isAutoincrement: false;
|
|
846
|
+
hasRuntimeDefault: false;
|
|
847
|
+
enumValues: undefined;
|
|
848
|
+
baseColumn: never;
|
|
849
|
+
identity: undefined;
|
|
850
|
+
generated: undefined;
|
|
851
|
+
}, {}, {}>;
|
|
852
|
+
isActive: drizzle_orm_pg_core.PgColumn<{
|
|
853
|
+
name: "is_active";
|
|
854
|
+
tableName: "shop_listings";
|
|
855
|
+
dataType: "boolean";
|
|
856
|
+
columnType: "PgBoolean";
|
|
857
|
+
data: boolean;
|
|
858
|
+
driverParam: boolean;
|
|
859
|
+
notNull: true;
|
|
860
|
+
hasDefault: true;
|
|
861
|
+
isPrimaryKey: false;
|
|
862
|
+
isAutoincrement: false;
|
|
863
|
+
hasRuntimeDefault: false;
|
|
864
|
+
enumValues: undefined;
|
|
865
|
+
baseColumn: never;
|
|
866
|
+
identity: undefined;
|
|
867
|
+
generated: undefined;
|
|
868
|
+
}, {}, {}>;
|
|
869
|
+
availableFrom: drizzle_orm_pg_core.PgColumn<{
|
|
870
|
+
name: "available_from";
|
|
871
|
+
tableName: "shop_listings";
|
|
872
|
+
dataType: "date";
|
|
873
|
+
columnType: "PgTimestamp";
|
|
874
|
+
data: Date;
|
|
875
|
+
driverParam: string;
|
|
876
|
+
notNull: false;
|
|
877
|
+
hasDefault: false;
|
|
878
|
+
isPrimaryKey: false;
|
|
879
|
+
isAutoincrement: false;
|
|
880
|
+
hasRuntimeDefault: false;
|
|
881
|
+
enumValues: undefined;
|
|
882
|
+
baseColumn: never;
|
|
883
|
+
identity: undefined;
|
|
884
|
+
generated: undefined;
|
|
885
|
+
}, {}, {}>;
|
|
886
|
+
availableUntil: drizzle_orm_pg_core.PgColumn<{
|
|
887
|
+
name: "available_until";
|
|
888
|
+
tableName: "shop_listings";
|
|
889
|
+
dataType: "date";
|
|
890
|
+
columnType: "PgTimestamp";
|
|
891
|
+
data: Date;
|
|
892
|
+
driverParam: string;
|
|
893
|
+
notNull: false;
|
|
894
|
+
hasDefault: false;
|
|
895
|
+
isPrimaryKey: false;
|
|
896
|
+
isAutoincrement: false;
|
|
897
|
+
hasRuntimeDefault: false;
|
|
898
|
+
enumValues: undefined;
|
|
899
|
+
baseColumn: never;
|
|
900
|
+
identity: undefined;
|
|
901
|
+
generated: undefined;
|
|
902
|
+
}, {}, {}>;
|
|
903
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
904
|
+
name: "created_at";
|
|
905
|
+
tableName: "shop_listings";
|
|
906
|
+
dataType: "date";
|
|
907
|
+
columnType: "PgTimestamp";
|
|
908
|
+
data: Date;
|
|
909
|
+
driverParam: string;
|
|
910
|
+
notNull: true;
|
|
911
|
+
hasDefault: true;
|
|
912
|
+
isPrimaryKey: false;
|
|
913
|
+
isAutoincrement: false;
|
|
914
|
+
hasRuntimeDefault: false;
|
|
915
|
+
enumValues: undefined;
|
|
916
|
+
baseColumn: never;
|
|
917
|
+
identity: undefined;
|
|
918
|
+
generated: undefined;
|
|
919
|
+
}, {}, {}>;
|
|
920
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
921
|
+
name: "updated_at";
|
|
922
|
+
tableName: "shop_listings";
|
|
923
|
+
dataType: "date";
|
|
924
|
+
columnType: "PgTimestamp";
|
|
925
|
+
data: Date;
|
|
926
|
+
driverParam: string;
|
|
927
|
+
notNull: false;
|
|
928
|
+
hasDefault: true;
|
|
929
|
+
isPrimaryKey: false;
|
|
930
|
+
isAutoincrement: false;
|
|
931
|
+
hasRuntimeDefault: false;
|
|
932
|
+
enumValues: undefined;
|
|
933
|
+
baseColumn: never;
|
|
934
|
+
identity: undefined;
|
|
935
|
+
generated: undefined;
|
|
936
|
+
}, {}, {}>;
|
|
937
|
+
};
|
|
938
|
+
dialect: "pg";
|
|
939
|
+
}>;
|
|
940
|
+
declare const mapElements: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
941
|
+
name: "map_elements";
|
|
942
|
+
schema: undefined;
|
|
943
|
+
columns: {
|
|
944
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
945
|
+
name: "id";
|
|
946
|
+
tableName: "map_elements";
|
|
947
|
+
dataType: "string";
|
|
948
|
+
columnType: "PgUUID";
|
|
949
|
+
data: string;
|
|
950
|
+
driverParam: string;
|
|
951
|
+
notNull: true;
|
|
952
|
+
hasDefault: true;
|
|
953
|
+
isPrimaryKey: true;
|
|
954
|
+
isAutoincrement: false;
|
|
955
|
+
hasRuntimeDefault: false;
|
|
956
|
+
enumValues: undefined;
|
|
957
|
+
baseColumn: never;
|
|
958
|
+
identity: undefined;
|
|
959
|
+
generated: undefined;
|
|
960
|
+
}, {}, {}>;
|
|
961
|
+
mapId: drizzle_orm_pg_core.PgColumn<{
|
|
962
|
+
name: "map_id";
|
|
963
|
+
tableName: "map_elements";
|
|
964
|
+
dataType: "string";
|
|
965
|
+
columnType: "PgUUID";
|
|
966
|
+
data: string;
|
|
967
|
+
driverParam: string;
|
|
968
|
+
notNull: false;
|
|
969
|
+
hasDefault: false;
|
|
970
|
+
isPrimaryKey: false;
|
|
971
|
+
isAutoincrement: false;
|
|
972
|
+
hasRuntimeDefault: false;
|
|
973
|
+
enumValues: undefined;
|
|
974
|
+
baseColumn: never;
|
|
975
|
+
identity: undefined;
|
|
976
|
+
generated: undefined;
|
|
977
|
+
}, {}, {}>;
|
|
978
|
+
elementSlug: drizzle_orm_pg_core.PgColumn<{
|
|
979
|
+
name: "element_slug";
|
|
980
|
+
tableName: "map_elements";
|
|
981
|
+
dataType: "string";
|
|
982
|
+
columnType: "PgVarchar";
|
|
983
|
+
data: string;
|
|
984
|
+
driverParam: string;
|
|
985
|
+
notNull: true;
|
|
986
|
+
hasDefault: false;
|
|
987
|
+
isPrimaryKey: false;
|
|
988
|
+
isAutoincrement: false;
|
|
989
|
+
hasRuntimeDefault: false;
|
|
990
|
+
enumValues: [string, ...string[]];
|
|
991
|
+
baseColumn: never;
|
|
992
|
+
identity: undefined;
|
|
993
|
+
generated: undefined;
|
|
994
|
+
}, {}, {
|
|
995
|
+
length: 255;
|
|
996
|
+
}>;
|
|
997
|
+
interactionType: drizzle_orm_pg_core.PgColumn<{
|
|
998
|
+
name: "interaction_type";
|
|
999
|
+
tableName: "map_elements";
|
|
1000
|
+
dataType: "string";
|
|
1001
|
+
columnType: "PgEnumColumn";
|
|
1002
|
+
data: "game_entry" | "game_registry" | "info" | "teleport" | "door_in" | "door_out" | "npc_interaction" | "quest_trigger";
|
|
1003
|
+
driverParam: string;
|
|
1004
|
+
notNull: true;
|
|
1005
|
+
hasDefault: false;
|
|
1006
|
+
isPrimaryKey: false;
|
|
1007
|
+
isAutoincrement: false;
|
|
1008
|
+
hasRuntimeDefault: false;
|
|
1009
|
+
enumValues: ["game_entry", "game_registry", "info", "teleport", "door_in", "door_out", "npc_interaction", "quest_trigger"];
|
|
1010
|
+
baseColumn: never;
|
|
1011
|
+
identity: undefined;
|
|
1012
|
+
generated: undefined;
|
|
1013
|
+
}, {}, {}>;
|
|
1014
|
+
gameId: drizzle_orm_pg_core.PgColumn<{
|
|
1015
|
+
name: "game_id";
|
|
1016
|
+
tableName: "map_elements";
|
|
1017
|
+
dataType: "string";
|
|
1018
|
+
columnType: "PgUUID";
|
|
1019
|
+
data: string;
|
|
1020
|
+
driverParam: string;
|
|
1021
|
+
notNull: false;
|
|
1022
|
+
hasDefault: false;
|
|
1023
|
+
isPrimaryKey: false;
|
|
1024
|
+
isAutoincrement: false;
|
|
1025
|
+
hasRuntimeDefault: false;
|
|
1026
|
+
enumValues: undefined;
|
|
1027
|
+
baseColumn: never;
|
|
1028
|
+
identity: undefined;
|
|
1029
|
+
generated: undefined;
|
|
1030
|
+
}, {}, {}>;
|
|
1031
|
+
metadata: drizzle_orm_pg_core.PgColumn<{
|
|
1032
|
+
name: "metadata";
|
|
1033
|
+
tableName: "map_elements";
|
|
1034
|
+
dataType: "json";
|
|
1035
|
+
columnType: "PgJsonb";
|
|
1036
|
+
data: Record<string, unknown>;
|
|
1037
|
+
driverParam: unknown;
|
|
1038
|
+
notNull: false;
|
|
1039
|
+
hasDefault: true;
|
|
1040
|
+
isPrimaryKey: false;
|
|
1041
|
+
isAutoincrement: false;
|
|
1042
|
+
hasRuntimeDefault: false;
|
|
1043
|
+
enumValues: undefined;
|
|
1044
|
+
baseColumn: never;
|
|
1045
|
+
identity: undefined;
|
|
1046
|
+
generated: undefined;
|
|
1047
|
+
}, {}, {
|
|
1048
|
+
$type: Record<string, unknown>;
|
|
1049
|
+
}>;
|
|
1050
|
+
};
|
|
1051
|
+
dialect: "pg";
|
|
1052
|
+
}>;
|
|
1053
|
+
declare const mapObjects: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
1054
|
+
name: "map_objects";
|
|
1055
|
+
schema: undefined;
|
|
1056
|
+
columns: {
|
|
1057
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
1058
|
+
name: "id";
|
|
1059
|
+
tableName: "map_objects";
|
|
1060
|
+
dataType: "string";
|
|
1061
|
+
columnType: "PgUUID";
|
|
1062
|
+
data: string;
|
|
1063
|
+
driverParam: string;
|
|
1064
|
+
notNull: true;
|
|
1065
|
+
hasDefault: true;
|
|
1066
|
+
isPrimaryKey: true;
|
|
1067
|
+
isAutoincrement: false;
|
|
1068
|
+
hasRuntimeDefault: false;
|
|
1069
|
+
enumValues: undefined;
|
|
1070
|
+
baseColumn: never;
|
|
1071
|
+
identity: undefined;
|
|
1072
|
+
generated: undefined;
|
|
1073
|
+
}, {}, {}>;
|
|
1074
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
1075
|
+
name: "user_id";
|
|
1076
|
+
tableName: "map_objects";
|
|
1077
|
+
dataType: "string";
|
|
1078
|
+
columnType: "PgText";
|
|
1079
|
+
data: string;
|
|
1080
|
+
driverParam: string;
|
|
1081
|
+
notNull: true;
|
|
1082
|
+
hasDefault: false;
|
|
1083
|
+
isPrimaryKey: false;
|
|
1084
|
+
isAutoincrement: false;
|
|
1085
|
+
hasRuntimeDefault: false;
|
|
1086
|
+
enumValues: [string, ...string[]];
|
|
1087
|
+
baseColumn: never;
|
|
1088
|
+
identity: undefined;
|
|
1089
|
+
generated: undefined;
|
|
1090
|
+
}, {}, {}>;
|
|
1091
|
+
mapId: drizzle_orm_pg_core.PgColumn<{
|
|
1092
|
+
name: "map_id";
|
|
1093
|
+
tableName: "map_objects";
|
|
1094
|
+
dataType: "string";
|
|
1095
|
+
columnType: "PgUUID";
|
|
1096
|
+
data: string;
|
|
1097
|
+
driverParam: string;
|
|
1098
|
+
notNull: true;
|
|
1099
|
+
hasDefault: false;
|
|
1100
|
+
isPrimaryKey: false;
|
|
1101
|
+
isAutoincrement: false;
|
|
1102
|
+
hasRuntimeDefault: false;
|
|
1103
|
+
enumValues: undefined;
|
|
1104
|
+
baseColumn: never;
|
|
1105
|
+
identity: undefined;
|
|
1106
|
+
generated: undefined;
|
|
1107
|
+
}, {}, {}>;
|
|
1108
|
+
itemId: drizzle_orm_pg_core.PgColumn<{
|
|
1109
|
+
name: "item_id";
|
|
1110
|
+
tableName: "map_objects";
|
|
1111
|
+
dataType: "string";
|
|
1112
|
+
columnType: "PgUUID";
|
|
1113
|
+
data: string;
|
|
1114
|
+
driverParam: string;
|
|
1115
|
+
notNull: true;
|
|
1116
|
+
hasDefault: false;
|
|
1117
|
+
isPrimaryKey: false;
|
|
1118
|
+
isAutoincrement: false;
|
|
1119
|
+
hasRuntimeDefault: false;
|
|
1120
|
+
enumValues: undefined;
|
|
1121
|
+
baseColumn: never;
|
|
1122
|
+
identity: undefined;
|
|
1123
|
+
generated: undefined;
|
|
1124
|
+
}, {}, {}>;
|
|
1125
|
+
worldX: drizzle_orm_pg_core.PgColumn<{
|
|
1126
|
+
name: "world_x";
|
|
1127
|
+
tableName: "map_objects";
|
|
1128
|
+
dataType: "number";
|
|
1129
|
+
columnType: "PgDoublePrecision";
|
|
1130
|
+
data: number;
|
|
1131
|
+
driverParam: string | number;
|
|
1132
|
+
notNull: true;
|
|
1133
|
+
hasDefault: false;
|
|
1134
|
+
isPrimaryKey: false;
|
|
1135
|
+
isAutoincrement: false;
|
|
1136
|
+
hasRuntimeDefault: false;
|
|
1137
|
+
enumValues: undefined;
|
|
1138
|
+
baseColumn: never;
|
|
1139
|
+
identity: undefined;
|
|
1140
|
+
generated: undefined;
|
|
1141
|
+
}, {}, {}>;
|
|
1142
|
+
worldY: drizzle_orm_pg_core.PgColumn<{
|
|
1143
|
+
name: "world_y";
|
|
1144
|
+
tableName: "map_objects";
|
|
1145
|
+
dataType: "number";
|
|
1146
|
+
columnType: "PgDoublePrecision";
|
|
1147
|
+
data: number;
|
|
1148
|
+
driverParam: string | number;
|
|
1149
|
+
notNull: true;
|
|
1150
|
+
hasDefault: false;
|
|
1151
|
+
isPrimaryKey: false;
|
|
1152
|
+
isAutoincrement: false;
|
|
1153
|
+
hasRuntimeDefault: false;
|
|
1154
|
+
enumValues: undefined;
|
|
1155
|
+
baseColumn: never;
|
|
1156
|
+
identity: undefined;
|
|
1157
|
+
generated: undefined;
|
|
1158
|
+
}, {}, {}>;
|
|
1159
|
+
rotation: drizzle_orm_pg_core.PgColumn<{
|
|
1160
|
+
name: "rotation";
|
|
1161
|
+
tableName: "map_objects";
|
|
1162
|
+
dataType: "number";
|
|
1163
|
+
columnType: "PgInteger";
|
|
1164
|
+
data: number;
|
|
1165
|
+
driverParam: string | number;
|
|
1166
|
+
notNull: true;
|
|
1167
|
+
hasDefault: true;
|
|
1168
|
+
isPrimaryKey: false;
|
|
1169
|
+
isAutoincrement: false;
|
|
1170
|
+
hasRuntimeDefault: false;
|
|
1171
|
+
enumValues: undefined;
|
|
1172
|
+
baseColumn: never;
|
|
1173
|
+
identity: undefined;
|
|
1174
|
+
generated: undefined;
|
|
1175
|
+
}, {}, {}>;
|
|
1176
|
+
scale: drizzle_orm_pg_core.PgColumn<{
|
|
1177
|
+
name: "scale";
|
|
1178
|
+
tableName: "map_objects";
|
|
1179
|
+
dataType: "number";
|
|
1180
|
+
columnType: "PgDoublePrecision";
|
|
1181
|
+
data: number;
|
|
1182
|
+
driverParam: string | number;
|
|
1183
|
+
notNull: true;
|
|
1184
|
+
hasDefault: true;
|
|
1185
|
+
isPrimaryKey: false;
|
|
1186
|
+
isAutoincrement: false;
|
|
1187
|
+
hasRuntimeDefault: false;
|
|
1188
|
+
enumValues: undefined;
|
|
1189
|
+
baseColumn: never;
|
|
1190
|
+
identity: undefined;
|
|
1191
|
+
generated: undefined;
|
|
1192
|
+
}, {}, {}>;
|
|
1193
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
1194
|
+
name: "created_at";
|
|
1195
|
+
tableName: "map_objects";
|
|
1196
|
+
dataType: "date";
|
|
1197
|
+
columnType: "PgTimestamp";
|
|
1198
|
+
data: Date;
|
|
1199
|
+
driverParam: string;
|
|
1200
|
+
notNull: true;
|
|
1201
|
+
hasDefault: true;
|
|
1202
|
+
isPrimaryKey: false;
|
|
1203
|
+
isAutoincrement: false;
|
|
1204
|
+
hasRuntimeDefault: false;
|
|
1205
|
+
enumValues: undefined;
|
|
1206
|
+
baseColumn: never;
|
|
1207
|
+
identity: undefined;
|
|
1208
|
+
generated: undefined;
|
|
1209
|
+
}, {}, {}>;
|
|
1210
|
+
};
|
|
1211
|
+
dialect: "pg";
|
|
1212
|
+
}>;
|
|
1213
|
+
|
|
1214
|
+
declare const userLevels: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
1215
|
+
name: "user_levels";
|
|
1216
|
+
schema: undefined;
|
|
1217
|
+
columns: {
|
|
1218
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
1219
|
+
name: "user_id";
|
|
1220
|
+
tableName: "user_levels";
|
|
1221
|
+
dataType: "string";
|
|
1222
|
+
columnType: "PgText";
|
|
1223
|
+
data: string;
|
|
1224
|
+
driverParam: string;
|
|
1225
|
+
notNull: true;
|
|
1226
|
+
hasDefault: false;
|
|
1227
|
+
isPrimaryKey: true;
|
|
1228
|
+
isAutoincrement: false;
|
|
1229
|
+
hasRuntimeDefault: false;
|
|
1230
|
+
enumValues: [string, ...string[]];
|
|
1231
|
+
baseColumn: never;
|
|
1232
|
+
identity: undefined;
|
|
1233
|
+
generated: undefined;
|
|
1234
|
+
}, {}, {}>;
|
|
1235
|
+
currentLevel: drizzle_orm_pg_core.PgColumn<{
|
|
1236
|
+
name: "current_level";
|
|
1237
|
+
tableName: "user_levels";
|
|
1238
|
+
dataType: "number";
|
|
1239
|
+
columnType: "PgInteger";
|
|
1240
|
+
data: number;
|
|
1241
|
+
driverParam: string | number;
|
|
1242
|
+
notNull: true;
|
|
1243
|
+
hasDefault: true;
|
|
1244
|
+
isPrimaryKey: false;
|
|
1245
|
+
isAutoincrement: false;
|
|
1246
|
+
hasRuntimeDefault: false;
|
|
1247
|
+
enumValues: undefined;
|
|
1248
|
+
baseColumn: never;
|
|
1249
|
+
identity: undefined;
|
|
1250
|
+
generated: undefined;
|
|
1251
|
+
}, {}, {}>;
|
|
1252
|
+
currentXp: drizzle_orm_pg_core.PgColumn<{
|
|
1253
|
+
name: "current_xp";
|
|
1254
|
+
tableName: "user_levels";
|
|
1255
|
+
dataType: "number";
|
|
1256
|
+
columnType: "PgDoublePrecision";
|
|
1257
|
+
data: number;
|
|
1258
|
+
driverParam: string | number;
|
|
1259
|
+
notNull: true;
|
|
1260
|
+
hasDefault: true;
|
|
1261
|
+
isPrimaryKey: false;
|
|
1262
|
+
isAutoincrement: false;
|
|
1263
|
+
hasRuntimeDefault: false;
|
|
1264
|
+
enumValues: undefined;
|
|
1265
|
+
baseColumn: never;
|
|
1266
|
+
identity: undefined;
|
|
1267
|
+
generated: undefined;
|
|
1268
|
+
}, {}, {}>;
|
|
1269
|
+
totalXP: drizzle_orm_pg_core.PgColumn<{
|
|
1270
|
+
name: "total_xp";
|
|
1271
|
+
tableName: "user_levels";
|
|
1272
|
+
dataType: "number";
|
|
1273
|
+
columnType: "PgDoublePrecision";
|
|
1274
|
+
data: number;
|
|
1275
|
+
driverParam: string | number;
|
|
1276
|
+
notNull: true;
|
|
1277
|
+
hasDefault: true;
|
|
1278
|
+
isPrimaryKey: false;
|
|
1279
|
+
isAutoincrement: false;
|
|
1280
|
+
hasRuntimeDefault: false;
|
|
1281
|
+
enumValues: undefined;
|
|
1282
|
+
baseColumn: never;
|
|
1283
|
+
identity: undefined;
|
|
1284
|
+
generated: undefined;
|
|
1285
|
+
}, {}, {}>;
|
|
1286
|
+
lastLevelUpAt: drizzle_orm_pg_core.PgColumn<{
|
|
1287
|
+
name: "last_level_up_at";
|
|
1288
|
+
tableName: "user_levels";
|
|
1289
|
+
dataType: "date";
|
|
1290
|
+
columnType: "PgTimestamp";
|
|
1291
|
+
data: Date;
|
|
1292
|
+
driverParam: string;
|
|
1293
|
+
notNull: false;
|
|
1294
|
+
hasDefault: false;
|
|
1295
|
+
isPrimaryKey: false;
|
|
1296
|
+
isAutoincrement: false;
|
|
1297
|
+
hasRuntimeDefault: false;
|
|
1298
|
+
enumValues: undefined;
|
|
1299
|
+
baseColumn: never;
|
|
1300
|
+
identity: undefined;
|
|
1301
|
+
generated: undefined;
|
|
1302
|
+
}, {}, {}>;
|
|
1303
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
1304
|
+
name: "created_at";
|
|
1305
|
+
tableName: "user_levels";
|
|
1306
|
+
dataType: "date";
|
|
1307
|
+
columnType: "PgTimestamp";
|
|
1308
|
+
data: Date;
|
|
1309
|
+
driverParam: string;
|
|
1310
|
+
notNull: true;
|
|
1311
|
+
hasDefault: true;
|
|
1312
|
+
isPrimaryKey: false;
|
|
1313
|
+
isAutoincrement: false;
|
|
1314
|
+
hasRuntimeDefault: false;
|
|
1315
|
+
enumValues: undefined;
|
|
1316
|
+
baseColumn: never;
|
|
1317
|
+
identity: undefined;
|
|
1318
|
+
generated: undefined;
|
|
1319
|
+
}, {}, {}>;
|
|
1320
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
1321
|
+
name: "updated_at";
|
|
1322
|
+
tableName: "user_levels";
|
|
1323
|
+
dataType: "date";
|
|
1324
|
+
columnType: "PgTimestamp";
|
|
1325
|
+
data: Date;
|
|
1326
|
+
driverParam: string;
|
|
1327
|
+
notNull: false;
|
|
1328
|
+
hasDefault: true;
|
|
1329
|
+
isPrimaryKey: false;
|
|
1330
|
+
isAutoincrement: false;
|
|
1331
|
+
hasRuntimeDefault: false;
|
|
1332
|
+
enumValues: undefined;
|
|
1333
|
+
baseColumn: never;
|
|
1334
|
+
identity: undefined;
|
|
1335
|
+
generated: undefined;
|
|
1336
|
+
}, {}, {}>;
|
|
1337
|
+
};
|
|
1338
|
+
dialect: "pg";
|
|
1339
|
+
}>;
|
|
1340
|
+
declare const levelConfigs: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
1341
|
+
name: "level_configs";
|
|
1342
|
+
schema: undefined;
|
|
1343
|
+
columns: {
|
|
1344
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
1345
|
+
name: "id";
|
|
1346
|
+
tableName: "level_configs";
|
|
1347
|
+
dataType: "string";
|
|
1348
|
+
columnType: "PgUUID";
|
|
1349
|
+
data: string;
|
|
1350
|
+
driverParam: string;
|
|
1351
|
+
notNull: true;
|
|
1352
|
+
hasDefault: true;
|
|
1353
|
+
isPrimaryKey: true;
|
|
1354
|
+
isAutoincrement: false;
|
|
1355
|
+
hasRuntimeDefault: false;
|
|
1356
|
+
enumValues: undefined;
|
|
1357
|
+
baseColumn: never;
|
|
1358
|
+
identity: undefined;
|
|
1359
|
+
generated: undefined;
|
|
1360
|
+
}, {}, {}>;
|
|
1361
|
+
level: drizzle_orm_pg_core.PgColumn<{
|
|
1362
|
+
name: "level";
|
|
1363
|
+
tableName: "level_configs";
|
|
1364
|
+
dataType: "number";
|
|
1365
|
+
columnType: "PgInteger";
|
|
1366
|
+
data: number;
|
|
1367
|
+
driverParam: string | number;
|
|
1368
|
+
notNull: true;
|
|
1369
|
+
hasDefault: false;
|
|
1370
|
+
isPrimaryKey: false;
|
|
1371
|
+
isAutoincrement: false;
|
|
1372
|
+
hasRuntimeDefault: false;
|
|
1373
|
+
enumValues: undefined;
|
|
1374
|
+
baseColumn: never;
|
|
1375
|
+
identity: undefined;
|
|
1376
|
+
generated: undefined;
|
|
1377
|
+
}, {}, {}>;
|
|
1378
|
+
xpRequired: drizzle_orm_pg_core.PgColumn<{
|
|
1379
|
+
name: "xp_required";
|
|
1380
|
+
tableName: "level_configs";
|
|
1381
|
+
dataType: "number";
|
|
1382
|
+
columnType: "PgInteger";
|
|
1383
|
+
data: number;
|
|
1384
|
+
driverParam: string | number;
|
|
1385
|
+
notNull: true;
|
|
1386
|
+
hasDefault: false;
|
|
1387
|
+
isPrimaryKey: false;
|
|
1388
|
+
isAutoincrement: false;
|
|
1389
|
+
hasRuntimeDefault: false;
|
|
1390
|
+
enumValues: undefined;
|
|
1391
|
+
baseColumn: never;
|
|
1392
|
+
identity: undefined;
|
|
1393
|
+
generated: undefined;
|
|
1394
|
+
}, {}, {}>;
|
|
1395
|
+
creditsReward: drizzle_orm_pg_core.PgColumn<{
|
|
1396
|
+
name: "credits_reward";
|
|
1397
|
+
tableName: "level_configs";
|
|
1398
|
+
dataType: "number";
|
|
1399
|
+
columnType: "PgInteger";
|
|
1400
|
+
data: number;
|
|
1401
|
+
driverParam: string | number;
|
|
1402
|
+
notNull: true;
|
|
1403
|
+
hasDefault: true;
|
|
1404
|
+
isPrimaryKey: false;
|
|
1405
|
+
isAutoincrement: false;
|
|
1406
|
+
hasRuntimeDefault: false;
|
|
1407
|
+
enumValues: undefined;
|
|
1408
|
+
baseColumn: never;
|
|
1409
|
+
identity: undefined;
|
|
1410
|
+
generated: undefined;
|
|
1411
|
+
}, {}, {}>;
|
|
1412
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
1413
|
+
name: "created_at";
|
|
1414
|
+
tableName: "level_configs";
|
|
1415
|
+
dataType: "date";
|
|
1416
|
+
columnType: "PgTimestamp";
|
|
1417
|
+
data: Date;
|
|
1418
|
+
driverParam: string;
|
|
1419
|
+
notNull: true;
|
|
1420
|
+
hasDefault: true;
|
|
1421
|
+
isPrimaryKey: false;
|
|
1422
|
+
isAutoincrement: false;
|
|
1423
|
+
hasRuntimeDefault: false;
|
|
1424
|
+
enumValues: undefined;
|
|
1425
|
+
baseColumn: never;
|
|
1426
|
+
identity: undefined;
|
|
1427
|
+
generated: undefined;
|
|
1428
|
+
}, {}, {}>;
|
|
1429
|
+
};
|
|
1430
|
+
dialect: "pg";
|
|
1431
|
+
}>;
|
|
1432
|
+
declare const characterComponents: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
1433
|
+
name: "character_components";
|
|
1434
|
+
schema: undefined;
|
|
1435
|
+
columns: {
|
|
1436
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
1437
|
+
name: "id";
|
|
1438
|
+
tableName: "character_components";
|
|
1439
|
+
dataType: "string";
|
|
1440
|
+
columnType: "PgUUID";
|
|
1441
|
+
data: string;
|
|
1442
|
+
driverParam: string;
|
|
1443
|
+
notNull: true;
|
|
1444
|
+
hasDefault: true;
|
|
1445
|
+
isPrimaryKey: true;
|
|
1446
|
+
isAutoincrement: false;
|
|
1447
|
+
hasRuntimeDefault: false;
|
|
1448
|
+
enumValues: undefined;
|
|
1449
|
+
baseColumn: never;
|
|
1450
|
+
identity: undefined;
|
|
1451
|
+
generated: undefined;
|
|
1452
|
+
}, {}, {}>;
|
|
1453
|
+
componentType: drizzle_orm_pg_core.PgColumn<{
|
|
1454
|
+
name: "component_type";
|
|
1455
|
+
tableName: "character_components";
|
|
1456
|
+
dataType: "string";
|
|
1457
|
+
columnType: "PgEnumColumn";
|
|
1458
|
+
data: "accessory" | "body" | "outfit" | "hairstyle" | "eyes";
|
|
1459
|
+
driverParam: string;
|
|
1460
|
+
notNull: true;
|
|
1461
|
+
hasDefault: false;
|
|
1462
|
+
isPrimaryKey: false;
|
|
1463
|
+
isAutoincrement: false;
|
|
1464
|
+
hasRuntimeDefault: false;
|
|
1465
|
+
enumValues: ["body", "outfit", "hairstyle", "eyes", "accessory"];
|
|
1466
|
+
baseColumn: never;
|
|
1467
|
+
identity: undefined;
|
|
1468
|
+
generated: undefined;
|
|
1469
|
+
}, {}, {}>;
|
|
1470
|
+
slug: drizzle_orm_pg_core.PgColumn<{
|
|
1471
|
+
name: "slug";
|
|
1472
|
+
tableName: "character_components";
|
|
1473
|
+
dataType: "string";
|
|
1474
|
+
columnType: "PgVarchar";
|
|
1475
|
+
data: string;
|
|
1476
|
+
driverParam: string;
|
|
1477
|
+
notNull: true;
|
|
1478
|
+
hasDefault: false;
|
|
1479
|
+
isPrimaryKey: false;
|
|
1480
|
+
isAutoincrement: false;
|
|
1481
|
+
hasRuntimeDefault: false;
|
|
1482
|
+
enumValues: [string, ...string[]];
|
|
1483
|
+
baseColumn: never;
|
|
1484
|
+
identity: undefined;
|
|
1485
|
+
generated: undefined;
|
|
1486
|
+
}, {}, {
|
|
1487
|
+
length: 128;
|
|
1488
|
+
}>;
|
|
1489
|
+
displayName: drizzle_orm_pg_core.PgColumn<{
|
|
1490
|
+
name: "display_name";
|
|
1491
|
+
tableName: "character_components";
|
|
1492
|
+
dataType: "string";
|
|
1493
|
+
columnType: "PgVarchar";
|
|
1494
|
+
data: string;
|
|
1495
|
+
driverParam: string;
|
|
1496
|
+
notNull: true;
|
|
1497
|
+
hasDefault: false;
|
|
1498
|
+
isPrimaryKey: false;
|
|
1499
|
+
isAutoincrement: false;
|
|
1500
|
+
hasRuntimeDefault: false;
|
|
1501
|
+
enumValues: [string, ...string[]];
|
|
1502
|
+
baseColumn: never;
|
|
1503
|
+
identity: undefined;
|
|
1504
|
+
generated: undefined;
|
|
1505
|
+
}, {}, {
|
|
1506
|
+
length: 128;
|
|
1507
|
+
}>;
|
|
1508
|
+
slot: drizzle_orm_pg_core.PgColumn<{
|
|
1509
|
+
name: "slot";
|
|
1510
|
+
tableName: "character_components";
|
|
1511
|
+
dataType: "string";
|
|
1512
|
+
columnType: "PgVarchar";
|
|
1513
|
+
data: string;
|
|
1514
|
+
driverParam: string;
|
|
1515
|
+
notNull: true;
|
|
1516
|
+
hasDefault: false;
|
|
1517
|
+
isPrimaryKey: false;
|
|
1518
|
+
isAutoincrement: false;
|
|
1519
|
+
hasRuntimeDefault: false;
|
|
1520
|
+
enumValues: [string, ...string[]];
|
|
1521
|
+
baseColumn: never;
|
|
1522
|
+
identity: undefined;
|
|
1523
|
+
generated: undefined;
|
|
1524
|
+
}, {}, {
|
|
1525
|
+
length: 64;
|
|
1526
|
+
}>;
|
|
1527
|
+
spriteSheetId: drizzle_orm_pg_core.PgColumn<{
|
|
1528
|
+
name: "sprite_sheet_id";
|
|
1529
|
+
tableName: "character_components";
|
|
1530
|
+
dataType: "string";
|
|
1531
|
+
columnType: "PgUUID";
|
|
1532
|
+
data: string;
|
|
1533
|
+
driverParam: string;
|
|
1534
|
+
notNull: true;
|
|
1535
|
+
hasDefault: false;
|
|
1536
|
+
isPrimaryKey: false;
|
|
1537
|
+
isAutoincrement: false;
|
|
1538
|
+
hasRuntimeDefault: false;
|
|
1539
|
+
enumValues: undefined;
|
|
1540
|
+
baseColumn: never;
|
|
1541
|
+
identity: undefined;
|
|
1542
|
+
generated: undefined;
|
|
1543
|
+
}, {}, {}>;
|
|
1544
|
+
unlockLevel: drizzle_orm_pg_core.PgColumn<{
|
|
1545
|
+
name: "unlock_level";
|
|
1546
|
+
tableName: "character_components";
|
|
1547
|
+
dataType: "number";
|
|
1548
|
+
columnType: "PgInteger";
|
|
1549
|
+
data: number;
|
|
1550
|
+
driverParam: string | number;
|
|
1551
|
+
notNull: true;
|
|
1552
|
+
hasDefault: true;
|
|
1553
|
+
isPrimaryKey: false;
|
|
1554
|
+
isAutoincrement: false;
|
|
1555
|
+
hasRuntimeDefault: false;
|
|
1556
|
+
enumValues: undefined;
|
|
1557
|
+
baseColumn: never;
|
|
1558
|
+
identity: undefined;
|
|
1559
|
+
generated: undefined;
|
|
1560
|
+
}, {}, {}>;
|
|
1561
|
+
variant: drizzle_orm_pg_core.PgColumn<{
|
|
1562
|
+
name: "variant";
|
|
1563
|
+
tableName: "character_components";
|
|
1564
|
+
dataType: "number";
|
|
1565
|
+
columnType: "PgInteger";
|
|
1566
|
+
data: number;
|
|
1567
|
+
driverParam: string | number;
|
|
1568
|
+
notNull: true;
|
|
1569
|
+
hasDefault: true;
|
|
1570
|
+
isPrimaryKey: false;
|
|
1571
|
+
isAutoincrement: false;
|
|
1572
|
+
hasRuntimeDefault: false;
|
|
1573
|
+
enumValues: undefined;
|
|
1574
|
+
baseColumn: never;
|
|
1575
|
+
identity: undefined;
|
|
1576
|
+
generated: undefined;
|
|
1577
|
+
}, {}, {}>;
|
|
1578
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
1579
|
+
name: "created_at";
|
|
1580
|
+
tableName: "character_components";
|
|
1581
|
+
dataType: "date";
|
|
1582
|
+
columnType: "PgTimestamp";
|
|
1583
|
+
data: Date;
|
|
1584
|
+
driverParam: string;
|
|
1585
|
+
notNull: true;
|
|
1586
|
+
hasDefault: true;
|
|
1587
|
+
isPrimaryKey: false;
|
|
1588
|
+
isAutoincrement: false;
|
|
1589
|
+
hasRuntimeDefault: false;
|
|
1590
|
+
enumValues: undefined;
|
|
1591
|
+
baseColumn: never;
|
|
1592
|
+
identity: undefined;
|
|
1593
|
+
generated: undefined;
|
|
1594
|
+
}, {}, {}>;
|
|
1595
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
1596
|
+
name: "updated_at";
|
|
1597
|
+
tableName: "character_components";
|
|
1598
|
+
dataType: "date";
|
|
1599
|
+
columnType: "PgTimestamp";
|
|
1600
|
+
data: Date;
|
|
1601
|
+
driverParam: string;
|
|
1602
|
+
notNull: true;
|
|
1603
|
+
hasDefault: true;
|
|
1604
|
+
isPrimaryKey: false;
|
|
1605
|
+
isAutoincrement: false;
|
|
1606
|
+
hasRuntimeDefault: false;
|
|
1607
|
+
enumValues: undefined;
|
|
1608
|
+
baseColumn: never;
|
|
1609
|
+
identity: undefined;
|
|
1610
|
+
generated: undefined;
|
|
1611
|
+
}, {}, {}>;
|
|
1612
|
+
};
|
|
1613
|
+
dialect: "pg";
|
|
1614
|
+
}>;
|
|
1615
|
+
declare const playerCharacters: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
1616
|
+
name: "player_characters";
|
|
1617
|
+
schema: undefined;
|
|
1618
|
+
columns: {
|
|
1619
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
1620
|
+
name: "id";
|
|
1621
|
+
tableName: "player_characters";
|
|
1622
|
+
dataType: "string";
|
|
1623
|
+
columnType: "PgUUID";
|
|
1624
|
+
data: string;
|
|
1625
|
+
driverParam: string;
|
|
1626
|
+
notNull: true;
|
|
1627
|
+
hasDefault: true;
|
|
1628
|
+
isPrimaryKey: true;
|
|
1629
|
+
isAutoincrement: false;
|
|
1630
|
+
hasRuntimeDefault: false;
|
|
1631
|
+
enumValues: undefined;
|
|
1632
|
+
baseColumn: never;
|
|
1633
|
+
identity: undefined;
|
|
1634
|
+
generated: undefined;
|
|
1635
|
+
}, {}, {}>;
|
|
1636
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
1637
|
+
name: "user_id";
|
|
1638
|
+
tableName: "player_characters";
|
|
1639
|
+
dataType: "string";
|
|
1640
|
+
columnType: "PgText";
|
|
1641
|
+
data: string;
|
|
1642
|
+
driverParam: string;
|
|
1643
|
+
notNull: true;
|
|
1644
|
+
hasDefault: false;
|
|
1645
|
+
isPrimaryKey: false;
|
|
1646
|
+
isAutoincrement: false;
|
|
1647
|
+
hasRuntimeDefault: false;
|
|
1648
|
+
enumValues: [string, ...string[]];
|
|
1649
|
+
baseColumn: never;
|
|
1650
|
+
identity: undefined;
|
|
1651
|
+
generated: undefined;
|
|
1652
|
+
}, {}, {}>;
|
|
1653
|
+
bodyComponentId: drizzle_orm_pg_core.PgColumn<{
|
|
1654
|
+
name: "body_component_id";
|
|
1655
|
+
tableName: "player_characters";
|
|
1656
|
+
dataType: "string";
|
|
1657
|
+
columnType: "PgUUID";
|
|
1658
|
+
data: string;
|
|
1659
|
+
driverParam: string;
|
|
1660
|
+
notNull: true;
|
|
1661
|
+
hasDefault: false;
|
|
1662
|
+
isPrimaryKey: false;
|
|
1663
|
+
isAutoincrement: false;
|
|
1664
|
+
hasRuntimeDefault: false;
|
|
1665
|
+
enumValues: undefined;
|
|
1666
|
+
baseColumn: never;
|
|
1667
|
+
identity: undefined;
|
|
1668
|
+
generated: undefined;
|
|
1669
|
+
}, {}, {}>;
|
|
1670
|
+
eyesComponentId: drizzle_orm_pg_core.PgColumn<{
|
|
1671
|
+
name: "eyes_component_id";
|
|
1672
|
+
tableName: "player_characters";
|
|
1673
|
+
dataType: "string";
|
|
1674
|
+
columnType: "PgUUID";
|
|
1675
|
+
data: string;
|
|
1676
|
+
driverParam: string;
|
|
1677
|
+
notNull: true;
|
|
1678
|
+
hasDefault: false;
|
|
1679
|
+
isPrimaryKey: false;
|
|
1680
|
+
isAutoincrement: false;
|
|
1681
|
+
hasRuntimeDefault: false;
|
|
1682
|
+
enumValues: undefined;
|
|
1683
|
+
baseColumn: never;
|
|
1684
|
+
identity: undefined;
|
|
1685
|
+
generated: undefined;
|
|
1686
|
+
}, {}, {}>;
|
|
1687
|
+
hairstyleComponentId: drizzle_orm_pg_core.PgColumn<{
|
|
1688
|
+
name: "hairstyle_component_id";
|
|
1689
|
+
tableName: "player_characters";
|
|
1690
|
+
dataType: "string";
|
|
1691
|
+
columnType: "PgUUID";
|
|
1692
|
+
data: string;
|
|
1693
|
+
driverParam: string;
|
|
1694
|
+
notNull: true;
|
|
1695
|
+
hasDefault: false;
|
|
1696
|
+
isPrimaryKey: false;
|
|
1697
|
+
isAutoincrement: false;
|
|
1698
|
+
hasRuntimeDefault: false;
|
|
1699
|
+
enumValues: undefined;
|
|
1700
|
+
baseColumn: never;
|
|
1701
|
+
identity: undefined;
|
|
1702
|
+
generated: undefined;
|
|
1703
|
+
}, {}, {}>;
|
|
1704
|
+
outfitComponentId: drizzle_orm_pg_core.PgColumn<{
|
|
1705
|
+
name: "outfit_component_id";
|
|
1706
|
+
tableName: "player_characters";
|
|
1707
|
+
dataType: "string";
|
|
1708
|
+
columnType: "PgUUID";
|
|
1709
|
+
data: string;
|
|
1710
|
+
driverParam: string;
|
|
1711
|
+
notNull: true;
|
|
1712
|
+
hasDefault: false;
|
|
1713
|
+
isPrimaryKey: false;
|
|
1714
|
+
isAutoincrement: false;
|
|
1715
|
+
hasRuntimeDefault: false;
|
|
1716
|
+
enumValues: undefined;
|
|
1717
|
+
baseColumn: never;
|
|
1718
|
+
identity: undefined;
|
|
1719
|
+
generated: undefined;
|
|
1720
|
+
}, {}, {}>;
|
|
1721
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
1722
|
+
name: "created_at";
|
|
1723
|
+
tableName: "player_characters";
|
|
1724
|
+
dataType: "date";
|
|
1725
|
+
columnType: "PgTimestamp";
|
|
1726
|
+
data: Date;
|
|
1727
|
+
driverParam: string;
|
|
1728
|
+
notNull: true;
|
|
1729
|
+
hasDefault: true;
|
|
1730
|
+
isPrimaryKey: false;
|
|
1731
|
+
isAutoincrement: false;
|
|
1732
|
+
hasRuntimeDefault: false;
|
|
1733
|
+
enumValues: undefined;
|
|
1734
|
+
baseColumn: never;
|
|
1735
|
+
identity: undefined;
|
|
1736
|
+
generated: undefined;
|
|
1737
|
+
}, {}, {}>;
|
|
1738
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
1739
|
+
name: "updated_at";
|
|
1740
|
+
tableName: "player_characters";
|
|
1741
|
+
dataType: "date";
|
|
1742
|
+
columnType: "PgTimestamp";
|
|
1743
|
+
data: Date;
|
|
1744
|
+
driverParam: string;
|
|
1745
|
+
notNull: true;
|
|
1746
|
+
hasDefault: true;
|
|
1747
|
+
isPrimaryKey: false;
|
|
1748
|
+
isAutoincrement: false;
|
|
1749
|
+
hasRuntimeDefault: false;
|
|
1750
|
+
enumValues: undefined;
|
|
1751
|
+
baseColumn: never;
|
|
1752
|
+
identity: undefined;
|
|
1753
|
+
generated: undefined;
|
|
1754
|
+
}, {}, {}>;
|
|
1755
|
+
};
|
|
1756
|
+
dialect: "pg";
|
|
1757
|
+
}>;
|
|
1758
|
+
declare const playerCharacterAccessories: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
1759
|
+
name: "player_character_accessories";
|
|
1760
|
+
schema: undefined;
|
|
1761
|
+
columns: {
|
|
1762
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
1763
|
+
name: "id";
|
|
1764
|
+
tableName: "player_character_accessories";
|
|
1765
|
+
dataType: "string";
|
|
1766
|
+
columnType: "PgUUID";
|
|
1767
|
+
data: string;
|
|
1768
|
+
driverParam: string;
|
|
1769
|
+
notNull: true;
|
|
1770
|
+
hasDefault: true;
|
|
1771
|
+
isPrimaryKey: true;
|
|
1772
|
+
isAutoincrement: false;
|
|
1773
|
+
hasRuntimeDefault: false;
|
|
1774
|
+
enumValues: undefined;
|
|
1775
|
+
baseColumn: never;
|
|
1776
|
+
identity: undefined;
|
|
1777
|
+
generated: undefined;
|
|
1778
|
+
}, {}, {}>;
|
|
1779
|
+
playerCharacterId: drizzle_orm_pg_core.PgColumn<{
|
|
1780
|
+
name: "player_character_id";
|
|
1781
|
+
tableName: "player_character_accessories";
|
|
1782
|
+
dataType: "string";
|
|
1783
|
+
columnType: "PgUUID";
|
|
1784
|
+
data: string;
|
|
1785
|
+
driverParam: string;
|
|
1786
|
+
notNull: true;
|
|
1787
|
+
hasDefault: false;
|
|
1788
|
+
isPrimaryKey: false;
|
|
1789
|
+
isAutoincrement: false;
|
|
1790
|
+
hasRuntimeDefault: false;
|
|
1791
|
+
enumValues: undefined;
|
|
1792
|
+
baseColumn: never;
|
|
1793
|
+
identity: undefined;
|
|
1794
|
+
generated: undefined;
|
|
1795
|
+
}, {}, {}>;
|
|
1796
|
+
accessoryComponentId: drizzle_orm_pg_core.PgColumn<{
|
|
1797
|
+
name: "accessory_component_id";
|
|
1798
|
+
tableName: "player_character_accessories";
|
|
1799
|
+
dataType: "string";
|
|
1800
|
+
columnType: "PgUUID";
|
|
1801
|
+
data: string;
|
|
1802
|
+
driverParam: string;
|
|
1803
|
+
notNull: true;
|
|
1804
|
+
hasDefault: false;
|
|
1805
|
+
isPrimaryKey: false;
|
|
1806
|
+
isAutoincrement: false;
|
|
1807
|
+
hasRuntimeDefault: false;
|
|
1808
|
+
enumValues: undefined;
|
|
1809
|
+
baseColumn: never;
|
|
1810
|
+
identity: undefined;
|
|
1811
|
+
generated: undefined;
|
|
1812
|
+
}, {}, {}>;
|
|
1813
|
+
slot: drizzle_orm_pg_core.PgColumn<{
|
|
1814
|
+
name: "slot";
|
|
1815
|
+
tableName: "player_character_accessories";
|
|
1816
|
+
dataType: "string";
|
|
1817
|
+
columnType: "PgVarchar";
|
|
1818
|
+
data: string;
|
|
1819
|
+
driverParam: string;
|
|
1820
|
+
notNull: true;
|
|
1821
|
+
hasDefault: false;
|
|
1822
|
+
isPrimaryKey: false;
|
|
1823
|
+
isAutoincrement: false;
|
|
1824
|
+
hasRuntimeDefault: false;
|
|
1825
|
+
enumValues: [string, ...string[]];
|
|
1826
|
+
baseColumn: never;
|
|
1827
|
+
identity: undefined;
|
|
1828
|
+
generated: undefined;
|
|
1829
|
+
}, {}, {
|
|
1830
|
+
length: 64;
|
|
1831
|
+
}>;
|
|
1832
|
+
equippedAt: drizzle_orm_pg_core.PgColumn<{
|
|
1833
|
+
name: "equipped_at";
|
|
1834
|
+
tableName: "player_character_accessories";
|
|
1835
|
+
dataType: "date";
|
|
1836
|
+
columnType: "PgTimestamp";
|
|
1837
|
+
data: Date;
|
|
1838
|
+
driverParam: string;
|
|
1839
|
+
notNull: true;
|
|
1840
|
+
hasDefault: true;
|
|
1841
|
+
isPrimaryKey: false;
|
|
1842
|
+
isAutoincrement: false;
|
|
1843
|
+
hasRuntimeDefault: false;
|
|
1844
|
+
enumValues: undefined;
|
|
1845
|
+
baseColumn: never;
|
|
1846
|
+
identity: undefined;
|
|
1847
|
+
generated: undefined;
|
|
1848
|
+
}, {}, {}>;
|
|
1849
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
1850
|
+
name: "updated_at";
|
|
1851
|
+
tableName: "player_character_accessories";
|
|
1852
|
+
dataType: "date";
|
|
1853
|
+
columnType: "PgTimestamp";
|
|
1854
|
+
data: Date;
|
|
1855
|
+
driverParam: string;
|
|
1856
|
+
notNull: true;
|
|
1857
|
+
hasDefault: true;
|
|
1858
|
+
isPrimaryKey: false;
|
|
1859
|
+
isAutoincrement: false;
|
|
1860
|
+
hasRuntimeDefault: false;
|
|
1861
|
+
enumValues: undefined;
|
|
1862
|
+
baseColumn: never;
|
|
1863
|
+
identity: undefined;
|
|
1864
|
+
generated: undefined;
|
|
1865
|
+
}, {}, {}>;
|
|
1866
|
+
};
|
|
1867
|
+
dialect: "pg";
|
|
1868
|
+
}>;
|
|
1869
|
+
|
|
1870
|
+
declare const achievementIntervalEnum: drizzle_orm_pg_core.PgEnum<["daily", "weekly"]>;
|
|
1871
|
+
declare const DeveloperStatusResponseSchema: z.ZodObject<{
|
|
1872
|
+
status: z.ZodEnum<["none", "pending", "approved"]>;
|
|
1873
|
+
}, "strip", z.ZodTypeAny, {
|
|
1874
|
+
status: "none" | "pending" | "approved";
|
|
1875
|
+
}, {
|
|
1876
|
+
status: "none" | "pending" | "approved";
|
|
1877
|
+
}>;
|
|
1878
|
+
declare const UpsertGameMetadataSchema: z.ZodEffects<z.ZodObject<{
|
|
1879
|
+
displayName: z.ZodString;
|
|
1880
|
+
mapElementId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
1881
|
+
platform: z.ZodEnum<["web", "godot", "unity"]>;
|
|
1882
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1883
|
+
gameType: z.ZodDefault<z.ZodOptional<z.ZodEnum<["hosted", "external"]>>>;
|
|
1884
|
+
externalUrl: z.ZodOptional<z.ZodString>;
|
|
1885
|
+
}, "strip", z.ZodTypeAny, {
|
|
1886
|
+
displayName: string;
|
|
1887
|
+
gameType: "hosted" | "external";
|
|
1888
|
+
platform: "web" | "godot" | "unity";
|
|
1889
|
+
metadata: Record<string, unknown>;
|
|
1890
|
+
externalUrl?: string | undefined;
|
|
1891
|
+
mapElementId?: string | null | undefined;
|
|
1892
|
+
}, {
|
|
1893
|
+
displayName: string;
|
|
1894
|
+
platform: "web" | "godot" | "unity";
|
|
1895
|
+
gameType?: "hosted" | "external" | undefined;
|
|
1896
|
+
externalUrl?: string | undefined;
|
|
1897
|
+
mapElementId?: string | null | undefined;
|
|
1898
|
+
metadata?: Record<string, unknown> | undefined;
|
|
1899
|
+
}>, {
|
|
1900
|
+
displayName: string;
|
|
1901
|
+
gameType: "hosted" | "external";
|
|
1902
|
+
platform: "web" | "godot" | "unity";
|
|
1903
|
+
metadata: Record<string, unknown>;
|
|
1904
|
+
externalUrl?: string | undefined;
|
|
1905
|
+
mapElementId?: string | null | undefined;
|
|
1906
|
+
}, {
|
|
1907
|
+
displayName: string;
|
|
1908
|
+
platform: "web" | "godot" | "unity";
|
|
1909
|
+
gameType?: "hosted" | "external" | undefined;
|
|
1910
|
+
externalUrl?: string | undefined;
|
|
1911
|
+
mapElementId?: string | null | undefined;
|
|
1912
|
+
metadata?: Record<string, unknown> | undefined;
|
|
1913
|
+
}>;
|
|
1914
|
+
declare const ManifestV1Schema: z.ZodObject<{
|
|
1915
|
+
version: z.ZodString;
|
|
1916
|
+
bootMode: z.ZodEnum<["iframe", "module"]>;
|
|
1917
|
+
entryPoint: z.ZodEffects<z.ZodString, string, string>;
|
|
1918
|
+
/**
|
|
1919
|
+
* An array of relative paths to CSS stylesheets.
|
|
1920
|
+
* Currently, this property is ONLY utilized by the 'module' boot mode
|
|
1921
|
+
* (`apps/cademy/src/lib/loader/boot-module.ts`) to load external
|
|
1922
|
+
* stylesheets into the game's shadow DOM.
|
|
1923
|
+
*
|
|
1924
|
+
* This property is under review for potential deprecation and removal.
|
|
1925
|
+
* The 'module' boot mode itself has not yet seen significant adoption
|
|
1926
|
+
* or clear use-cases, and if support for module loading is removed in
|
|
1927
|
+
* the future, this 'styles' property would become obsolete.
|
|
1928
|
+
*
|
|
1929
|
+
* If module-based games need styling, alternative approaches might involve
|
|
1930
|
+
* bundling CSS within their JavaScript or managing style injection internally.
|
|
1931
|
+
*/
|
|
1932
|
+
styles: z.ZodEffects<z.ZodOptional<z.ZodArray<z.ZodString, "many">>, string[] | undefined, string[] | undefined>;
|
|
1933
|
+
/**
|
|
1934
|
+
* Specifies the game or development platform.
|
|
1935
|
+
* Current values include 'web', 'godot', and 'unity'.
|
|
1936
|
+
* The default in the database is 'web'.
|
|
1937
|
+
*
|
|
1938
|
+
* IMPORTANT: This property is NOT CURRENTLY USED by the core loader
|
|
1939
|
+
* or runtime systems in any functional way. It is present in the manifest
|
|
1940
|
+
* but does not drive any specific behavior in `boot-iframe.ts` or
|
|
1941
|
+
* `boot-module.ts` beyond being a piece of metadata.
|
|
1942
|
+
*
|
|
1943
|
+
* Potential Future Uses (Speculative):
|
|
1944
|
+
* - Analytics: Could be used to gather stats on platform popularity/usage.
|
|
1945
|
+
* - Developer Portal: Might inform UI/UX in the dev portal, e.g., showing
|
|
1946
|
+
* platform-specific guides or settings.
|
|
1947
|
+
* - Loader Optimizations: In the future, the loader could potentially use this
|
|
1948
|
+
* to apply platform-specific loading strategies or workarounds, though this
|
|
1949
|
+
* is unlikely given the current generic boot process.
|
|
1950
|
+
* - Asset Pipeline: Could hint to future asset pipeline tools about expected
|
|
1951
|
+
* project structures or build artifacts for different platforms.
|
|
1952
|
+
*
|
|
1953
|
+
* The field is intentionally kept somewhat generic. If finer-grained
|
|
1954
|
+
* distinctions are ever needed (e.g., specific web frameworks like 'phaser',
|
|
1955
|
+
* 'three'), this schema might need to be revisited or a separate
|
|
1956
|
+
* 'platformVersion' or 'framework' field could be added.
|
|
1957
|
+
*/
|
|
1958
|
+
platform: z.ZodEnum<["web", "godot", "unity"]>;
|
|
1959
|
+
createdAt: z.ZodString;
|
|
1960
|
+
}, "strip", z.ZodTypeAny, {
|
|
1961
|
+
createdAt: string;
|
|
1962
|
+
version: string;
|
|
1963
|
+
platform: "web" | "godot" | "unity";
|
|
1964
|
+
bootMode: "iframe" | "module";
|
|
1965
|
+
entryPoint: string;
|
|
1966
|
+
styles?: string[] | undefined;
|
|
1967
|
+
}, {
|
|
1968
|
+
createdAt: string;
|
|
1969
|
+
version: string;
|
|
1970
|
+
platform: "web" | "godot" | "unity";
|
|
1971
|
+
bootMode: "iframe" | "module";
|
|
1972
|
+
entryPoint: string;
|
|
1973
|
+
styles?: string[] | undefined;
|
|
1974
|
+
}>;
|
|
1975
|
+
declare const InsertItemSchema: drizzle_zod.BuildSchema<"insert", {
|
|
1976
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
1977
|
+
name: "id";
|
|
1978
|
+
tableName: "items";
|
|
1979
|
+
dataType: "string";
|
|
1980
|
+
columnType: "PgUUID";
|
|
1981
|
+
data: string;
|
|
1982
|
+
driverParam: string;
|
|
1983
|
+
notNull: true;
|
|
1984
|
+
hasDefault: true;
|
|
1985
|
+
isPrimaryKey: true;
|
|
1986
|
+
isAutoincrement: false;
|
|
1987
|
+
hasRuntimeDefault: false;
|
|
1988
|
+
enumValues: undefined;
|
|
1989
|
+
baseColumn: never;
|
|
1990
|
+
identity: undefined;
|
|
1991
|
+
generated: undefined;
|
|
1992
|
+
}, {}, {}>;
|
|
1993
|
+
slug: drizzle_orm_pg_core.PgColumn<{
|
|
1994
|
+
name: "slug";
|
|
1995
|
+
tableName: "items";
|
|
1996
|
+
dataType: "string";
|
|
1997
|
+
columnType: "PgText";
|
|
1998
|
+
data: string;
|
|
1999
|
+
driverParam: string;
|
|
2000
|
+
notNull: true;
|
|
2001
|
+
hasDefault: false;
|
|
2002
|
+
isPrimaryKey: false;
|
|
2003
|
+
isAutoincrement: false;
|
|
2004
|
+
hasRuntimeDefault: false;
|
|
2005
|
+
enumValues: [string, ...string[]];
|
|
2006
|
+
baseColumn: never;
|
|
2007
|
+
identity: undefined;
|
|
2008
|
+
generated: undefined;
|
|
2009
|
+
}, {}, {}>;
|
|
2010
|
+
gameId: drizzle_orm_pg_core.PgColumn<{
|
|
2011
|
+
name: "game_id";
|
|
2012
|
+
tableName: "items";
|
|
2013
|
+
dataType: "string";
|
|
2014
|
+
columnType: "PgUUID";
|
|
2015
|
+
data: string;
|
|
2016
|
+
driverParam: string;
|
|
2017
|
+
notNull: false;
|
|
2018
|
+
hasDefault: false;
|
|
2019
|
+
isPrimaryKey: false;
|
|
2020
|
+
isAutoincrement: false;
|
|
2021
|
+
hasRuntimeDefault: false;
|
|
2022
|
+
enumValues: undefined;
|
|
2023
|
+
baseColumn: never;
|
|
2024
|
+
identity: undefined;
|
|
2025
|
+
generated: undefined;
|
|
2026
|
+
}, {}, {}>;
|
|
2027
|
+
displayName: drizzle_orm_pg_core.PgColumn<{
|
|
2028
|
+
name: "display_name";
|
|
2029
|
+
tableName: "items";
|
|
2030
|
+
dataType: "string";
|
|
2031
|
+
columnType: "PgText";
|
|
2032
|
+
data: string;
|
|
2033
|
+
driverParam: string;
|
|
2034
|
+
notNull: true;
|
|
2035
|
+
hasDefault: false;
|
|
2036
|
+
isPrimaryKey: false;
|
|
2037
|
+
isAutoincrement: false;
|
|
2038
|
+
hasRuntimeDefault: false;
|
|
2039
|
+
enumValues: [string, ...string[]];
|
|
2040
|
+
baseColumn: never;
|
|
2041
|
+
identity: undefined;
|
|
2042
|
+
generated: undefined;
|
|
2043
|
+
}, {}, {}>;
|
|
2044
|
+
description: drizzle_orm_pg_core.PgColumn<{
|
|
2045
|
+
name: "description";
|
|
2046
|
+
tableName: "items";
|
|
2047
|
+
dataType: "string";
|
|
2048
|
+
columnType: "PgText";
|
|
2049
|
+
data: string;
|
|
2050
|
+
driverParam: string;
|
|
2051
|
+
notNull: false;
|
|
2052
|
+
hasDefault: false;
|
|
2053
|
+
isPrimaryKey: false;
|
|
2054
|
+
isAutoincrement: false;
|
|
2055
|
+
hasRuntimeDefault: false;
|
|
2056
|
+
enumValues: [string, ...string[]];
|
|
2057
|
+
baseColumn: never;
|
|
2058
|
+
identity: undefined;
|
|
2059
|
+
generated: undefined;
|
|
2060
|
+
}, {}, {}>;
|
|
2061
|
+
type: drizzle_orm_pg_core.PgColumn<{
|
|
2062
|
+
name: "type";
|
|
2063
|
+
tableName: "items";
|
|
2064
|
+
dataType: "string";
|
|
2065
|
+
columnType: "PgEnumColumn";
|
|
2066
|
+
data: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
|
|
2067
|
+
driverParam: string;
|
|
2068
|
+
notNull: true;
|
|
2069
|
+
hasDefault: true;
|
|
2070
|
+
isPrimaryKey: false;
|
|
2071
|
+
isAutoincrement: false;
|
|
2072
|
+
hasRuntimeDefault: false;
|
|
2073
|
+
enumValues: ["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"];
|
|
2074
|
+
baseColumn: never;
|
|
2075
|
+
identity: undefined;
|
|
2076
|
+
generated: undefined;
|
|
2077
|
+
}, {}, {}>;
|
|
2078
|
+
isPlaceable: drizzle_orm_pg_core.PgColumn<{
|
|
2079
|
+
name: "is_placeable";
|
|
2080
|
+
tableName: "items";
|
|
2081
|
+
dataType: "boolean";
|
|
2082
|
+
columnType: "PgBoolean";
|
|
2083
|
+
data: boolean;
|
|
2084
|
+
driverParam: boolean;
|
|
2085
|
+
notNull: true;
|
|
2086
|
+
hasDefault: true;
|
|
2087
|
+
isPrimaryKey: false;
|
|
2088
|
+
isAutoincrement: false;
|
|
2089
|
+
hasRuntimeDefault: false;
|
|
2090
|
+
enumValues: undefined;
|
|
2091
|
+
baseColumn: never;
|
|
2092
|
+
identity: undefined;
|
|
2093
|
+
generated: undefined;
|
|
2094
|
+
}, {}, {}>;
|
|
2095
|
+
imageUrl: drizzle_orm_pg_core.PgColumn<{
|
|
2096
|
+
name: "image_url";
|
|
2097
|
+
tableName: "items";
|
|
2098
|
+
dataType: "string";
|
|
2099
|
+
columnType: "PgText";
|
|
2100
|
+
data: string;
|
|
2101
|
+
driverParam: string;
|
|
2102
|
+
notNull: false;
|
|
2103
|
+
hasDefault: false;
|
|
2104
|
+
isPrimaryKey: false;
|
|
2105
|
+
isAutoincrement: false;
|
|
2106
|
+
hasRuntimeDefault: false;
|
|
2107
|
+
enumValues: [string, ...string[]];
|
|
2108
|
+
baseColumn: never;
|
|
2109
|
+
identity: undefined;
|
|
2110
|
+
generated: undefined;
|
|
2111
|
+
}, {}, {}>;
|
|
2112
|
+
metadata: drizzle_orm_pg_core.PgColumn<{
|
|
2113
|
+
name: "metadata";
|
|
2114
|
+
tableName: "items";
|
|
2115
|
+
dataType: "json";
|
|
2116
|
+
columnType: "PgJsonb";
|
|
2117
|
+
data: unknown;
|
|
2118
|
+
driverParam: unknown;
|
|
2119
|
+
notNull: false;
|
|
2120
|
+
hasDefault: true;
|
|
2121
|
+
isPrimaryKey: false;
|
|
2122
|
+
isAutoincrement: false;
|
|
2123
|
+
hasRuntimeDefault: false;
|
|
2124
|
+
enumValues: undefined;
|
|
2125
|
+
baseColumn: never;
|
|
2126
|
+
identity: undefined;
|
|
2127
|
+
generated: undefined;
|
|
2128
|
+
}, {}, {}>;
|
|
2129
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
2130
|
+
name: "created_at";
|
|
2131
|
+
tableName: "items";
|
|
2132
|
+
dataType: "date";
|
|
2133
|
+
columnType: "PgTimestamp";
|
|
2134
|
+
data: Date;
|
|
2135
|
+
driverParam: string;
|
|
2136
|
+
notNull: true;
|
|
2137
|
+
hasDefault: true;
|
|
2138
|
+
isPrimaryKey: false;
|
|
2139
|
+
isAutoincrement: false;
|
|
2140
|
+
hasRuntimeDefault: false;
|
|
2141
|
+
enumValues: undefined;
|
|
2142
|
+
baseColumn: never;
|
|
2143
|
+
identity: undefined;
|
|
2144
|
+
generated: undefined;
|
|
2145
|
+
}, {}, {}>;
|
|
2146
|
+
}, {
|
|
2147
|
+
imageUrl: z.ZodNullable<z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>>;
|
|
2148
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
2149
|
+
}>;
|
|
2150
|
+
declare const UpdateItemSchema: z.ZodObject<Omit<{
|
|
2151
|
+
id: z.ZodOptional<z.ZodString>;
|
|
2152
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
2153
|
+
gameId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
2154
|
+
displayName: z.ZodOptional<z.ZodString>;
|
|
2155
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
2156
|
+
type: z.ZodOptional<z.ZodEnum<["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"]>>;
|
|
2157
|
+
isPlaceable: z.ZodOptional<z.ZodBoolean>;
|
|
2158
|
+
imageUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
2159
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
2160
|
+
createdAt: z.ZodOptional<z.ZodDate>;
|
|
2161
|
+
}, "id" | "createdAt">, "strip", z.ZodTypeAny, {
|
|
2162
|
+
description?: string | null | undefined;
|
|
2163
|
+
displayName?: string | undefined;
|
|
2164
|
+
slug?: string | undefined;
|
|
2165
|
+
metadata?: Record<string, unknown> | undefined;
|
|
2166
|
+
gameId?: string | null | undefined;
|
|
2167
|
+
type?: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other" | undefined;
|
|
2168
|
+
isPlaceable?: boolean | undefined;
|
|
2169
|
+
imageUrl?: string | null | undefined;
|
|
2170
|
+
}, {
|
|
2171
|
+
description?: string | null | undefined;
|
|
2172
|
+
displayName?: string | undefined;
|
|
2173
|
+
slug?: string | undefined;
|
|
2174
|
+
metadata?: Record<string, unknown> | undefined;
|
|
2175
|
+
gameId?: string | null | undefined;
|
|
2176
|
+
type?: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other" | undefined;
|
|
2177
|
+
isPlaceable?: boolean | undefined;
|
|
2178
|
+
imageUrl?: string | null | undefined;
|
|
2179
|
+
}>;
|
|
2180
|
+
declare const InsertCurrencySchema: z.ZodObject<Omit<{
|
|
2181
|
+
id: z.ZodOptional<z.ZodString>;
|
|
2182
|
+
itemId: z.ZodString;
|
|
2183
|
+
symbol: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
2184
|
+
isPrimary: z.ZodDefault<z.ZodBoolean>;
|
|
2185
|
+
createdAt: z.ZodOptional<z.ZodDate>;
|
|
2186
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
2187
|
+
}, "id" | "createdAt" | "updatedAt">, "strip", z.ZodTypeAny, {
|
|
2188
|
+
itemId: string;
|
|
2189
|
+
isPrimary: boolean;
|
|
2190
|
+
symbol?: string | null | undefined;
|
|
2191
|
+
}, {
|
|
2192
|
+
itemId: string;
|
|
2193
|
+
symbol?: string | null | undefined;
|
|
2194
|
+
isPrimary?: boolean | undefined;
|
|
2195
|
+
}>;
|
|
2196
|
+
declare const UpdateCurrencySchema: z.ZodObject<{
|
|
2197
|
+
symbol: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
2198
|
+
itemId: z.ZodOptional<z.ZodString>;
|
|
2199
|
+
isPrimary: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
2200
|
+
}, "strip", z.ZodTypeAny, {
|
|
2201
|
+
symbol?: string | null | undefined;
|
|
2202
|
+
itemId?: string | undefined;
|
|
2203
|
+
isPrimary?: boolean | undefined;
|
|
2204
|
+
}, {
|
|
2205
|
+
symbol?: string | null | undefined;
|
|
2206
|
+
itemId?: string | undefined;
|
|
2207
|
+
isPrimary?: boolean | undefined;
|
|
2208
|
+
}>;
|
|
2209
|
+
declare const InsertShopListingSchema: z.ZodObject<Omit<{
|
|
2210
|
+
id: z.ZodOptional<z.ZodString>;
|
|
2211
|
+
itemId: z.ZodString;
|
|
2212
|
+
currencyId: z.ZodString;
|
|
2213
|
+
price: z.ZodNumber;
|
|
2214
|
+
sellBackPercentage: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
2215
|
+
stock: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
2216
|
+
isActive: z.ZodDefault<z.ZodBoolean>;
|
|
2217
|
+
availableFrom: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
2218
|
+
availableUntil: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
2219
|
+
createdAt: z.ZodOptional<z.ZodDate>;
|
|
2220
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
2221
|
+
}, "id" | "createdAt" | "updatedAt">, "strip", z.ZodTypeAny, {
|
|
2222
|
+
itemId: string;
|
|
2223
|
+
currencyId: string;
|
|
2224
|
+
price: number;
|
|
2225
|
+
isActive: boolean;
|
|
2226
|
+
sellBackPercentage?: number | null | undefined;
|
|
2227
|
+
stock?: number | null | undefined;
|
|
2228
|
+
availableFrom?: Date | null | undefined;
|
|
2229
|
+
availableUntil?: Date | null | undefined;
|
|
2230
|
+
}, {
|
|
2231
|
+
itemId: string;
|
|
2232
|
+
currencyId: string;
|
|
2233
|
+
price: number;
|
|
2234
|
+
sellBackPercentage?: number | null | undefined;
|
|
2235
|
+
stock?: number | null | undefined;
|
|
2236
|
+
isActive?: boolean | undefined;
|
|
2237
|
+
availableFrom?: Date | null | undefined;
|
|
2238
|
+
availableUntil?: Date | null | undefined;
|
|
2239
|
+
}>;
|
|
2240
|
+
declare const UpdateShopListingSchema: z.ZodObject<{
|
|
2241
|
+
itemId: z.ZodOptional<z.ZodString>;
|
|
2242
|
+
currencyId: z.ZodOptional<z.ZodString>;
|
|
2243
|
+
price: z.ZodOptional<z.ZodNumber>;
|
|
2244
|
+
sellBackPercentage: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodNumber>>>;
|
|
2245
|
+
stock: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodNumber>>>;
|
|
2246
|
+
isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
2247
|
+
availableFrom: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
|
|
2248
|
+
availableUntil: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
|
|
2249
|
+
}, "strip", z.ZodTypeAny, {
|
|
2250
|
+
itemId?: string | undefined;
|
|
2251
|
+
currencyId?: string | undefined;
|
|
2252
|
+
price?: number | undefined;
|
|
2253
|
+
sellBackPercentage?: number | null | undefined;
|
|
2254
|
+
stock?: number | null | undefined;
|
|
2255
|
+
isActive?: boolean | undefined;
|
|
2256
|
+
availableFrom?: Date | null | undefined;
|
|
2257
|
+
availableUntil?: Date | null | undefined;
|
|
2258
|
+
}, {
|
|
2259
|
+
itemId?: string | undefined;
|
|
2260
|
+
currencyId?: string | undefined;
|
|
2261
|
+
price?: number | undefined;
|
|
2262
|
+
sellBackPercentage?: number | null | undefined;
|
|
2263
|
+
stock?: number | null | undefined;
|
|
2264
|
+
isActive?: boolean | undefined;
|
|
2265
|
+
availableFrom?: Date | null | undefined;
|
|
2266
|
+
availableUntil?: Date | null | undefined;
|
|
2267
|
+
}>;
|
|
2268
|
+
/**
|
|
2269
|
+
* Achievement Completion Types
|
|
2270
|
+
*/
|
|
2271
|
+
declare const ACHIEVEMENT_COMPLETION_TYPES: readonly ["time_played_session", "interaction", "leaderboard_rank"];
|
|
2272
|
+
type AchievementCompletionType = (typeof ACHIEVEMENT_COMPLETION_TYPES)[number];
|
|
2273
|
+
|
|
2274
|
+
type CharacterComponent = typeof characterComponents.$inferSelect;
|
|
2275
|
+
type PlayerCharacter = typeof playerCharacters.$inferSelect & {
|
|
2276
|
+
accessories?: PlayerCharacterAccessory[];
|
|
2277
|
+
};
|
|
2278
|
+
type PlayerCharacterAccessory = typeof playerCharacterAccessories.$inferSelect;
|
|
2279
|
+
type GameRow = typeof games.$inferSelect;
|
|
2280
|
+
type BaseGame = Omit<GameRow, 'gameType' | 'assetBundleBase' | 'externalUrl'>;
|
|
2281
|
+
type HostedGame = BaseGame & {
|
|
2282
|
+
gameType: 'hosted';
|
|
2283
|
+
assetBundleBase: string;
|
|
2284
|
+
externalUrl: null;
|
|
2285
|
+
};
|
|
2286
|
+
type ExternalGame = BaseGame & {
|
|
2287
|
+
gameType: 'external';
|
|
2288
|
+
assetBundleBase: null;
|
|
2289
|
+
externalUrl: string;
|
|
2290
|
+
};
|
|
2291
|
+
type Game = HostedGame | ExternalGame;
|
|
2292
|
+
type GameStateData = Record<string, unknown>;
|
|
2293
|
+
type UpsertGameMetadataInput = z.infer<typeof UpsertGameMetadataSchema>;
|
|
2294
|
+
type Item = typeof items.$inferSelect;
|
|
2295
|
+
type InventoryItem = typeof inventoryItems.$inferSelect;
|
|
2296
|
+
type ShopListing = typeof shopListings.$inferSelect;
|
|
2297
|
+
type InsertItemInput = z.infer<typeof InsertItemSchema>;
|
|
2298
|
+
type UpdateItemInput = z.infer<typeof UpdateItemSchema>;
|
|
2299
|
+
type InsertCurrencyInput = z.infer<typeof InsertCurrencySchema>;
|
|
2300
|
+
type UpdateCurrencyInput = z.infer<typeof UpdateCurrencySchema>;
|
|
2301
|
+
type InsertShopListingInput = z.infer<typeof InsertShopListingSchema>;
|
|
2302
|
+
type UpdateShopListingInput = z.infer<typeof UpdateShopListingSchema>;
|
|
2303
|
+
interface PlaceableItemMetadata {
|
|
2304
|
+
tilesWide?: number;
|
|
2305
|
+
tilesHigh?: number;
|
|
2306
|
+
flippable?: boolean;
|
|
2307
|
+
[key: string]: unknown;
|
|
2308
|
+
}
|
|
2309
|
+
type MapElement = typeof mapElements.$inferSelect;
|
|
2310
|
+
type MapObject = typeof mapObjects.$inferSelect;
|
|
2311
|
+
interface MapData {
|
|
2312
|
+
id: string;
|
|
2313
|
+
identifier: string;
|
|
2314
|
+
displayName: string;
|
|
2315
|
+
description?: string;
|
|
2316
|
+
metadata?: Record<string, unknown>;
|
|
2317
|
+
}
|
|
2318
|
+
interface CreateMapObjectData {
|
|
2319
|
+
itemId: string;
|
|
2320
|
+
worldX: number;
|
|
2321
|
+
worldY: number;
|
|
2322
|
+
width?: number;
|
|
2323
|
+
height?: number;
|
|
2324
|
+
rotation?: number;
|
|
2325
|
+
scale?: number;
|
|
2326
|
+
metadata?: Record<string, unknown>;
|
|
2327
|
+
}
|
|
2328
|
+
|
|
2329
|
+
type User = typeof users.$inferSelect;
|
|
2330
|
+
type DeveloperStatusResponse = z.infer<typeof DeveloperStatusResponseSchema>;
|
|
2331
|
+
type DeveloperStatusValue = DeveloperStatusResponse['status'];
|
|
2332
|
+
/**
|
|
2333
|
+
* User data with authentication provider information.
|
|
2334
|
+
* Returned by the /users/me endpoint with additional auth context.
|
|
2335
|
+
*/
|
|
2336
|
+
type AuthenticatedUser = User & {
|
|
2337
|
+
/** Whether the user authenticated via Timeback SSO */
|
|
2338
|
+
hasTimebackAccount: boolean;
|
|
2339
|
+
};
|
|
2340
|
+
|
|
2341
|
+
/**
|
|
2342
|
+
* Cross-Domain Composite Types
|
|
2343
|
+
* Types that combine data from multiple domains
|
|
2344
|
+
*/
|
|
2345
|
+
type ManifestV1 = z.infer<typeof ManifestV1Schema>;
|
|
2346
|
+
/**
|
|
2347
|
+
* Character-related Composite Types
|
|
2348
|
+
* Types that combine character component data with sprite sheet information
|
|
2349
|
+
*/
|
|
2350
|
+
type CharacterComponentWithSpriteUrl = CharacterComponent & {
|
|
2351
|
+
spriteSheetUrl: string;
|
|
2352
|
+
};
|
|
2353
|
+
type InventoryItemWithItem = Omit<InventoryItem, 'itemId'> & {
|
|
2354
|
+
item: Item;
|
|
2355
|
+
};
|
|
2356
|
+
type HostedGameWithManifest = HostedGame & {
|
|
2357
|
+
manifest: ManifestV1;
|
|
2358
|
+
};
|
|
2359
|
+
type FetchedGame = HostedGameWithManifest | GameRow;
|
|
2360
|
+
/**
|
|
2361
|
+
* Map-related Composite Types
|
|
2362
|
+
* Types that combine map, game, and item data for rendering and interaction
|
|
2363
|
+
*/
|
|
2364
|
+
interface MapElementWithGame extends MapElement {
|
|
2365
|
+
game: Pick<Game, 'id' | 'displayName'> | null;
|
|
2366
|
+
}
|
|
2367
|
+
interface MapObjectWithItem extends MapObject {
|
|
2368
|
+
item: Pick<Item, 'id' | 'slug' | 'displayName' | 'description' | 'imageUrl' | 'isPlaceable'> & {
|
|
2369
|
+
metadata: PlaceableItemMetadata;
|
|
2370
|
+
};
|
|
2371
|
+
}
|
|
2372
|
+
/**
|
|
2373
|
+
* Shop-related Composite Types
|
|
2374
|
+
* Types that combine inventory, currency, and shop listing data for commerce operations
|
|
2375
|
+
*/
|
|
2376
|
+
interface ShopDisplayItem extends Omit<Item, 'createdAt'> {
|
|
2377
|
+
listingId: string;
|
|
2378
|
+
shopPrice: number;
|
|
2379
|
+
currencyId: string;
|
|
2380
|
+
currencySymbol?: string | null;
|
|
2381
|
+
currencyDisplayName?: string | null;
|
|
2382
|
+
currencyImageUrl?: string | null;
|
|
2383
|
+
stock?: number | null;
|
|
2384
|
+
sellBackPercentage?: number | null;
|
|
2385
|
+
}
|
|
2386
|
+
interface ShopCurrency {
|
|
2387
|
+
id: string;
|
|
2388
|
+
symbol: string | null;
|
|
2389
|
+
isPrimary: boolean;
|
|
2390
|
+
displayName?: string | null;
|
|
2391
|
+
imageUrl?: string | null;
|
|
2392
|
+
}
|
|
2393
|
+
interface ShopViewResponse {
|
|
2394
|
+
shopItems: ShopDisplayItem[];
|
|
2395
|
+
currencies: ShopCurrency[];
|
|
2396
|
+
}
|
|
2397
|
+
/**
|
|
2398
|
+
* Leaderboard Composite Types
|
|
2399
|
+
* Types that combine leaderboard, user, and game data
|
|
2400
|
+
*/
|
|
2401
|
+
interface GameLeaderboardEntry {
|
|
2402
|
+
rank: number;
|
|
2403
|
+
userId: string;
|
|
2404
|
+
username: string;
|
|
2405
|
+
userImage?: string | null;
|
|
2406
|
+
score: number;
|
|
2407
|
+
achievedAt: Date;
|
|
2408
|
+
metadata?: Record<string, unknown>;
|
|
2409
|
+
gameId: string;
|
|
2410
|
+
gameTitle: string;
|
|
2411
|
+
gameSlug: string;
|
|
2412
|
+
}
|
|
2413
|
+
|
|
2414
|
+
type UserLevel = typeof userLevels.$inferSelect;
|
|
2415
|
+
type LevelConfig = typeof levelConfigs.$inferSelect;
|
|
2416
|
+
interface LeaderboardOptions {
|
|
2417
|
+
timeframe?: 'all_time' | 'monthly' | 'weekly' | 'daily';
|
|
2418
|
+
limit?: number;
|
|
2419
|
+
offset?: number;
|
|
2420
|
+
gameId?: string;
|
|
2421
|
+
}
|
|
2422
|
+
interface LeaderboardEntry {
|
|
2423
|
+
rank: number;
|
|
2424
|
+
userId: string;
|
|
2425
|
+
username: string;
|
|
2426
|
+
userImage?: string | null;
|
|
2427
|
+
score: number;
|
|
2428
|
+
achievedAt: Date;
|
|
2429
|
+
metadata?: Record<string, unknown>;
|
|
2430
|
+
gameId?: string;
|
|
2431
|
+
gameTitle?: string;
|
|
2432
|
+
gameSlug?: string;
|
|
2433
|
+
}
|
|
2434
|
+
interface UserRankResponse {
|
|
2435
|
+
rank: number;
|
|
2436
|
+
score: number;
|
|
2437
|
+
userId: string;
|
|
2438
|
+
}
|
|
2439
|
+
interface UserScore$1 {
|
|
2440
|
+
id: string;
|
|
2441
|
+
score: number;
|
|
2442
|
+
achievedAt: Date;
|
|
2443
|
+
metadata?: Record<string, unknown>;
|
|
2444
|
+
gameId: string;
|
|
2445
|
+
gameTitle: string;
|
|
2446
|
+
gameSlug: string;
|
|
2447
|
+
}
|
|
2448
|
+
interface SpriteTemplateData {
|
|
2449
|
+
tileSize: number;
|
|
2450
|
+
tileHeight: number;
|
|
2451
|
+
columns: number;
|
|
2452
|
+
rows: number;
|
|
2453
|
+
spacing: number;
|
|
2454
|
+
animations: {
|
|
2455
|
+
base_right: {
|
|
2456
|
+
row: number;
|
|
2457
|
+
frameStart: number;
|
|
2458
|
+
numFrames: number;
|
|
2459
|
+
fps: number;
|
|
2460
|
+
};
|
|
2461
|
+
base_up: {
|
|
2462
|
+
row: number;
|
|
2463
|
+
frameStart: number;
|
|
2464
|
+
numFrames: number;
|
|
2465
|
+
fps: number;
|
|
2466
|
+
};
|
|
2467
|
+
base_left: {
|
|
2468
|
+
row: number;
|
|
2469
|
+
frameStart: number;
|
|
2470
|
+
numFrames: number;
|
|
2471
|
+
fps: number;
|
|
2472
|
+
};
|
|
2473
|
+
base_down: {
|
|
2474
|
+
row: number;
|
|
2475
|
+
frameStart: number;
|
|
2476
|
+
numFrames: number;
|
|
2477
|
+
fps: number;
|
|
2478
|
+
};
|
|
2479
|
+
idle_right: {
|
|
2480
|
+
row: number;
|
|
2481
|
+
frameStart: number;
|
|
2482
|
+
numFrames: number;
|
|
2483
|
+
fps: number;
|
|
2484
|
+
};
|
|
2485
|
+
walk_right: {
|
|
2486
|
+
row: number;
|
|
2487
|
+
frameStart: number;
|
|
2488
|
+
numFrames: number;
|
|
2489
|
+
fps: number;
|
|
2490
|
+
};
|
|
2491
|
+
idle_up: {
|
|
2492
|
+
row: number;
|
|
2493
|
+
frameStart: number;
|
|
2494
|
+
numFrames: number;
|
|
2495
|
+
fps: number;
|
|
2496
|
+
};
|
|
2497
|
+
walk_up: {
|
|
2498
|
+
row: number;
|
|
2499
|
+
frameStart: number;
|
|
2500
|
+
numFrames: number;
|
|
2501
|
+
fps: number;
|
|
2502
|
+
};
|
|
2503
|
+
idle_left: {
|
|
2504
|
+
row: number;
|
|
2505
|
+
frameStart: number;
|
|
2506
|
+
numFrames: number;
|
|
2507
|
+
fps: number;
|
|
2508
|
+
};
|
|
2509
|
+
walk_left: {
|
|
2510
|
+
row: number;
|
|
2511
|
+
frameStart: number;
|
|
2512
|
+
numFrames: number;
|
|
2513
|
+
fps: number;
|
|
2514
|
+
};
|
|
2515
|
+
idle_down: {
|
|
2516
|
+
row: number;
|
|
2517
|
+
frameStart: number;
|
|
2518
|
+
numFrames: number;
|
|
2519
|
+
fps: number;
|
|
2520
|
+
};
|
|
2521
|
+
walk_down: {
|
|
2522
|
+
row: number;
|
|
2523
|
+
frameStart: number;
|
|
2524
|
+
numFrames: number;
|
|
2525
|
+
fps: number;
|
|
2526
|
+
};
|
|
2527
|
+
};
|
|
2528
|
+
}
|
|
2529
|
+
type TodayXpResponse = {
|
|
2530
|
+
xp: number;
|
|
2531
|
+
date: string;
|
|
2532
|
+
};
|
|
2533
|
+
type TotalXpResponse = {
|
|
2534
|
+
totalXp: number;
|
|
2535
|
+
};
|
|
2536
|
+
type XpHistoryResponse = {
|
|
2537
|
+
history: Array<{
|
|
2538
|
+
date: string;
|
|
2539
|
+
xp: number;
|
|
2540
|
+
}>;
|
|
2541
|
+
};
|
|
2542
|
+
|
|
2543
|
+
type AchievementIntervalType = (typeof achievementIntervalEnum.enumValues)[number];
|
|
2544
|
+
/**
|
|
2545
|
+
* Current-interval achievement with computed status and window metadata
|
|
2546
|
+
*/
|
|
2547
|
+
interface AchievementCurrent {
|
|
2548
|
+
id: string;
|
|
2549
|
+
title: string;
|
|
2550
|
+
description?: string | null;
|
|
2551
|
+
intervalType: AchievementIntervalType;
|
|
2552
|
+
rewardCredits: number;
|
|
2553
|
+
limitPerInterval: number;
|
|
2554
|
+
completionType: AchievementCompletionType;
|
|
2555
|
+
completionConfig: Record<string, unknown>;
|
|
2556
|
+
scope: Record<string, unknown>;
|
|
2557
|
+
active: boolean;
|
|
2558
|
+
createdAt?: Date;
|
|
2559
|
+
updatedAt?: Date;
|
|
2560
|
+
status: 'available' | 'completed';
|
|
2561
|
+
intervalKey: string;
|
|
2562
|
+
windowStart: string;
|
|
2563
|
+
windowEnd: string;
|
|
2564
|
+
}
|
|
2565
|
+
/**
|
|
2566
|
+
* Historical entry representing a prior claim within an interval
|
|
2567
|
+
*/
|
|
2568
|
+
interface AchievementHistoryEntry {
|
|
2569
|
+
achievementId: string;
|
|
2570
|
+
title: string;
|
|
2571
|
+
rewardCredits: number;
|
|
2572
|
+
createdAt: string;
|
|
2573
|
+
intervalKey: string;
|
|
2574
|
+
}
|
|
2575
|
+
/**
|
|
2576
|
+
* Response returned when submitting achievement progress
|
|
2577
|
+
*/
|
|
2578
|
+
interface AchievementProgressResponse {
|
|
2579
|
+
achievementId: string;
|
|
2580
|
+
status: 'completed' | 'already_completed';
|
|
2581
|
+
rewardCredits: number;
|
|
2582
|
+
intervalKey: string;
|
|
2583
|
+
createdAt: string;
|
|
2584
|
+
}
|
|
2585
|
+
|
|
2586
|
+
interface ClientConfig {
|
|
2587
|
+
baseUrl: string;
|
|
2588
|
+
token?: string;
|
|
2589
|
+
gameId?: string;
|
|
2590
|
+
autoStartSession?: boolean;
|
|
2591
|
+
}
|
|
2592
|
+
type AuthProviderType = (typeof AuthProvider)[keyof typeof AuthProvider];
|
|
2593
|
+
interface AuthOptions {
|
|
2594
|
+
/** The identity provider to use for authentication */
|
|
2595
|
+
provider: AuthProviderType;
|
|
2596
|
+
/** The OAuth callback URL where your server handles the callback */
|
|
2597
|
+
callbackUrl: string;
|
|
2598
|
+
/** Authentication mode - auto detects best option based on context */
|
|
2599
|
+
mode?: 'auto' | 'popup' | 'redirect';
|
|
2600
|
+
/** Callback for authentication state changes */
|
|
2601
|
+
onStateChange?: (state: AuthStateUpdate) => void;
|
|
2602
|
+
/** Custom OAuth configuration (for users embedding the SDK outside of the Playcademy platform) */
|
|
2603
|
+
oauth?: {
|
|
2604
|
+
clientId: string;
|
|
2605
|
+
authorizationEndpoint?: string;
|
|
2606
|
+
tokenEndpoint?: string;
|
|
2607
|
+
scope?: string;
|
|
2608
|
+
};
|
|
2609
|
+
/**
|
|
2610
|
+
* Optional custom data to encode in OAuth state parameter.
|
|
2611
|
+
* By default, the SDK automatically includes playcademy_user_id and game_id.
|
|
2612
|
+
* Use this to add additional custom data if needed.
|
|
2613
|
+
*/
|
|
2614
|
+
stateData?: Record<string, string>;
|
|
2615
|
+
}
|
|
2616
|
+
interface AuthStateUpdate {
|
|
2617
|
+
/** Current status of the authentication flow */
|
|
2618
|
+
status: 'opening_popup' | 'exchanging_token' | 'complete' | 'error';
|
|
2619
|
+
/** Human-readable message about the current state */
|
|
2620
|
+
message: string;
|
|
2621
|
+
/** Error details if status is 'error' */
|
|
2622
|
+
error?: Error;
|
|
2623
|
+
}
|
|
2624
|
+
interface AuthResult {
|
|
2625
|
+
/** Whether authentication was successful */
|
|
2626
|
+
success: boolean;
|
|
2627
|
+
/** User information if authentication was successful */
|
|
2628
|
+
user?: UserInfo;
|
|
2629
|
+
/** Error if authentication failed */
|
|
2630
|
+
error?: Error;
|
|
2631
|
+
}
|
|
2632
|
+
/**
|
|
2633
|
+
* Standard OAuth/OIDC user claims returned from identity providers
|
|
2634
|
+
* This is what external identity providers (like Timeback) return
|
|
2635
|
+
*/
|
|
2636
|
+
interface UserInfo {
|
|
2637
|
+
/** Unique user identifier (sub claim from JWT) */
|
|
2638
|
+
sub: string;
|
|
2639
|
+
/** User's email address */
|
|
2640
|
+
email: string;
|
|
2641
|
+
/** User's display name */
|
|
2642
|
+
name: string;
|
|
2643
|
+
/** Whether the email has been verified */
|
|
2644
|
+
email_verified: boolean;
|
|
2645
|
+
/** Optional given name (first name) */
|
|
2646
|
+
given_name?: string;
|
|
2647
|
+
/** Optional family name (last name) */
|
|
2648
|
+
family_name?: string;
|
|
2649
|
+
/** Additional user attributes from the identity provider */
|
|
2650
|
+
[key: string]: unknown;
|
|
2651
|
+
}
|
|
2652
|
+
/**
|
|
2653
|
+
* Authentication state change event payload.
|
|
2654
|
+
* Used when authentication state changes in the application.
|
|
2655
|
+
*/
|
|
2656
|
+
interface AuthStateChangePayload {
|
|
2657
|
+
/** Whether the user is currently authenticated */
|
|
2658
|
+
authenticated: boolean;
|
|
2659
|
+
/** User information if authenticated, null otherwise */
|
|
2660
|
+
user: UserInfo | null;
|
|
2661
|
+
/** Error information if authentication failed */
|
|
2662
|
+
error: Error | null;
|
|
2663
|
+
}
|
|
2664
|
+
/**
|
|
2665
|
+
* OAuth callback event payload.
|
|
2666
|
+
* Used when OAuth flow completes in popup/new-tab windows.
|
|
2667
|
+
*/
|
|
2668
|
+
interface AuthCallbackPayload {
|
|
2669
|
+
/** OAuth authorization code */
|
|
2670
|
+
code: string;
|
|
2671
|
+
/** OAuth state parameter for CSRF protection */
|
|
2672
|
+
state: string;
|
|
2673
|
+
/** Error message if OAuth flow failed */
|
|
2674
|
+
error: string | null;
|
|
2675
|
+
}
|
|
2676
|
+
/**
|
|
2677
|
+
* Token refresh event payload.
|
|
2678
|
+
* Sent when authentication token is updated.
|
|
2679
|
+
*/
|
|
2680
|
+
interface TokenRefreshPayload {
|
|
2681
|
+
/** New authentication token */
|
|
2682
|
+
token: string;
|
|
2683
|
+
/** Token expiration timestamp */
|
|
2684
|
+
exp: number;
|
|
2685
|
+
}
|
|
2686
|
+
/**
|
|
2687
|
+
* Telemetry event payload.
|
|
2688
|
+
* Performance metrics sent from the game.
|
|
2689
|
+
*/
|
|
2690
|
+
interface TelemetryPayload {
|
|
2691
|
+
/** Frames per second */
|
|
2692
|
+
fps: number;
|
|
2693
|
+
/** Memory usage in MB */
|
|
2694
|
+
mem: number;
|
|
2695
|
+
}
|
|
2696
|
+
/**
|
|
2697
|
+
* Keyboard event payload.
|
|
2698
|
+
* Key events forwarded from the game.
|
|
2699
|
+
*/
|
|
2700
|
+
interface KeyEventPayload {
|
|
2701
|
+
/** Key value (e.g., 'Escape', 'F1') */
|
|
2702
|
+
key: string;
|
|
2703
|
+
/** Key code (optional) */
|
|
2704
|
+
code?: string;
|
|
2705
|
+
/** Event type */
|
|
2706
|
+
type: 'keydown' | 'keyup';
|
|
2707
|
+
}
|
|
2708
|
+
interface ClientEvents {
|
|
2709
|
+
authChange: {
|
|
2710
|
+
token: string | null;
|
|
2711
|
+
};
|
|
2712
|
+
inventoryChange: {
|
|
2713
|
+
itemId: string;
|
|
2714
|
+
delta: number;
|
|
2715
|
+
newTotal: number;
|
|
2716
|
+
};
|
|
2717
|
+
levelUp: {
|
|
2718
|
+
oldLevel: number;
|
|
2719
|
+
newLevel: number;
|
|
2720
|
+
creditsAwarded: number;
|
|
2721
|
+
};
|
|
2722
|
+
xpGained: {
|
|
2723
|
+
amount: number;
|
|
2724
|
+
totalXP: number;
|
|
2725
|
+
leveledUp: boolean;
|
|
2726
|
+
};
|
|
2727
|
+
}
|
|
2728
|
+
type GameContextPayload = {
|
|
2729
|
+
token: string;
|
|
2730
|
+
baseUrl: string;
|
|
2731
|
+
realtimeUrl: string;
|
|
2732
|
+
gameId: string;
|
|
2733
|
+
forwardKeys?: string[];
|
|
2734
|
+
};
|
|
2735
|
+
type LoginResponse = {
|
|
2736
|
+
token: string;
|
|
2737
|
+
};
|
|
2738
|
+
type GameTokenResponse = {
|
|
2739
|
+
token: string;
|
|
2740
|
+
exp: number;
|
|
2741
|
+
};
|
|
2742
|
+
type StartSessionResponse = {
|
|
2743
|
+
sessionId: string;
|
|
2744
|
+
};
|
|
2745
|
+
type InventoryMutationResponse = {
|
|
2746
|
+
newTotal: number;
|
|
2747
|
+
};
|
|
2748
|
+
type DevUploadEvent = {
|
|
2749
|
+
type: 'init';
|
|
2750
|
+
} | {
|
|
2751
|
+
type: 's3Progress';
|
|
2752
|
+
loaded: number;
|
|
2753
|
+
total: number;
|
|
2754
|
+
percent: number;
|
|
2755
|
+
} | {
|
|
2756
|
+
type: 'finalizeStart';
|
|
2757
|
+
} | {
|
|
2758
|
+
type: 'finalizeProgress';
|
|
2759
|
+
percent: number;
|
|
2760
|
+
currentFileLabel?: string;
|
|
2761
|
+
} | {
|
|
2762
|
+
type: 'finalizeStatus';
|
|
2763
|
+
message: string;
|
|
2764
|
+
} | {
|
|
2765
|
+
type: 'close';
|
|
2766
|
+
};
|
|
2767
|
+
type DevUploadHooks = {
|
|
2768
|
+
onEvent?: (e: DevUploadEvent) => void;
|
|
2769
|
+
onClose?: () => void;
|
|
2770
|
+
};
|
|
2771
|
+
|
|
2772
|
+
/**
|
|
2773
|
+
* OAuth 2.0 implementation for the Playcademy SDK
|
|
2774
|
+
*/
|
|
2775
|
+
|
|
2776
|
+
/**
|
|
2777
|
+
* Parses an OAuth state parameter to extract CSRF token and any encoded data.
|
|
2778
|
+
*
|
|
2779
|
+
* @param state - The OAuth state parameter to parse
|
|
2780
|
+
* @returns Object containing CSRF token and optional decoded data
|
|
2781
|
+
*/
|
|
2782
|
+
declare function parseOAuthState(state: string): {
|
|
2783
|
+
csrfToken: string;
|
|
2784
|
+
data?: Record<string, string>;
|
|
2785
|
+
};
|
|
2786
|
+
|
|
2787
|
+
/**
|
|
2788
|
+
* Response type for the realtime token API
|
|
2789
|
+
*/
|
|
2790
|
+
interface RealtimeTokenResponse {
|
|
2791
|
+
token: string;
|
|
2792
|
+
}
|
|
2793
|
+
|
|
2794
|
+
/**
|
|
2795
|
+
* Cache configuration types for runtime customization
|
|
2796
|
+
*/
|
|
2797
|
+
/**
|
|
2798
|
+
* Runtime configuration for TTL cache behavior
|
|
2799
|
+
*/
|
|
2800
|
+
interface TTLCacheConfig {
|
|
2801
|
+
/** Time-to-live in milliseconds. Set to 0 to disable caching for this call. */
|
|
2802
|
+
ttl?: number;
|
|
2803
|
+
/** Force refresh, bypassing cache */
|
|
2804
|
+
force?: boolean;
|
|
2805
|
+
/** Skip cache and fetch fresh data (alias for force) */
|
|
2806
|
+
skipCache?: boolean;
|
|
2807
|
+
}
|
|
2808
|
+
/**
|
|
2809
|
+
* Runtime configuration for cooldown cache behavior
|
|
2810
|
+
*/
|
|
2811
|
+
interface CooldownCacheConfig {
|
|
2812
|
+
/** Cooldown period in milliseconds. Set to 0 to disable cooldown for this call. */
|
|
2813
|
+
cooldown?: number;
|
|
2814
|
+
/** Force refresh, bypassing cooldown */
|
|
2815
|
+
force?: boolean;
|
|
2816
|
+
}
|
|
2817
|
+
|
|
2818
|
+
interface CharacterComponentsOptions {
|
|
2819
|
+
/**
|
|
2820
|
+
* Optional level filter for components
|
|
2821
|
+
* When provided, only components available at this level or below are returned
|
|
2822
|
+
*/
|
|
2823
|
+
level?: number;
|
|
2824
|
+
/**
|
|
2825
|
+
* Whether to bypass the cache and force a fresh API request
|
|
2826
|
+
* Default: false (use cache when available)
|
|
2827
|
+
*/
|
|
2828
|
+
skipCache?: boolean;
|
|
2829
|
+
}
|
|
2830
|
+
interface CreateCharacterData {
|
|
2831
|
+
bodyComponentId: string;
|
|
2832
|
+
eyesComponentId: string;
|
|
2833
|
+
hairstyleComponentId: string;
|
|
2834
|
+
outfitComponentId: string;
|
|
2835
|
+
}
|
|
2836
|
+
interface UpdateCharacterData {
|
|
2837
|
+
bodyComponentId?: string;
|
|
2838
|
+
eyesComponentId?: string;
|
|
2839
|
+
hairstyleComponentId?: string;
|
|
2840
|
+
outfitComponentId?: string;
|
|
2841
|
+
}
|
|
2842
|
+
|
|
2843
|
+
interface ScoreSubmission {
|
|
2844
|
+
id: string;
|
|
2845
|
+
score: number;
|
|
2846
|
+
achievedAt: Date;
|
|
2847
|
+
}
|
|
2848
|
+
|
|
2849
|
+
/**
|
|
2850
|
+
* Combined response type for summary method
|
|
2851
|
+
*/
|
|
2852
|
+
type XpSummaryResponse = {
|
|
2853
|
+
today: TodayXpResponse;
|
|
2854
|
+
total: TotalXpResponse;
|
|
2855
|
+
};
|
|
2856
|
+
|
|
2857
|
+
interface UserScore {
|
|
2858
|
+
id: string;
|
|
2859
|
+
score: number;
|
|
2860
|
+
achievedAt: Date;
|
|
2861
|
+
metadata?: Record<string, unknown>;
|
|
2862
|
+
gameId: string;
|
|
2863
|
+
gameTitle: string;
|
|
2864
|
+
gameSlug: string;
|
|
2865
|
+
}
|
|
2866
|
+
|
|
2867
|
+
/**
|
|
2868
|
+
* Auto-initializes a PlaycademyClient with context from the environment.
|
|
2869
|
+
* Works in both iframe mode (production/development) and standalone mode (local dev).
|
|
2870
|
+
*
|
|
2871
|
+
* This is the recommended way to initialize the SDK as it automatically:
|
|
2872
|
+
* - Detects the runtime environment (iframe vs standalone)
|
|
2873
|
+
* - Configures the client with the appropriate context
|
|
2874
|
+
* - Sets up event listeners for token refresh
|
|
2875
|
+
* - Exposes the client for debugging in development mode
|
|
2876
|
+
*
|
|
2877
|
+
* @returns Promise resolving to a fully initialized PlaycademyClient
|
|
2878
|
+
* @throws Error if not running in a browser context
|
|
2879
|
+
*
|
|
2880
|
+
* @example
|
|
2881
|
+
* ```typescript
|
|
2882
|
+
* const client = await PlaycademyClient.init()
|
|
2883
|
+
* const user = await client.users.me()
|
|
2884
|
+
* ```
|
|
2885
|
+
*/
|
|
2886
|
+
declare function init(): Promise<PlaycademyClient>;
|
|
2887
|
+
|
|
2888
|
+
/**
|
|
2889
|
+
* Authenticates a user with email and password.
|
|
2890
|
+
*
|
|
2891
|
+
* This is a standalone authentication method that doesn't require an initialized client.
|
|
2892
|
+
* Use this for login flows before creating a client instance.
|
|
2893
|
+
*
|
|
2894
|
+
* @deprecated Use client.auth.login() instead for better error handling and automatic token management
|
|
2895
|
+
*
|
|
2896
|
+
* @param baseUrl - The base URL of the Playcademy API
|
|
2897
|
+
* @param email - User's email address
|
|
2898
|
+
* @param password - User's password
|
|
2899
|
+
* @returns Promise resolving to authentication response with token
|
|
2900
|
+
* @throws PlaycademyError if authentication fails or network error occurs
|
|
2901
|
+
*
|
|
2902
|
+
* @example
|
|
2903
|
+
* ```typescript
|
|
2904
|
+
* // Preferred approach:
|
|
2905
|
+
* const client = new PlaycademyClient({ baseUrl: '/api' })
|
|
2906
|
+
* const result = await client.auth.login({
|
|
2907
|
+
* email: 'user@example.com',
|
|
2908
|
+
* password: 'password'
|
|
2909
|
+
* })
|
|
2910
|
+
*
|
|
2911
|
+
* // Legacy approach (still works):
|
|
2912
|
+
* try {
|
|
2913
|
+
* const response = await PlaycademyClient.login('/api', 'user@example.com', 'password')
|
|
2914
|
+
* const client = new PlaycademyClient({ token: response.token })
|
|
2915
|
+
* } catch (error) {
|
|
2916
|
+
* console.error('Login failed:', error.message)
|
|
2917
|
+
* }
|
|
2918
|
+
* ```
|
|
2919
|
+
*/
|
|
2920
|
+
declare function login(baseUrl: string, email: string, password: string): Promise<LoginResponse>;
|
|
2921
|
+
|
|
2922
|
+
/** Permitted HTTP verbs */
|
|
2923
|
+
type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
2924
|
+
|
|
2925
|
+
/**
|
|
2926
|
+
* Main Playcademy SDK client for interacting with the platform API.
|
|
2927
|
+
* Provides namespaced access to all platform features including games, users, inventory, and more.
|
|
2928
|
+
*/
|
|
2929
|
+
declare class PlaycademyClient {
|
|
2930
|
+
private baseUrl;
|
|
2931
|
+
private token?;
|
|
2932
|
+
private gameId?;
|
|
2933
|
+
private config;
|
|
2934
|
+
private listeners;
|
|
2935
|
+
private internalClientSessionId?;
|
|
2936
|
+
private authContext?;
|
|
2937
|
+
private initPayload?;
|
|
2938
|
+
/**
|
|
2939
|
+
* Creates a new PlaycademyClient instance.
|
|
2940
|
+
*
|
|
2941
|
+
* @param config - Optional configuration object
|
|
2942
|
+
* @param config.baseUrl - Base URL for API requests (defaults to '/api')
|
|
2943
|
+
* @param config.token - Authentication token
|
|
2944
|
+
* @param config.gameId - Game ID for automatic session management
|
|
2945
|
+
* @param config.autoStartSession - Automatically start a game session?
|
|
2946
|
+
*/
|
|
2947
|
+
constructor(config?: Partial<ClientConfig>);
|
|
2948
|
+
/**
|
|
2949
|
+
* Gets the effective base URL for API requests.
|
|
2950
|
+
* Converts relative URLs to absolute URLs in browser environments.
|
|
2951
|
+
*
|
|
2952
|
+
* @returns The complete base URL for API requests
|
|
2953
|
+
*/
|
|
2954
|
+
getBaseUrl(): string;
|
|
2955
|
+
/**
|
|
2956
|
+
* Simple ping method for testing connectivity.
|
|
2957
|
+
*
|
|
2958
|
+
* @returns 'pong' string response
|
|
2959
|
+
*/
|
|
2960
|
+
ping(): string;
|
|
2961
|
+
/**
|
|
2962
|
+
* Sets the authentication token for API requests.
|
|
2963
|
+
* Emits an 'authChange' event when the token changes.
|
|
2964
|
+
*
|
|
2965
|
+
* @param token - The authentication token, or null to clear
|
|
2966
|
+
*/
|
|
2967
|
+
setToken(token: string | null): void;
|
|
2968
|
+
/**
|
|
2969
|
+
* Checks if the client has a valid API token for making Playcademy API requests.
|
|
2970
|
+
*
|
|
2971
|
+
* For games (iframe context): Checks if we have a valid token from the parent.
|
|
2972
|
+
* For Cademy (standalone): Checks if we have a token from better-auth.
|
|
2973
|
+
*
|
|
2974
|
+
* Note: This checks for API authentication, not whether a user has linked
|
|
2975
|
+
* their identity via OAuth.
|
|
2976
|
+
*
|
|
2977
|
+
* @returns true if API token exists, false otherwise
|
|
2978
|
+
*
|
|
2979
|
+
* @example
|
|
2980
|
+
* ```typescript
|
|
2981
|
+
* if (client.isAuthenticated()) {
|
|
2982
|
+
* // Can make API calls
|
|
2983
|
+
* const games = await client.games.list()
|
|
2984
|
+
* } else {
|
|
2985
|
+
* console.error('No API token available')
|
|
2986
|
+
* }
|
|
2987
|
+
* ```
|
|
2988
|
+
*/
|
|
2989
|
+
isAuthenticated(): boolean;
|
|
2990
|
+
/**
|
|
2991
|
+
* Registers a callback to be called when authentication state changes.
|
|
2992
|
+
*
|
|
2993
|
+
* @param callback - Function to call when auth state changes
|
|
2994
|
+
*/
|
|
2995
|
+
onAuthChange(callback: (token: string | null) => void): void;
|
|
2996
|
+
/**
|
|
2997
|
+
* Sets the authentication context for the client.
|
|
2998
|
+
* This is called during initialization to store environment info.
|
|
2999
|
+
* @internal
|
|
3000
|
+
*/
|
|
3001
|
+
_setAuthContext(context: {
|
|
3002
|
+
isInIframe: boolean;
|
|
3003
|
+
}): void;
|
|
3004
|
+
/**
|
|
3005
|
+
* Registers an event listener for client events.
|
|
3006
|
+
*
|
|
3007
|
+
* @param event - The event type to listen for
|
|
3008
|
+
* @param callback - Function to call when the event is emitted
|
|
3009
|
+
*/
|
|
3010
|
+
on<E extends keyof ClientEvents>(event: E, callback: (payload: ClientEvents[E]) => void): void;
|
|
3011
|
+
/**
|
|
3012
|
+
* Emits an event to all registered listeners.
|
|
3013
|
+
*
|
|
3014
|
+
* @param event - The event type to emit
|
|
3015
|
+
* @param payload - The event payload
|
|
3016
|
+
*/
|
|
3017
|
+
private emit;
|
|
3018
|
+
/**
|
|
3019
|
+
* Makes an authenticated HTTP request to the API.
|
|
3020
|
+
*
|
|
3021
|
+
* @param path - API endpoint path
|
|
3022
|
+
* @param method - HTTP method
|
|
3023
|
+
* @param body - Request body (optional)
|
|
3024
|
+
* @param headers - Additional headers (optional)
|
|
3025
|
+
* @returns Promise resolving to the response data
|
|
3026
|
+
*/
|
|
3027
|
+
protected request<T>(path: string, method: Method, body?: unknown, headers?: Record<string, string>): Promise<T>;
|
|
3028
|
+
/**
|
|
3029
|
+
* Ensures a gameId is available, throwing an error if not.
|
|
3030
|
+
*
|
|
3031
|
+
* @returns The gameId
|
|
3032
|
+
* @throws PlaycademyError if no gameId is configured
|
|
3033
|
+
*/
|
|
3034
|
+
private _ensureGameId;
|
|
3035
|
+
/**
|
|
3036
|
+
* Detects and sets the authentication context (iframe vs standalone).
|
|
3037
|
+
* Safe to call in any environment - isInIframe handles browser detection.
|
|
3038
|
+
*/
|
|
3039
|
+
private _detectAuthContext;
|
|
3040
|
+
/**
|
|
3041
|
+
* Initializes an internal game session for automatic session management.
|
|
3042
|
+
* Only starts a session if:
|
|
3043
|
+
* 1. A gameId is configured
|
|
3044
|
+
* 2. No session already exists
|
|
3045
|
+
* 3. autoStartSession is enabled (defaults to false)
|
|
3046
|
+
*/
|
|
3047
|
+
private _initializeInternalSession;
|
|
3048
|
+
/** Platform API authentication methods (login, logout) */
|
|
3049
|
+
auth: {
|
|
3050
|
+
login: (credentials: {
|
|
3051
|
+
email: string;
|
|
3052
|
+
password: string;
|
|
3053
|
+
}) => Promise<{
|
|
3054
|
+
success: boolean;
|
|
3055
|
+
token?: string;
|
|
3056
|
+
error?: string;
|
|
3057
|
+
}>;
|
|
3058
|
+
logout: () => Promise<void>;
|
|
3059
|
+
};
|
|
3060
|
+
/** Identity provider connection methods (connect external accounts) */
|
|
3061
|
+
identity: {
|
|
3062
|
+
readonly user: {
|
|
3063
|
+
sub: string;
|
|
3064
|
+
email: string;
|
|
3065
|
+
name: string;
|
|
3066
|
+
email_verified: true;
|
|
3067
|
+
given_name: undefined;
|
|
3068
|
+
family_name: undefined;
|
|
3069
|
+
} | null;
|
|
3070
|
+
connect: (options: AuthOptions) => Promise<AuthResult>;
|
|
3071
|
+
_getContext: () => {
|
|
3072
|
+
isInIframe: boolean;
|
|
3073
|
+
};
|
|
3074
|
+
};
|
|
3075
|
+
/** Runtime methods (getGameToken, exit) */
|
|
3076
|
+
runtime: {
|
|
3077
|
+
getGameToken: (gameId: string, options?: {
|
|
3078
|
+
apply?: boolean;
|
|
3079
|
+
}) => Promise<GameTokenResponse>;
|
|
3080
|
+
exit: () => Promise<void>;
|
|
3081
|
+
onInit: (handler: (context: GameContextPayload) => void) => void;
|
|
3082
|
+
onTokenRefresh: (handler: (data: {
|
|
3083
|
+
token: string;
|
|
3084
|
+
exp: number;
|
|
3085
|
+
}) => void) => void;
|
|
3086
|
+
onPause: (handler: () => void) => void;
|
|
3087
|
+
onResume: (handler: () => void) => void;
|
|
3088
|
+
onForceExit: (handler: () => void) => void;
|
|
3089
|
+
onOverlay: (handler: (isVisible: boolean) => void) => void;
|
|
3090
|
+
ready: () => void;
|
|
3091
|
+
sendTelemetry: (data: {
|
|
3092
|
+
fps: number;
|
|
3093
|
+
mem: number;
|
|
3094
|
+
}) => void;
|
|
3095
|
+
removeListener: (eventType: MessageEvents, handler: ((context: GameContextPayload) => void) | ((data: {
|
|
3096
|
+
token: string;
|
|
3097
|
+
exp: number;
|
|
3098
|
+
}) => void) | (() => void) | ((isVisible: boolean) => void)) => void;
|
|
3099
|
+
removeAllListeners: () => void;
|
|
3100
|
+
getListenerCounts: () => Record<string, number>;
|
|
3101
|
+
};
|
|
3102
|
+
/** Game management methods (fetch, list, saveState, loadState, sessions) */
|
|
3103
|
+
games: {
|
|
3104
|
+
fetch: (gameIdOrSlug: string, options?: TTLCacheConfig) => Promise<FetchedGame>;
|
|
3105
|
+
list: (options?: TTLCacheConfig) => Promise<Array<Game>>;
|
|
3106
|
+
saveState: (state: Record<string, unknown>) => Promise<void>;
|
|
3107
|
+
loadState: () => Promise<GameStateData>;
|
|
3108
|
+
startSession: (gameId?: string) => Promise<StartSessionResponse>;
|
|
3109
|
+
endSession: (sessionId: string, gameId?: string) => Promise<void>;
|
|
3110
|
+
token: {
|
|
3111
|
+
create: (gameId: string, options?: {
|
|
3112
|
+
apply?: boolean;
|
|
3113
|
+
}) => Promise<GameTokenResponse>;
|
|
3114
|
+
};
|
|
3115
|
+
leaderboard: {
|
|
3116
|
+
get: (gameId: string, options?: {
|
|
3117
|
+
limit?: number;
|
|
3118
|
+
offset?: number;
|
|
3119
|
+
}) => Promise<LeaderboardEntry[]>;
|
|
3120
|
+
};
|
|
3121
|
+
};
|
|
3122
|
+
/** User methods (me, inventory management) */
|
|
3123
|
+
users: {
|
|
3124
|
+
me: () => Promise<AuthenticatedUser>;
|
|
3125
|
+
inventory: {
|
|
3126
|
+
get: () => Promise<InventoryItemWithItem[]>;
|
|
3127
|
+
add: (identifier: string, qty: number) => Promise<InventoryMutationResponse>;
|
|
3128
|
+
remove: (identifier: string, qty: number) => Promise<InventoryMutationResponse>;
|
|
3129
|
+
quantity: (identifier: string) => Promise<number>;
|
|
3130
|
+
has: (identifier: string, minQuantity?: number) => Promise<boolean>;
|
|
3131
|
+
};
|
|
3132
|
+
scores: {
|
|
3133
|
+
get: (userIdOrOptions?: string | {
|
|
3134
|
+
limit?: number;
|
|
3135
|
+
gameId?: string;
|
|
3136
|
+
}, options?: {
|
|
3137
|
+
limit?: number;
|
|
3138
|
+
gameId?: string;
|
|
3139
|
+
}) => Promise<UserScore[]>;
|
|
3140
|
+
};
|
|
3141
|
+
};
|
|
3142
|
+
/** Developer tools (auth, games, keys management) */
|
|
3143
|
+
dev: {
|
|
3144
|
+
status: {
|
|
3145
|
+
apply: () => Promise<void>;
|
|
3146
|
+
get: () => Promise<DeveloperStatusValue>;
|
|
3147
|
+
};
|
|
3148
|
+
games: {
|
|
3149
|
+
upsert: (slug: string, metadata: UpsertGameMetadataInput, file: File | Blob | null, hooks?: DevUploadHooks) => Promise<Game>;
|
|
3150
|
+
update: (gameId: string, props: Partial<Game>) => Promise<void>;
|
|
3151
|
+
delete: (gameId: string) => Promise<void>;
|
|
3152
|
+
};
|
|
3153
|
+
keys: {
|
|
3154
|
+
create: (label?: string) => Promise<{
|
|
3155
|
+
id: string;
|
|
3156
|
+
createdAt: Date;
|
|
3157
|
+
userId: string;
|
|
3158
|
+
label: string | null;
|
|
3159
|
+
keyHash: string;
|
|
3160
|
+
}>;
|
|
3161
|
+
list: () => Promise<{
|
|
3162
|
+
id: string;
|
|
3163
|
+
createdAt: Date;
|
|
3164
|
+
userId: string;
|
|
3165
|
+
label: string | null;
|
|
3166
|
+
keyHash: string;
|
|
3167
|
+
}[]>;
|
|
3168
|
+
revoke: (keyId: string) => Promise<void>;
|
|
3169
|
+
};
|
|
3170
|
+
items: {
|
|
3171
|
+
create: (gameId: string, slug: string, itemData: Omit<InsertItemInput, "slug" | "gameId">) => Promise<Item>;
|
|
3172
|
+
update: (gameId: string, itemId: string, updates: UpdateItemInput) => Promise<Item>;
|
|
3173
|
+
list: (gameId: string) => Promise<Array<Item>>;
|
|
3174
|
+
get: (gameId: string, slug: string) => Promise<Item>;
|
|
3175
|
+
delete: (gameId: string, itemId: string) => Promise<void>;
|
|
3176
|
+
shop: {
|
|
3177
|
+
create: (gameId: string, itemId: string, listingData: Omit<InsertShopListingInput, "itemId">) => Promise<ShopListing>;
|
|
3178
|
+
get: (gameId: string, itemId: string) => Promise<ShopListing | null>;
|
|
3179
|
+
update: (gameId: string, itemId: string, updates: UpdateShopListingInput) => Promise<ShopListing>;
|
|
3180
|
+
delete: (gameId: string, itemId: string) => Promise<void>;
|
|
3181
|
+
list: (gameId: string) => Promise<Array<ShopListing & {
|
|
3182
|
+
item: Item;
|
|
3183
|
+
}>>;
|
|
3184
|
+
};
|
|
3185
|
+
};
|
|
3186
|
+
};
|
|
3187
|
+
/** Map methods (elements) */
|
|
3188
|
+
maps: {
|
|
3189
|
+
get: (identifier: string) => Promise<MapData>;
|
|
3190
|
+
elements: (mapId: string) => Promise<MapElementWithGame[]>;
|
|
3191
|
+
objects: {
|
|
3192
|
+
list: (mapId: string) => Promise<MapObjectWithItem[]>;
|
|
3193
|
+
create: (mapId: string, objectData: CreateMapObjectData) => Promise<MapObjectWithItem>;
|
|
3194
|
+
delete: (mapId: string, objectId: string) => Promise<void>;
|
|
3195
|
+
};
|
|
3196
|
+
};
|
|
3197
|
+
/** Admin methods (games, items, currencies, shop listings) */
|
|
3198
|
+
admin: {
|
|
3199
|
+
games: {
|
|
3200
|
+
pauseGame: (gameId: string) => Promise<void>;
|
|
3201
|
+
resumeGame: (gameId: string) => Promise<void>;
|
|
3202
|
+
};
|
|
3203
|
+
items: {
|
|
3204
|
+
create: (props: InsertItemInput) => Promise<{
|
|
3205
|
+
id: string;
|
|
3206
|
+
createdAt: Date;
|
|
3207
|
+
type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
|
|
3208
|
+
gameId: string | null;
|
|
3209
|
+
slug: string;
|
|
3210
|
+
displayName: string;
|
|
3211
|
+
metadata: unknown;
|
|
3212
|
+
description: string | null;
|
|
3213
|
+
isPlaceable: boolean;
|
|
3214
|
+
imageUrl: string | null;
|
|
3215
|
+
}>;
|
|
3216
|
+
get: (itemId: string) => Promise<{
|
|
3217
|
+
id: string;
|
|
3218
|
+
createdAt: Date;
|
|
3219
|
+
type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
|
|
3220
|
+
gameId: string | null;
|
|
3221
|
+
slug: string;
|
|
3222
|
+
displayName: string;
|
|
3223
|
+
metadata: unknown;
|
|
3224
|
+
description: string | null;
|
|
3225
|
+
isPlaceable: boolean;
|
|
3226
|
+
imageUrl: string | null;
|
|
3227
|
+
}>;
|
|
3228
|
+
list: () => Promise<{
|
|
3229
|
+
id: string;
|
|
3230
|
+
createdAt: Date;
|
|
3231
|
+
type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
|
|
3232
|
+
gameId: string | null;
|
|
3233
|
+
slug: string;
|
|
3234
|
+
displayName: string;
|
|
3235
|
+
metadata: unknown;
|
|
3236
|
+
description: string | null;
|
|
3237
|
+
isPlaceable: boolean;
|
|
3238
|
+
imageUrl: string | null;
|
|
3239
|
+
}[]>;
|
|
3240
|
+
update: (itemId: string, props: UpdateItemInput) => Promise<{
|
|
3241
|
+
id: string;
|
|
3242
|
+
createdAt: Date;
|
|
3243
|
+
type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
|
|
3244
|
+
gameId: string | null;
|
|
3245
|
+
slug: string;
|
|
3246
|
+
displayName: string;
|
|
3247
|
+
metadata: unknown;
|
|
3248
|
+
description: string | null;
|
|
3249
|
+
isPlaceable: boolean;
|
|
3250
|
+
imageUrl: string | null;
|
|
3251
|
+
}>;
|
|
3252
|
+
delete: (itemId: string) => Promise<void>;
|
|
3253
|
+
};
|
|
3254
|
+
currencies: {
|
|
3255
|
+
create: (props: InsertCurrencyInput) => Promise<{
|
|
3256
|
+
symbol: string | null;
|
|
3257
|
+
id: string;
|
|
3258
|
+
createdAt: Date;
|
|
3259
|
+
updatedAt: Date | null;
|
|
3260
|
+
itemId: string;
|
|
3261
|
+
isPrimary: boolean;
|
|
3262
|
+
}>;
|
|
3263
|
+
get: (currencyId: string) => Promise<{
|
|
3264
|
+
symbol: string | null;
|
|
3265
|
+
id: string;
|
|
3266
|
+
createdAt: Date;
|
|
3267
|
+
updatedAt: Date | null;
|
|
3268
|
+
itemId: string;
|
|
3269
|
+
isPrimary: boolean;
|
|
3270
|
+
}>;
|
|
3271
|
+
list: () => Promise<{
|
|
3272
|
+
symbol: string | null;
|
|
3273
|
+
id: string;
|
|
3274
|
+
createdAt: Date;
|
|
3275
|
+
updatedAt: Date | null;
|
|
3276
|
+
itemId: string;
|
|
3277
|
+
isPrimary: boolean;
|
|
3278
|
+
}[]>;
|
|
3279
|
+
update: (currencyId: string, props: UpdateCurrencyInput) => Promise<{
|
|
3280
|
+
symbol: string | null;
|
|
3281
|
+
id: string;
|
|
3282
|
+
createdAt: Date;
|
|
3283
|
+
updatedAt: Date | null;
|
|
3284
|
+
itemId: string;
|
|
3285
|
+
isPrimary: boolean;
|
|
3286
|
+
}>;
|
|
3287
|
+
delete: (currencyId: string) => Promise<void>;
|
|
3288
|
+
};
|
|
3289
|
+
shopListings: {
|
|
3290
|
+
create: (props: InsertShopListingInput) => Promise<{
|
|
3291
|
+
id: string;
|
|
3292
|
+
createdAt: Date;
|
|
3293
|
+
updatedAt: Date | null;
|
|
3294
|
+
itemId: string;
|
|
3295
|
+
currencyId: string;
|
|
3296
|
+
price: number;
|
|
3297
|
+
sellBackPercentage: number | null;
|
|
3298
|
+
stock: number | null;
|
|
3299
|
+
isActive: boolean;
|
|
3300
|
+
availableFrom: Date | null;
|
|
3301
|
+
availableUntil: Date | null;
|
|
3302
|
+
}>;
|
|
3303
|
+
get: (listingId: string) => Promise<{
|
|
3304
|
+
id: string;
|
|
3305
|
+
createdAt: Date;
|
|
3306
|
+
updatedAt: Date | null;
|
|
3307
|
+
itemId: string;
|
|
3308
|
+
currencyId: string;
|
|
3309
|
+
price: number;
|
|
3310
|
+
sellBackPercentage: number | null;
|
|
3311
|
+
stock: number | null;
|
|
3312
|
+
isActive: boolean;
|
|
3313
|
+
availableFrom: Date | null;
|
|
3314
|
+
availableUntil: Date | null;
|
|
3315
|
+
}>;
|
|
3316
|
+
list: () => Promise<{
|
|
3317
|
+
id: string;
|
|
3318
|
+
createdAt: Date;
|
|
3319
|
+
updatedAt: Date | null;
|
|
3320
|
+
itemId: string;
|
|
3321
|
+
currencyId: string;
|
|
3322
|
+
price: number;
|
|
3323
|
+
sellBackPercentage: number | null;
|
|
3324
|
+
stock: number | null;
|
|
3325
|
+
isActive: boolean;
|
|
3326
|
+
availableFrom: Date | null;
|
|
3327
|
+
availableUntil: Date | null;
|
|
3328
|
+
}[]>;
|
|
3329
|
+
update: (listingId: string, props: UpdateShopListingInput) => Promise<{
|
|
3330
|
+
id: string;
|
|
3331
|
+
createdAt: Date;
|
|
3332
|
+
updatedAt: Date | null;
|
|
3333
|
+
itemId: string;
|
|
3334
|
+
currencyId: string;
|
|
3335
|
+
price: number;
|
|
3336
|
+
sellBackPercentage: number | null;
|
|
3337
|
+
stock: number | null;
|
|
3338
|
+
isActive: boolean;
|
|
3339
|
+
availableFrom: Date | null;
|
|
3340
|
+
availableUntil: Date | null;
|
|
3341
|
+
}>;
|
|
3342
|
+
delete: (listingId: string) => Promise<void>;
|
|
3343
|
+
};
|
|
3344
|
+
};
|
|
3345
|
+
/** Shop methods (view) */
|
|
3346
|
+
shop: {
|
|
3347
|
+
view: () => Promise<ShopViewResponse>;
|
|
3348
|
+
};
|
|
3349
|
+
/** Level methods (levels) */
|
|
3350
|
+
levels: {
|
|
3351
|
+
get: () => Promise<UserLevel>;
|
|
3352
|
+
progress: (options?: CooldownCacheConfig) => Promise<{
|
|
3353
|
+
level: number;
|
|
3354
|
+
currentXp: number;
|
|
3355
|
+
xpToNextLevel: number;
|
|
3356
|
+
totalXP: number;
|
|
3357
|
+
}>;
|
|
3358
|
+
config: {
|
|
3359
|
+
list: () => Promise<LevelConfig[]>;
|
|
3360
|
+
get: (level: number) => Promise<LevelConfig | null>;
|
|
3361
|
+
};
|
|
3362
|
+
};
|
|
3363
|
+
/** TimeBack XP methods (today, total, history) */
|
|
3364
|
+
timeback: {
|
|
3365
|
+
xp: {
|
|
3366
|
+
today: (options?: {
|
|
3367
|
+
date?: string;
|
|
3368
|
+
timezone?: string;
|
|
3369
|
+
}) => Promise<TodayXpResponse>;
|
|
3370
|
+
total: () => Promise<TotalXpResponse>;
|
|
3371
|
+
history: (options?: {
|
|
3372
|
+
startDate?: string;
|
|
3373
|
+
endDate?: string;
|
|
3374
|
+
}) => Promise<XpHistoryResponse>;
|
|
3375
|
+
summary: (options?: {
|
|
3376
|
+
date?: string;
|
|
3377
|
+
timezone?: string;
|
|
3378
|
+
}) => Promise<XpSummaryResponse>;
|
|
3379
|
+
};
|
|
3380
|
+
};
|
|
3381
|
+
/** Telemetry methods (pushMetrics) */
|
|
3382
|
+
telemetry: {
|
|
3383
|
+
pushMetrics: (metrics: Record<string, number>) => Promise<void>;
|
|
3384
|
+
};
|
|
3385
|
+
/** Credits methods (credits management) */
|
|
3386
|
+
credits: {
|
|
3387
|
+
balance: () => Promise<number>;
|
|
3388
|
+
add: (amount: number) => Promise<number>;
|
|
3389
|
+
spend: (amount: number) => Promise<number>;
|
|
3390
|
+
};
|
|
3391
|
+
/** Platform-wide leaderboard methods (fetch, getUserRank) */
|
|
3392
|
+
leaderboard: {
|
|
3393
|
+
fetch: (options?: LeaderboardOptions) => Promise<GameLeaderboardEntry[]>;
|
|
3394
|
+
getUserRank: (gameId: string, userId: string) => Promise<UserRankResponse>;
|
|
3395
|
+
};
|
|
3396
|
+
/** Platform-wide scores methods (submit, getUserScores) */
|
|
3397
|
+
scores: {
|
|
3398
|
+
submit: (gameId: string, score: number, metadata?: Record<string, unknown>) => Promise<ScoreSubmission>;
|
|
3399
|
+
getByUser: (gameId: string, userId: string, options?: {
|
|
3400
|
+
limit?: number;
|
|
3401
|
+
}) => Promise<UserScore$1[]>;
|
|
3402
|
+
};
|
|
3403
|
+
/** Character methods (get, create, update, components) */
|
|
3404
|
+
character: {
|
|
3405
|
+
get: (userId?: string) => Promise<PlayerCharacter | null>;
|
|
3406
|
+
create: (characterData: CreateCharacterData) => Promise<PlayerCharacter>;
|
|
3407
|
+
update: (updates: UpdateCharacterData) => Promise<PlayerCharacter>;
|
|
3408
|
+
components: {
|
|
3409
|
+
list: (options?: CharacterComponentsOptions & TTLCacheConfig) => Promise<CharacterComponentWithSpriteUrl[]>;
|
|
3410
|
+
clearCache: (key?: string) => void;
|
|
3411
|
+
getCacheKeys: () => string[];
|
|
3412
|
+
};
|
|
3413
|
+
accessories: {
|
|
3414
|
+
equip: (slot: string, componentId: string) => Promise<PlayerCharacterAccessory>;
|
|
3415
|
+
remove: (slot: string) => Promise<{
|
|
3416
|
+
success: boolean;
|
|
3417
|
+
}>;
|
|
3418
|
+
list: () => Promise<PlayerCharacterAccessory[]>;
|
|
3419
|
+
};
|
|
3420
|
+
};
|
|
3421
|
+
/** Sprites methods (templates) */
|
|
3422
|
+
sprites: {
|
|
3423
|
+
templates: {
|
|
3424
|
+
get: (slug: string) => Promise<SpriteTemplateData>;
|
|
3425
|
+
};
|
|
3426
|
+
};
|
|
3427
|
+
/** Realtime methods (token) */
|
|
3428
|
+
realtime: {
|
|
3429
|
+
token: {
|
|
3430
|
+
get: () => Promise<RealtimeTokenResponse>;
|
|
3431
|
+
};
|
|
3432
|
+
open(channel?: string, url?: string): Promise<_playcademy_realtime_server_types.RealtimeChannel>;
|
|
3433
|
+
};
|
|
3434
|
+
/** Achievements methods (list, history, progress) */
|
|
3435
|
+
achievements: {
|
|
3436
|
+
list: (options?: TTLCacheConfig) => Promise<AchievementCurrent[]>;
|
|
3437
|
+
history: {
|
|
3438
|
+
list: (queryOptions?: {
|
|
3439
|
+
limit?: number;
|
|
3440
|
+
}, cacheOptions?: TTLCacheConfig) => Promise<AchievementHistoryEntry[]>;
|
|
3441
|
+
};
|
|
3442
|
+
progress: {
|
|
3443
|
+
submit: (achievementId: string) => Promise<AchievementProgressResponse>;
|
|
3444
|
+
};
|
|
3445
|
+
};
|
|
3446
|
+
/** Auto-initializes a PlaycademyClient with context from the environment */
|
|
3447
|
+
static init: typeof init;
|
|
3448
|
+
/** Authenticates a user with email and password */
|
|
3449
|
+
static login: typeof login;
|
|
3450
|
+
/** Static identity utilities for OAuth operations */
|
|
3451
|
+
static identity: {
|
|
3452
|
+
parseOAuthState: typeof parseOAuthState;
|
|
3453
|
+
};
|
|
3454
|
+
}
|
|
3455
|
+
|
|
3456
|
+
/**
|
|
3457
|
+
* @fileoverview Playcademy Messaging System
|
|
3458
|
+
*
|
|
3459
|
+
* This file implements a unified messaging system for the Playcademy platform that handles
|
|
3460
|
+
* communication between different contexts:
|
|
3461
|
+
*
|
|
3462
|
+
* 1. **Iframe-to-Parent Communication**: When games run inside iframes (production/development),
|
|
3463
|
+
* they need to communicate with the parent window using postMessage API
|
|
3464
|
+
*
|
|
3465
|
+
* 2. **Local Communication**: When games run in the same context (local development),
|
|
3466
|
+
* they use CustomEvents for internal messaging
|
|
3467
|
+
*
|
|
3468
|
+
* The system automatically detects the runtime environment and chooses the appropriate
|
|
3469
|
+
* transport method, abstracting this complexity from the developer.
|
|
3470
|
+
*
|
|
3471
|
+
* **Architecture Overview**:
|
|
3472
|
+
* - Games run in iframes for security and isolation
|
|
3473
|
+
* - Parent window (Playcademy shell) manages game lifecycle
|
|
3474
|
+
* - Messages flow bidirectionally between parent and iframe
|
|
3475
|
+
* - Local development mode simulates this architecture without iframes
|
|
3476
|
+
*/
|
|
3477
|
+
|
|
3478
|
+
/**
|
|
3479
|
+
* Enumeration of all message types used in the Playcademy messaging system.
|
|
3480
|
+
*
|
|
3481
|
+
* **Message Flow Patterns**:
|
|
3482
|
+
*
|
|
3483
|
+
* **Parent → Game (Overworld → Game)**:
|
|
3484
|
+
* - INIT: Provides game with authentication token and configuration
|
|
3485
|
+
* - TOKEN_REFRESH: Updates game's authentication token before expiry
|
|
3486
|
+
* - PAUSE/RESUME: Controls game execution state
|
|
3487
|
+
* - FORCE_EXIT: Immediately terminates the game
|
|
3488
|
+
* - OVERLAY: Shows/hides UI overlays over the game
|
|
3489
|
+
*
|
|
3490
|
+
* **Game → Parent (Game → Overworld)**:
|
|
3491
|
+
* - READY: Game has loaded and is ready to receive messages
|
|
3492
|
+
* - EXIT: Game requests to be closed (user clicked exit, game ended, etc.)
|
|
3493
|
+
* - TELEMETRY: Game reports performance metrics (FPS, memory usage, etc.)
|
|
3494
|
+
*/
|
|
3495
|
+
declare enum MessageEvents {
|
|
3496
|
+
/**
|
|
3497
|
+
* Initializes the game with authentication context and configuration.
|
|
3498
|
+
* Sent immediately after game iframe loads.
|
|
3499
|
+
* Payload:
|
|
3500
|
+
* - `baseUrl`: string
|
|
3501
|
+
* - `token`: string
|
|
3502
|
+
* - `gameId`: string
|
|
3503
|
+
*/
|
|
3504
|
+
INIT = "PLAYCADEMY_INIT",
|
|
3505
|
+
/**
|
|
3506
|
+
* Updates the game's authentication token before it expires.
|
|
3507
|
+
* Sent periodically to maintain valid authentication.
|
|
3508
|
+
* Payload:
|
|
3509
|
+
* - `token`: string
|
|
3510
|
+
* - `exp`: number
|
|
3511
|
+
*/
|
|
3512
|
+
TOKEN_REFRESH = "PLAYCADEMY_TOKEN_REFRESH",
|
|
3513
|
+
/**
|
|
3514
|
+
* Pauses game execution (e.g., when user switches tabs).
|
|
3515
|
+
* Game should pause timers, animations, and user input.
|
|
3516
|
+
* Payload: void
|
|
3517
|
+
*/
|
|
3518
|
+
PAUSE = "PLAYCADEMY_PAUSE",
|
|
3519
|
+
/**
|
|
3520
|
+
* Resumes game execution after being paused.
|
|
3521
|
+
* Game should restore timers, animations, and user input.
|
|
3522
|
+
* Payload: void
|
|
3523
|
+
*/
|
|
3524
|
+
RESUME = "PLAYCADEMY_RESUME",
|
|
3525
|
+
/**
|
|
3526
|
+
* Forces immediate game termination (emergency exit).
|
|
3527
|
+
* Game should clean up resources and exit immediately.
|
|
3528
|
+
* Payload: void
|
|
3529
|
+
*/
|
|
3530
|
+
FORCE_EXIT = "PLAYCADEMY_FORCE_EXIT",
|
|
3531
|
+
/**
|
|
3532
|
+
* Shows or hides UI overlays over the game.
|
|
3533
|
+
* Game may need to pause or adjust rendering accordingly.
|
|
3534
|
+
* Payload: boolean (true = show overlay, false = hide overlay)
|
|
3535
|
+
*/
|
|
3536
|
+
OVERLAY = "PLAYCADEMY_OVERLAY",
|
|
3537
|
+
/**
|
|
3538
|
+
* Game has finished loading and is ready to receive messages.
|
|
3539
|
+
* Sent once after game initialization is complete.
|
|
3540
|
+
* Payload: void
|
|
3541
|
+
*/
|
|
3542
|
+
READY = "PLAYCADEMY_READY",
|
|
3543
|
+
/**
|
|
3544
|
+
* Game requests to be closed/exited.
|
|
3545
|
+
* Sent when user clicks exit button or game naturally ends.
|
|
3546
|
+
* Payload: void
|
|
3547
|
+
*/
|
|
3548
|
+
EXIT = "PLAYCADEMY_EXIT",
|
|
3549
|
+
/**
|
|
3550
|
+
* Game reports performance telemetry data.
|
|
3551
|
+
* Sent periodically for monitoring and analytics.
|
|
3552
|
+
* Payload:
|
|
3553
|
+
* - `fps`: number
|
|
3554
|
+
* - `mem`: number
|
|
3555
|
+
*/
|
|
3556
|
+
TELEMETRY = "PLAYCADEMY_TELEMETRY",
|
|
3557
|
+
/**
|
|
3558
|
+
* Game reports key events to parent.
|
|
3559
|
+
* Sent when certain keys are pressed within the game iframe.
|
|
3560
|
+
* Payload:
|
|
3561
|
+
* - `key`: string
|
|
3562
|
+
* - `code?`: string
|
|
3563
|
+
* - `type`: 'keydown' | 'keyup'
|
|
3564
|
+
*/
|
|
3565
|
+
KEY_EVENT = "PLAYCADEMY_KEY_EVENT",
|
|
3566
|
+
/**
|
|
3567
|
+
* Notifies about authentication state changes.
|
|
3568
|
+
* Can be sent in both directions depending on auth flow.
|
|
3569
|
+
* Payload:
|
|
3570
|
+
* - `authenticated`: boolean
|
|
3571
|
+
* - `user`: UserInfo | null
|
|
3572
|
+
* - `error`: Error | null
|
|
3573
|
+
*/
|
|
3574
|
+
AUTH_STATE_CHANGE = "PLAYCADEMY_AUTH_STATE_CHANGE",
|
|
3575
|
+
/**
|
|
3576
|
+
* OAuth callback data from popup/new-tab windows.
|
|
3577
|
+
* Sent from popup window back to parent after OAuth completes.
|
|
3578
|
+
* Payload:
|
|
3579
|
+
* - `code`: string (OAuth authorization code)
|
|
3580
|
+
* - `state`: string (OAuth state for CSRF protection)
|
|
3581
|
+
* - `error`: string | null (OAuth error if any)
|
|
3582
|
+
*/
|
|
3583
|
+
AUTH_CALLBACK = "PLAYCADEMY_AUTH_CALLBACK"
|
|
3584
|
+
}
|
|
3585
|
+
/**
|
|
3586
|
+
* Type definition for message handler functions.
|
|
3587
|
+
* These functions are called when a specific message type is received.
|
|
3588
|
+
*
|
|
3589
|
+
* @template T - The type of payload data the handler expects
|
|
3590
|
+
* @param payload - The data sent with the message
|
|
3591
|
+
*/
|
|
3592
|
+
type MessageHandler<T = unknown> = (payload: T) => void;
|
|
3593
|
+
/**
|
|
3594
|
+
* Type mapping that defines the payload structure for each message type.
|
|
3595
|
+
* This ensures type safety when sending and receiving messages.
|
|
3596
|
+
*
|
|
3597
|
+
* **Usage Examples**:
|
|
3598
|
+
* ```typescript
|
|
3599
|
+
* // Type-safe message sending
|
|
3600
|
+
* messaging.send(MessageEvents.INIT, { baseUrl: '/api', token: 'abc', gameId: '123' })
|
|
3601
|
+
*
|
|
3602
|
+
* // Type-safe message handling
|
|
3603
|
+
* messaging.listen(MessageEvents.TOKEN_REFRESH, ({ token, exp }) => {
|
|
3604
|
+
* console.log(`New token expires at: ${new Date(exp)}`)
|
|
3605
|
+
* })
|
|
3606
|
+
* ```
|
|
3607
|
+
*/
|
|
3608
|
+
type MessageEventMap = {
|
|
3609
|
+
/** Game initialization context with API endpoint, auth token, and game ID */
|
|
3610
|
+
[MessageEvents.INIT]: GameContextPayload;
|
|
3611
|
+
/** Token refresh data with new token and expiration timestamp */
|
|
3612
|
+
[MessageEvents.TOKEN_REFRESH]: TokenRefreshPayload;
|
|
3613
|
+
/** Pause message has no payload data */
|
|
3614
|
+
[MessageEvents.PAUSE]: void;
|
|
3615
|
+
/** Resume message has no payload data */
|
|
3616
|
+
[MessageEvents.RESUME]: void;
|
|
3617
|
+
/** Force exit message has no payload data */
|
|
3618
|
+
[MessageEvents.FORCE_EXIT]: void;
|
|
3619
|
+
/** Overlay visibility state (true = show, false = hide) */
|
|
3620
|
+
[MessageEvents.OVERLAY]: boolean;
|
|
3621
|
+
/** Ready message has no payload data */
|
|
3622
|
+
[MessageEvents.READY]: void;
|
|
3623
|
+
/** Exit message has no payload data */
|
|
3624
|
+
[MessageEvents.EXIT]: void;
|
|
3625
|
+
/** Performance telemetry data */
|
|
3626
|
+
[MessageEvents.TELEMETRY]: TelemetryPayload;
|
|
3627
|
+
/** Key event data */
|
|
3628
|
+
[MessageEvents.KEY_EVENT]: KeyEventPayload;
|
|
3629
|
+
/** Authentication state change notification */
|
|
3630
|
+
[MessageEvents.AUTH_STATE_CHANGE]: AuthStateChangePayload;
|
|
3631
|
+
/** OAuth callback data from popup/new-tab windows */
|
|
3632
|
+
[MessageEvents.AUTH_CALLBACK]: AuthCallbackPayload;
|
|
3633
|
+
};
|
|
3634
|
+
/**
|
|
3635
|
+
* **PlaycademyMessaging Class**
|
|
3636
|
+
*
|
|
3637
|
+
* This is the core messaging system that handles all communication in the Playcademy platform.
|
|
3638
|
+
* It automatically detects the runtime environment and chooses the appropriate transport method.
|
|
3639
|
+
*
|
|
3640
|
+
* **Key Features**:
|
|
3641
|
+
* 1. **Automatic Transport Selection**: Detects iframe vs local context and uses appropriate method
|
|
3642
|
+
* 2. **Type Safety**: Full TypeScript support with payload type checking
|
|
3643
|
+
* 3. **Bidirectional Communication**: Handles both parent→game and game→parent messages
|
|
3644
|
+
* 4. **Event Cleanup**: Proper listener management to prevent memory leaks
|
|
3645
|
+
*
|
|
3646
|
+
* **Transport Methods**:
|
|
3647
|
+
* - **postMessage**: Used for iframe-to-parent communication (production/development)
|
|
3648
|
+
* - **CustomEvent**: Used for local same-context communication (local development)
|
|
3649
|
+
*
|
|
3650
|
+
* **Runtime Detection Logic**:
|
|
3651
|
+
* - If `window.self !== window.top`: We're in an iframe, use postMessage
|
|
3652
|
+
* - If `window.self === window.top`: We're in the same context, use CustomEvent
|
|
3653
|
+
*
|
|
3654
|
+
* **Example Usage**:
|
|
3655
|
+
* ```typescript
|
|
3656
|
+
* // Send a message (automatically chooses transport)
|
|
3657
|
+
* messaging.send(MessageEvents.READY, undefined)
|
|
3658
|
+
*
|
|
3659
|
+
* // Listen for messages (handles both transports)
|
|
3660
|
+
* messaging.listen(MessageEvents.INIT, (payload) => {
|
|
3661
|
+
* console.log('Game initialized with:', payload)
|
|
3662
|
+
* })
|
|
3663
|
+
*
|
|
3664
|
+
* // Clean up listeners
|
|
3665
|
+
* messaging.unlisten(MessageEvents.INIT, handler)
|
|
3666
|
+
* ```
|
|
3667
|
+
*/
|
|
3668
|
+
declare class PlaycademyMessaging {
|
|
3669
|
+
/**
|
|
3670
|
+
* Internal storage for message listeners.
|
|
3671
|
+
*
|
|
3672
|
+
* **Structure Explanation**:
|
|
3673
|
+
* - Outer Map: MessageEvents → Map of handlers for that event type
|
|
3674
|
+
* - Inner Map: MessageHandler → Object containing both listener types
|
|
3675
|
+
* - Object: { postMessage: EventListener, customEvent: EventListener }
|
|
3676
|
+
*
|
|
3677
|
+
* **Why Two Listeners Per Handler?**:
|
|
3678
|
+
* Since we don't know at registration time which transport will be used,
|
|
3679
|
+
* we register both a postMessage listener and a CustomEvent listener.
|
|
3680
|
+
* The appropriate one will be triggered based on the runtime context.
|
|
3681
|
+
*/
|
|
3682
|
+
private listeners;
|
|
3683
|
+
/**
|
|
3684
|
+
* **Send Message Method**
|
|
3685
|
+
*
|
|
3686
|
+
* Sends a message using the appropriate transport method based on the runtime context.
|
|
3687
|
+
* This is the main public API for sending messages in the Playcademy system.
|
|
3688
|
+
*
|
|
3689
|
+
* **How It Works**:
|
|
3690
|
+
* 1. Analyzes the message type and current runtime context
|
|
3691
|
+
* 2. Determines if we're in an iframe and if this message should use postMessage
|
|
3692
|
+
* 3. Routes to the appropriate transport method (postMessage or CustomEvent)
|
|
3693
|
+
*
|
|
3694
|
+
* **Transport Selection Logic**:
|
|
3695
|
+
* - **postMessage**: Used when game is in iframe and sending to parent, OR when target window is specified
|
|
3696
|
+
* - **CustomEvent**: Used for local/same-context communication
|
|
3697
|
+
*
|
|
3698
|
+
* **Type Safety**:
|
|
3699
|
+
* The generic type parameter `K` ensures that the payload type matches
|
|
3700
|
+
* the expected type for the given message event.
|
|
3701
|
+
*
|
|
3702
|
+
* @template K - The message event type (ensures type safety)
|
|
3703
|
+
* @param type - The message event type to send
|
|
3704
|
+
* @param payload - The data to send with the message (type-checked)
|
|
3705
|
+
* @param options - Optional configuration for message sending
|
|
3706
|
+
*
|
|
3707
|
+
* @example
|
|
3708
|
+
* ```typescript
|
|
3709
|
+
* // Send game ready signal (no payload)
|
|
3710
|
+
* messaging.send(MessageEvents.READY, undefined)
|
|
3711
|
+
*
|
|
3712
|
+
* // Send telemetry data (typed payload)
|
|
3713
|
+
* messaging.send(MessageEvents.TELEMETRY, { fps: 60, mem: 128 })
|
|
3714
|
+
*
|
|
3715
|
+
* // Send to specific iframe window (parent to iframe communication)
|
|
3716
|
+
* messaging.send(MessageEvents.INIT, { baseUrl, token, gameId }, {
|
|
3717
|
+
* target: iframe.contentWindow,
|
|
3718
|
+
* origin: '*'
|
|
3719
|
+
* })
|
|
3720
|
+
*
|
|
3721
|
+
* // TypeScript will error if payload type is wrong
|
|
3722
|
+
* messaging.send(MessageEvents.INIT, "wrong type") // ❌ Error
|
|
3723
|
+
* ```
|
|
3724
|
+
*/
|
|
3725
|
+
send<K extends MessageEvents>(type: K, payload: MessageEventMap[K], options?: {
|
|
3726
|
+
target?: Window;
|
|
3727
|
+
origin?: string;
|
|
3728
|
+
}): void;
|
|
3729
|
+
/**
|
|
3730
|
+
* **Listen for Messages Method**
|
|
3731
|
+
*
|
|
3732
|
+
* Registers a message listener that will be called when the specified message type is received.
|
|
3733
|
+
* This method automatically handles both postMessage and CustomEvent sources.
|
|
3734
|
+
*
|
|
3735
|
+
* **Why Register Two Listeners?**:
|
|
3736
|
+
* Since we don't know at registration time which transport method will be used to send
|
|
3737
|
+
* messages, we register listeners for both possible sources:
|
|
3738
|
+
* 1. **postMessage listener**: Handles messages from iframe-to-parent communication
|
|
3739
|
+
* 2. **CustomEvent listener**: Handles messages from local same-context communication
|
|
3740
|
+
*
|
|
3741
|
+
* **Message Processing**:
|
|
3742
|
+
* - **postMessage**: Extracts data from `event.data.payload` or `event.data`
|
|
3743
|
+
* - **CustomEvent**: Extracts data from `event.detail`
|
|
3744
|
+
*
|
|
3745
|
+
* **Type Safety**:
|
|
3746
|
+
* The handler function receives the correctly typed payload based on the message type.
|
|
3747
|
+
*
|
|
3748
|
+
* @template K - The message event type (ensures type safety)
|
|
3749
|
+
* @param type - The message event type to listen for
|
|
3750
|
+
* @param handler - Function to call when the message is received
|
|
3751
|
+
*
|
|
3752
|
+
* @example
|
|
3753
|
+
* ```typescript
|
|
3754
|
+
* // Listen for game initialization
|
|
3755
|
+
* messaging.listen(MessageEvents.INIT, (payload) => {
|
|
3756
|
+
* // payload is automatically typed as GameContextPayload
|
|
3757
|
+
* console.log(`Game ${payload.gameId} initialized`)
|
|
3758
|
+
* console.log(`API base URL: ${payload.baseUrl}`)
|
|
3759
|
+
* })
|
|
3760
|
+
*
|
|
3761
|
+
* // Listen for token refresh
|
|
3762
|
+
* messaging.listen(MessageEvents.TOKEN_REFRESH, ({ token, exp }) => {
|
|
3763
|
+
* // payload is automatically typed as { token: string; exp: number }
|
|
3764
|
+
* updateAuthToken(token)
|
|
3765
|
+
* scheduleTokenRefresh(exp)
|
|
3766
|
+
* })
|
|
3767
|
+
* ```
|
|
3768
|
+
*/
|
|
3769
|
+
listen<K extends MessageEvents>(type: K, handler: MessageHandler<MessageEventMap[K]>): void;
|
|
3770
|
+
/**
|
|
3771
|
+
* **Remove Message Listener Method**
|
|
3772
|
+
*
|
|
3773
|
+
* Removes a previously registered message listener to prevent memory leaks and unwanted callbacks.
|
|
3774
|
+
* This method cleans up both the postMessage and CustomEvent listeners that were registered.
|
|
3775
|
+
*
|
|
3776
|
+
* **Why Clean Up Both Listeners?**:
|
|
3777
|
+
* When we registered the listener with `listen()`, we created two browser event listeners:
|
|
3778
|
+
* 1. A 'message' event listener for postMessage communication
|
|
3779
|
+
* 2. A custom event listener for local CustomEvent communication
|
|
3780
|
+
*
|
|
3781
|
+
* Both must be removed to prevent memory leaks and ensure the handler is completely unregistered.
|
|
3782
|
+
*
|
|
3783
|
+
* **Memory Management**:
|
|
3784
|
+
* - Removes both event listeners from the browser
|
|
3785
|
+
* - Cleans up internal tracking maps
|
|
3786
|
+
* - If no more handlers exist for a message type, removes the entire type entry
|
|
3787
|
+
*
|
|
3788
|
+
* **Safe to Call Multiple Times**:
|
|
3789
|
+
* This method is idempotent - calling it multiple times with the same handler is safe.
|
|
3790
|
+
*
|
|
3791
|
+
* @template K - The message event type (ensures type safety)
|
|
3792
|
+
* @param type - The message event type to stop listening for
|
|
3793
|
+
* @param handler - The exact handler function that was passed to listen()
|
|
3794
|
+
*
|
|
3795
|
+
* @example
|
|
3796
|
+
* ```typescript
|
|
3797
|
+
* // Register a handler
|
|
3798
|
+
* const handleInit = (payload) => console.log('Game initialized')
|
|
3799
|
+
* messaging.listen(MessageEvents.INIT, handleInit)
|
|
3800
|
+
*
|
|
3801
|
+
* // Later, remove the handler
|
|
3802
|
+
* messaging.unlisten(MessageEvents.INIT, handleInit)
|
|
3803
|
+
*
|
|
3804
|
+
* // Safe to call multiple times
|
|
3805
|
+
* messaging.unlisten(MessageEvents.INIT, handleInit) // No error
|
|
3806
|
+
* ```
|
|
3807
|
+
*/
|
|
3808
|
+
unlisten<K extends MessageEvents>(type: K, handler: MessageHandler<MessageEventMap[K]>): void;
|
|
3809
|
+
/**
|
|
3810
|
+
* **Get Messaging Context Method**
|
|
3811
|
+
*
|
|
3812
|
+
* Analyzes the current runtime environment and message type to determine the appropriate
|
|
3813
|
+
* transport method and configuration for sending messages.
|
|
3814
|
+
*
|
|
3815
|
+
* **Runtime Environment Detection**:
|
|
3816
|
+
* The method detects whether the code is running in an iframe by comparing:
|
|
3817
|
+
* - `window.self`: Reference to the current window
|
|
3818
|
+
* - `window.top`: Reference to the topmost window in the hierarchy
|
|
3819
|
+
*
|
|
3820
|
+
* If they're different, we're in an iframe. If they're the same, we're in the top-level window.
|
|
3821
|
+
*
|
|
3822
|
+
* **Message Direction Analysis**:
|
|
3823
|
+
* Different message types flow in different directions:
|
|
3824
|
+
* - **Game → Parent**: READY, EXIT, TELEMETRY (use postMessage when in iframe)
|
|
3825
|
+
* - **Parent → Game**: INIT, TOKEN_REFRESH, PAUSE, etc. (use CustomEvent in local dev, or postMessage with target)
|
|
3826
|
+
*
|
|
3827
|
+
* **Cross-Context Communication**:
|
|
3828
|
+
* The messaging system supports cross-context targeting through the optional `target` parameter.
|
|
3829
|
+
* When a target window is specified, postMessage is used regardless of the current context.
|
|
3830
|
+
* This enables parent-to-iframe communication through the unified messaging API.
|
|
3831
|
+
*
|
|
3832
|
+
* **Transport Selection Logic**:
|
|
3833
|
+
* - **postMessage**: Used when game is in iframe AND sending to parent, OR when target window is specified
|
|
3834
|
+
* - **CustomEvent**: Used for all other cases (local development, same-context communication)
|
|
3835
|
+
*
|
|
3836
|
+
* **Security Considerations**:
|
|
3837
|
+
* The origin is currently set to '*' for development convenience, but should be
|
|
3838
|
+
* configurable for production security.
|
|
3839
|
+
*
|
|
3840
|
+
* @param eventType - The message event type being sent
|
|
3841
|
+
* @returns Configuration object with transport method and target information
|
|
3842
|
+
*
|
|
3843
|
+
* @example
|
|
3844
|
+
* ```typescript
|
|
3845
|
+
* // In iframe sending READY to parent
|
|
3846
|
+
* const context = getMessagingContext(MessageEvents.READY)
|
|
3847
|
+
* // Returns: { shouldUsePostMessage: true, target: window.parent, origin: '*' }
|
|
3848
|
+
*
|
|
3849
|
+
* // In same context sending INIT
|
|
3850
|
+
* const context = getMessagingContext(MessageEvents.INIT)
|
|
3851
|
+
* // Returns: { shouldUsePostMessage: false, target: undefined, origin: '*' }
|
|
3852
|
+
* ```
|
|
3853
|
+
*/
|
|
3854
|
+
private getMessagingContext;
|
|
3855
|
+
/**
|
|
3856
|
+
* **Send Via PostMessage Method**
|
|
3857
|
+
*
|
|
3858
|
+
* Sends a message using the browser's postMessage API for iframe-to-parent communication.
|
|
3859
|
+
* This method is used when the game is running in an iframe and needs to communicate
|
|
3860
|
+
* with the parent window (the Playcademy shell).
|
|
3861
|
+
*
|
|
3862
|
+
* **PostMessage Protocol**:
|
|
3863
|
+
* The postMessage API is the standard way for iframes to communicate with their parent.
|
|
3864
|
+
* It's secure, cross-origin capable, and designed specifically for this use case.
|
|
3865
|
+
*
|
|
3866
|
+
* **Message Structure**:
|
|
3867
|
+
* The method creates a message object with the following structure:
|
|
3868
|
+
* - `type`: The message event type (e.g., 'PLAYCADEMY_READY')
|
|
3869
|
+
* - `payload`: The message data (if any)
|
|
3870
|
+
*
|
|
3871
|
+
* **Payload Handling**:
|
|
3872
|
+
* - **All payloads**: Wrapped in a `payload` property for consistency (e.g., { type, payload: data })
|
|
3873
|
+
* - **Undefined payloads**: Only the type is sent (e.g., { type })
|
|
3874
|
+
*
|
|
3875
|
+
* **Security**:
|
|
3876
|
+
* The origin parameter controls which domains can receive the message.
|
|
3877
|
+
* Currently set to '*' for development, but should be restricted in production.
|
|
3878
|
+
*
|
|
3879
|
+
* @template K - The message event type (ensures type safety)
|
|
3880
|
+
* @param type - The message event type to send
|
|
3881
|
+
* @param payload - The data to send with the message
|
|
3882
|
+
* @param target - The target window (defaults to parent window)
|
|
3883
|
+
* @param origin - The allowed origin for the message (defaults to '*')
|
|
3884
|
+
*
|
|
3885
|
+
* @example
|
|
3886
|
+
* ```typescript
|
|
3887
|
+
* // Send ready signal (no payload)
|
|
3888
|
+
* sendViaPostMessage(MessageEvents.READY, undefined)
|
|
3889
|
+
* // Sends: { type: 'PLAYCADEMY_READY' }
|
|
3890
|
+
*
|
|
3891
|
+
* // Send telemetry data (object payload)
|
|
3892
|
+
* sendViaPostMessage(MessageEvents.TELEMETRY, { fps: 60, mem: 128 })
|
|
3893
|
+
* // Sends: { type: 'PLAYCADEMY_TELEMETRY', payload: { fps: 60, mem: 128 } }
|
|
3894
|
+
*
|
|
3895
|
+
* // Send overlay state (primitive payload)
|
|
3896
|
+
* sendViaPostMessage(MessageEvents.OVERLAY, true)
|
|
3897
|
+
* // Sends: { type: 'PLAYCADEMY_OVERLAY', payload: true }
|
|
3898
|
+
* ```
|
|
3899
|
+
*/
|
|
3900
|
+
private sendViaPostMessage;
|
|
3901
|
+
/**
|
|
3902
|
+
* **Send Via CustomEvent Method**
|
|
3903
|
+
*
|
|
3904
|
+
* Sends a message using the browser's CustomEvent API for local same-context communication.
|
|
3905
|
+
* This method is used when both the sender and receiver are in the same window context,
|
|
3906
|
+
* typically during local development or when the parent needs to send messages to the game.
|
|
3907
|
+
*
|
|
3908
|
+
* **CustomEvent Protocol**:
|
|
3909
|
+
* CustomEvent is a browser API for creating and dispatching custom events within the same
|
|
3910
|
+
* window context. It's simpler than postMessage but only works within the same origin/context.
|
|
3911
|
+
*
|
|
3912
|
+
* **Event Structure**:
|
|
3913
|
+
* - **type**: The event name (e.g., 'PLAYCADEMY_INIT')
|
|
3914
|
+
* - **detail**: The payload data attached to the event
|
|
3915
|
+
*
|
|
3916
|
+
* **When This Is Used**:
|
|
3917
|
+
* - Local development when game and shell run in the same context
|
|
3918
|
+
* - Parent-to-game communication (INIT, TOKEN_REFRESH, PAUSE, etc.)
|
|
3919
|
+
* - Any scenario where postMessage isn't needed
|
|
3920
|
+
*
|
|
3921
|
+
* **Event Bubbling**:
|
|
3922
|
+
* CustomEvents are dispatched on the window object and can be listened to by any
|
|
3923
|
+
* code in the same context using `addEventListener(type, handler)`.
|
|
3924
|
+
*
|
|
3925
|
+
* @template K - The message event type (ensures type safety)
|
|
3926
|
+
* @param type - The message event type to send (becomes the event name)
|
|
3927
|
+
* @param payload - The data to send with the message (stored in event.detail)
|
|
3928
|
+
*
|
|
3929
|
+
* @example
|
|
3930
|
+
* ```typescript
|
|
3931
|
+
* // Send initialization data
|
|
3932
|
+
* sendViaCustomEvent(MessageEvents.INIT, {
|
|
3933
|
+
* baseUrl: '/api',
|
|
3934
|
+
* token: 'abc123',
|
|
3935
|
+
* gameId: 'game-456'
|
|
3936
|
+
* })
|
|
3937
|
+
* // Creates: CustomEvent('PLAYCADEMY_INIT', { detail: { baseUrl, token, gameId } })
|
|
3938
|
+
*
|
|
3939
|
+
* // Send pause signal
|
|
3940
|
+
* sendViaCustomEvent(MessageEvents.PAUSE, undefined)
|
|
3941
|
+
* // Creates: CustomEvent('PLAYCADEMY_PAUSE', { detail: undefined })
|
|
3942
|
+
*
|
|
3943
|
+
* // Listeners can access the data via event.detail:
|
|
3944
|
+
* window.addEventListener('PLAYCADEMY_INIT', (event) => {
|
|
3945
|
+
* console.log(event.detail.gameId) // 'game-456'
|
|
3946
|
+
* })
|
|
3947
|
+
* ```
|
|
3948
|
+
*/
|
|
3949
|
+
private sendViaCustomEvent;
|
|
3950
|
+
}
|
|
3951
|
+
/**
|
|
3952
|
+
* **Playcademy Messaging Singleton**
|
|
3953
|
+
*
|
|
3954
|
+
* This is the main messaging instance used throughout the Playcademy platform.
|
|
3955
|
+
* It's exported as a singleton to ensure consistent communication across all parts
|
|
3956
|
+
* of the application.
|
|
3957
|
+
*
|
|
3958
|
+
* **Why a Singleton?**:
|
|
3959
|
+
* - Ensures all parts of the app use the same messaging instance
|
|
3960
|
+
* - Prevents conflicts between multiple messaging systems
|
|
3961
|
+
* - Simplifies the API - no need to pass instances around
|
|
3962
|
+
* - Maintains consistent event listener management
|
|
3963
|
+
*
|
|
3964
|
+
* **Usage in Different Contexts**:
|
|
3965
|
+
*
|
|
3966
|
+
* **In Games**:
|
|
3967
|
+
* ```typescript
|
|
3968
|
+
* import { messaging, MessageEvents } from '@playcademy/sdk'
|
|
3969
|
+
*
|
|
3970
|
+
* // Tell parent we're ready
|
|
3971
|
+
* messaging.send(MessageEvents.READY, undefined)
|
|
3972
|
+
*
|
|
3973
|
+
* // Listen for pause/resume
|
|
3974
|
+
* messaging.listen(MessageEvents.PAUSE, () => game.pause())
|
|
3975
|
+
* messaging.listen(MessageEvents.RESUME, () => game.resume())
|
|
3976
|
+
* ```
|
|
3977
|
+
*
|
|
3978
|
+
* **In Parent Shell**:
|
|
3979
|
+
* ```typescript
|
|
3980
|
+
* import { messaging, MessageEvents } from '@playcademy/sdk'
|
|
3981
|
+
*
|
|
3982
|
+
* // Send initialization data to game
|
|
3983
|
+
* messaging.send(MessageEvents.INIT, { baseUrl, token, gameId })
|
|
3984
|
+
*
|
|
3985
|
+
* // Listen for game events
|
|
3986
|
+
* messaging.listen(MessageEvents.EXIT, () => closeGame())
|
|
3987
|
+
* messaging.listen(MessageEvents.READY, () => showGame())
|
|
3988
|
+
* ```
|
|
3989
|
+
*
|
|
3990
|
+
* **Automatic Transport Selection**:
|
|
3991
|
+
* The messaging system automatically chooses the right transport method:
|
|
3992
|
+
* - Uses postMessage when game is in iframe sending to parent
|
|
3993
|
+
* - Uses CustomEvent for local development and parent-to-game communication
|
|
3
3994
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3995
|
+
* **Type Safety**:
|
|
3996
|
+
* All message sending and receiving is fully type-safe with TypeScript.
|
|
6
3997
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export { AuthProvider
|
|
10
|
-
export type { DevUploadEvent, DevUploadHooks }
|
|
3998
|
+
declare const messaging: PlaycademyMessaging;
|
|
3999
|
+
|
|
4000
|
+
export { AuthProvider, BADGES, CURRENCIES, MessageEvents, PlaycademyClient, messaging };
|
|
4001
|
+
export type { DevUploadEvent, DevUploadHooks };
|