@sudobility/sudojo_lib 0.0.4

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.
Files changed (141) hide show
  1. package/dist/hooks/index.d.ts +27 -0
  2. package/dist/hooks/index.d.ts.map +1 -0
  3. package/dist/hooks/index.js +27 -0
  4. package/dist/hooks/index.js.map +1 -0
  5. package/dist/hooks/useDailyGame.d.ts +64 -0
  6. package/dist/hooks/useDailyGame.d.ts.map +1 -0
  7. package/dist/hooks/useDailyGame.js +120 -0
  8. package/dist/hooks/useDailyGame.js.map +1 -0
  9. package/dist/hooks/useGame.d.ts +104 -0
  10. package/dist/hooks/useGame.d.ts.map +1 -0
  11. package/dist/hooks/useGame.js +546 -0
  12. package/dist/hooks/useGame.js.map +1 -0
  13. package/dist/hooks/useGamePersistence.d.ts +63 -0
  14. package/dist/hooks/useGamePersistence.d.ts.map +1 -0
  15. package/dist/hooks/useGamePersistence.js +124 -0
  16. package/dist/hooks/useGamePersistence.js.map +1 -0
  17. package/dist/hooks/useGameTeaching.d.ts +89 -0
  18. package/dist/hooks/useGameTeaching.d.ts.map +1 -0
  19. package/dist/hooks/useGameTeaching.js +230 -0
  20. package/dist/hooks/useGameTeaching.js.map +1 -0
  21. package/dist/hooks/useGameTimer.d.ts +43 -0
  22. package/dist/hooks/useGameTimer.d.ts.map +1 -0
  23. package/dist/hooks/useGameTimer.js +68 -0
  24. package/dist/hooks/useGameTimer.js.map +1 -0
  25. package/dist/hooks/useHint.d.ts +105 -0
  26. package/dist/hooks/useHint.d.ts.map +1 -0
  27. package/dist/hooks/useHint.js +179 -0
  28. package/dist/hooks/useHint.js.map +1 -0
  29. package/dist/hooks/useLearning.d.ts +100 -0
  30. package/dist/hooks/useLearning.d.ts.map +1 -0
  31. package/dist/hooks/useLearning.js +127 -0
  32. package/dist/hooks/useLearning.js.map +1 -0
  33. package/dist/hooks/useLevelGame.d.ts +68 -0
  34. package/dist/hooks/useLevelGame.d.ts.map +1 -0
  35. package/dist/hooks/useLevelGame.js +128 -0
  36. package/dist/hooks/useLevelGame.js.map +1 -0
  37. package/dist/hooks/useLevels.d.ts +93 -0
  38. package/dist/hooks/useLevels.d.ts.map +1 -0
  39. package/dist/hooks/useLevels.js +98 -0
  40. package/dist/hooks/useLevels.js.map +1 -0
  41. package/dist/hooks/useLocalStorage.d.ts +26 -0
  42. package/dist/hooks/useLocalStorage.d.ts.map +1 -0
  43. package/dist/hooks/useLocalStorage.js +75 -0
  44. package/dist/hooks/useLocalStorage.js.map +1 -0
  45. package/dist/hooks/useSudoku.d.ts +125 -0
  46. package/dist/hooks/useSudoku.d.ts.map +1 -0
  47. package/dist/hooks/useSudoku.js +655 -0
  48. package/dist/hooks/useSudoku.js.map +1 -0
  49. package/dist/hooks/useTechniques.d.ts +92 -0
  50. package/dist/hooks/useTechniques.d.ts.map +1 -0
  51. package/dist/hooks/useTechniques.js +108 -0
  52. package/dist/hooks/useTechniques.js.map +1 -0
  53. package/dist/index.d.ts +42 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +64 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/test/setup.d.ts +2 -0
  58. package/dist/test/setup.d.ts.map +1 -0
  59. package/dist/test/setup.js +35 -0
  60. package/dist/test/setup.js.map +1 -0
  61. package/dist/types/display.d.ts +142 -0
  62. package/dist/types/display.d.ts.map +1 -0
  63. package/dist/types/display.js +94 -0
  64. package/dist/types/display.js.map +1 -0
  65. package/dist/types/game.d.ts +201 -0
  66. package/dist/types/game.d.ts.map +1 -0
  67. package/dist/types/game.js +26 -0
  68. package/dist/types/game.js.map +1 -0
  69. package/dist/types/gamePersistence.d.ts +31 -0
  70. package/dist/types/gamePersistence.d.ts.map +1 -0
  71. package/dist/types/gamePersistence.js +15 -0
  72. package/dist/types/gamePersistence.js.map +1 -0
  73. package/dist/types/index.d.ts +18 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/index.js +11 -0
  76. package/dist/types/index.js.map +1 -0
  77. package/dist/types/progress.d.ts +43 -0
  78. package/dist/types/progress.d.ts.map +1 -0
  79. package/dist/types/progress.js +19 -0
  80. package/dist/types/progress.js.map +1 -0
  81. package/dist/types/settings.d.ts +19 -0
  82. package/dist/types/settings.d.ts.map +1 -0
  83. package/dist/types/settings.js +12 -0
  84. package/dist/types/settings.js.map +1 -0
  85. package/dist/types/subscription.d.ts +27 -0
  86. package/dist/types/subscription.d.ts.map +1 -0
  87. package/dist/types/subscription.js +8 -0
  88. package/dist/types/subscription.js.map +1 -0
  89. package/dist/types/sudoku.d.ts +147 -0
  90. package/dist/types/sudoku.d.ts.map +1 -0
  91. package/dist/types/sudoku.js +125 -0
  92. package/dist/types/sudoku.js.map +1 -0
  93. package/dist/utils/auth.d.ts +25 -0
  94. package/dist/utils/auth.d.ts.map +1 -0
  95. package/dist/utils/auth.js +47 -0
  96. package/dist/utils/auth.js.map +1 -0
  97. package/dist/utils/board.d.ts +116 -0
  98. package/dist/utils/board.d.ts.map +1 -0
  99. package/dist/utils/board.js +291 -0
  100. package/dist/utils/board.js.map +1 -0
  101. package/dist/utils/index.d.ts +18 -0
  102. package/dist/utils/index.d.ts.map +1 -0
  103. package/dist/utils/index.js +23 -0
  104. package/dist/utils/index.js.map +1 -0
  105. package/dist/utils/progress.d.ts +44 -0
  106. package/dist/utils/progress.d.ts.map +1 -0
  107. package/dist/utils/progress.js +104 -0
  108. package/dist/utils/progress.js.map +1 -0
  109. package/dist/utils/scramble.d.ts +35 -0
  110. package/dist/utils/scramble.d.ts.map +1 -0
  111. package/dist/utils/scramble.js +270 -0
  112. package/dist/utils/scramble.js.map +1 -0
  113. package/dist/utils/subscription.d.ts +82 -0
  114. package/dist/utils/subscription.d.ts.map +1 -0
  115. package/dist/utils/subscription.js +117 -0
  116. package/dist/utils/subscription.js.map +1 -0
  117. package/dist/utils/sudokuPresenter.d.ts +62 -0
  118. package/dist/utils/sudokuPresenter.d.ts.map +1 -0
  119. package/dist/utils/sudokuPresenter.js +403 -0
  120. package/dist/utils/sudokuPresenter.js.map +1 -0
  121. package/dist/utils/sudokuScrambler.d.ts +61 -0
  122. package/dist/utils/sudokuScrambler.d.ts.map +1 -0
  123. package/dist/utils/sudokuScrambler.js +223 -0
  124. package/dist/utils/sudokuScrambler.js.map +1 -0
  125. package/dist/utils/technique.d.ts +41 -0
  126. package/dist/utils/technique.d.ts.map +1 -0
  127. package/dist/utils/technique.js +106 -0
  128. package/dist/utils/technique.js.map +1 -0
  129. package/dist/utils/theme.d.ts +31 -0
  130. package/dist/utils/theme.d.ts.map +1 -0
  131. package/dist/utils/theme.js +40 -0
  132. package/dist/utils/theme.js.map +1 -0
  133. package/dist/utils/time.d.ts +22 -0
  134. package/dist/utils/time.d.ts.map +1 -0
  135. package/dist/utils/time.js +41 -0
  136. package/dist/utils/time.js.map +1 -0
  137. package/dist/utils/validation.d.ts +107 -0
  138. package/dist/utils/validation.d.ts.map +1 -0
  139. package/dist/utils/validation.js +248 -0
  140. package/dist/utils/validation.js.map +1 -0
  141. package/package.json +79 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Hook for fetching and managing Sudoku solving techniques
