├── .prettierignore ├── .gitignore ├── src ├── client │ ├── module.d.ts │ ├── assets │ │ ├── sudoku-icon-64.png │ │ ├── list.svg │ │ └── x.svg │ ├── scss │ │ ├── index.scss │ │ ├── _state.scss │ │ ├── modules │ │ │ ├── _site-info.scss │ │ │ ├── _error-page.scss │ │ │ ├── _login.scss │ │ │ ├── _top-bar.scss │ │ │ ├── _solution-container.scss │ │ │ ├── _saved-puzzle.scss │ │ │ ├── _puzzle-select-menu.scss │ │ │ ├── _side-bar.scss │ │ │ ├── _userNavbar.scss │ │ │ └── _puzzle.scss │ │ ├── _modules.scss │ │ ├── _base.scss │ │ ├── trialstyles.scss │ │ ├── _layouts.scss │ │ ├── _variables.scss │ │ └── styles.scss │ ├── Sample.tsx │ ├── layouts │ │ ├── RootLayout.tsx │ │ ├── WelcomeLayout.tsx │ │ ├── side-bar │ │ │ ├── SettingsToggle.tsx │ │ │ ├── UserSideBar.tsx │ │ │ ├── SideBarSectionContainer.tsx │ │ │ ├── WelcomeNavBar.tsx │ │ │ ├── SideBarContainer.tsx │ │ │ ├── GameSettings.tsx │ │ │ └── UserNavBar.tsx │ │ ├── TopBar.tsx │ │ └── UserLayout.tsx │ ├── shared-components │ │ ├── Loading.tsx │ │ ├── SiteInfo.tsx │ │ └── GameStats.tsx │ ├── index.html │ ├── pages │ │ ├── NotFound.tsx │ │ ├── Puzzle │ │ │ ├── components │ │ │ │ ├── EmptySquareDisplay.tsx │ │ │ │ ├── BoxUnitContainer.tsx │ │ │ │ ├── FilledSquareDisplay.tsx │ │ │ │ ├── PuzzleContainer.tsx │ │ │ │ ├── PencilSquareDisplay.tsx │ │ │ │ ├── SquareContainer.tsx │ │ │ │ ├── NumberSelectBar.tsx │ │ │ │ ├── PuzzleStringDisplay.tsx │ │ │ │ ├── ToolBar.tsx │ │ │ │ └── SolutionContainer.tsx │ │ │ ├── PuzzlePageTest.tsx │ │ │ └── PuzzlePage.tsx │ │ ├── ErrorPage.tsx │ │ ├── PuzzleSelect │ │ │ ├── components │ │ │ │ ├── SavedPuzzleGraphic.tsx │ │ │ │ └── SavedPuzzleSelector.tsx │ │ │ ├── SavedPuzzleMenu.tsx │ │ │ └── PuzzleSelectViaFilters.tsx │ │ └── Welcome │ │ │ ├── Home.tsx │ │ │ ├── SignUp.tsx │ │ │ └── Login.tsx │ ├── index.tsx │ ├── __tests__ │ │ └── Sample.test.tsx │ ├── utils │ │ ├── puzzle-state-management-functions │ │ │ ├── newFilledSquare.ts │ │ │ ├── isPuzzleFinished.ts │ │ │ ├── autofillPencilSquares.ts │ │ │ ├── puzzleStringsFromSquares.ts │ │ │ ├── puzzleStringValidation.ts │ │ │ ├── deepCopySquares.ts │ │ │ ├── updateSquaresDuplicates.ts │ │ │ ├── initialSquareStatePopulation.ts │ │ │ ├── checkForDuplicateUpdates.ts │ │ │ └── makeAllPeers.ts │ │ ├── signInWithSession.ts │ │ ├── populateUserAndPuzzleContext.ts │ │ ├── addPuzzleToUserAndCollection.ts │ │ └── save.ts │ ├── context.ts │ └── App.tsx ├── custom.d.ts ├── globalUtils │ ├── puzzle-solution-functions │ │ ├── sumTwo.ts │ │ ├── xWingSolver.ts │ │ ├── swordfishSolver.ts │ │ ├── forcingChainsSolver.ts │ │ ├── pencilStringSolutionExecuter.ts │ │ ├── updateSolveSquares.ts │ │ ├── solutionDictionary.ts │ │ ├── populateSolveSquaresIfEmpty.ts │ │ ├── singleCandidateSolver.ts │ │ ├── solveSquaresConversion.ts │ │ ├── singlePositionSolver.ts │ │ └── nakedSubsetSolver.ts │ ├── totalPuzzles.ts │ └── __tests__ │ │ ├── sumTwo.test.ts │ │ ├── hiddenQuadSolver.test.ts │ │ ├── hiddenPairSolver.test.ts │ │ └── hiddenTripleSolver.test.ts ├── server │ ├── models │ │ ├── userModel.ts │ │ ├── sessionModel.ts │ │ └── puzzleModel.ts │ ├── routes │ │ ├── puzzleRouter.ts │ │ └── userRouter.ts │ ├── utils │ │ ├── controllerErrorMaker.ts │ │ └── puzzleDBCreate.js │ ├── backendTypes.ts │ ├── controllers │ │ ├── cookieController.ts │ │ └── sessionController.ts │ └── server.ts └── ReadMe.md ├── jest.config.js ├── .prettierrc.json ├── docker-compose-test.yml ├── Dockerfile-dev ├── .github └── workflows │ └── build-tests.yml ├── Dockerfile ├── .eslintrc.json ├── webpack.config.js ├── package.json └── README.md /.prettierignore: -------------------------------------------------------------------------------- 1 | data 2 | dist 3 | node_modules 4 | src/server/routes -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .vscode 4 | .DS_Store 5 | dist 6 | data 7 | coverage -------------------------------------------------------------------------------- /src/client/module.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.png' { 2 | const value: any; 3 | export default value; 4 | } 5 | -------------------------------------------------------------------------------- /src/custom.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg' { 2 | const content: string; 3 | export default content; 4 | } 5 | -------------------------------------------------------------------------------- /src/client/assets/sudoku-icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MarkTeets/LetsPlaySudoku/HEAD/src/client/assets/sudoku-icon-64.png -------------------------------------------------------------------------------- /src/client/scss/index.scss: -------------------------------------------------------------------------------- 1 | @import "variables"; 2 | @import "base"; 3 | @import "layouts"; 4 | @import "modules"; 5 | @import "state"; -------------------------------------------------------------------------------- /src/client/scss/_state.scss: -------------------------------------------------------------------------------- 1 | .is-width-collapsed { 2 | width: 0px; 3 | } 4 | 5 | .is-height-collapsed { 6 | max-height: 0px; 7 | } 8 | -------------------------------------------------------------------------------- /src/client/scss/modules/_site-info.scss: -------------------------------------------------------------------------------- 1 | .site-info { 2 | margin: 0px 15px; 3 | 4 | &__par { 5 | margin-bottom: 15px; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/globalUtils/puzzle-solution-functions/sumTwo.ts: -------------------------------------------------------------------------------- 1 | export const sumTwo = (num1: number, num2: number): number => { 2 | return num1 + num2; 3 | }; 4 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest').JestConfigWithTsJest} */ 2 | module.exports = { 3 | preset: 'ts-jest', 4 | testEnvironment: 'node' 5 | }; 6 | -------------------------------------------------------------------------------- /src/client/Sample.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Sample = () => { 4 | return
11 | Error:{' '} 12 | {error 13 | ? error.message 14 | : 'A sample error message that could be much longer than this. It could go on for several lines. It could keep going forever and ever and ever.'} 15 |
16 | Take me home! 17 |8 | Well hi there! Thank you so much for coming! This is a site dedicated to facilitating your 9 | Sudoku journey for free! What makes this site special is it's ad-free, and you can make 10 | an account to save your progress on your puzzles and come back to them whenever you like. 11 |
12 |13 | Many features are in development! Soon you'll be able to choose a puzzle to play by 14 | difficulty or by a specific technique used to solve the puzzle. 15 |
16 |Last technique applied: {foundTechnique ? foundTechnique : 'None'}
109 | {/* */} 110 |67 | No account? Sign up 68 |
69 |