@sudobility/sudojo_client 0.0.80 → 0.0.81
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/errors/hint-access-denied.d.ts.map +1 -1
- package/dist/errors/hint-access-denied.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/query-config.d.ts.map +1 -1
- package/dist/hooks/query-config.js.map +1 -1
- package/dist/hooks/query-keys.d.ts.map +1 -1
- package/dist/hooks/query-keys.js.map +1 -1
- package/dist/hooks/use-sudojo-boards.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-boards.js.map +1 -1
- package/dist/hooks/use-sudojo-challenges.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-challenges.js.map +1 -1
- package/dist/hooks/use-sudojo-dailies.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-dailies.js.map +1 -1
- package/dist/hooks/use-sudojo-gamification.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-gamification.js.map +1 -1
- package/dist/hooks/use-sudojo-health.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-health.js.map +1 -1
- package/dist/hooks/use-sudojo-invalidation.d.ts +13 -0
- package/dist/hooks/use-sudojo-invalidation.d.ts.map +1 -0
- package/dist/hooks/use-sudojo-invalidation.js +69 -0
- package/dist/hooks/use-sudojo-invalidation.js.map +1 -0
- package/dist/hooks/use-sudojo-learning.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-learning.js.map +1 -1
- package/dist/hooks/use-sudojo-levels.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-levels.js.map +1 -1
- package/dist/hooks/use-sudojo-practices.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-practices.js.map +1 -1
- package/dist/hooks/use-sudojo-techniques.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-techniques.js.map +1 -1
- package/dist/hooks/use-sudojo-users.d.ts.map +1 -1
- package/dist/hooks/use-sudojo-users.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/network/sudojo-client.d.ts.map +1 -1
- package/dist/network/sudojo-client.js.map +1 -1
- package/dist/solver/hooks/query-config.d.ts.map +1 -1
- package/dist/solver/hooks/query-config.js.map +1 -1
- package/dist/solver/hooks/query-keys.d.ts.map +1 -1
- package/dist/solver/hooks/query-keys.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sudojo-client.js","sourceRoot":"","sources":["../../src/network/sudojo-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClient, UserInfoResponse } from \"@sudobility/types\";\nimport {\n type BadgeDefinition,\n type BaseResponse,\n type Board,\n type BoardCountsData,\n type BoardCreateRequest,\n type BoardQueryParams,\n type BoardUpdateRequest,\n type Challenge,\n type ChallengeCreateRequest,\n type ChallengeQueryParams,\n type ChallengeUpdateRequest,\n type Daily,\n type DailyCreateRequest,\n type DailyUpdateRequest,\n type ExampleCountsData,\n type GameFinishRequest,\n type GameFinishResponse,\n type GameStartRequest,\n type GameStartResponse,\n type GamificationStats,\n type GenerateData,\n type GenerateOptions,\n type HealthCheckData,\n type HintAccessDeniedResponse,\n isValidUUID,\n type Learning,\n type LearningCreateRequest,\n type LearningQueryParams,\n type LearningUpdateRequest,\n type Level,\n type LevelCreateRequest,\n type LevelUpdateRequest,\n type Optional,\n type PointTransaction,\n type SolveData,\n type SolveOptions,\n type SubscriptionResult,\n type Technique,\n type TechniqueCreateRequest,\n type TechniqueExample,\n type TechniqueExampleCreateRequest,\n type TechniqueExampleQueryParams,\n type TechniquePractice,\n type TechniquePracticeCountItem,\n type TechniquePracticeCreateRequest,\n type TechniqueQueryParams,\n type TechniqueUpdateRequest,\n type ValidateData,\n type ValidateOptions,\n validateUUID,\n} from \"@sudobility/sudojo_types\";\nimport { HintAccessDeniedError } from \"../errors\";\n\n// Re-export option types for convenience\nexport type { SolveOptions, ValidateOptions, GenerateOptions };\n\n// =============================================================================\n// URL Search Params Utility\n// =============================================================================\n\nconst createURLSearchParams = () => {\n const params: Record<string, string[]> = {};\n return {\n append: (key: string, value: string) => {\n if (!params[key]) {\n params[key] = [];\n }\n params[key]?.push(value);\n },\n toString: () => {\n return Object.entries(params)\n .flatMap(([key, values]) =>\n values.map(\n (value) =>\n // Don't encode commas - the solver API expects literal commas in pencilmarks\n `${encodeURIComponent(key)}=${encodeURIComponent(value).replace(/%2C/g, \",\")}`,\n ),\n )\n .join(\"&\");\n },\n };\n};\n\n// =============================================================================\n// API Configuration Factory\n// =============================================================================\n\nconst createApiConfig = (baseUrl: string) => ({\n BASE_URL: baseUrl,\n ENDPOINTS: {\n // Health\n HEALTH: \"/\",\n\n // Levels\n LEVELS: \"/api/v1/levels\",\n LEVEL: (level: number) => `/api/v1/levels/${level}`,\n\n // Techniques\n TECHNIQUES: \"/api/v1/techniques\",\n TECHNIQUE: (technique: number) => `/api/v1/techniques/${technique}`,\n\n // Learning\n LEARNING: \"/api/v1/learning\",\n LEARNING_ITEM: (uuid: string) => `/api/v1/learning/${uuid}`,\n\n // Boards\n BOARDS: \"/api/v1/boards\",\n BOARDS_RANDOM: \"/api/v1/boards/random\",\n BOARD: (uuid: string) => `/api/v1/boards/${uuid}`,\n\n // Dailies\n DAILIES: \"/api/v1/dailies\",\n DAILIES_RANDOM: \"/api/v1/dailies/random\",\n DAILIES_TODAY: \"/api/v1/dailies/today\",\n DAILIES_DATE: (date: string) => `/api/v1/dailies/date/${date}`,\n DAILY: (uuid: string) => `/api/v1/dailies/${uuid}`,\n\n // Challenges\n CHALLENGES: \"/api/v1/challenges\",\n CHALLENGES_RANDOM: \"/api/v1/challenges/random\",\n CHALLENGE: (uuid: string) => `/api/v1/challenges/${uuid}`,\n\n // Users\n USER: (userId: string) => `/api/v1/users/${userId}`,\n USER_SUBSCRIPTIONS: (userId: string) =>\n `/api/v1/users/${userId}/subscriptions`,\n\n // Solver\n SOLVER_SOLVE: \"/api/v1/solver/solve\",\n SOLVER_VALIDATE: \"/api/v1/solver/validate\",\n SOLVER_GENERATE: \"/api/v1/solver/generate\",\n\n // Practices\n PRACTICES: \"/api/v1/practices\",\n PRACTICES_COUNTS: \"/api/v1/practices/counts\",\n PRACTICE_RANDOM: (technique: number) =>\n `/api/v1/practices/technique/${technique}/random`,\n\n // Examples\n EXAMPLES: \"/api/v1/examples\",\n EXAMPLES_COUNTS: \"/api/v1/examples/counts\",\n\n // Boards counts\n BOARDS_COUNTS: \"/api/v1/boards/counts\",\n BOARDS_COUNTS_BY_TECHNIQUE: \"/api/v1/boards/counts/by-technique\",\n\n // Play (game sessions)\n PLAY_START: \"/api/v1/play/start\",\n PLAY_FINISH: \"/api/v1/play/finish\",\n\n // Gamification\n GAMIFICATION_STATS: \"/api/v1/gamification/stats\",\n GAMIFICATION_BADGES: \"/api/v1/gamification/badges\",\n GAMIFICATION_HISTORY: \"/api/v1/gamification/history\",\n },\n DEFAULT_HEADERS: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n});\n\n// =============================================================================\n// Sudojo Client Class\n// =============================================================================\n\nexport class SudojoClient {\n private baseUrl: string;\n private headers: Record<string, string>;\n private networkClient: NetworkClient;\n private config: ReturnType<typeof createApiConfig>;\n\n /**\n * Create a SudojoClient\n * @param networkClient - Network client for making requests\n * @param baseUrl - Base URL for API requests\n */\n constructor(networkClient: NetworkClient, baseUrl: string) {\n this.config = createApiConfig(baseUrl);\n this.baseUrl = this.config.BASE_URL;\n this.networkClient = networkClient;\n\n this.headers = {\n ...this.config.DEFAULT_HEADERS,\n };\n }\n\n // ===========================================================================\n // Private Request Method\n // ===========================================================================\n\n private async request<T>(\n endpoint: string,\n options: {\n method?: Optional<\"GET\" | \"POST\" | \"PUT\" | \"DELETE\">;\n body?: Optional<Record<string, unknown>>;\n headers?: Optional<Record<string, string>>;\n token?: Optional<string>;\n timeout?: Optional<number>;\n } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const requestHeaders: Record<string, string> = {\n ...this.headers,\n ...options.headers,\n };\n\n // Add authorization header if token is provided\n if (options.token) {\n requestHeaders[\"Authorization\"] = `Bearer ${options.token}`;\n }\n\n const requestOptions: {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers: Record<string, string>;\n body?: string;\n timeout?: number;\n } = {\n method: options.method || \"GET\",\n headers: requestHeaders,\n };\n\n // Add body for POST/PUT/DELETE requests\n if (options.body && options.method !== \"GET\") {\n requestOptions.body = JSON.stringify(options.body);\n }\n\n // Add timeout if specified\n if (options.timeout) {\n requestOptions.timeout = options.timeout;\n }\n\n const response = await this.networkClient.request<T>(url, requestOptions);\n\n if (response.data === undefined) {\n throw new Error(\"No data received from server\");\n }\n\n return response.data as T;\n }\n\n // ===========================================================================\n // Health Check\n // ===========================================================================\n\n async getHealth(): Promise<BaseResponse<HealthCheckData>> {\n return this.request<BaseResponse<HealthCheckData>>(\n this.config.ENDPOINTS.HEALTH,\n );\n }\n\n // ===========================================================================\n // Levels\n // ===========================================================================\n\n async getLevels(token: string): Promise<BaseResponse<Level[]>> {\n return this.request<BaseResponse<Level[]>>(this.config.ENDPOINTS.LEVELS, {\n token,\n });\n }\n\n async getLevel(token: string, level: number): Promise<BaseResponse<Level>> {\n if (level < 1 || level > 12) {\n throw new Error(`Invalid level: ${level}. Expected 1-12`);\n }\n return this.request<BaseResponse<Level>>(\n this.config.ENDPOINTS.LEVEL(level),\n { token },\n );\n }\n\n async createLevel(\n token: string,\n data: LevelCreateRequest,\n ): Promise<BaseResponse<Level>> {\n return this.request<BaseResponse<Level>>(this.config.ENDPOINTS.LEVELS, {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n });\n }\n\n async updateLevel(\n token: string,\n level: number,\n data: LevelUpdateRequest,\n ): Promise<BaseResponse<Level>> {\n if (level < 1 || level > 12) {\n throw new Error(`Invalid level: ${level}. Expected 1-12`);\n }\n return this.request<BaseResponse<Level>>(\n this.config.ENDPOINTS.LEVEL(level),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteLevel(\n token: string,\n level: number,\n ): Promise<BaseResponse<Level>> {\n if (level < 1 || level > 12) {\n throw new Error(`Invalid level: ${level}. Expected 1-12`);\n }\n return this.request<BaseResponse<Level>>(\n this.config.ENDPOINTS.LEVEL(level),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Techniques\n // ===========================================================================\n\n async getTechniques(\n token: string,\n queryParams?: TechniqueQueryParams,\n ): Promise<BaseResponse<Technique[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.TECHNIQUES}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Technique[]>>(endpoint, { token });\n }\n\n async getTechnique(\n token: string,\n technique: number,\n ): Promise<BaseResponse<Technique>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUE(technique),\n { token },\n );\n }\n\n async createTechnique(\n token: string,\n data: TechniqueCreateRequest,\n ): Promise<BaseResponse<Technique>> {\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async updateTechnique(\n token: string,\n technique: number,\n data: TechniqueUpdateRequest,\n ): Promise<BaseResponse<Technique>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUE(technique),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteTechnique(\n token: string,\n technique: number,\n ): Promise<BaseResponse<Technique>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUE(technique),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Learning\n // ===========================================================================\n\n async getLearning(\n token: string,\n queryParams?: LearningQueryParams,\n ): Promise<BaseResponse<Learning[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.technique !== undefined) {\n params.append(\"technique\", String(queryParams.technique));\n }\n if (queryParams?.language_code) {\n params.append(\"language_code\", queryParams.language_code);\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.LEARNING}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Learning[]>>(endpoint, { token });\n }\n\n async getLearningItem(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Learning>> {\n const validatedUuid = validateUUID(uuid, \"Learning UUID\");\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING_ITEM(validatedUuid),\n { token },\n );\n }\n\n async createLearning(\n token: string,\n data: LearningCreateRequest,\n ): Promise<BaseResponse<Learning>> {\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async updateLearning(\n token: string,\n uuid: string,\n data: LearningUpdateRequest,\n ): Promise<BaseResponse<Learning>> {\n const validatedUuid = validateUUID(uuid, \"Learning UUID\");\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING_ITEM(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteLearning(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Learning>> {\n const validatedUuid = validateUUID(uuid, \"Learning UUID\");\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING_ITEM(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Boards\n // ===========================================================================\n\n async getBoards(\n token: string,\n queryParams?: BoardQueryParams,\n ): Promise<BaseResponse<Board[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n if (queryParams?.limit !== undefined) {\n params.append(\"limit\", String(queryParams.limit));\n }\n if (queryParams?.offset !== undefined) {\n params.append(\"offset\", String(queryParams.offset));\n }\n if (queryParams?.techniques !== undefined) {\n params.append(\"techniques\", String(queryParams.techniques));\n }\n if (queryParams?.technique_bit !== undefined) {\n params.append(\"technique_bit\", String(queryParams.technique_bit));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.BOARDS}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Board[]>>(endpoint, { token });\n }\n\n async getRandomBoard(\n token: string,\n queryParams?: BoardQueryParams,\n ): Promise<BaseResponse<Board>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n\n if (queryParams?.symmetrical !== undefined) {\n params.append(\"symmetrical\", String(queryParams.symmetrical));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.BOARDS_RANDOM}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Board>>(endpoint, { token });\n }\n\n async getBoard(token: string, uuid: string): Promise<BaseResponse<Board>> {\n const validatedUuid = validateUUID(uuid, \"Board UUID\");\n return this.request<BaseResponse<Board>>(\n this.config.ENDPOINTS.BOARD(validatedUuid),\n { token },\n );\n }\n\n async createBoard(\n token: string,\n data: BoardCreateRequest,\n ): Promise<BaseResponse<Board>> {\n return this.request<BaseResponse<Board>>(this.config.ENDPOINTS.BOARDS, {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n });\n }\n\n async updateBoard(\n token: string,\n uuid: string,\n data: BoardUpdateRequest,\n ): Promise<BaseResponse<Board>> {\n const validatedUuid = validateUUID(uuid, \"Board UUID\");\n return this.request<BaseResponse<Board>>(\n this.config.ENDPOINTS.BOARD(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteBoard(token: string, uuid: string): Promise<BaseResponse<Board>> {\n const validatedUuid = validateUUID(uuid, \"Board UUID\");\n return this.request<BaseResponse<Board>>(\n this.config.ENDPOINTS.BOARD(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Dailies\n // ===========================================================================\n\n async getDailies(token: string): Promise<BaseResponse<Daily[]>> {\n return this.request<BaseResponse<Daily[]>>(this.config.ENDPOINTS.DAILIES, {\n token,\n });\n }\n\n async getRandomDaily(token: string): Promise<BaseResponse<Daily>> {\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILIES_RANDOM,\n { token },\n );\n }\n\n async getTodayDaily(token: string): Promise<BaseResponse<Daily>> {\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILIES_TODAY,\n { token },\n );\n }\n\n async getDailyByDate(\n token: string,\n date: string,\n ): Promise<BaseResponse<Daily>> {\n // Validate date format (YYYY-MM-DD)\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\n throw new Error(\n `Invalid date format: \"${date}\". Expected YYYY-MM-DD format`,\n );\n }\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILIES_DATE(date),\n { token },\n );\n }\n\n async getDaily(token: string, uuid: string): Promise<BaseResponse<Daily>> {\n const validatedUuid = validateUUID(uuid, \"Daily UUID\");\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILY(validatedUuid),\n { token },\n );\n }\n\n async createDaily(\n token: string,\n data: DailyCreateRequest,\n ): Promise<BaseResponse<Daily>> {\n return this.request<BaseResponse<Daily>>(this.config.ENDPOINTS.DAILIES, {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n });\n }\n\n async updateDaily(\n token: string,\n uuid: string,\n data: DailyUpdateRequest,\n ): Promise<BaseResponse<Daily>> {\n const validatedUuid = validateUUID(uuid, \"Daily UUID\");\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILY(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteDaily(token: string, uuid: string): Promise<BaseResponse<Daily>> {\n const validatedUuid = validateUUID(uuid, \"Daily UUID\");\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILY(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Challenges\n // ===========================================================================\n\n async getChallenges(\n token: string,\n queryParams?: ChallengeQueryParams,\n ): Promise<BaseResponse<Challenge[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n if (queryParams?.difficulty) {\n params.append(\"difficulty\", queryParams.difficulty);\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.CHALLENGES}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Challenge[]>>(endpoint, { token });\n }\n\n async getRandomChallenge(\n token: string,\n queryParams?: ChallengeQueryParams,\n ): Promise<BaseResponse<Challenge>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n if (queryParams?.difficulty) {\n params.append(\"difficulty\", queryParams.difficulty);\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.CHALLENGES_RANDOM}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Challenge>>(endpoint, { token });\n }\n\n async getChallenge(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Challenge>> {\n const validatedUuid = validateUUID(uuid, \"Challenge UUID\");\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGE(validatedUuid),\n { token },\n );\n }\n\n async createChallenge(\n token: string,\n data: ChallengeCreateRequest,\n ): Promise<BaseResponse<Challenge>> {\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async updateChallenge(\n token: string,\n uuid: string,\n data: ChallengeUpdateRequest,\n ): Promise<BaseResponse<Challenge>> {\n const validatedUuid = validateUUID(uuid, \"Challenge UUID\");\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGE(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteChallenge(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Challenge>> {\n const validatedUuid = validateUUID(uuid, \"Challenge UUID\");\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGE(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Users\n // ===========================================================================\n\n async getUser(\n token: string,\n userId: string,\n ): Promise<BaseResponse<UserInfoResponse>> {\n if (!userId || userId.length === 0 || userId.length > 128) {\n throw new Error(`Invalid userId: \"${userId}\". Expected 1-128 characters`);\n }\n return this.request<BaseResponse<UserInfoResponse>>(\n this.config.ENDPOINTS.USER(userId),\n {\n token,\n },\n );\n }\n\n async getUserSubscription(\n token: string,\n userId: string,\n ): Promise<BaseResponse<SubscriptionResult>> {\n if (!userId || userId.length === 0 || userId.length > 128) {\n throw new Error(`Invalid userId: \"${userId}\". Expected 1-128 characters`);\n }\n return this.request<BaseResponse<SubscriptionResult>>(\n this.config.ENDPOINTS.USER_SUBSCRIPTIONS(userId),\n {\n token,\n },\n );\n }\n\n // ===========================================================================\n // Practices\n // ===========================================================================\n\n /**\n * Get practice counts for all techniques\n */\n async getPracticeCounts(\n token: string,\n ): Promise<BaseResponse<TechniquePracticeCountItem[]>> {\n return this.request<BaseResponse<TechniquePracticeCountItem[]>>(\n this.config.ENDPOINTS.PRACTICES_COUNTS,\n { token },\n );\n }\n\n /**\n * Get a random practice for a specific technique\n */\n async getRandomPractice(\n token: string,\n technique: number,\n ): Promise<BaseResponse<TechniquePractice>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<TechniquePractice>>(\n this.config.ENDPOINTS.PRACTICE_RANDOM(technique),\n { token },\n );\n }\n\n /**\n * Create a new practice (admin only)\n */\n async createPractice(\n token: string,\n data: TechniquePracticeCreateRequest,\n ): Promise<BaseResponse<TechniquePractice>> {\n return this.request<BaseResponse<TechniquePractice>>(\n this.config.ENDPOINTS.PRACTICES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n /**\n * Delete all practices (admin only, requires confirm=true)\n */\n async deleteAllPractices(\n token: string,\n ): Promise<BaseResponse<{ deleted: number; message: string }>> {\n return this.request<BaseResponse<{ deleted: number; message: string }>>(\n `${this.config.ENDPOINTS.PRACTICES}?confirm=true`,\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Examples\n // ===========================================================================\n\n /**\n * Get example counts for all techniques\n */\n async getExampleCounts(\n token: string,\n ): Promise<BaseResponse<ExampleCountsData>> {\n return this.request<BaseResponse<ExampleCountsData>>(\n this.config.ENDPOINTS.EXAMPLES_COUNTS,\n { token },\n );\n }\n\n /**\n * Get examples, optionally filtered by technique\n */\n async getExamples(\n token: string,\n queryParams?: TechniqueExampleQueryParams,\n ): Promise<BaseResponse<TechniqueExample[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.technique !== undefined) {\n params.append(\"technique\", String(queryParams.technique));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.EXAMPLES}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<TechniqueExample[]>>(endpoint, { token });\n }\n\n /**\n * Create a new example (admin only)\n */\n async createExample(\n token: string,\n data: TechniqueExampleCreateRequest,\n ): Promise<BaseResponse<TechniqueExample>> {\n return this.request<BaseResponse<TechniqueExample>>(\n this.config.ENDPOINTS.EXAMPLES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n // ===========================================================================\n // Board Counts\n // ===========================================================================\n\n /**\n * Get board counts (total and without techniques)\n */\n async getBoardCounts(token: string): Promise<BaseResponse<BoardCountsData>> {\n return this.request<BaseResponse<BoardCountsData>>(\n this.config.ENDPOINTS.BOARDS_COUNTS,\n { token },\n );\n }\n\n /**\n * Get board counts by technique (count of boards with each technique bit set)\n * Returns Record<number, number> where key is technique ID and value is count\n */\n async getBoardCountsByTechnique(\n token: string,\n ): Promise<BaseResponse<Record<number, number>>> {\n return this.request<BaseResponse<Record<number, number>>>(\n this.config.ENDPOINTS.BOARDS_COUNTS_BY_TECHNIQUE,\n { token },\n );\n }\n\n // ===========================================================================\n // Solver\n // ===========================================================================\n\n /**\n * Builds an endpoint path with query parameters for solver endpoints\n */\n private buildSolverUrl(\n endpoint: string,\n params: Record<string, string | boolean | undefined>,\n ): string {\n const searchParams = createURLSearchParams();\n // Sort keys alphabetically to match Kotlin behavior\n const sortedKeys = Object.keys(params).sort();\n for (const key of sortedKeys) {\n const value = params[key];\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n const query = searchParams.toString();\n // Return endpoint + query only, baseUrl is added by request()\n return `${endpoint}${query ? `?${query}` : \"\"}`;\n }\n\n /**\n * Get hints for solving a Sudoku puzzle\n * @throws {HintAccessDeniedError} When hint level exceeds user's subscription tier\n */\n async solverSolve(\n token: string,\n options: SolveOptions,\n ): Promise<BaseResponse<SolveData>> {\n const url = this.buildSolverUrl(this.config.ENDPOINTS.SOLVER_SOLVE, {\n original: options.original,\n user: options.user,\n autopencilmarks: options.autoPencilmarks,\n pencilmarks: options.pencilmarks,\n filters: options.filters,\n techniques: options.techniques,\n });\n\n const fullUrl = `${this.baseUrl}${url}`;\n const requestHeaders: Record<string, string> = {\n ...this.headers,\n };\n\n if (token) {\n requestHeaders[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Use 120 second timeout for solve (advanced techniques can be slow)\n const response = await this.networkClient.request<\n BaseResponse<SolveData> | HintAccessDeniedResponse\n >(fullUrl, {\n method: \"GET\",\n headers: requestHeaders,\n timeout: 120000,\n });\n\n // Check for hint access denied (402)\n if (response.status === 402 && response.data) {\n const errorResponse = response.data as HintAccessDeniedResponse;\n if (errorResponse.error?.code === \"HINT_ACCESS_DENIED\") {\n throw new HintAccessDeniedError(errorResponse.error);\n }\n }\n\n // Check for other errors\n if (!response.ok || response.data === undefined) {\n throw new Error(\"Failed to get hints from solver\");\n }\n\n return response.data as BaseResponse<SolveData>;\n }\n\n /**\n * Validate that a Sudoku puzzle has a unique solution.\n * Uses a longer timeout (120s) because validation involves iterative solving.\n */\n async solverValidate(\n token: string,\n options: ValidateOptions,\n ): Promise<BaseResponse<ValidateData>> {\n const url = this.buildSolverUrl(this.config.ENDPOINTS.SOLVER_VALIDATE, {\n original: options.original,\n });\n\n // Use 120 second timeout for validation (iterative solving can be slow)\n return this.request<BaseResponse<ValidateData>>(url, {\n token,\n timeout: 120000,\n });\n }\n\n /**\n * Generate a new random Sudoku puzzle\n */\n async solverGenerate(\n token: string,\n options: GenerateOptions = {},\n ): Promise<BaseResponse<GenerateData>> {\n const url = this.buildSolverUrl(this.config.ENDPOINTS.SOLVER_GENERATE, {\n symmetrical: options.symmetrical,\n });\n\n return this.request<BaseResponse<GenerateData>>(url, { token });\n }\n\n // ===========================================================================\n // Play (Game Session) Endpoints\n // ===========================================================================\n\n /**\n * Start a new game session\n */\n async playStart(\n token: string,\n data: GameStartRequest,\n ): Promise<BaseResponse<GameStartResponse>> {\n return this.request<BaseResponse<GameStartResponse>>(\n this.config.ENDPOINTS.PLAY_START,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n /**\n * Finish the current game session and get rewards\n */\n async playFinish(\n token: string,\n data: GameFinishRequest,\n ): Promise<BaseResponse<GameFinishResponse>> {\n return this.request<BaseResponse<GameFinishResponse>>(\n this.config.ENDPOINTS.PLAY_FINISH,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n // ===========================================================================\n // Gamification Endpoints\n // ===========================================================================\n\n /**\n * Get user's gamification stats (points, level, badges)\n */\n async getGamificationStats(\n token: string,\n ): Promise<BaseResponse<GamificationStats>> {\n return this.request<BaseResponse<GamificationStats>>(\n this.config.ENDPOINTS.GAMIFICATION_STATS,\n { token },\n );\n }\n\n /**\n * Get all badge definitions (public)\n */\n async getBadgeDefinitions(): Promise<BaseResponse<BadgeDefinition[]>> {\n return this.request<BaseResponse<BadgeDefinition[]>>(\n this.config.ENDPOINTS.GAMIFICATION_BADGES,\n );\n }\n\n /**\n * Get user's point transaction history\n */\n async getPointHistory(\n token: string,\n options?: { limit?: number; offset?: number },\n ): Promise<BaseResponse<PointTransaction[]>> {\n let endpoint = this.config.ENDPOINTS.GAMIFICATION_HISTORY;\n if (options?.limit || options?.offset) {\n const params = createURLSearchParams();\n if (options.limit) params.append(\"limit\", String(options.limit));\n if (options.offset) params.append(\"offset\", String(options.offset));\n endpoint = `${endpoint}?${params.toString()}`;\n }\n return this.request<BaseResponse<PointTransaction[]>>(endpoint, { token });\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\nexport const createSudojoClient = (\n networkClient: NetworkClient,\n baseUrl: string,\n): SudojoClient => {\n return new SudojoClient(networkClient, baseUrl);\n};\n\n// =============================================================================\n// Utility Exports\n// =============================================================================\n\nexport { isValidUUID, validateUUID };\n"]}
|
|
1
|
+
{"version":3,"file":"sudojo-client.js","sourceRoot":"","sources":["../../src/network/sudojo-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClient, UserInfoResponse } from \"@sudobility/types\";\nimport {\n type BadgeDefinition,\n type BaseResponse,\n type Board,\n type BoardCountsData,\n type BoardCreateRequest,\n type BoardQueryParams,\n type BoardUpdateRequest,\n type Challenge,\n type ChallengeCreateRequest,\n type ChallengeQueryParams,\n type ChallengeUpdateRequest,\n type Daily,\n type DailyCreateRequest,\n type DailyUpdateRequest,\n type ExampleCountsData,\n type GameFinishRequest,\n type GameFinishResponse,\n type GameStartRequest,\n type GameStartResponse,\n type GamificationStats,\n type GenerateData,\n type GenerateOptions,\n type HealthCheckData,\n type HintAccessDeniedResponse,\n isValidUUID,\n type Learning,\n type LearningCreateRequest,\n type LearningQueryParams,\n type LearningUpdateRequest,\n type Level,\n type LevelCreateRequest,\n type LevelUpdateRequest,\n type Optional,\n type PointTransaction,\n type SolveData,\n type SolveOptions,\n type SubscriptionResult,\n type Technique,\n type TechniqueCreateRequest,\n type TechniqueExample,\n type TechniqueExampleCreateRequest,\n type TechniqueExampleQueryParams,\n type TechniquePractice,\n type TechniquePracticeCountItem,\n type TechniquePracticeCreateRequest,\n type TechniqueQueryParams,\n type TechniqueUpdateRequest,\n type ValidateData,\n type ValidateOptions,\n validateUUID,\n} from \"@sudobility/sudojo_types\";\nimport { HintAccessDeniedError } from \"../errors\";\n\n// Re-export option types for convenience\nexport type { SolveOptions, ValidateOptions, GenerateOptions };\n\n// =============================================================================\n// URL Search Params Utility\n// =============================================================================\n\n/**\n * Creates a lightweight URL search params builder.\n *\n * This is a custom implementation instead of the standard `URLSearchParams`\n * because the solver API requires a special encoding behavior: **commas must\n * NOT be percent-encoded** in pencilmark values. The standard `URLSearchParams`\n * encodes commas as `%2C`, which the Kotlin-based solver backend does not decode.\n *\n * @returns An object with `append(key, value)` and `toString()` methods\n *\n * @example\n * ```ts\n * const params = createURLSearchParams();\n * params.append(\"pencilmarks\", \"1,2,3\");\n * params.toString(); // \"pencilmarks=1,2,3\" (commas preserved)\n * ```\n */\nconst createURLSearchParams = () => {\n const params: Record<string, string[]> = {};\n return {\n append: (key: string, value: string) => {\n if (!params[key]) {\n params[key] = [];\n }\n params[key]?.push(value);\n },\n toString: () => {\n return Object.entries(params)\n .flatMap(([key, values]) =>\n values.map(\n (value) =>\n // Don't encode commas - the solver API expects literal commas in pencilmarks\n `${encodeURIComponent(key)}=${encodeURIComponent(value).replace(/%2C/g, \",\")}`,\n ),\n )\n .join(\"&\");\n },\n };\n};\n\n// =============================================================================\n// API Configuration Factory\n// =============================================================================\n\nconst createApiConfig = (baseUrl: string) => ({\n BASE_URL: baseUrl,\n ENDPOINTS: {\n // Health\n HEALTH: \"/\",\n\n // Levels\n LEVELS: \"/api/v1/levels\",\n LEVEL: (level: number) => `/api/v1/levels/${level}`,\n\n // Techniques\n TECHNIQUES: \"/api/v1/techniques\",\n TECHNIQUE: (technique: number) => `/api/v1/techniques/${technique}`,\n\n // Learning\n LEARNING: \"/api/v1/learning\",\n LEARNING_ITEM: (uuid: string) => `/api/v1/learning/${uuid}`,\n\n // Boards\n BOARDS: \"/api/v1/boards\",\n BOARDS_RANDOM: \"/api/v1/boards/random\",\n BOARD: (uuid: string) => `/api/v1/boards/${uuid}`,\n\n // Dailies\n DAILIES: \"/api/v1/dailies\",\n DAILIES_RANDOM: \"/api/v1/dailies/random\",\n DAILIES_TODAY: \"/api/v1/dailies/today\",\n DAILIES_DATE: (date: string) => `/api/v1/dailies/date/${date}`,\n DAILY: (uuid: string) => `/api/v1/dailies/${uuid}`,\n\n // Challenges\n CHALLENGES: \"/api/v1/challenges\",\n CHALLENGES_RANDOM: \"/api/v1/challenges/random\",\n CHALLENGE: (uuid: string) => `/api/v1/challenges/${uuid}`,\n\n // Users\n USER: (userId: string) => `/api/v1/users/${userId}`,\n USER_SUBSCRIPTIONS: (userId: string) =>\n `/api/v1/users/${userId}/subscriptions`,\n\n // Solver\n SOLVER_SOLVE: \"/api/v1/solver/solve\",\n SOLVER_VALIDATE: \"/api/v1/solver/validate\",\n SOLVER_GENERATE: \"/api/v1/solver/generate\",\n\n // Practices\n PRACTICES: \"/api/v1/practices\",\n PRACTICES_COUNTS: \"/api/v1/practices/counts\",\n PRACTICE_RANDOM: (technique: number) =>\n `/api/v1/practices/technique/${technique}/random`,\n\n // Examples\n EXAMPLES: \"/api/v1/examples\",\n EXAMPLES_COUNTS: \"/api/v1/examples/counts\",\n\n // Boards counts\n BOARDS_COUNTS: \"/api/v1/boards/counts\",\n BOARDS_COUNTS_BY_TECHNIQUE: \"/api/v1/boards/counts/by-technique\",\n\n // Play (game sessions)\n PLAY_START: \"/api/v1/play/start\",\n PLAY_FINISH: \"/api/v1/play/finish\",\n\n // Gamification\n GAMIFICATION_STATS: \"/api/v1/gamification/stats\",\n GAMIFICATION_BADGES: \"/api/v1/gamification/badges\",\n GAMIFICATION_HISTORY: \"/api/v1/gamification/history\",\n },\n DEFAULT_HEADERS: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n});\n\n// =============================================================================\n// Sudojo Client Class\n// =============================================================================\n\n/**\n * Type-safe client for the Sudojo REST API.\n *\n * Provides methods for all Sudojo API endpoints including levels, techniques,\n * boards, dailies, challenges, users, solver, practices, examples, and gamification.\n *\n * ## Error Handling\n *\n * All methods throw errors on failure:\n * - **Network errors**: Thrown by the underlying `NetworkClient` (e.g., connection refused, timeout)\n * - **Empty response**: Throws `Error(\"No data received from server\")` when the server returns no data\n * - **Validation errors**: Thrown before the request for invalid parameters (e.g., invalid UUID, level out of range)\n * - **HTTP 402**: `solverSolve()` throws {@link HintAccessDeniedError} when the hint level exceeds the user's tier\n * - **Other HTTP errors**: Depend on the `NetworkClient` implementation - typically thrown as generic `Error`\n *\n * ## Authentication\n *\n * Most methods accept a `token` parameter (Firebase ID token). The token is sent\n * as a `Bearer` token in the `Authorization` header. Public endpoints (health,\n * levels, boards, etc.) accept but do not require a token. User-specific endpoints\n * (subscriptions, gamification) require a valid token.\n *\n * ## Usage\n *\n * ```typescript\n * const client = new SudojoClient(networkClient, \"https://api.sudojo.com\");\n * const levels = await client.getLevels(token);\n * const daily = await client.getDailyByDate(token, \"2024-01-15\");\n * ```\n */\nexport class SudojoClient {\n private baseUrl: string;\n private headers: Record<string, string>;\n private networkClient: NetworkClient;\n private config: ReturnType<typeof createApiConfig>;\n\n /**\n * Create a SudojoClient instance.\n *\n * @param networkClient - Network client for making HTTP requests (from `@sudobility/types`)\n * @param baseUrl - Base URL for the Sudojo API (e.g., \"https://api.sudojo.com\")\n */\n constructor(networkClient: NetworkClient, baseUrl: string) {\n this.config = createApiConfig(baseUrl);\n this.baseUrl = this.config.BASE_URL;\n this.networkClient = networkClient;\n\n this.headers = {\n ...this.config.DEFAULT_HEADERS,\n };\n }\n\n // ===========================================================================\n // Private Request Method\n // ===========================================================================\n\n private async request<T>(\n endpoint: string,\n options: {\n method?: Optional<\"GET\" | \"POST\" | \"PUT\" | \"DELETE\">;\n body?: Optional<Record<string, unknown>>;\n headers?: Optional<Record<string, string>>;\n token?: Optional<string>;\n timeout?: Optional<number>;\n } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const requestHeaders: Record<string, string> = {\n ...this.headers,\n ...options.headers,\n };\n\n // Add authorization header if token is provided\n if (options.token) {\n requestHeaders[\"Authorization\"] = `Bearer ${options.token}`;\n }\n\n const requestOptions: {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers: Record<string, string>;\n body?: string;\n timeout?: number;\n } = {\n method: options.method || \"GET\",\n headers: requestHeaders,\n };\n\n // Add body for POST/PUT/DELETE requests\n if (options.body && options.method !== \"GET\") {\n requestOptions.body = JSON.stringify(options.body);\n }\n\n // Add timeout if specified\n if (options.timeout) {\n requestOptions.timeout = options.timeout;\n }\n\n const response = await this.networkClient.request<T>(url, requestOptions);\n\n if (response.data === undefined) {\n throw new Error(\"No data received from server\");\n }\n\n return response.data as T;\n }\n\n // ===========================================================================\n // Health Check\n // ===========================================================================\n\n async getHealth(): Promise<BaseResponse<HealthCheckData>> {\n return this.request<BaseResponse<HealthCheckData>>(\n this.config.ENDPOINTS.HEALTH,\n );\n }\n\n // ===========================================================================\n // Levels\n // ===========================================================================\n\n async getLevels(token: string): Promise<BaseResponse<Level[]>> {\n return this.request<BaseResponse<Level[]>>(this.config.ENDPOINTS.LEVELS, {\n token,\n });\n }\n\n async getLevel(token: string, level: number): Promise<BaseResponse<Level>> {\n if (level < 1 || level > 12) {\n throw new Error(`Invalid level: ${level}. Expected 1-12`);\n }\n return this.request<BaseResponse<Level>>(\n this.config.ENDPOINTS.LEVEL(level),\n { token },\n );\n }\n\n async createLevel(\n token: string,\n data: LevelCreateRequest,\n ): Promise<BaseResponse<Level>> {\n return this.request<BaseResponse<Level>>(this.config.ENDPOINTS.LEVELS, {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n });\n }\n\n async updateLevel(\n token: string,\n level: number,\n data: LevelUpdateRequest,\n ): Promise<BaseResponse<Level>> {\n if (level < 1 || level > 12) {\n throw new Error(`Invalid level: ${level}. Expected 1-12`);\n }\n return this.request<BaseResponse<Level>>(\n this.config.ENDPOINTS.LEVEL(level),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteLevel(\n token: string,\n level: number,\n ): Promise<BaseResponse<Level>> {\n if (level < 1 || level > 12) {\n throw new Error(`Invalid level: ${level}. Expected 1-12`);\n }\n return this.request<BaseResponse<Level>>(\n this.config.ENDPOINTS.LEVEL(level),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Techniques\n // ===========================================================================\n\n async getTechniques(\n token: string,\n queryParams?: TechniqueQueryParams,\n ): Promise<BaseResponse<Technique[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.TECHNIQUES}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Technique[]>>(endpoint, { token });\n }\n\n async getTechnique(\n token: string,\n technique: number,\n ): Promise<BaseResponse<Technique>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUE(technique),\n { token },\n );\n }\n\n async createTechnique(\n token: string,\n data: TechniqueCreateRequest,\n ): Promise<BaseResponse<Technique>> {\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async updateTechnique(\n token: string,\n technique: number,\n data: TechniqueUpdateRequest,\n ): Promise<BaseResponse<Technique>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUE(technique),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteTechnique(\n token: string,\n technique: number,\n ): Promise<BaseResponse<Technique>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<Technique>>(\n this.config.ENDPOINTS.TECHNIQUE(technique),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Learning\n // ===========================================================================\n\n async getLearning(\n token: string,\n queryParams?: LearningQueryParams,\n ): Promise<BaseResponse<Learning[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.technique !== undefined) {\n params.append(\"technique\", String(queryParams.technique));\n }\n if (queryParams?.language_code) {\n params.append(\"language_code\", queryParams.language_code);\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.LEARNING}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Learning[]>>(endpoint, { token });\n }\n\n async getLearningItem(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Learning>> {\n const validatedUuid = validateUUID(uuid, \"Learning UUID\");\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING_ITEM(validatedUuid),\n { token },\n );\n }\n\n async createLearning(\n token: string,\n data: LearningCreateRequest,\n ): Promise<BaseResponse<Learning>> {\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async updateLearning(\n token: string,\n uuid: string,\n data: LearningUpdateRequest,\n ): Promise<BaseResponse<Learning>> {\n const validatedUuid = validateUUID(uuid, \"Learning UUID\");\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING_ITEM(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteLearning(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Learning>> {\n const validatedUuid = validateUUID(uuid, \"Learning UUID\");\n return this.request<BaseResponse<Learning>>(\n this.config.ENDPOINTS.LEARNING_ITEM(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Boards\n // ===========================================================================\n\n async getBoards(\n token: string,\n queryParams?: BoardQueryParams,\n ): Promise<BaseResponse<Board[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n if (queryParams?.limit !== undefined) {\n params.append(\"limit\", String(queryParams.limit));\n }\n if (queryParams?.offset !== undefined) {\n params.append(\"offset\", String(queryParams.offset));\n }\n if (queryParams?.techniques !== undefined) {\n params.append(\"techniques\", String(queryParams.techniques));\n }\n if (queryParams?.technique_bit !== undefined) {\n params.append(\"technique_bit\", String(queryParams.technique_bit));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.BOARDS}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Board[]>>(endpoint, { token });\n }\n\n async getRandomBoard(\n token: string,\n queryParams?: BoardQueryParams,\n ): Promise<BaseResponse<Board>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n\n if (queryParams?.symmetrical !== undefined) {\n params.append(\"symmetrical\", String(queryParams.symmetrical));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.BOARDS_RANDOM}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Board>>(endpoint, { token });\n }\n\n async getBoard(token: string, uuid: string): Promise<BaseResponse<Board>> {\n const validatedUuid = validateUUID(uuid, \"Board UUID\");\n return this.request<BaseResponse<Board>>(\n this.config.ENDPOINTS.BOARD(validatedUuid),\n { token },\n );\n }\n\n async createBoard(\n token: string,\n data: BoardCreateRequest,\n ): Promise<BaseResponse<Board>> {\n return this.request<BaseResponse<Board>>(this.config.ENDPOINTS.BOARDS, {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n });\n }\n\n async updateBoard(\n token: string,\n uuid: string,\n data: BoardUpdateRequest,\n ): Promise<BaseResponse<Board>> {\n const validatedUuid = validateUUID(uuid, \"Board UUID\");\n return this.request<BaseResponse<Board>>(\n this.config.ENDPOINTS.BOARD(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteBoard(token: string, uuid: string): Promise<BaseResponse<Board>> {\n const validatedUuid = validateUUID(uuid, \"Board UUID\");\n return this.request<BaseResponse<Board>>(\n this.config.ENDPOINTS.BOARD(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Dailies\n // ===========================================================================\n\n async getDailies(token: string): Promise<BaseResponse<Daily[]>> {\n return this.request<BaseResponse<Daily[]>>(this.config.ENDPOINTS.DAILIES, {\n token,\n });\n }\n\n async getRandomDaily(token: string): Promise<BaseResponse<Daily>> {\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILIES_RANDOM,\n { token },\n );\n }\n\n async getTodayDaily(token: string): Promise<BaseResponse<Daily>> {\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILIES_TODAY,\n { token },\n );\n }\n\n async getDailyByDate(\n token: string,\n date: string,\n ): Promise<BaseResponse<Daily>> {\n // Validate date format (YYYY-MM-DD)\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\n throw new Error(\n `Invalid date format: \"${date}\". Expected YYYY-MM-DD format`,\n );\n }\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILIES_DATE(date),\n { token },\n );\n }\n\n async getDaily(token: string, uuid: string): Promise<BaseResponse<Daily>> {\n const validatedUuid = validateUUID(uuid, \"Daily UUID\");\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILY(validatedUuid),\n { token },\n );\n }\n\n async createDaily(\n token: string,\n data: DailyCreateRequest,\n ): Promise<BaseResponse<Daily>> {\n return this.request<BaseResponse<Daily>>(this.config.ENDPOINTS.DAILIES, {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n });\n }\n\n async updateDaily(\n token: string,\n uuid: string,\n data: DailyUpdateRequest,\n ): Promise<BaseResponse<Daily>> {\n const validatedUuid = validateUUID(uuid, \"Daily UUID\");\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILY(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteDaily(token: string, uuid: string): Promise<BaseResponse<Daily>> {\n const validatedUuid = validateUUID(uuid, \"Daily UUID\");\n return this.request<BaseResponse<Daily>>(\n this.config.ENDPOINTS.DAILY(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Challenges\n // ===========================================================================\n\n async getChallenges(\n token: string,\n queryParams?: ChallengeQueryParams,\n ): Promise<BaseResponse<Challenge[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n if (queryParams?.difficulty) {\n params.append(\"difficulty\", queryParams.difficulty);\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.CHALLENGES}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Challenge[]>>(endpoint, { token });\n }\n\n async getRandomChallenge(\n token: string,\n queryParams?: ChallengeQueryParams,\n ): Promise<BaseResponse<Challenge>> {\n const params = createURLSearchParams();\n\n if (queryParams?.level !== undefined) {\n params.append(\"level\", String(queryParams.level));\n }\n if (queryParams?.difficulty) {\n params.append(\"difficulty\", queryParams.difficulty);\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.CHALLENGES_RANDOM}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<Challenge>>(endpoint, { token });\n }\n\n async getChallenge(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Challenge>> {\n const validatedUuid = validateUUID(uuid, \"Challenge UUID\");\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGE(validatedUuid),\n { token },\n );\n }\n\n async createChallenge(\n token: string,\n data: ChallengeCreateRequest,\n ): Promise<BaseResponse<Challenge>> {\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async updateChallenge(\n token: string,\n uuid: string,\n data: ChallengeUpdateRequest,\n ): Promise<BaseResponse<Challenge>> {\n const validatedUuid = validateUUID(uuid, \"Challenge UUID\");\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGE(validatedUuid),\n {\n method: \"PUT\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n async deleteChallenge(\n token: string,\n uuid: string,\n ): Promise<BaseResponse<Challenge>> {\n const validatedUuid = validateUUID(uuid, \"Challenge UUID\");\n return this.request<BaseResponse<Challenge>>(\n this.config.ENDPOINTS.CHALLENGE(validatedUuid),\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Users\n // ===========================================================================\n\n async getUser(\n token: string,\n userId: string,\n ): Promise<BaseResponse<UserInfoResponse>> {\n if (!userId || userId.length === 0 || userId.length > 128) {\n throw new Error(`Invalid userId: \"${userId}\". Expected 1-128 characters`);\n }\n return this.request<BaseResponse<UserInfoResponse>>(\n this.config.ENDPOINTS.USER(userId),\n {\n token,\n },\n );\n }\n\n async getUserSubscription(\n token: string,\n userId: string,\n ): Promise<BaseResponse<SubscriptionResult>> {\n if (!userId || userId.length === 0 || userId.length > 128) {\n throw new Error(`Invalid userId: \"${userId}\". Expected 1-128 characters`);\n }\n return this.request<BaseResponse<SubscriptionResult>>(\n this.config.ENDPOINTS.USER_SUBSCRIPTIONS(userId),\n {\n token,\n },\n );\n }\n\n // ===========================================================================\n // Practices\n // ===========================================================================\n\n /**\n * Get practice counts for all techniques\n */\n async getPracticeCounts(\n token: string,\n ): Promise<BaseResponse<TechniquePracticeCountItem[]>> {\n return this.request<BaseResponse<TechniquePracticeCountItem[]>>(\n this.config.ENDPOINTS.PRACTICES_COUNTS,\n { token },\n );\n }\n\n /**\n * Get a random practice for a specific technique\n */\n async getRandomPractice(\n token: string,\n technique: number,\n ): Promise<BaseResponse<TechniquePractice>> {\n if (technique < 1) {\n throw new Error(`Invalid technique: ${technique}. Expected >= 1`);\n }\n return this.request<BaseResponse<TechniquePractice>>(\n this.config.ENDPOINTS.PRACTICE_RANDOM(technique),\n { token },\n );\n }\n\n /**\n * Create a new practice (admin only)\n */\n async createPractice(\n token: string,\n data: TechniquePracticeCreateRequest,\n ): Promise<BaseResponse<TechniquePractice>> {\n return this.request<BaseResponse<TechniquePractice>>(\n this.config.ENDPOINTS.PRACTICES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n /**\n * Delete all practices (admin only, requires confirm=true)\n */\n async deleteAllPractices(\n token: string,\n ): Promise<BaseResponse<{ deleted: number; message: string }>> {\n return this.request<BaseResponse<{ deleted: number; message: string }>>(\n `${this.config.ENDPOINTS.PRACTICES}?confirm=true`,\n {\n method: \"DELETE\",\n token,\n },\n );\n }\n\n // ===========================================================================\n // Examples\n // ===========================================================================\n\n /**\n * Get example counts for all techniques\n */\n async getExampleCounts(\n token: string,\n ): Promise<BaseResponse<ExampleCountsData>> {\n return this.request<BaseResponse<ExampleCountsData>>(\n this.config.ENDPOINTS.EXAMPLES_COUNTS,\n { token },\n );\n }\n\n /**\n * Get examples, optionally filtered by technique\n */\n async getExamples(\n token: string,\n queryParams?: TechniqueExampleQueryParams,\n ): Promise<BaseResponse<TechniqueExample[]>> {\n const params = createURLSearchParams();\n\n if (queryParams?.technique !== undefined) {\n params.append(\"technique\", String(queryParams.technique));\n }\n\n const query = params.toString();\n const endpoint = `${this.config.ENDPOINTS.EXAMPLES}${query ? `?${query}` : \"\"}`;\n\n return this.request<BaseResponse<TechniqueExample[]>>(endpoint, { token });\n }\n\n /**\n * Create a new example (admin only)\n */\n async createExample(\n token: string,\n data: TechniqueExampleCreateRequest,\n ): Promise<BaseResponse<TechniqueExample>> {\n return this.request<BaseResponse<TechniqueExample>>(\n this.config.ENDPOINTS.EXAMPLES,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n // ===========================================================================\n // Board Counts\n // ===========================================================================\n\n /**\n * Get board counts (total and without techniques)\n */\n async getBoardCounts(token: string): Promise<BaseResponse<BoardCountsData>> {\n return this.request<BaseResponse<BoardCountsData>>(\n this.config.ENDPOINTS.BOARDS_COUNTS,\n { token },\n );\n }\n\n /**\n * Get board counts by technique (count of boards with each technique bit set)\n * Returns Record<number, number> where key is technique ID and value is count\n */\n async getBoardCountsByTechnique(\n token: string,\n ): Promise<BaseResponse<Record<number, number>>> {\n return this.request<BaseResponse<Record<number, number>>>(\n this.config.ENDPOINTS.BOARDS_COUNTS_BY_TECHNIQUE,\n { token },\n );\n }\n\n // ===========================================================================\n // Solver\n // ===========================================================================\n\n /**\n * Builds an endpoint path with query parameters for solver endpoints\n */\n private buildSolverUrl(\n endpoint: string,\n params: Record<string, string | boolean | undefined>,\n ): string {\n const searchParams = createURLSearchParams();\n // Sort keys alphabetically to match Kotlin behavior\n const sortedKeys = Object.keys(params).sort();\n for (const key of sortedKeys) {\n const value = params[key];\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n const query = searchParams.toString();\n // Return endpoint + query only, baseUrl is added by request()\n return `${endpoint}${query ? `?${query}` : \"\"}`;\n }\n\n /**\n * Get hints for solving a Sudoku puzzle\n * @throws {HintAccessDeniedError} When hint level exceeds user's subscription tier\n */\n async solverSolve(\n token: string,\n options: SolveOptions,\n ): Promise<BaseResponse<SolveData>> {\n const url = this.buildSolverUrl(this.config.ENDPOINTS.SOLVER_SOLVE, {\n original: options.original,\n user: options.user,\n autopencilmarks: options.autoPencilmarks,\n pencilmarks: options.pencilmarks,\n filters: options.filters,\n techniques: options.techniques,\n });\n\n const fullUrl = `${this.baseUrl}${url}`;\n const requestHeaders: Record<string, string> = {\n ...this.headers,\n };\n\n if (token) {\n requestHeaders[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Use 120 second timeout for solve (advanced techniques can be slow)\n const response = await this.networkClient.request<\n BaseResponse<SolveData> | HintAccessDeniedResponse\n >(fullUrl, {\n method: \"GET\",\n headers: requestHeaders,\n timeout: 120000,\n });\n\n // Check for hint access denied (402)\n if (response.status === 402 && response.data) {\n const errorResponse = response.data as HintAccessDeniedResponse;\n if (errorResponse.error?.code === \"HINT_ACCESS_DENIED\") {\n throw new HintAccessDeniedError(errorResponse.error);\n }\n }\n\n // Check for other errors\n if (!response.ok || response.data === undefined) {\n throw new Error(\"Failed to get hints from solver\");\n }\n\n return response.data as BaseResponse<SolveData>;\n }\n\n /**\n * Validate that a Sudoku puzzle has a unique solution.\n * Uses a longer timeout (120s) because validation involves iterative solving.\n */\n async solverValidate(\n token: string,\n options: ValidateOptions,\n ): Promise<BaseResponse<ValidateData>> {\n const url = this.buildSolverUrl(this.config.ENDPOINTS.SOLVER_VALIDATE, {\n original: options.original,\n });\n\n // Use 120 second timeout for validation (iterative solving can be slow)\n return this.request<BaseResponse<ValidateData>>(url, {\n token,\n timeout: 120000,\n });\n }\n\n /**\n * Generate a new random Sudoku puzzle\n */\n async solverGenerate(\n token: string,\n options: GenerateOptions = {},\n ): Promise<BaseResponse<GenerateData>> {\n const url = this.buildSolverUrl(this.config.ENDPOINTS.SOLVER_GENERATE, {\n symmetrical: options.symmetrical,\n });\n\n return this.request<BaseResponse<GenerateData>>(url, { token });\n }\n\n // ===========================================================================\n // Play (Game Session) Endpoints\n // ===========================================================================\n\n /**\n * Start a new game session\n */\n async playStart(\n token: string,\n data: GameStartRequest,\n ): Promise<BaseResponse<GameStartResponse>> {\n return this.request<BaseResponse<GameStartResponse>>(\n this.config.ENDPOINTS.PLAY_START,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n /**\n * Finish the current game session and get rewards\n */\n async playFinish(\n token: string,\n data: GameFinishRequest,\n ): Promise<BaseResponse<GameFinishResponse>> {\n return this.request<BaseResponse<GameFinishResponse>>(\n this.config.ENDPOINTS.PLAY_FINISH,\n {\n method: \"POST\",\n body: data as unknown as Record<string, unknown>,\n token,\n },\n );\n }\n\n // ===========================================================================\n // Gamification Endpoints\n // ===========================================================================\n\n /**\n * Get user's gamification stats (points, level, badges)\n */\n async getGamificationStats(\n token: string,\n ): Promise<BaseResponse<GamificationStats>> {\n return this.request<BaseResponse<GamificationStats>>(\n this.config.ENDPOINTS.GAMIFICATION_STATS,\n { token },\n );\n }\n\n /**\n * Get all badge definitions (public)\n */\n async getBadgeDefinitions(): Promise<BaseResponse<BadgeDefinition[]>> {\n return this.request<BaseResponse<BadgeDefinition[]>>(\n this.config.ENDPOINTS.GAMIFICATION_BADGES,\n );\n }\n\n /**\n * Get user's point transaction history\n */\n async getPointHistory(\n token: string,\n options?: { limit?: number; offset?: number },\n ): Promise<BaseResponse<PointTransaction[]>> {\n let endpoint = this.config.ENDPOINTS.GAMIFICATION_HISTORY;\n if (options?.limit || options?.offset) {\n const params = createURLSearchParams();\n if (options.limit) params.append(\"limit\", String(options.limit));\n if (options.offset) params.append(\"offset\", String(options.offset));\n endpoint = `${endpoint}?${params.toString()}`;\n }\n return this.request<BaseResponse<PointTransaction[]>>(endpoint, { token });\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Factory function to create a new SudojoClient instance.\n *\n * Equivalent to `new SudojoClient(networkClient, baseUrl)` but useful\n * for dependency injection and functional composition patterns.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL for the Sudojo API\n * @returns A new SudojoClient instance\n */\nexport const createSudojoClient = (\n networkClient: NetworkClient,\n baseUrl: string,\n): SudojoClient => {\n return new SudojoClient(networkClient, baseUrl);\n};\n\n// =============================================================================\n// Utility Exports\n// =============================================================================\n\n/**\n * Re-exported UUID validation utilities from `@sudobility/sudojo_types`.\n *\n * These are used internally by the SudojoClient for parameter validation\n * and are also exported for consumer convenience. Use `isValidUUID` for\n * boolean checks and `validateUUID` when you want an error thrown on invalid input.\n *\n * - `isValidUUID(value)` - Returns true if the string is a valid UUID v4\n * - `validateUUID(value, label)` - Returns the UUID or throws an Error with the label\n */\nexport { isValidUUID, validateUUID };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-config.d.ts","sourceRoot":"","sources":["../../../src/solver/hooks/query-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-config.d.ts","sourceRoot":"","sources":["../../../src/solver/hooks/query-config.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,kBAAkB;;;;CAoBrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-config.js","sourceRoot":"","sources":["../../../src/solver/hooks/query-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-config.js","sourceRoot":"","sources":["../../../src/solver/hooks/query-config.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAMhC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAOpB,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAMxB,QAAQ,EAAE,CAAC;CACH,CAAC","sourcesContent":["/**\n * Sudojo Solver TanStack Query Configuration\n *\n * Provides stale time constants for Solver queries. The solver is a\n * computationally intensive service, so stale times balance freshness\n * with avoiding redundant requests.\n *\n * ## Solver Latency Notes\n *\n * - **Solve**: Can take up to 120 seconds for advanced techniques.\n * The underlying request uses a 120s timeout.\n * - **Validate**: Also uses a 120s timeout due to iterative solving.\n * - **Generate**: Typically faster but still involves puzzle generation.\n *\n * ## Error Handling\n *\n * The solve endpoint may throw {@link HintAccessDeniedError} (HTTP 402)\n * when the requested hint level exceeds the user's subscription tier.\n * Other endpoints throw generic errors on failure.\n */\n\n/**\n * Default stale times (in milliseconds) for Solver queries.\n */\nexport const SOLVER_STALE_TIMES = {\n /**\n * Solve hints - short cache (1 min) since the user's puzzle state changes\n * frequently as they make moves. The same puzzle+state combination is\n * deterministic, so a brief cache avoids redundant requests during rapid interactions.\n */\n SOLVE: 1 * 60 * 1000, // 1 minute\n\n /**\n * Validate - puzzle validation is deterministic for a given original puzzle\n * string, so results can be cached longer (10 min). A given puzzle string\n * will always produce the same validation result.\n */\n VALIDATE: 10 * 60 * 1000, // 10 minutes\n\n /**\n * Generate - always fetch fresh (0ms stale time) since the purpose is to\n * create a new random puzzle each time. Caching would defeat the purpose.\n */\n GENERATE: 0, // Always fresh\n} as const;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-keys.d.ts","sourceRoot":"","sources":["../../../src/solver/hooks/query-keys.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-keys.d.ts","sourceRoot":"","sources":["../../../src/solver/hooks/query-keys.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,eAAe;wBAHL,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;8BAWjC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC9B;kBALW,MAAM;cACV,MAAM;0BACM,OAAO,GAAG,SAAS;sBACvB,MAAM,GAAG,SAAS;kBACtB,MAAM,GAAG,SAAS;;kCAOT,MAAM;kCAON;QAAE,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE;sBAArB,OAAO,GAAG,SAAS;;CAEhD,CAAC;AAaX,eAAO,MAAM,oBAAoB,QAAO,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAEnE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-keys.js","sourceRoot":"","sources":["../../../src/solver/hooks/query-keys.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-keys.js","sourceRoot":"","sources":["../../../src/solver/hooks/query-keys.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,GAAG,GAAkC,EAAE,CACrD,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAEhC,MAAM,CAAC,MAAM,eAAe,GAAG;IAE7B,GAAG,EAAE,UAAU;IAMf,KAAK,EAAE,CAAC,OAMP,EAAE,EAAE,CAAC,CAAC,GAAG,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,CAAU;IAMlD,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAC7B,CAAC,GAAG,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAU;IAMlD,QAAQ,EAAE,CAAC,OAA+C,EAAE,EAAE,CAC5D,CAAC,GAAG,UAAU,EAAE,EAAE,UAAU,EAAE,OAAO,CAAU;CACzC,CAAC;AAaX,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAkC,EAAE;IACtE,OAAO,eAAe,CAAC,GAAG,EAAE,CAAC;AAC/B,CAAC,CAAC","sourcesContent":["/**\n * Query Key Factory for Sudojo Solver TanStack Query\n *\n * Provides type-safe, consistent query keys for Solver API endpoints.\n * Following TanStack Query best practices for key structure.\n *\n * ## Key Hierarchy\n *\n * All solver keys start with `[\"sudojo\", \"solver\"]` as the root:\n * - `[\"sudojo\", \"solver\", \"solve\", { original, user, ... }]` - solve hints\n * - `[\"sudojo\", \"solver\", \"validate\", originalPuzzle]` - validation\n * - `[\"sudojo\", \"solver\", \"generate\", { symmetrical }]` - generation\n *\n * ## Invalidation\n *\n * Use `getSolverServiceKeys()` to invalidate all solver queries at once.\n * Individual solve/validate/generate keys include their parameters so\n * different inputs produce distinct cache entries.\n */\n\nconst solverBase = (): readonly [\"sudojo\", \"solver\"] =>\n [\"sudojo\", \"solver\"] as const;\n\nexport const solverQueryKeys = {\n /** Root key for all solver queries. Use for bulk invalidation. */\n all: solverBase,\n\n /**\n * Key for a solve hints query. Includes all puzzle state parameters\n * so different board states produce separate cache entries.\n */\n solve: (options: {\n original: string;\n user: string;\n autoPencilmarks?: boolean | undefined;\n pencilmarks?: string | undefined;\n filters?: string | undefined;\n }) => [...solverBase(), \"solve\", options] as const,\n\n /**\n * Key for a puzzle validation query. Since validation is deterministic\n * for a given original puzzle string, only the puzzle string is needed.\n */\n validate: (original: string) =>\n [...solverBase(), \"validate\", original] as const,\n\n /**\n * Key for a puzzle generation query. Includes symmetry preference\n * as different options may produce different puzzle types.\n */\n generate: (options?: { symmetrical?: boolean | undefined }) =>\n [...solverBase(), \"generate\", options] as const,\n} as const;\n\n/**\n * Helper to get the root key for all solver service queries.\n * Useful for bulk invalidation of the entire solver cache.\n *\n * @returns The root query key `[\"sudojo\", \"solver\"]`\n *\n * @example\n * ```ts\n * queryClient.invalidateQueries({ queryKey: getSolverServiceKeys() });\n * ```\n */\nexport const getSolverServiceKeys = (): readonly [\"sudojo\", \"solver\"] => {\n return solverQueryKeys.all();\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/sudojo_client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.81",
|
|
4
4
|
"description": "TypeScript client library for Sudojo API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"format:check": "prettier --check src/**/*.ts",
|
|
24
24
|
"typecheck": "tsc --noEmit",
|
|
25
25
|
"typecheck:watch": "tsc --noEmit --watch",
|
|
26
|
-
"check-all": "bun run lint && bun run typecheck && bun run test:run"
|
|
26
|
+
"check-all": "bun run lint && bun run typecheck && bun run test:run",
|
|
27
|
+
"verify": "bun run lint && bun run typecheck && bun run test:run && bun run build"
|
|
27
28
|
},
|
|
28
29
|
"keywords": [
|
|
29
30
|
"sudojo",
|