diff --git a/convex/_generated/api.d.ts b/convex/_generated/api.d.ts index 9d478a9..ec93670 100644 --- a/convex/_generated/api.d.ts +++ b/convex/_generated/api.d.ts @@ -4,7 +4,7 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.11.2. + * Generated by convex@1.12.1. * To regenerate, run `npx convex dev`. * @module */ diff --git a/convex/_generated/api.js b/convex/_generated/api.js index 21a4bd2..c820c6f 100644 --- a/convex/_generated/api.js +++ b/convex/_generated/api.js @@ -4,7 +4,7 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.11.2. + * Generated by convex@1.12.1. * To regenerate, run `npx convex dev`. * @module */ diff --git a/convex/_generated/dataModel.d.ts b/convex/_generated/dataModel.d.ts index 80dc17d..5fc7722 100644 --- a/convex/_generated/dataModel.d.ts +++ b/convex/_generated/dataModel.d.ts @@ -4,7 +4,7 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.11.2. + * Generated by convex@1.12.1. * To regenerate, run `npx convex dev`. * @module */ diff --git a/convex/_generated/server.d.ts b/convex/_generated/server.d.ts index c512cc0..af0160d 100644 --- a/convex/_generated/server.d.ts +++ b/convex/_generated/server.d.ts @@ -4,7 +4,7 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.11.2. + * Generated by convex@1.12.1. * To regenerate, run `npx convex dev`. * @module */ diff --git a/convex/_generated/server.js b/convex/_generated/server.js index 5318a30..06748ad 100644 --- a/convex/_generated/server.js +++ b/convex/_generated/server.js @@ -4,7 +4,7 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.11.2. + * Generated by convex@1.12.1. * To regenerate, run `npx convex dev`. * @module */ diff --git a/convex/cards.ts b/convex/cards.ts index bec0c29..685df6a 100644 --- a/convex/cards.ts +++ b/convex/cards.ts @@ -6,6 +6,13 @@ import { internalMutationWithEnt, mutationWithGame } from './lib/functions' export const startSelectSet = mutationWithGame({ args: {}, + returns: v.union( + v.null(), + v.object({ + reason: v.string(), + selectedBy: v.id('Players'), + }) + ), handler: async (ctx) => { const { game, player } = ctx @@ -17,6 +24,7 @@ export const select = mutationWithGame({ args: { cardId: v.id('PlayingCards'), }, + returns: v.null(), handler: async (ctx, { cardId }) => { return Cards.select(ctx, { cardId }) }, @@ -24,6 +32,7 @@ export const select = mutationWithGame({ export const reveal = mutationWithGame({ args: {}, + returns: v.null(), handler: async (ctx) => { return Cards.reveal(ctx) }, @@ -34,14 +43,15 @@ export const discardRevealedProset = internalMutationWithEnt({ gameId: v.id('Games'), cardIds: v.array(v.id('PlayingCards')), }, + returns: v.null(), handler: async (ctx, args) => { const player = await Player.getSystemPlayer(ctx, args.gameId) - const game = await ctx.table("Games").getX(args.gameId) + const game = await ctx.table('Games').getX(args.gameId) const prosetId = await ctx.table('Prosets').insert({ PlayingCards: args.cardIds, - PlayerId: player._id + PlayerId: player._id, }) await game.patch({ selectingPlayer: null, @@ -49,7 +59,7 @@ export const discardRevealedProset = internalMutationWithEnt({ }) await Promise.all( args.cardIds.map((cardId) => { - return ctx.table("PlayingCards").getX(cardId).patch({ + return ctx.table('PlayingCards').getX(cardId).patch({ proset: prosetId, }) }) @@ -63,9 +73,10 @@ export const claimSet = internalMutationWithEnt({ gameId: v.id('Games'), playerId: v.id('Players'), }, + returns: v.null(), handler: async (ctx, { gameId, playerId }) => { - const game = await ctx.table("Games").getX(gameId) - const player = await ctx.table("Players").getX(playerId) + const game = await ctx.table('Games').getX(gameId) + const player = await ctx.table('Players').getX(playerId) await Cards.claimSet(ctx, { game: game, player: player, @@ -77,8 +88,9 @@ export const maybeClearSelectSet = internalMutationWithEnt({ args: { gameId: v.id('Games'), }, + returns: v.null(), handler: async (ctx, { gameId }) => { - const game = await ctx.table("Games").getX(gameId) + const game = await ctx.table('Games').getX(gameId) await Cards.maybeClearSelectSet(ctx, game) }, }) diff --git a/convex/dealCards.ts b/convex/dealCards.ts index 7d15da4..d556505 100644 --- a/convex/dealCards.ts +++ b/convex/dealCards.ts @@ -1,13 +1,46 @@ -import { PaginationOptions, PaginationResult } from 'convex/server' -import { Doc, Id } from './_generated/dataModel' -import { query } from './_generated/server'; -import { QueryCtx, queryWithEnt } from './lib/functions'; +import { PaginationResult, paginationOptsValidator } from 'convex/server' +import { v } from 'convex/values' +import { Doc } from './_generated/dataModel' +import { queryWithEnt } from './lib/functions' -export default queryWithEnt( - async ( +export default queryWithEnt({ + args: { gameId: v.id('Games'), paginationOpts: paginationOptsValidator }, + returns: v.object({ + page: v.array( + v.object({ + GameId: v.id('Games'), + blue: v.boolean(), + green: v.boolean(), + orange: v.boolean(), + proset: v.union(v.null(), v.id('Prosets')), + purple: v.boolean(), + rank: v.float64(), + red: v.boolean(), + selectedBy: v.union(v.null(), v.id('Players')), + yellow: v.boolean(), + _id: v.id('PlayingCards'), + _creationTime: v.number(), + }) + ), + isDone: v.boolean(), + continueCursor: v.string(), + splitCursor: v.optional(v.union(v.string(), v.null())), + pageStatus: v.optional( + v.union( + v.literal('SplitRecommended'), + v.literal('SplitRequired'), + v.null() + ) + ), + }), + handler: async ( ctx, - args: { gameId: Id<'Games'>; paginationOpts: PaginationOptions } + args ): Promise>> => { - return ctx.table("PlayingCards", "ByGameAndProsetAndRank", q => q.eq("GameId", args.gameId).eq("proset", null)).paginate(args.paginationOpts) - } -) + return ctx + .table('PlayingCards', 'ByGameAndProsetAndRank', (q) => + q.eq('GameId', args.gameId).eq('proset', null) + ) + .paginate(args.paginationOpts) + }, +}) diff --git a/convex/games.ts b/convex/games.ts index de80005..c9e50b2 100644 --- a/convex/games.ts +++ b/convex/games.ts @@ -1,5 +1,10 @@ import { v } from 'convex/values' -import { internalMutationWithEnt, mutationWithEnt, mutationWithGame, queryWithGame } from './lib/functions' +import { + internalMutationWithEnt, + mutationWithEnt, + mutationWithGame, + queryWithGame, +} from './lib/functions' import * as Games from './model/game' import * as Players from './model/player' import * as User from './model/user' @@ -34,8 +39,62 @@ export const end = mutationWithGame({ }, }) +/* +export interface GameInfo { + game: Doc<'Games'> + currentPlayer: Doc<'Players'> & { showOnboarding: boolean; isGuest: boolean } + otherPlayers: Doc<'Players'>[] + playerToProsets: Record[][]> +} + + +*/ + +const playerFields = { + // from schema + name: v.string(), + score: v.number(), + color: v.union( + v.literal('red'), + v.literal('orange'), + v.literal('yellow'), + v.literal('green'), + v.literal('blue'), + v.literal('purple'), + v.literal('grey') + ), + isSystemPlayer: v.boolean(), + // system fields + _id: v.id('Players'), + _creationTime: v.number(), + // fields added by ents + GameId: v.id('Games'), + UserId: v.id('Users'), +} + export const getInfo = queryWithGame({ args: {}, + returns: v.object({ + game: v.object({ + name: v.string(), + selectingPlayer: v.union(v.null(), v.id('Players')), + selectionStartTime: v.union(v.null(), v.number()), + inProgress: v.boolean(), + isPublic: v.optional(v.boolean()), + // system fields + _id: v.id('Games'), + _creationTime: v.number(), + // fields added by ents + }), + currentPlayer: v.object({ + ...playerFields, + isGuest: v.boolean(), + showOnboarding: v.boolean(), + }), + otherPlayers: v.array(v.object(playerFields)), + // record + playerToProsets: v.any(), + }), handler: async (ctx) => { return await Games.getInfo(ctx, { currentPlayer: ctx.player, @@ -47,7 +106,7 @@ export const getInfo = queryWithGame({ export const cleanup = internalMutationWithEnt({ args: { gameId: v.id('Games') }, - handler: (ctx, args) => {} // Games.cleanup(ctx, args), + handler: (ctx, args) => {}, // Games.cleanup(ctx, args), }) export const setup = internalMutationWithEnt({ diff --git a/convex/message.ts b/convex/message.ts index 28271f3..d716ea0 100644 --- a/convex/message.ts +++ b/convex/message.ts @@ -1,8 +1,8 @@ import { v } from 'convex/values' +import { Doc } from './_generated/dataModel' import { internalMutation } from './_generated/server' -import { mutationWithGame, queryWithGame, } from './lib/functions' +import { mutationWithGame, queryWithGame } from './lib/functions' import * as Message from './model/message' -import { Doc } from './_generated/dataModel' export const send = mutationWithGame({ args: { @@ -28,8 +28,21 @@ export const remove = internalMutation({ export const list = queryWithGame({ args: {}, - handler: async (ctx): Promise>> => { - const messages = await ctx.game.edge("Messages") - return messages.filter(m => m._creationTime >= Date.now() - 10 * 1000 && (m.player === null || m.player === ctx.player._id)) + returns: v.array( + v.object({ + content: v.string(), + player: v.union(v.null(), v.string()), + GameId: v.id('Games'), + _id: v.id('Messages'), + _creationTime: v.number(), + }) + ), + handler: async (ctx): Promise>> => { + const messages = await ctx.game.edge('Messages') + return messages.filter( + (m) => + m._creationTime >= Date.now() - 10 * 1000 && + (m.player === null || m.player === ctx.player._id) + ) }, }) diff --git a/convex/model/cards.ts b/convex/model/cards.ts index 986cf92..7975923 100644 --- a/convex/model/cards.ts +++ b/convex/model/cards.ts @@ -1,6 +1,6 @@ import { internal } from '../_generated/api' import { Id } from '../_generated/dataModel' -import { MutationCtx, Ent, BaseMutationCtx } from '../lib/functions' +import { BaseMutationCtx, Ent, MutationCtx } from '../lib/functions' import { findProset, isProset } from '../prosetHelpers' import * as Message from './message' import * as Player from './player' @@ -9,38 +9,48 @@ export const claimSet = async ( ctx: BaseMutationCtx, { game, player }: { game: Ent<'Games'>; player: Ent<'Players'> } ) => { - const currentlySelected = (await game.edge("PlayingCards")).filter(p => p.selectedBy === player._id) + const currentlySelected = (await game.edge('PlayingCards')).filter( + (p) => p.selectedBy === player._id + ) if (isProset(currentlySelected)) { - const prosetId = await ctx.table("Prosets").insert({ - PlayingCards: currentlySelected.map(p => p._id), - PlayerId: player._id + const prosetId = await ctx.table('Prosets').insert({ + PlayingCards: currentlySelected.map((p) => p._id), + PlayerId: player._id, }) await Promise.all( currentlySelected.map(async (card) => { - return ctx.table("PlayingCards").getX(card._id).patch({ + return ctx.table('PlayingCards').getX(card._id).patch({ selectedBy: null, - proset: prosetId + proset: prosetId, }) }) ) await clearSelectSet(ctx, game) - await ctx.table("Players").getX(player._id).patch({ - score: player.score + 1, - }) + await ctx + .table('Players') + .getX(player._id) + .patch({ + score: player.score + 1, + }) } } -export const clearSelectSet = async (ctx: BaseMutationCtx, game: Ent<'Games'>) => { +export const clearSelectSet = async ( + ctx: BaseMutationCtx, + game: Ent<'Games'> +) => { const selectingPlayer = game.selectingPlayer - await ctx.table("Games").getX(game._id).patch({ + await ctx.table('Games').getX(game._id).patch({ selectingPlayer: null, selectionStartTime: null, }) if (selectingPlayer != null) { - const currentlySelected = (await game.edge("PlayingCards")).filter(p => p.selectedBy === selectingPlayer) + const currentlySelected = (await game.edge('PlayingCards')).filter( + (p) => p.selectedBy === selectingPlayer + ) await Promise.all( currentlySelected.map(async (card) => { - return ctx.table("PlayingCards").getX(card._id).patch({ + return ctx.table('PlayingCards').getX(card._id).patch({ selectedBy: null, }) }) @@ -57,7 +67,7 @@ export const maybeClearSelectSet = async ( } if (Date.now() - game.selectionStartTime! > 20 * 1000) { await clearSelectSet(ctx, game) - const player = await ctx.table("Players").getX(game.selectingPlayer) + const player = await ctx.table('Players').getX(game.selectingPlayer) await player.patch({ score: player!.score - 1, }) @@ -68,17 +78,16 @@ export const startSelectSet = async ( ctx: MutationCtx, { game, player }: { game: Ent<'Games'>; player: Ent<'Players'> } ) => { - if (game.selectingPlayer !== null) { return { reason: 'Another player is already selecting!', selectedBy: game.selectingPlayer, } } - await ctx.table("Users").getX(player.UserId).patch({ + await ctx.table('Users').getX(player.UserId).patch({ showOnboarding: false, }) - await ctx.table("Games").getX(game._id).patch({ + await ctx.table('Games').getX(game._id).patch({ selectingPlayer: player._id, selectionStartTime: Date.now(), }) @@ -90,18 +99,18 @@ export const startSelectSet = async ( export const select = async ( ctx: MutationCtx, - { - cardId, - }: { cardId: Id<'PlayingCards'> } + { cardId }: { cardId: Id<'PlayingCards'> } ) => { - const { game, user, player } = ctx; - let currentlySelected = (await game.edge("PlayingCards")).filter(p => p.selectedBy === player._id) + const { game, user, player } = ctx + let currentlySelected = (await game.edge('PlayingCards')).filter( + (p) => p.selectedBy === player._id + ) if (isProset(currentlySelected)) { // don't allow selecting more cards return } - const card = await ctx.table("PlayingCards").getX(cardId); + const card = await ctx.table('PlayingCards').getX(cardId) if (card.selectedBy !== null) { await card.patch({ @@ -113,7 +122,9 @@ export const select = async ( }) } - currentlySelected = (await game.edge("PlayingCards")).filter(p => p.selectedBy === player._id) + currentlySelected = (await game.edge('PlayingCards')).filter( + (p) => p.selectedBy === player._id + ) if (isProset(currentlySelected)) { await Message.send(ctx, { @@ -124,13 +135,11 @@ export const select = async ( gameId: game._id, playerId: player._id, }) - return 'FoundProset' + return } } -export const reveal = async ( - ctx: MutationCtx, -) => { +export const reveal = async (ctx: MutationCtx) => { const { player, user } = ctx const systemPlayer = await Player.getSystemPlayer(ctx, player.GameId) @@ -139,7 +148,7 @@ export const reveal = async ( isPrivate: false, }) - await ctx.table("Games").getX(player.GameId).patch({ + await ctx.table('Games').getX(player.GameId).patch({ selectingPlayer: systemPlayer._id, selectionStartTime: Date.now(), }) @@ -153,7 +162,7 @@ export const reveal = async ( const prosetCards = findProset(cards) await Promise.all( prosetCards!.map(async (card) => { - return await ctx.table("PlayingCards").getX(card._id).patch({ + return await ctx.table('PlayingCards').getX(card._id).patch({ selectedBy: systemPlayer._id, }) }) diff --git a/convex/players.ts b/convex/players.ts index 384b9d1..dbf69f2 100644 --- a/convex/players.ts +++ b/convex/players.ts @@ -1,10 +1,11 @@ import { v } from 'convex/values' +import { mutationWithEnt } from './lib/functions' import * as Players from './model/player' import * as User from './model/user' -import { mutationWithEnt } from './lib/functions' export const joinGame = mutationWithEnt({ args: { gameId: v.id('Games'), sessionId: v.string() }, + returns: v.null(), handler: async (ctx, { gameId, sessionId }) => { const user = await User.get(ctx, { sessionId }) await Players.joinGame(ctx, { gameId, user }) diff --git a/convex/revealProset.ts b/convex/revealProset.ts index 518f9b5..d343a14 100644 --- a/convex/revealProset.ts +++ b/convex/revealProset.ts @@ -1,8 +1,10 @@ +import { v } from 'convex/values' import { mutationWithGame } from './lib/functions' -import * as Cards from "./model/cards" +import * as Cards from './model/cards' export default mutationWithGame({ args: {}, + returns: v.null(), handler: async (ctx) => { return Cards.reveal(ctx) }, diff --git a/convex/users.ts b/convex/users.ts index e764c06..8358fcc 100644 --- a/convex/users.ts +++ b/convex/users.ts @@ -1,9 +1,10 @@ import { v } from 'convex/values' -import * as User from './model/user' import { mutationWithEnt, queryWithEnt } from './lib/functions' +import * as User from './model/user' export const getOrCreate = mutationWithEnt({ args: { sessionId: v.string() }, + returns: v.id('Users'), handler: async (ctx, { sessionId }) => { const result = await User.getOrCreate(ctx, sessionId) return result.userId @@ -12,6 +13,21 @@ export const getOrCreate = mutationWithEnt({ export const getOrNull = queryWithEnt({ args: { sessionId: v.string() }, + returns: v.union( + v.null(), + v.object({ + // system fields + _id: v.id('Users'), + _creationTime: v.number(), + // fields I copied from my schema + name: v.string(), + showOnboarding: v.boolean(), + isGuest: v.boolean(), + // field with a unique constraint + identifier: v.string(), + // ent fields that I had to kinda guess and check + }) + ), handler: async (ctx, { sessionId }) => { const userOrNull = await User.getOrNull(ctx, { sessionId }) if (userOrNull !== null) { diff --git a/package-lock.json b/package-lock.json index a8fa96f..2ef3a26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ "@mui/material": "^5.12.1", "@types/react-transition-group": "^4.4.5", "canvas-confetti": "^1.6.0", - "convex": "^1.10.0", - "convex-ents": "^0.4.2", - "convex-helpers": "^0.1.35", + "convex": "file:../convex-helpers/convex-1.12.1.tgz", + "convex-ents": "^0.7.6", + "convex-helpers": "file:../convex-helpers/packages/convex-helpers/convex-helpers-0.1.41.tgz", "itertools": "^1.7.1", "next": "latest", "react": "^18.2.0", @@ -2147,9 +2147,10 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/convex": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/convex/-/convex-1.11.2.tgz", - "integrity": "sha512-AmIVdT6mAlqzQeRB6VadzHvvxHeAXSdpH6oOa9mto8CIgSiSkOH/E6+2icHTC0dKR/ueZGjSb/a/PlbmEHlSBQ==", + "version": "1.12.1", + "resolved": "file:../convex-helpers/convex-1.12.1.tgz", + "integrity": "sha512-A0syb8XPaeHzyVj0340L7zBiTWbwQcXDkSFRdyRoS2TeQ0vVemHSrHQj5uqmdnlxMuTctwMKAi+zLoftuU6IAg==", + "license": "Apache-2.0", "dependencies": { "esbuild": "^0.17.5", "jwt-decode": "^3.1.2", @@ -2185,19 +2186,20 @@ } }, "node_modules/convex-ents": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/convex-ents/-/convex-ents-0.4.2.tgz", - "integrity": "sha512-dQ9TgQn1jMfU7I9JwAmNHFV5AOBr/YhJ/RXlQMJXMVTUKCJGhfTccsMqxBsS4dceX8rDJaZydiqrMV4ExhDeWw==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/convex-ents/-/convex-ents-0.7.6.tgz", + "integrity": "sha512-R+9TYA1EC0kWa5Iyw9g6RA8auHUkdDpY/Rw5WPGXB0nc3Q5q9YqNYJCQMMQ3aJEGkUqt+7h2MabNUqCEiQFmsw==", "peerDependencies": { - "convex": "^1.8.0" + "convex": "^1.11.2" } }, "node_modules/convex-helpers": { - "version": "0.1.35", - "resolved": "https://registry.npmjs.org/convex-helpers/-/convex-helpers-0.1.35.tgz", - "integrity": "sha512-JruOIBGQGqOMsA50iEVpPrml5uXsBqcNRaWRsfYfBUJYEq+8RLVk5ad0LyMJd1gk2M/jk6XpB6XKy/QLs/sZLQ==", + "version": "0.1.41", + "resolved": "file:../convex-helpers/packages/convex-helpers/convex-helpers-0.1.41.tgz", + "integrity": "sha512-eSdkFVpDz2SztpERKFXuFyC4lGGwOsaaBikOBEPKBH6FC8fus+4QjIM/pmi+lpduorqi2/hTVxF4su2x94O03A==", + "license": "MIT", "peerDependencies": { - "convex": "^1.11.0", + "convex": "^1.12.0", "hono": "^4.0.5", "react": "^17.0.2 || ^18.0.0", "zod": "^3.22.4" @@ -7259,9 +7261,8 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "convex": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/convex/-/convex-1.11.2.tgz", - "integrity": "sha512-AmIVdT6mAlqzQeRB6VadzHvvxHeAXSdpH6oOa9mto8CIgSiSkOH/E6+2icHTC0dKR/ueZGjSb/a/PlbmEHlSBQ==", + "version": "file:../convex-helpers/convex-1.12.1.tgz", + "integrity": "sha512-A0syb8XPaeHzyVj0340L7zBiTWbwQcXDkSFRdyRoS2TeQ0vVemHSrHQj5uqmdnlxMuTctwMKAi+zLoftuU6IAg==", "requires": { "esbuild": "^0.17.5", "jwt-decode": "^3.1.2", @@ -7277,15 +7278,14 @@ } }, "convex-ents": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/convex-ents/-/convex-ents-0.4.2.tgz", - "integrity": "sha512-dQ9TgQn1jMfU7I9JwAmNHFV5AOBr/YhJ/RXlQMJXMVTUKCJGhfTccsMqxBsS4dceX8rDJaZydiqrMV4ExhDeWw==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/convex-ents/-/convex-ents-0.7.6.tgz", + "integrity": "sha512-R+9TYA1EC0kWa5Iyw9g6RA8auHUkdDpY/Rw5WPGXB0nc3Q5q9YqNYJCQMMQ3aJEGkUqt+7h2MabNUqCEiQFmsw==", "requires": {} }, "convex-helpers": { - "version": "0.1.35", - "resolved": "https://registry.npmjs.org/convex-helpers/-/convex-helpers-0.1.35.tgz", - "integrity": "sha512-JruOIBGQGqOMsA50iEVpPrml5uXsBqcNRaWRsfYfBUJYEq+8RLVk5ad0LyMJd1gk2M/jk6XpB6XKy/QLs/sZLQ==", + "version": "file:../convex-helpers/packages/convex-helpers/convex-helpers-0.1.41.tgz", + "integrity": "sha512-eSdkFVpDz2SztpERKFXuFyC4lGGwOsaaBikOBEPKBH6FC8fus+4QjIM/pmi+lpduorqi2/hTVxF4su2x94O03A==", "requires": {} }, "cosmiconfig": { diff --git a/package.json b/package.json index 4ad75be..b72eaa4 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,9 @@ "@mui/material": "^5.12.1", "@types/react-transition-group": "^4.4.5", "canvas-confetti": "^1.6.0", - "convex": "^1.10.0", - "convex-ents": "^0.4.2", - "convex-helpers": "^0.1.35", + "convex": "file:../convex-helpers/convex-1.12.1.tgz", + "convex-ents": "^0.7.6", + "convex-helpers": "file:../convex-helpers/packages/convex-helpers/convex-helpers-0.1.41.tgz", "itertools": "^1.7.1", "next": "latest", "react": "^18.2.0",