3
+ */
4
+ import type { Technique } from '@sudobility/sudojo_types';
5
+ import type { NetworkClient } from '@sudobility/types';
6
+ import { type SudojoAuth, type SudojoConfig } from '@sudobility/sudojo_client';
7
+ export interface UseTechniquesOptions {
8
+ /** Network client for API calls */
9
+ networkClient: NetworkClient;
10
+ /** Sudojo API configuration */
11
+ config: SudojoConfig;
12
+ /** Auth credentials (optional for public data) */
13
+ auth?: SudojoAuth;
14
+ /** Optional level UUID to filter techniques */
15
+ levelUuid?: string;
16
+ /** Whether to enable the query */
17
+ enabled?: boolean;
18
+ }
19
+ export interface UseTechniquesResult {
20
+ /** All techniques (optionally filtered by level) */
21
+ techniques: Technique[];
22
+ /** Whether techniques are loading */
23
+ isLoading: boolean;
24
+ /** Error if loading failed */
25
+ error: Error | null;
26
+ /** Refetch techniques */
27
+ refetch: () => void;
28
+ /** Get technique by UUID */
29
+ getTechniqueByUuid: (uuid: string) => Technique | undefined;
30
+ /** Techniques sorted by index */
31
+ sortedTechniques: Technique[];
32
+ /** Group techniques by level UUID */
33
+ techniquesByLevel: Map<string, Technique[]>;
34
+ }
35
+ /**
36
+ * Hook for fetching and managing solving techniques
37
+ *
38
+ * @param options - Hook options
39
+ * @returns Techniques data and utilities
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * function TechniqueList({ levelUuid }: { levelUuid: string }) {
44
+ * const { techniques, isLoading, sortedTechniques } = useTechniques({
45
+ * networkClient,
46
+ * config: { baseUrl: 'https://api.sudojo.com' },
47
+ * levelUuid,
48
+ * });
49
+ *
50
+ * if (isLoading) return <Loading />;
51
+ *
52
+ * return (
53
+ * <ul>
54
+ * {sortedTechniques.map(technique => (
55
+ * <li key={technique.uuid}>{technique.title}</li>
56
+ * ))}
57
+ * </ul>
58
+ * );
59
+ * }
60
+ * ```
61
+ */
62
+ export declare function useTechniques(options: UseTechniquesOptions): UseTechniquesResult;
63
+ export interface UseTechniqueOptions {
64
+ /** Network client for API calls */
65
+ networkClient: NetworkClient;
66
+ /** Sudojo API configuration */
67
+ config: SudojoConfig;
68
+ /** Auth credentials (optional for public data) */
69
+ auth?: SudojoAuth;
70
+ /** Technique UUID to fetch */
71
+ techniqueUuid: string;
72
+ /** Whether to enable the query */
73
+ enabled?: boolean;
74
+ }
75
+ export interface UseTechniqueResult {
76
+ /** The fetched technique */
77
+ technique: Technique | null;
78
+ /** Whether technique is loading */
79
+ isLoading: boolean;
80
+ /** Error if loading failed */
81
+ error: Error | null;
82
+ /** Refetch technique */
83
+ refetch: () => void;
84
+ }
85
+ /**
86
+ * Hook for fetching a single technique by UUID
87
+ *
88
+ * @param options - Hook options
89
+ * @returns Technique data
90
+ */
91
+ export declare function useTechnique(options: UseTechniqueOptions): UseTechniqueResult;
92
+ //# sourceMappingURL=useTechniques.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTechniques.d.ts","sourceRoot":"","sources":["../../src/hooks/useTechniques.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EAGlB,MAAM,2BAA2B,CAAC;AAKnC,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4BAA4B;IAC5B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAC5D,iCAAiC;IACjC,gBAAgB,EAAE,SAAS,EAAE,CAAC;IAC9B,qCAAqC;IACrC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,mBAAmB,CAgErB;AAED,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,wBAAwB;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAgC7E"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Hook for fetching and managing Sudoku solving techniques
3
+ */
4
+ import { useMemo } from 'react';
5
+ import { useSudojoTechnique, useSudojoTechniques, } from '@sudobility/sudojo_client';
6
+ /** Default empty auth for public endpoints */
7
+ const DEFAULT_AUTH = { accessToken: '' };
8
+ /**
9
+ * Hook for fetching and managing solving techniques
10
+ *
11
+ * @param options - Hook options
12
+ * @returns Techniques data and utilities
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * function TechniqueList({ levelUuid }: { levelUuid: string }) {
17
+ * const { techniques, isLoading, sortedTechniques } = useTechniques({
18
+ * networkClient,
19
+ * config: { baseUrl: 'https://api.sudojo.com' },
20
+ * levelUuid,
21
+ * });
22
+ *
23
+ * if (isLoading) return <Loading />;
24
+ *
25
+ * return (
26
+ * <ul>
27
+ * {sortedTechniques.map(technique => (
28
+ * <li key={technique.uuid}>{technique.title}</li>
29
+ * ))}
30
+ * </ul>
31
+ * );
32
+ * }
33
+ * ```
34
+ */
35
+ export function useTechniques(options) {
36
+ const { networkClient, config, auth = DEFAULT_AUTH, levelUuid, enabled = true, } = options;
37
+ const queryParams = useMemo(() => {
38
+ if (!levelUuid)
39
+ return undefined;
40
+ return { level_uuid: levelUuid };
41
+ }, [levelUuid]);
42
+ const { data, isLoading, error, refetch } = useSudojoTechniques(networkClient, config, auth, queryParams, { enabled });
43
+ const techniques = useMemo(() => {
44
+ if (!data?.success || !data.data)
45
+ return [];
46
+ return data.data;
47
+ }, [data]);
48
+ const sortedTechniques = useMemo(() => {
49
+ return [...techniques].sort((a, b) => {
50
+ // First sort by level UUID, then by index
51
+ if (a.level_uuid !== b.level_uuid) {
52
+ return (a.level_uuid ?? '').localeCompare(b.level_uuid ?? '');
53
+ }
54
+ return a.index - b.index;
55
+ });
56
+ }, [techniques]);
57
+ const getTechniqueByUuid = useMemo(() => {
58
+ const techniqueMap = new Map(techniques.map(t => [t.uuid, t]));
59
+ return (uuid) => techniqueMap.get(uuid);
60
+ }, [techniques]);
61
+ const techniquesByLevel = useMemo(() => {
62
+ const byLevel = new Map();
63
+ for (const technique of sortedTechniques) {
64
+ const key = technique.level_uuid ?? '';
65
+ const existing = byLevel.get(key) ?? [];
66
+ existing.push(technique);
67
+ byLevel.set(key, existing);
68
+ }
69
+ return byLevel;
70
+ }, [sortedTechniques]);
71
+ return {
72
+ techniques,
73
+ isLoading,
74
+ error: error ?? null,
75
+ refetch: () => {
76
+ refetch();
77
+ },
78
+ getTechniqueByUuid,
79
+ sortedTechniques,
80
+ techniquesByLevel,
81
+ };
82
+ }
83
+ /**
84
+ * Hook for fetching a single technique by UUID
85
+ *
86
+ * @param options - Hook options
87
+ * @returns Technique data
88
+ */
89
+ export function useTechnique(options) {
90
+ const { networkClient, config, auth = DEFAULT_AUTH, techniqueUuid, enabled = true, } = options;
91
+ const { data, isLoading, error, refetch } = useSudojoTechnique(networkClient, config, auth, techniqueUuid, {
92
+ enabled: enabled && !!techniqueUuid,
93
+ });
94
+ const technique = useMemo(() => {
95
+ if (!data?.success || !data.data)
96
+ return null;
97
+ return data.data;
98
+ }, [data]);
99
+ return {
100
+ technique,
101
+ isLoading,
102
+ error: error ?? null,
103
+ refetch: () => {
104
+ refetch();
105
+ },
106
+ };
107
+ }
108
+ //# sourceMappingURL=useTechniques.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTechniques.js","sourceRoot":"","sources":["../../src/hooks/useTechniques.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @sudobility/sudojo_lib - Business logic library for Sudojo app
3
+ *
4
+ * This library provides:
5
+ * - Game state management with useSudoku hook (ported from renderable)
6
+ * - Board scrambling utilities
7
+ * - Game validation (mistakes, completion)
8
+ * - Level, technique, and learning data hooks
9
+ * - Teaching/hint integration with solver
10
+ * - Legacy useGame hook for backward compatibility
11
+ */
12
+ export type { CellPosition, CellState, GameBoard, GameHint, GameMove, GameSettings, GameState, GameStatus, ScrambleConfig, ScrambleResult, TeachingState, } from './types';
13
+ export { DEFAULT_GAME_SETTINGS, DEFAULT_SCRAMBLE_CONFIG } from './types';
14
+ export type { SudokuCell, SudokuBoard, SudokuPlay, SudokuPlaySettings, SudokuAppSettings, SudokuGameState, SudokuDisplay, PlayingSource, } from './types';
15
+ export { DEFAULT_PLAY_SETTINGS, DEFAULT_APP_SETTINGS, createEmptyCell, createEmptyBoard, cellHasError, rowOf, columnOf, blockOf, cellIndex, getRowIndices, getColumnIndices, getBlockIndices, getRelatedIndices, } from './types';
16
+ export type { HintArea, HintCell, HintCellActions, DisplayHintStep, CellDisplayState, PencilmarkDisplayState, UIColorPalette, } from './types';
17
+ export { ThemeColor, SudokuColor, UIColorLight, UIColorDark } from './types';
18
+ export type { CompletedPuzzle, GameStats, UserProgress } from './types';
19
+ export { DEFAULT_PROGRESS, PROGRESS_STORAGE_KEY } from './types';
20
+ export type { DigitDisplay, AppSettings } from './types';
21
+ export { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from './types';
22
+ export type { Product, Subscription } from './types';
23
+ export { DEFAULT_SUBSCRIPTION } from './types';
24
+ export type { SavedGameState, GamePersistenceKey } from './types';
25
+ export { GAME_STORAGE_PREFIX, getGameStorageKey } from './types';
26
+ export { BLOCK_SIZE, BOARD_SIZE, cloneBoard, countFilledCells, createGameBoard, getBlockCells, getBlockIndex, getBoardStateString, getColumnCells, getEmptyCells, getPencilmarksString, getRelatedCells, getRowCells, isValidPlacement, parseBoardString, stringifyBoard, TOTAL_CELLS, noScramble, scrambleBoard, autoRemovePencilmarks, clearHighlights, countMistakes, getIncorrectCells, getProgressPercentage, isBoardFilled, isCellCorrect, isGameComplete, isValueCorrect, updateCellErrors, updateCellHighlights, validateGameState, } from './utils';
27
+ export type { ScramblerProtocol, SudokuScrambleResult } from './utils';
28
+ export { Scrambler, NonScrambler, scrambleSudokuBoard, parsePuzzleString, cellsToPuzzleString, cellsToStateString, cellsToInputString, cellsToPencilmarksString, } from './utils';
29
+ export type { PresentBoardOptions } from './utils';
30
+ export { presentBoard, calculateCellHints, themeColorToCSS, getColorPalette, getCellsWithDigit, getSelectedDigit, computeSelectedDigitCells, } from './utils';
31
+ export { formatTime, parseTime } from './utils';
32
+ export { calculateStats, calculateStreak, isPuzzleCompleted, getCompletedLevelIds, getCompletedDailyDates, } from './utils';
33
+ export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, } from './utils';
34
+ export type { ThemePreference, ResolvedTheme } from './utils';
35
+ export { THEME_STORAGE_KEY, getSystemTheme, resolveTheme, isValidThemePreference, } from './utils';
36
+ export { convertPackageToProduct, parseCustomerInfo, getPeriodDisplayName, isBestValuePlan, getRevenueCatErrorMessage, } from './utils';
37
+ export { getTechniqueIconUrl, TECHNIQUE_TO_HELP_FILE, HELP_FILE_TO_TECHNIQUE, getHelpFileUrl, getTechniqueFromHelpFile, extractBodyContent, } from './utils';
38
+ export { useLevel, useLevels, useTechnique, useTechniques, useLearning, useLearningItem, useGame, useSudoku, useGameTeaching, useLevelGame, useDailyGame, useGameTimer, useGamePersistence, useAutoSave, useLocalStorage, useHint, } from './hooks';
39
+ export type { UseLevelOptions, UseLevelResult, UseLevelsOptions, UseLevelsResult, UseTechniqueOptions, UseTechniqueResult, UseTechniquesOptions, UseTechniquesResult, UseLearningItemOptions, UseLearningItemResult, UseLearningOptions, UseLearningResult, UseGameOptions, UseGameResult, UseSudokuOptions, UseSudokuResult, UseGameTeachingOptions, UseGameTeachingResult, UseLevelGameOptions, UseLevelGameResult, UseDailyGameOptions, UseDailyGameResult, GameFetchStatus, UseGameTimerOptions, UseGameTimerResult, UseGamePersistenceOptions, UseGamePersistenceResult, UseHintOptions, UseHintResult, HintBoardData, } from './hooks';
40
+ export type { Board, Challenge, Daily, Learning, Level, Technique, } from '@sudobility/sudojo_types';
41
+ export type { SudojoConfig, SudojoAuth } from '@sudobility/sudojo_client';
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @sudobility/sudojo_lib - Business logic library for Sudojo app
3
+ *
4
+ * This library provides:
5
+ * - Game state management with useSudoku hook (ported from renderable)
6
+ * - Board scrambling utilities
7
+ * - Game validation (mistakes, completion)
8
+ * - Level, technique, and learning data hooks
9
+ * - Teaching/hint integration with solver
10
+ * - Legacy useGame hook for backward compatibility
11
+ */
12
+ export { DEFAULT_GAME_SETTINGS, DEFAULT_SCRAMBLE_CONFIG } from './types';
13
+ export { DEFAULT_PLAY_SETTINGS, DEFAULT_APP_SETTINGS, createEmptyCell, createEmptyBoard, cellHasError, rowOf, columnOf, blockOf, cellIndex, getRowIndices, getColumnIndices, getBlockIndices, getRelatedIndices, } from './types';
14
+ export { ThemeColor, SudokuColor, UIColorLight, UIColorDark } from './types';
15
+ export { DEFAULT_PROGRESS, PROGRESS_STORAGE_KEY } from './types';
16
+ export { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from './types';
17
+ export { DEFAULT_SUBSCRIPTION } from './types';
18
+ export { GAME_STORAGE_PREFIX, getGameStorageKey } from './types';
19
+ // Legacy Utilities (useGame hook)
20
+ export {
21
+ // Board utilities
22
+ BLOCK_SIZE, BOARD_SIZE, cloneBoard, countFilledCells, createGameBoard, getBlockCells, getBlockIndex, getBoardStateString, getColumnCells, getEmptyCells, getPencilmarksString, getRelatedCells, getRowCells, isValidPlacement, parseBoardString, stringifyBoard, TOTAL_CELLS,
23
+ // Scramble utilities
24
+ noScramble, scrambleBoard,
25
+ // Validation utilities
26
+ autoRemovePencilmarks, clearHighlights, countMistakes, getIncorrectCells, getProgressPercentage, isBoardFilled, isCellCorrect, isGameComplete, isValueCorrect, updateCellErrors, updateCellHighlights, validateGameState, } from './utils';
27
+ export { Scrambler, NonScrambler, scrambleSudokuBoard, parsePuzzleString, cellsToPuzzleString, cellsToStateString, cellsToInputString, cellsToPencilmarksString, } from './utils';
28
+ export { presentBoard, calculateCellHints, themeColorToCSS, getColorPalette, getCellsWithDigit, getSelectedDigit, computeSelectedDigitCells, } from './utils';
29
+ // Time Utilities
30
+ export { formatTime, parseTime } from './utils';
31
+ // Progress Utilities
32
+ export { calculateStats, calculateStreak, isPuzzleCompleted, getCompletedLevelIds, getCompletedDailyDates, } from './utils';
33
+ // Auth Utilities
34
+ export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, } from './utils';
35
+ export { THEME_STORAGE_KEY, getSystemTheme, resolveTheme, isValidThemePreference, } from './utils';
36
+ // Subscription Utilities
37
+ export { convertPackageToProduct, parseCustomerInfo, getPeriodDisplayName, isBestValuePlan, getRevenueCatErrorMessage, } from './utils';
38
+ // Technique Utilities
39
+ export { getTechniqueIconUrl, TECHNIQUE_TO_HELP_FILE, HELP_FILE_TO_TECHNIQUE, getHelpFileUrl, getTechniqueFromHelpFile, extractBodyContent, } from './utils';
40
+ // Hooks
41
+ export {
42
+ // Levels
43
+ useLevel, useLevels,
44
+ // Techniques
45
+ useTechnique, useTechniques,
46
+ // Learning
47
+ useLearning, useLearningItem,
48
+ // Game (legacy)
49
+ useGame,
50
+ // Sudoku (ported from renderable)
51
+ useSudoku,
52
+ // Teaching
53
+ useGameTeaching,
54
+ // Game fetching (with auth/subscription handling)
55
+ useLevelGame, useDailyGame,
56
+ // Game timer
57
+ useGameTimer,
58
+ // Game persistence
59
+ useGamePersistence, useAutoSave,
60
+ // Local storage
61
+ useLocalStorage,
62
+ // Hint
63
+ useHint, } from './hooks';
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { vi } from 'vitest';
2
+ // Mock window.localStorage
3
+ const localStorageMock = {
4
+ getItem: vi.fn(),
5
+ setItem: vi.fn(),
6
+ removeItem: vi.fn(),
7
+ clear: vi.fn(),
8
+ };
9
+ global.localStorage = localStorageMock;
10
+ // Mock window event listeners
11
+ const addEventListenerMock = vi.fn();
12
+ const removeEventListenerMock = vi.fn();
13
+ Object.defineProperty(window, 'addEventListener', {
14
+ writable: true,
15
+ value: addEventListenerMock,
16
+ });
17
+ Object.defineProperty(window, 'removeEventListener', {
18
+ writable: true,
19
+ value: removeEventListenerMock,
20
+ });
21
+ // Mock window.matchMedia
22
+ Object.defineProperty(window, 'matchMedia', {
23
+ writable: true,
24
+ value: vi.fn().mockImplementation(query => ({
25
+ matches: false,
26
+ media: query,
27
+ onchange: null,
28
+ addListener: vi.fn(),
29
+ removeListener: vi.fn(),
30
+ addEventListener: vi.fn(),
31
+ removeEventListener: vi.fn(),
32
+ dispatchEvent: vi.fn(),
33
+ })),
34
+ });
35
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,2BAA2B;AAC3B,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC;AACF,MAAM,CAAC,YAAY,GAAG,gBAAuB,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAExC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;IAChD,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,oBAAoB;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE;IACnD,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,uBAAuB;CAC/B,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;IAC1C,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;QACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;QACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC5B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;KACvB,CAAC,CAAC;CACJ,CAAC,CAAC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Display types for Sudoku rendering
3
+ *
4
+ * Matches Kotlin renderable types exactly
5
+ */
6
+ /**
7
+ * Theme colors for the UI - matches Kotlin ThemeColor enum
8
+ */
9
+ export declare enum ThemeColor {
10
+ NONE = "NONE",
11
+ CLEAR = "CLEAR",
12
+ LABEL = "LABEL",
13
+ LABEL_SECONDARY = "LABEL_SECONDARY",
14
+ LABEL_TERTIARY = "LABEL_TERTIARY",
15
+ LABEL_QUATERNARY = "LABEL_QUATERNARY",
16
+ BACKGROUND = "BACKGROUND",
17
+ BACKGROUND_SECONDARY = "BACKGROUND_SECONDARY",
18
+ BACKGROUND_TERTIARY = "BACKGROUND_TERTIARY",
19
+ BACKGROUND_QUATERNARY = "BACKGROUND_QUATERNARY",
20
+ SELECTED = "SELECTED",
21
+ SUCCESS = "SUCCESS",
22
+ WARNING = "WARNING",
23
+ WARNING_SECONDARY = "WARNING_SECONDARY",
24
+ ERROR = "ERROR",
25
+ DISABLED = "DISABLED"
26
+ }
27
+ /**
28
+ * Sudoku-specific colors - matches Kotlin SudokuColor enum
29
+ */
30
+ export declare enum SudokuColor {
31
+ NONE = "none",
32
+ CLEAR = "clear",
33
+ BLUE = "blue",
34
+ GREEN = "green",
35
+ YELLOW = "yellow",
36
+ ORANGE = "orange",
37
+ RED = "red",
38
+ WHITE = "white",
39
+ LIGHT_GRAY = "lightgray",
40
+ BLACK = "black",
41
+ GRAY = "gray",
42
+ ACTION = "action",
43
+ SECONDARY_ACTION = "secondary-action",
44
+ DISABLED = "disabled"
45
+ }
46
+ /**
47
+ * Area type for highlighting - matches HintArea.Type
48
+ */
49
+ export type HintAreaType = 'row' | 'column' | 'block';
50
+ /**
51
+ * Highlighted area in a hint - matches HintArea
52
+ */
53
+ export interface HintArea {
54
+ type: HintAreaType;
55
+ color: SudokuColor | null;
56
+ index: number;
57
+ }
58
+ /**
59
+ * Actions to perform on a cell - matches HintCellActions
60
+ */
61
+ export interface HintCellActions {
62
+ select: number | null;
63
+ unselect: number | null;
64
+ add: number[] | null;
65
+ remove: number[] | null;
66
+ highlight: number[] | null;
67
+ }
68
+ /**
69
+ * Cell display information in a hint - matches HintCell
70
+ */
71
+ export interface HintCell {
72
+ index: number;
73
+ color: SudokuColor | null;
74
+ fill: boolean;
75
+ actions?: HintCellActions;
76
+ }
77
+ /**
78
+ * A single hint step - matches HintStep
79
+ */
80
+ export interface HintStep {
81
+ title: string;
82
+ text: string;
83
+ areas?: HintArea[] | null;
84
+ cells?: HintCell[] | null;
85
+ }
86
+ /**
87
+ * Complete display state for a single cell
88
+ */
89
+ export interface CellDisplayState {
90
+ /** Cell index (0-80) */
91
+ index: number;
92
+ /** Background color */
93
+ backgroundColor: ThemeColor;
94
+ /** Border color (null for no border) */
95
+ borderColor: ThemeColor | null;
96
+ /** Text color */
97
+ textColor: ThemeColor | null;
98
+ /** The digit to display (1-9) or null */
99
+ digit: number | null;
100
+ /** Whether this is a given (original) digit */
101
+ isGiven: boolean;
102
+ /** Pencilmarks to display */
103
+ pencilmarks: PencilmarkDisplayState[];
104
+ }
105
+ /**
106
+ * Display state for a single pencilmark
107
+ */
108
+ export interface PencilmarkDisplayState {
109
+ /** The digit (1-9) */
110
+ digit: number;
111
+ /** Color of the pencilmark */
112
+ color: ThemeColor | null;
113
+ }
114
+ /**
115
+ * UI color palette - matches UIColorType from sudojo-web
116
+ */
117
+ export interface UIColorPalette {
118
+ systemBackground: string;
119
+ secondarySystemBackground: string;
120
+ tertiarySystemBackground: string;
121
+ label: string;
122
+ secondaryLabel: string;
123
+ tertiaryLabel: string;
124
+ quaternaryLabel: string;
125
+ systemBlue: string;
126
+ systemGreen: string;
127
+ systemOrange: string;
128
+ systemPurple: string;
129
+ systemRed: string;
130
+ systemYellow: string;
131
+ systemGray: string;
132
+ clear: string;
133
+ }
134
+ /**
135
+ * Light mode color palette - matches sudojo-web UIColorLight
136
+ */
137
+ export declare const UIColorLight: UIColorPalette;
138
+ /**
139
+ * Dark mode color palette - matches sudojo-web UIColorDark
140
+ */
141
+ export declare const UIColorDark: UIColorPalette;
142
+ //# sourceMappingURL=display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/types/display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Display types for Sudoku rendering
3
+ *
4
+ * Matches Kotlin renderable types exactly
5
+ */
6
+ // =============================================================================
7
+ // Theme Color (matches ThemeColor.kt)
8
+ // =============================================================================
9
+ /**
10
+ * Theme colors for the UI - matches Kotlin ThemeColor enum
11
+ */
12
+ export var ThemeColor;
13
+ (function (ThemeColor) {
14
+ ThemeColor["NONE"] = "NONE";
15
+ ThemeColor["CLEAR"] = "CLEAR";
16
+ ThemeColor["LABEL"] = "LABEL";
17
+ ThemeColor["LABEL_SECONDARY"] = "LABEL_SECONDARY";
18
+ ThemeColor["LABEL_TERTIARY"] = "LABEL_TERTIARY";
19
+ ThemeColor["LABEL_QUATERNARY"] = "LABEL_QUATERNARY";
20
+ ThemeColor["BACKGROUND"] = "BACKGROUND";
21
+ ThemeColor["BACKGROUND_SECONDARY"] = "BACKGROUND_SECONDARY";
22
+ ThemeColor["BACKGROUND_TERTIARY"] = "BACKGROUND_TERTIARY";
23
+ ThemeColor["BACKGROUND_QUATERNARY"] = "BACKGROUND_QUATERNARY";
24
+ ThemeColor["SELECTED"] = "SELECTED";
25
+ ThemeColor["SUCCESS"] = "SUCCESS";
26
+ ThemeColor["WARNING"] = "WARNING";
27
+ ThemeColor["WARNING_SECONDARY"] = "WARNING_SECONDARY";
28
+ ThemeColor["ERROR"] = "ERROR";
29
+ ThemeColor["DISABLED"] = "DISABLED";
30
+ })(ThemeColor || (ThemeColor = {}));
31
+ // =============================================================================
32
+ // Sudoku Color (matches SudokuColor in Shared.kt)
33
+ // =============================================================================
34
+ /**
35
+ * Sudoku-specific colors - matches Kotlin SudokuColor enum
36
+ */
37
+ export var SudokuColor;
38
+ (function (SudokuColor) {
39
+ SudokuColor["NONE"] = "none";
40
+ SudokuColor["CLEAR"] = "clear";
41
+ SudokuColor["BLUE"] = "blue";
42
+ SudokuColor["GREEN"] = "green";
43
+ SudokuColor["YELLOW"] = "yellow";
44
+ SudokuColor["ORANGE"] = "orange";
45
+ SudokuColor["RED"] = "red";
46
+ SudokuColor["WHITE"] = "white";
47
+ SudokuColor["LIGHT_GRAY"] = "lightgray";
48
+ SudokuColor["BLACK"] = "black";
49
+ SudokuColor["GRAY"] = "gray";
50
+ SudokuColor["ACTION"] = "action";
51
+ SudokuColor["SECONDARY_ACTION"] = "secondary-action";
52
+ SudokuColor["DISABLED"] = "disabled";
53
+ })(SudokuColor || (SudokuColor = {}));
54
+ /**
55
+ * Light mode color palette - matches sudojo-web UIColorLight
56
+ */
57
+ export const UIColorLight = {
58
+ systemBackground: '#FFFFFF',
59
+ secondarySystemBackground: '#F2F2F7FF',
60
+ tertiarySystemBackground: '#FFFFFFFF',
61
+ label: '#000000FF',
62
+ secondaryLabel: '#3C3C4399',
63
+ tertiaryLabel: '#3C3C434D',
64
+ quaternaryLabel: '#3C3C432E',
65
+ systemBlue: '#007AFFFF',
66
+ systemGreen: '#34C759FF',
67
+ systemOrange: '#FF9500FF',
68
+ systemPurple: '#AF52DEFF',
69
+ systemRed: '#FF3B30FF',
70
+ systemYellow: '#FFCC00FF',
71
+ systemGray: '#8E8E93FF',
72
+ clear: '#00000000',
73
+ };
74
+ /**
75
+ * Dark mode color palette - matches sudojo-web UIColorDark
76
+ */
77
+ export const UIColorDark = {
78
+ systemBackground: '#000000FF',
79
+ secondarySystemBackground: '#1C1C1EFF',
80
+ tertiarySystemBackground: '#2C2C2EFF',
81
+ label: '#FFFFFFFF',
82
+ secondaryLabel: '#EBEBF599',
83
+ tertiaryLabel: '#EBEBF54D',
84
+ quaternaryLabel: '#EBEBF52E',
85
+ systemBlue: '#0A84FFFF',
86
+ systemGreen: '#30D158FF',
87
+ systemOrange: '#FF9F0AFF',
88
+ systemPurple: '#BF5AF2FF',
89
+ systemRed: '#FF453AFF',
90
+ systemYellow: '#FFD60AFF',
91
+ systemGray: '#8E8E93FF',
92
+ clear: '#00000000',
93
+ };
94
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/types/display.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,UAiBX;AAjBD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,6BAAe,CAAA;IACf,6BAAe,CAAA;IACf,iDAAmC,CAAA;IACnC,+CAAiC,CAAA;IACjC,mDAAqC,CAAA;IACrC,uCAAyB,CAAA;IACzB,2DAA6C,CAAA;IAC7C,yDAA2C,CAAA;IAC3C,6DAA+C,CAAA;IAC/C,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,qDAAuC,CAAA;IACvC,6BAAe,CAAA;IACf,mCAAqB,CAAA;AACvB,CAAC,EAjBW,UAAU,KAAV,UAAU,QAiBrB;AAED,gFAAgF;AAChF,kDAAkD;AAClD,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,WAeX;AAfD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;IACjB,0BAAW,CAAA;IACX,8BAAe,CAAA;IACf,uCAAwB,CAAA;IACxB,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,gCAAiB,CAAA;IACjB,oDAAqC,CAAA;IACrC,oCAAqB,CAAA;AACvB,CAAC,EAfW,WAAW,KAAX,WAAW,QAetB;AA8GD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,gBAAgB,EAAE,SAAS;IAC3B,yBAAyB,EAAE,WAAW;IACtC,wBAAwB,EAAE,WAAW;IACrC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,WAAW;IAC1B,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,gBAAgB,EAAE,WAAW;IAC7B,yBAAyB,EAAE,WAAW;IACtC,wBAAwB,EAAE,WAAW;IACrC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,WAAW;IAC1B,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;CACnB,CAAC"}