├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── bug_report.md └── workflows │ └── publish-and-deploy.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .prettierignore ├── misc │ └── suggested-structure.txt ├── package.json ├── src │ ├── app.d.ts │ ├── app.html │ ├── app.scss │ ├── lib │ │ ├── components │ │ │ ├── Highlight.svelte │ │ │ ├── Info.svelte │ │ │ ├── Logo.svelte │ │ │ ├── home │ │ │ │ ├── CallsToAction.svelte │ │ │ │ ├── LogoNetlify.svelte │ │ │ │ ├── LogoNode.svelte │ │ │ │ ├── LogoSvelte.svelte │ │ │ │ ├── LogoTrpc.svelte │ │ │ │ ├── LogoVercel.svelte │ │ │ │ ├── LogosBlend.svelte │ │ │ │ ├── Mantra.svelte │ │ │ │ ├── SupportedAdapter.svelte │ │ │ │ └── SupportedAdapters.svelte │ │ │ └── layout │ │ │ │ ├── DarkModeSwitcher.svelte │ │ │ │ ├── Footer.svelte │ │ │ │ ├── Header.svelte │ │ │ │ ├── Menu.svelte │ │ │ │ ├── MenuLink.svelte │ │ │ │ └── PageNavigation.svelte │ │ ├── constants.ts │ │ ├── icons │ │ │ ├── IconArrowLeft.svelte │ │ │ ├── IconArrowRight.svelte │ │ │ ├── IconBulb.svelte │ │ │ ├── IconCheck.svelte │ │ │ ├── IconClipboard.svelte │ │ │ ├── IconErrorHandling.svelte │ │ │ ├── IconFileCode.svelte │ │ │ ├── IconFileDatabase.svelte │ │ │ ├── IconFolder.svelte │ │ │ ├── IconGitHub.svelte │ │ │ ├── IconHeartHandshake.svelte │ │ │ ├── IconHome.svelte │ │ │ ├── IconInfoCircle.svelte │ │ │ ├── IconLifeBuoy.svelte │ │ │ ├── IconLock.svelte │ │ │ ├── IconMenu.svelte │ │ │ ├── IconMoon.svelte │ │ │ ├── IconRocket.svelte │ │ │ ├── IconSpeakerphone.svelte │ │ │ ├── IconSun.svelte │ │ │ ├── IconTools.svelte │ │ │ └── IconWebSocket.svelte │ │ ├── loadCodeBlocks.ts │ │ ├── menuStore.ts │ │ └── useMediaQuery.ts │ ├── routes │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ ├── +page.svelte │ │ ├── acknowledgements │ │ │ └── +page.svelte │ │ ├── authentication │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── contribute-and-support │ │ │ └── +page.svelte │ │ ├── experimental-websocket-support │ │ │ └── +page.svelte │ │ ├── getting-started │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── handling-errors │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── hire-the-author │ │ │ └── +page.svelte │ │ ├── page-data │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── page-server-data │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── recipes-and-caveats │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── robots.txt │ │ │ └── +server.ts │ │ ├── site.webmanifest │ │ │ └── +server.ts │ │ ├── sitemap.xml │ │ │ └── +server.ts │ │ ├── suggested-structure │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ └── using-with-svelte-query │ │ │ └── +page.svelte │ └── service-worker.js ├── static │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── googlea3479269b2f388cf.html │ ├── mstile-150x150.png │ ├── safari-pinned-tab.svg │ └── trpc-sveltekit.png ├── svelte.config.js ├── tsconfig.json └── vite.config.ts ├── examples ├── bookstall │ ├── .env │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .gitignore │ ├── .prettierignore │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── prisma │ │ ├── bookstall.db │ │ ├── schema.prisma │ │ └── seed.ts │ ├── src │ │ ├── app.d.ts │ │ ├── app.html │ │ ├── hooks.server.ts │ │ ├── lib │ │ │ ├── assets │ │ │ │ └── trpc-logo.png │ │ │ ├── components │ │ │ │ ├── AuthorizationAlert.svelte │ │ │ │ ├── BusyOverlay.svelte │ │ │ │ ├── DataTable.svelte │ │ │ │ ├── Footer.svelte │ │ │ │ ├── Header.svelte │ │ │ │ ├── HeaderNavLink.svelte │ │ │ │ ├── ModalEditor.svelte │ │ │ │ └── inputs │ │ │ │ │ ├── CheckboxList.svelte │ │ │ │ │ ├── LabelAsterisk.svelte │ │ │ │ │ ├── Select.svelte │ │ │ │ │ ├── TextInput.svelte │ │ │ │ │ └── TextareaInput.svelte │ │ │ ├── dayjs.ts │ │ │ ├── icons │ │ │ │ ├── IconAdd.svelte │ │ │ │ ├── IconClock.svelte │ │ │ │ ├── IconEmpty.svelte │ │ │ │ ├── IconPencil.svelte │ │ │ │ ├── IconTrash.svelte │ │ │ │ └── IconVerticalDots.svelte │ │ │ ├── prisma.ts │ │ │ ├── savable.ts │ │ │ └── trpc │ │ │ │ ├── client.ts │ │ │ │ ├── context.ts │ │ │ │ ├── middleware │ │ │ │ ├── auth.ts │ │ │ │ └── logger.ts │ │ │ │ ├── router.ts │ │ │ │ ├── routes │ │ │ │ ├── authors.ts │ │ │ │ ├── books.ts │ │ │ │ └── stores.ts │ │ │ │ └── t.ts │ │ └── routes │ │ │ ├── +layout.server.ts │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ ├── authors │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ ├── books │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ ├── login │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ ├── logout │ │ │ └── +server.ts │ │ │ └── stores │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ ├── static │ │ └── favicon.png │ ├── svelte.config.js │ ├── tsconfig.json │ └── vite.config.ts ├── simple │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .gitignore │ ├── .prettierignore │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── src │ │ ├── app.d.ts │ │ ├── app.html │ │ ├── hooks.server.ts │ │ ├── lib │ │ │ └── trpc │ │ │ │ ├── client.ts │ │ │ │ ├── context.ts │ │ │ │ └── router.ts │ │ └── routes │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ ├── page-data │ │ │ ├── +page.svelte │ │ │ └── +page.ts │ │ │ └── page-server-data │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ ├── static │ │ └── favicon.png │ ├── svelte.config.js │ ├── tsconfig.json │ └── vite.config.ts └── websocket │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .gitignore │ ├── .prettierignore │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── src │ ├── app.d.ts │ ├── app.html │ ├── hooks.server.ts │ ├── lib │ │ └── trpc │ │ │ ├── client.ts │ │ │ ├── context.ts │ │ │ └── router.ts │ └── routes │ │ ├── +layout.svelte │ │ ├── +page.svelte │ │ └── messages │ │ └── +page.svelte │ ├── static │ └── favicon.png │ ├── svelte.config.js │ ├── tsconfig.json │ ├── vite.config.ts │ └── wsServer.js ├── package.json ├── package ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── package.json ├── src │ ├── ValidRoute.ts │ ├── client.ts │ ├── index.ts │ ├── server.ts │ └── websocket │ │ ├── client.ts │ │ ├── index.ts │ │ ├── server.ts │ │ ├── svelteKitServer.ts │ │ └── vitePlugin.ts └── tsconfig.json ├── turbo.json └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: icflorescu 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: icflorescu 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/workflows/publish-and-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Publish npm & deploy docs 2 | 3 | on: 4 | # Runs on pushes targeting the default branch 5 | push: 6 | branches: ['main'] 7 | 8 | # Allows you to run this workflow manually from the Actions tab 9 | workflow_dispatch: 10 | 11 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 12 | permissions: 13 | contents: read 14 | pages: write 15 | id-token: write 16 | 17 | # Allow one concurrent deployment 18 | concurrency: 19 | group: 'pages' 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | # Build job 24 | build: 25 | if: github.repository_owner == 'icflorescu' 26 | runs-on: ubuntu-latest 27 | steps: 28 | - name: Checkout 29 | uses: actions/checkout@v4 30 | - name: Setup Node.js 31 | uses: actions/setup-node@v4 32 | with: 33 | node-version: '20' 34 | - name: Install dependencies 35 | run: yarn install 36 | - name: Build 37 | run: yarn turbo build 38 | - name: Upload pages artifact 39 | uses: actions/upload-pages-artifact@v3 40 | with: 41 | path: ./docs/build 42 | - name: Upload package artifact 43 | uses: actions/upload-artifact@v4 44 | with: 45 | name: package 46 | path: ./package 47 | 48 | # NPM publishing job 49 | publish: 50 | if: github.repository_owner == 'icflorescu' 51 | environment: 52 | name: npm-registry 53 | runs-on: ubuntu-latest 54 | needs: build 55 | steps: 56 | - uses: actions/download-artifact@v4 57 | with: 58 | name: package 59 | - uses: JS-DevTools/npm-publish@v3 60 | with: 61 | token: ${{ secrets.NPM_TOKEN }} 62 | 63 | # Pages deployment job 64 | deploy: 65 | if: github.repository_owner == 'icflorescu' 66 | environment: 67 | name: github-pages 68 | url: ${{ steps.deployment.outputs.page_url }} 69 | runs-on: ubuntu-latest 70 | needs: [build, publish] 71 | steps: 72 | - name: Deploy to GitHub Pages 73 | id: deployment 74 | uses: actions/deploy-pages@v4 75 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | .turbo 4 | yarn-error.log 5 | vite.config.ts.* 6 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | .env 5 | .env.* 6 | !.env.example 7 | 8 | # Ignore files for PNPM, NPM and YARN 9 | pnpm-lock.yaml 10 | package-lock.json 11 | yarn.lock 12 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib", 3 | "eslint.workingDirectories": ["./package", "./docs", "./examples/*"] 4 | } 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Pull requests are welcomed. 2 | Please make sure to follow the linting rules. 3 | If you're adding a new feature, please make sure to update the documaentation where needed. 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2022-2023 Ionut-Cristian Florescu 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /docs/.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | -------------------------------------------------------------------------------- /docs/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | vite.config.ts.timestamp-*.* 11 | -------------------------------------------------------------------------------- /docs/.prettierignore: -------------------------------------------------------------------------------- 1 | /.svelte-kit 2 | /package 3 | -------------------------------------------------------------------------------- /docs/misc/suggested-structure.txt: -------------------------------------------------------------------------------- 1 | -------------- 2 | | lib/trpc | 👈 place your tRPC-related stuff here 3 | -------------- 4 | | 5 | |-- context.ts 👈 router context 6 | |-- t.ts 👈 tRPC definition helper (see below) 7 | |-- router.ts 👈 main router definition (imports files defined in routes folder) 8 | |-- middleware.ts 👈 tRPC middleware (this could be split into multiple files if necessary) 9 | |-- client.ts 👈 define a client helper function here 10 | | 11 | | ------------ 12 | |--| routes | 👈 split your routes into multiple files and place them here 13 | | ------------ 14 | | | 15 | | |-- route-1.ts 16 | | |-- route-2.ts 17 | | |-- route-3.ts 18 | | | ... 19 | | |-- route-n.ts 20 | | 21 | | ---------------- 22 | |--| middleware | 👈 split your middleware into multiple files and place them here 23 | ---------------- 24 | | 25 | |-- middleware-1.ts 26 | | ... 27 | |-- middleware-n.ts 28 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "0.0.0", 4 | "author": { 5 | "name": "Ionut-Cristian Florescu", 6 | "email": "ionut.florescu@gmail.com", 7 | "url": "https://github.com/icflorescu" 8 | }, 9 | "private": true, 10 | "scripts": { 11 | "dev": "vite --port 3000 --clearScreen false", 12 | "build": "vite build", 13 | "preview": "vite preview --port 3000", 14 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 15 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 16 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 17 | "format": "prettier --plugin-search-dir . --write ." 18 | }, 19 | "devDependencies": { 20 | "@picocss/pico": "^1.5.10", 21 | "@sveltejs/adapter-static": "^3.0.8", 22 | "@sveltejs/kit": "^2.18.0", 23 | "@types/lodash": "^4.17.16", 24 | "@typescript-eslint/eslint-plugin": "^7.13.0", 25 | "@typescript-eslint/parser": "^7.13.0", 26 | "eslint": "^8.57.0", 27 | "eslint-config-prettier": "^9.1.0", 28 | "lodash": "^4.17.21", 29 | "prettier": "^3.5.3", 30 | "sass": "^1.85.1", 31 | "svelte": "^4.2.18", 32 | "svelte-check": "^3.8.0", 33 | "svelte-highlight": "^7.8.2", 34 | "svelte-preprocess": "^6.0.3", 35 | "tslib": "^2.8.1", 36 | "typescript": "^5.8.2", 37 | "vite": "^4.5.2" 38 | }, 39 | "type": "module" 40 | } 41 | -------------------------------------------------------------------------------- /docs/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | // and what to do when importing types 4 | declare namespace App { 5 | // interface Locals {} 6 | // interface PageData {} 7 | // interface Error {} 8 | // interface Platform {} 9 | } 10 | -------------------------------------------------------------------------------- /docs/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | %sveltekit.head% 14 | 15 | 16 |
%sveltekit.body%
17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/src/app.scss: -------------------------------------------------------------------------------- 1 | $enable-responsive-typography: false; 2 | @import '@picocss/pico/scss/pico'; 3 | 4 | h2 { 5 | font-size: 2rem; 6 | } 7 | 8 | @media (min-width: 768px) { 9 | h2 { 10 | font-weight: normal; 11 | font-size: 3rem; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /docs/src/lib/components/Info.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
7 | 8 |
9 |

10 | 11 |

12 |
13 | 14 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/components/Logo.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/CallsToAction.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 |
11 | 12 | 13 | Get started 14 | 15 | 16 | 17 | 18 | View code 19 | 20 |
21 | 22 | 46 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/LogoNetlify.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/LogoNode.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/LogoSvelte.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/LogoTrpc.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/LogoVercel.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/LogosBlend.svelte: -------------------------------------------------------------------------------- 1 | 19 | 20 |
21 | 22 | 23 | 24 |
25 | 26 | 77 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/Mantra.svelte: -------------------------------------------------------------------------------- 1 |

2 | Move fast and break nothing. 3 |
4 | End-to-end typesafe APIs for your 5 |
6 | SvelteKit applications. 7 |

8 | 9 | 31 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/SupportedAdapter.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | 7 |
@sveltejs/adapter-{name}
8 |
9 | 10 | 30 | -------------------------------------------------------------------------------- /docs/src/lib/components/home/SupportedAdapters.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 |

tRPC-SvelteKit works with:

10 |
11 | 12 | 13 | 14 |
15 |
16 | 17 | 41 | -------------------------------------------------------------------------------- /docs/src/lib/components/layout/DarkModeSwitcher.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 28 | {#if darkMode} 29 | {@html atomOneDark} 30 | {:else} 31 | {@html atomOneLight} 32 | {/if} 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 59 | -------------------------------------------------------------------------------- /docs/src/lib/components/layout/Footer.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 38 | 39 | 88 | -------------------------------------------------------------------------------- /docs/src/lib/components/layout/Header.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 |
26 |
27 | 28 | 31 | 32 |

33 | tRPC-SvelteKit 34 | v{$page.data.version} 35 |

36 |
37 |
End-to-end typesafe APIs for your SvelteKit applications
38 |
39 | 40 | 41 | 42 | 43 | 44 |
45 |
46 | 47 | 136 | -------------------------------------------------------------------------------- /docs/src/lib/components/layout/Menu.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | 26 |
27 | 28 | 39 | 40 | 120 | -------------------------------------------------------------------------------- /docs/src/lib/components/layout/MenuLink.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | {#if typeof title === 'string'} 11 | {title} 12 | {:else} 13 | {#each title as part, index (part)} 14 | {#if index > 0} 15 |
16 | {/if} 17 | {part} 18 | {/each} 19 | {/if} 20 |
21 | 22 | 48 | -------------------------------------------------------------------------------- /docs/src/lib/components/layout/PageNavigation.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 31 | 32 | 77 | -------------------------------------------------------------------------------- /docs/src/lib/constants.ts: -------------------------------------------------------------------------------- 1 | import IconFileCode from '$lib/icons/IconFileCode.svelte'; 2 | import IconFileDatabase from '$lib/icons/IconFileDatabase.svelte'; 3 | import IconFolder from '$lib/icons/IconFolder.svelte'; 4 | import IconHome from '$lib/icons/IconHome.svelte'; 5 | import IconLock from '$lib/icons/IconLock.svelte'; 6 | import IconRocket from '$lib/icons/IconRocket.svelte'; 7 | import IconTools from '$lib/icons/IconTools.svelte'; 8 | import IconBulb from './icons/IconBulb.svelte'; 9 | import IconErrorHandling from './icons/IconErrorHandling.svelte'; 10 | import IconHeartHandshake from './icons/IconHeartHandshake.svelte'; 11 | import IconLifeBuoy from './icons/IconLifeBuoy.svelte'; 12 | import IconSpeakerphone from './icons/IconSpeakerphone.svelte'; 13 | import IconWebSocket from './icons/IconWebSocket.svelte'; 14 | 15 | export const GITHUB_PAGES_ROOT = 'https://icflorescu.github.io/trpc-sveltekit'; 16 | export const AUTHOR_URL = 'https://github.com/icflorescu'; 17 | export const REPO_URL = `${AUTHOR_URL}/trpc-sveltekit`; 18 | export const BADGE_COLOR_CODE = '1095c1'; 19 | 20 | export const PAGES: { 21 | title: string | string[]; 22 | path: string; 23 | icon: typeof IconHome; 24 | customPageTitle?: string; 25 | pageDescription: string; 26 | }[] = [ 27 | { 28 | title: 'Home', 29 | path: '/', 30 | icon: IconHome, 31 | customPageTitle: 'tRPC-SvelteKit: end-to-end typesafe APIs for SvelteKit', 32 | pageDescription: 33 | 'tRPC-SvelteKit is a tRPC adapter that makes it easy to build end-to-end typesafe APIs for your SvelteKit applications.' 34 | }, 35 | { 36 | title: 'Getting started', 37 | path: '/getting-started', 38 | icon: IconRocket, 39 | pageDescription: 'Get started with tRPC-SvelteKit' 40 | }, 41 | { 42 | title: 'Page data', 43 | path: '/page-data', 44 | icon: IconFileCode, 45 | pageDescription: 'How to load SvelteKit page data with tRPC' 46 | }, 47 | { 48 | title: 'Page server data', 49 | path: '/page-server-data', 50 | icon: IconFileDatabase, 51 | pageDescription: 'How to load SvelteKit server data with tRPC' 52 | }, 53 | { 54 | title: 'Suggested structure', 55 | path: '/suggested-structure', 56 | icon: IconFolder, 57 | pageDescription: 'Suggested structure for a tRPC-SvelteKit application' 58 | }, 59 | { 60 | title: 'Authentication', 61 | path: '/authentication', 62 | icon: IconLock, 63 | pageDescription: 'How to add authentication to a tRPC-SvelteKit application' 64 | }, 65 | { 66 | title: 'Handling errors', 67 | path: '/handling-errors', 68 | icon: IconErrorHandling, 69 | pageDescription: 'How to handle errors in a tRPC-SvelteKit application' 70 | }, 71 | { 72 | title: 'Recipes and caveats', 73 | path: '/recipes-and-caveats', 74 | icon: IconTools, 75 | pageDescription: 'Recipes and caveats for tRPC-SvelteKit' 76 | }, 77 | { 78 | title: 'Using with Svelte Query', 79 | path: '/using-with-svelte-query', 80 | icon: IconBulb, 81 | pageDescription: 'How to use tRPC-SvelteKit with Svelte Query' 82 | }, 83 | { 84 | title: ['WebSocket support', '(experimental)'], 85 | path: '/experimental-websocket-support', 86 | icon: IconWebSocket, 87 | pageDescription: 'Experimental WebSocket support in tRPC-SvelteKit' 88 | }, 89 | { 90 | title: 'Contribute and support', 91 | path: '/contribute-and-support', 92 | icon: IconLifeBuoy, 93 | pageDescription: 'Contribute to tRPC-SvelteKit and support the project' 94 | }, 95 | { 96 | title: 'Acknowledgements', 97 | path: '/acknowledgements', 98 | icon: IconSpeakerphone, 99 | pageDescription: 'Huge thanks to tRPC-SvelteKit sponsors' 100 | }, 101 | { 102 | title: 'Hire the author', 103 | path: '/hire-the-author', 104 | icon: IconHeartHandshake, 105 | pageDescription: 'Hire the author of tRPC-SvleteKit' 106 | } 107 | ]; 108 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconArrowLeft.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconArrowRight.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconBulb.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconCheck.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconClipboard.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconErrorHandling.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 33 | 34 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconFileCode.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconFileDatabase.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconFolder.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconGitHub.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconHeartHandshake.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconHome.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconInfoCircle.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconLifeBuoy.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconLock.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconMenu.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconMoon.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconRocket.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconSpeakerphone.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 34 | 35 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconSun.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconTools.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/src/lib/icons/IconWebSocket.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/src/lib/loadCodeBlocks.ts: -------------------------------------------------------------------------------- 1 | import fromPairs from 'lodash/fp/fromPairs'; 2 | import { readFile } from 'node:fs/promises'; 3 | import { join } from 'node:path'; 4 | 5 | const cwd = process.cwd(); 6 | const examplesFolder = join(cwd, '..', 'examples'); 7 | const miscFolder = join(cwd, 'misc'); 8 | 9 | export default async function loadCodeBlocks>( 10 | options: T 11 | ) { 12 | const blocks = await Promise.all( 13 | Object.entries(options).map(async ([path, type]) => [ 14 | path, 15 | { 16 | code: await readFile(join(type === 'example' ? examplesFolder : miscFolder, path), 'utf-8'), 17 | language: path.endsWith('.ts') 18 | ? 'typescript' 19 | : path.endsWith('.txt') 20 | ? 'plaintext' 21 | : undefined, 22 | title: type === 'example' ? path.split('/').slice(2).join('/') : path 23 | } 24 | ]) 25 | ); 26 | return fromPairs(blocks) as Record< 27 | keyof T, 28 | { code: string; language?: 'typescript' | 'plaintext'; title: string } 29 | >; 30 | } 31 | -------------------------------------------------------------------------------- /docs/src/lib/menuStore.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store'; 2 | 3 | export const menuVisible = writable(false); 4 | -------------------------------------------------------------------------------- /docs/src/lib/useMediaQuery.ts: -------------------------------------------------------------------------------- 1 | import { browser } from '$app/environment'; 2 | import { readable } from 'svelte/store'; 3 | 4 | export const useMediaQuery = (mediaQueryString: string) => { 5 | const matches = readable(null, (set) => { 6 | if (!browser) return; 7 | const m = window.matchMedia(mediaQueryString); 8 | set(m.matches); 9 | const el = (e: MediaQueryListEvent) => set(e.matches); 10 | m.addEventListener('change', el); 11 | return () => { 12 | m.removeEventListener('change', el); 13 | }; 14 | }); 15 | return matches; 16 | }; 17 | -------------------------------------------------------------------------------- /docs/src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import { version } from '../../../package/package.json'; 2 | import type { LayoutServerLoad } from './$types'; 3 | 4 | export const prerender = true; 5 | 6 | export const load: LayoutServerLoad = () => ({ version }); 7 | -------------------------------------------------------------------------------- /docs/src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 | 28 | {title} 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | {#if !dev} 47 | 48 | {/if} 49 | 50 | 51 | 52 |
53 |
54 |
55 | 56 | {#if currentPageIndex > 0}{/if} 57 |
58 |
59 |