diff --git a/.changeset/sharp-rocks-enjoy.md b/.changeset/sharp-rocks-enjoy.md new file mode 100644 index 00000000..6cf03dcd --- /dev/null +++ b/.changeset/sharp-rocks-enjoy.md @@ -0,0 +1,15 @@ +--- +"@dojoengine/sdk": patch +"@dojoengine/core": patch +"@dojoengine/create-burner": patch +"@dojoengine/create-dojo": patch +"@dojoengine/predeployed-connector": patch +"@dojoengine/react": patch +"@dojoengine/state": patch +"@dojoengine/torii-client": patch +"@dojoengine/torii-wasm": patch +"@dojoengine/utils": patch +"@dojoengine/utils-wasm": patch +--- + +fix: use starknet.shortstring.encodeShortString instead of torii-wasm equivalent diff --git a/packages/sdk/src/__tests__/clauseBuilder.test.ts b/packages/sdk/src/__tests__/clauseBuilder.test.ts index 0a25f99b..09560b39 100644 --- a/packages/sdk/src/__tests__/clauseBuilder.test.ts +++ b/packages/sdk/src/__tests__/clauseBuilder.test.ts @@ -4,13 +4,12 @@ import { ClauseBuilder, MemberClause, OrComposeClause, -} from "../web/clauseBuilder"; -import { +} from "../internal/clauseBuilder"; +import type { ComparisonOperator, - LogicalOperator, PatternMatching, } from "@dojoengine/torii-wasm"; -import { SchemaType } from "../internal/types"; +import type { SchemaType } from "../internal/types"; // Test models interface interface TestModels extends SchemaType { diff --git a/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts b/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts index a5aaf4fc..7691893b 100644 --- a/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts +++ b/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { ToriiQueryBuilder } from "../internal/toriiQueryBuilder"; import type { Clause, OrderBy } from "@dojoengine/torii-wasm"; import type { SchemaType } from "../internal/types"; -import { ClauseBuilder } from "../web/clauseBuilder"; +import { ClauseBuilder } from "../internal/clauseBuilder"; interface TestModels extends SchemaType { dojo_starter: { diff --git a/packages/sdk/src/node/clauseBuilder.ts b/packages/sdk/src/internal/clauseBuilder.ts similarity index 97% rename from packages/sdk/src/node/clauseBuilder.ts rename to packages/sdk/src/internal/clauseBuilder.ts index 58425141..7fff35af 100644 --- a/packages/sdk/src/node/clauseBuilder.ts +++ b/packages/sdk/src/internal/clauseBuilder.ts @@ -3,12 +3,12 @@ import { ComparisonOperator, MemberValue, PatternMatching, - cairoShortStringToFelt, } from "@dojoengine/torii-wasm/node"; import { convertToPrimitive, type MemberValueParam, } from "../internal/convertToMemberValue.ts"; +import { shortString } from "starknet"; import type { SchemaType } from "../internal/types.ts"; type ClauseBuilderInterface = { @@ -146,10 +146,10 @@ export class ClauseBuilder { const memberValue: MemberValue = Array.isArray(value) ? { List: value.map((i) => - convertToPrimitive(i, cairoShortStringToFelt) + convertToPrimitive(i, shortString.encodeShortString) ), } - : convertToPrimitive(value, cairoShortStringToFelt); + : convertToPrimitive(value, shortString.encodeShortString); this.clause = { Member: { diff --git a/packages/sdk/src/node/index.ts b/packages/sdk/src/node/index.ts index e0142ee1..15c7dc19 100644 --- a/packages/sdk/src/node/index.ts +++ b/packages/sdk/src/node/index.ts @@ -29,7 +29,7 @@ import { Pagination } from "../internal/pagination.ts"; import { parseEntities } from "../internal/parseEntities.ts"; export * from "../internal/toriiQueryBuilder.ts"; -export * from "./clauseBuilder.ts"; +export * from "../internal/clauseBuilder.ts"; export * from "./worker.ts"; export * from "../internal/types.ts"; export * from "../internal/models.ts"; diff --git a/packages/sdk/src/web/clauseBuilder.ts b/packages/sdk/src/web/clauseBuilder.ts deleted file mode 100644 index dcfb174d..00000000 --- a/packages/sdk/src/web/clauseBuilder.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { - Clause, - ComparisonOperator, - MemberValue, - PatternMatching, - cairoShortStringToFelt, -} from "@dojoengine/torii-wasm"; -import { - convertToPrimitive, - type MemberValueParam, -} from "../internal/convertToMemberValue.ts"; -import type { SchemaType } from "../internal/types.ts"; - -type ClauseBuilderInterface = { - build(): Clause; -}; - -// Helper types for nested model structure -type ModelPath = K extends string - ? T[K] extends Record - ? { - [SubK in keyof T[K]]: `${K}-${SubK & string}`; - }[keyof T[K]] - : never - : never; - -type GetModelType< - T, - Path extends string -> = Path extends `${infer Namespace}-${infer Model}` - ? Namespace extends keyof T - ? Model extends keyof T[Namespace] - ? T[Namespace][Model] - : never - : never - : never; - -/** - * Saves some keyboard strokes to get a KeysClause. - * - * @param models - the models you want to query, has to be in form of ns-Model - * @param keys - the keys that has the model. You can use `undefined` as a wildcard to match any key - * @param pattern - either VariableLen or FixedLen - to check exact match of key number - * @return ClauseBuilder - */ -export function KeysClause( - models: ModelPath[], - keys: (string | undefined)[], - pattern: PatternMatching = "VariableLen" -): ClauseBuilder { - return new ClauseBuilder().keys(models, keys, pattern); -} - -/** - * Saves some keyboard strokes to get a MemberClause. - * - * @template T - the schema type - * @param model - the model you want to query, has to be in form of ns-Model - * @param member - the member of the model on which you want to apply operator - * @param operator - the operator to apply - * @param value - the value to operate on. - * @return ClauseBuilder - */ -export function MemberClause< - T extends SchemaType, - Path extends ModelPath, - M extends keyof GetModelType> ->( - model: Path, - member: M & string, - operator: ComparisonOperator, - value: - | GetModelType[M] - | GetModelType[M][] - | MemberValueParam -): ClauseBuilder { - return new ClauseBuilder().where(model, member, operator, value); -} - -/** - * Saves some keyboard strokes to get a Composite "Or" Clause - * - * @template T - the schema type - * @param clauses - the inner clauses that you want to compose - * @return CompositeBuilder - */ -export function AndComposeClause( - clauses: ClauseBuilderInterface[] -): CompositeBuilder { - return new ClauseBuilder().compose().and(clauses); -} - -/** - * Saves some keyboard strokes to get a Composite "And" Clause - * @template T - the schema type - * @param clauses - the inner clauses that you want to compose - * @return CompositeBuilder - */ -export function OrComposeClause( - clauses: ClauseBuilderInterface[] -): CompositeBuilder { - return new ClauseBuilder().compose().or(clauses); -} - -export class ClauseBuilder { - private clause: Clause; - - constructor() { - // @ts-expect-error It's ok if it's not assignable here. - this.clause = {}; - } - - /** - * Create a clause based on entity keys - */ - keys( - models: ModelPath[], - keys: (string | undefined)[], - pattern: PatternMatching = "VariableLen" - ): ClauseBuilder { - this.clause = { - Keys: { - keys: keys.length === 0 ? [undefined] : keys, - pattern_matching: pattern, - models, - }, - }; - return this; - } - - /** - * Create a member clause for comparing values - */ - where< - Path extends ModelPath, - M extends keyof GetModelType - >( - model: Path, - member: M & string, - operator: ComparisonOperator, - value: - | GetModelType[M] - | GetModelType[M][] - | MemberValueParam - ): ClauseBuilder { - const memberValue: MemberValue = Array.isArray(value) - ? { - List: value.map((i) => - convertToPrimitive(i, cairoShortStringToFelt) - ), - } - : convertToPrimitive(value, cairoShortStringToFelt); - - this.clause = { - Member: { - model, - member, - operator, - value: memberValue, - }, - }; - return this; - } - - /** - * Start a composite clause chain - */ - compose(): CompositeBuilder { - return new CompositeBuilder(); - } - /** - * Build the final clause - */ - build(): Clause { - if (Object.keys(this.clause).length === 0) { - throw new Error("You cannot build an empty Clause"); - } - - return this.clause; - } -} - -class CompositeBuilder>> { - private orClauses: Clause[] = []; - private andClauses: Clause[] = []; - - or(clauses: ClauseBuilderInterface[]): CompositeBuilder { - this.orClauses = clauses.map((c) => c.build()); - return this; - } - - and(clauses: ClauseBuilderInterface[]): CompositeBuilder { - this.andClauses = clauses.map((c) => c.build()); - return this; - } - - build(): Clause { - if (this.orClauses.length === 0 && this.andClauses.length === 0) { - throw new Error( - "ComposeClause is empty. Add .or([clause]) or .and([clause])" - ); - } - - // If we only have OR clauses - if (this.orClauses && this.andClauses.length === 0) { - return { - Composite: { - operator: "Or", - clauses: this.orClauses, - }, - }; - } - - // If we only have AND clauses - if (this.andClauses && this.orClauses.length === 0) { - return { - Composite: { - operator: "And", - clauses: this.andClauses, - }, - }; - } - - // If we have both OR and AND clauses - if (this.andClauses && this.orClauses) { - return { - Composite: { - operator: "And", - clauses: [ - ...this.andClauses, - { - Composite: { - operator: "Or", - clauses: this.orClauses, - }, - }, - ], - }, - }; - } - - throw new Error("CompositeClause is not properly build"); - } -} diff --git a/packages/sdk/src/web/index.ts b/packages/sdk/src/web/index.ts index 9f2607b6..f88f1674 100644 --- a/packages/sdk/src/web/index.ts +++ b/packages/sdk/src/web/index.ts @@ -32,7 +32,7 @@ import { parseEntities } from "../internal/parseEntities"; export * from "../internal/types"; export * from "./queryBuilder"; -export * from "./clauseBuilder"; +export * from "../internal/clauseBuilder"; export * from "../internal/toriiQueryBuilder"; /**