├── .env.example ├── .eslintignore ├── .eslintrc.cjs ├── .github └── workflows │ ├── seed-plugins.yml │ ├── sync-configs.yml │ ├── sync-plugins.yml │ └── sync-trending-plugins.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SUBMITTED-PLUGINS.md ├── docker-compose.yml ├── giscus.json ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── postcss.config.cjs ├── prisma ├── migrations │ ├── 20230312070424_init │ │ └── migration.sql │ ├── 20230312122749_add_github_token │ │ └── migration.sql │ ├── 20230313195333_add_neovim_config │ │ └── migration.sql │ ├── 20230313220248_add_plugin_manager │ │ └── migration.sql │ ├── 20230313233651_add_plugin_manager │ │ └── migration.sql │ ├── 20230314122537_add_branch │ │ └── migration.sql │ ├── 20230314124012_add_fork │ │ └── migration.sql │ ├── 20230314132630_cascade_deletes │ │ └── migration.sql │ ├── 20230314173013_add_plugins │ │ └── migration.sql │ ├── 20230314173312_add_unqique_plugin │ │ └── migration.sql │ ├── 20230314193111_add_config_plugin_mapping │ │ └── migration.sql │ ├── 20230315172158_remove_implicit_plugins │ │ └── migration.sql │ ├── 20230317161234_add_slug_to_config │ │ └── migration.sql │ ├── 20230317163536_add_cascade_to_config_plugins │ │ └── migration.sql │ ├── 20230317200201_add_created_at │ │ └── migration.sql │ ├── 20230318005305_add_last_synced_at_plugin │ │ └── migration.sql │ ├── 20230318005522_add_last_synced_at_plugin │ │ └── migration.sql │ ├── 20230318171949_add_readme_to_plugin │ │ └── migration.sql │ ├── 20230318173710_add_stars_to_plugin │ │ └── migration.sql │ ├── 20230323210150_add_default_to_root │ │ └── migration.sql │ ├── 20230323224550_add_last_login │ │ └── migration.sql │ ├── 20230611110251_add_sync_table │ │ └── migration.sql │ ├── 20230611112844_modify_last_login │ │ └── migration.sql │ ├── 20230611132309_weekly_added_plugins │ │ └── migration.sql │ ├── 20230611174409_add_leaderkey │ │ └── migration.sql │ ├── 20230611194924_add_language_servers │ │ └── migration.sql │ ├── 20230611195814_fix_language_servers │ │ └── migration.sql │ ├── 20230611202243_language_server_explicit_mapping │ │ └── migration.sql │ ├── 20230611212040_fix_language_server_sync_mapping │ │ └── migration.sql │ ├── 20230611212246_fix_language_servers_2 │ │ └── migration.sql │ ├── 20230622211042_add_breaking_changes │ │ └── migration.sql │ ├── 20230622211616_fix_external_url_name │ │ └── migration.sql │ ├── 20230622212411_add_sha_to_breaking_changes │ │ └── migration.sql │ ├── 20230622212626_add_created_at_to_posts │ │ └── migration.sql │ ├── 20230622213348_remove_unique_plugin_on_breaking_change │ │ └── migration.sql │ ├── 20230627205006_add_twin_post │ │ └── migration.sql │ ├── 20230627213031_add_title_to_twin_post │ │ └── migration.sql │ ├── 20230627213910_add_created_at_to_twin_post │ │ └── migration.sql │ ├── 20230627222532_remove_post_blog_connection │ │ └── migration.sql │ ├── 20230627223140_add_license │ │ └── migration.sql │ ├── 20230630195203_add_media │ │ └── migration.sql │ ├── 20230709113442_at_published_at │ │ └── migration.sql │ ├── 20230709232302_add_type_to_media │ │ └── migration.sql │ ├── 20230720193550_add_track_dotfyle_shield │ │ └── migration.sql │ ├── 20230720194427_add_dotfyle_shield_added_at │ │ └── migration.sql │ ├── 20230723152544_nvim_config_shield_added_at │ │ └── migration.sql │ ├── 20230826190240_drop_login_count │ │ └── migration.sql │ ├── 20230828211201_add_loc_to_neovim_configuration │ │ └── migration.sql │ ├── 20240113165546_add_thumbnail_to_media │ │ └── migration.sql │ ├── 20240119224322_add_paths_to_neovim_config_plugins │ │ └── migration.sql │ ├── 20240124185427_add_description_to_plugin │ │ └── migration.sql │ ├── 20240124212324_add_install_instructions │ │ └── migration.sql │ ├── 20240203130818_cascade_deletes_on_language_server_mappings │ │ └── migration.sql │ ├── 20240922092246_neovim_config_unique_for_id_user_id │ │ └── migration.sql │ └── migration_lock.toml └── schema.prisma ├── raw-twin-contents.txt ├── sentry.properties ├── src ├── app.css ├── app.d.ts ├── app.html ├── hooks.server.ts ├── lib │ ├── components │ │ ├── ActionButton.svelte │ │ ├── BigGridContainer.svelte │ │ ├── BreakingChangePost.svelte │ │ ├── Button.svelte │ │ ├── ColorschemeSwitcher.svelte │ │ ├── Comments.svelte │ │ ├── ConfigCard.svelte │ │ ├── CoolLink.svelte │ │ ├── CoolText.svelte │ │ ├── CoolTextOnHover.svelte │ │ ├── CoolTextWithChildren.svelte │ │ ├── EmailSubscribe.svelte │ │ ├── GithubLoginButton.svelte │ │ ├── GlossyCard.svelte │ │ ├── GridContainer.svelte │ │ ├── HeroTitle.svelte │ │ ├── HtmlContent.svelte │ │ ├── MediumHeroTitle.svelte │ │ ├── Modal.svelte │ │ ├── MultiSelectFilter.svelte │ │ ├── NeovimConfigCard.svelte │ │ ├── NeovimConfigMetaData.svelte │ │ ├── NeovimPluginMetaData.svelte │ │ ├── OpenGraph.svelte │ │ ├── OuterLayout.svelte │ │ ├── Pagination.svelte │ │ ├── PluginList.svelte │ │ ├── PluginSearchNavigation.svelte │ │ ├── PostContainer.svelte │ │ ├── RepoPicker.svelte │ │ ├── RepoPickerItem.svelte │ │ ├── RepositoryCard.svelte │ │ ├── Search.svelte │ │ ├── SearchHeader.svelte │ │ ├── ShareConfig.svelte │ │ ├── ShareContainer.svelte │ │ ├── ShowcaseCard.svelte │ │ ├── SingleSelectFilter.svelte │ │ ├── SmallTitle.svelte │ │ ├── TextGeneration.svelte │ │ ├── ThemeSwitcher.svelte │ │ ├── TwinLink.svelte │ │ ├── UnsyncedNeovimConfigCard.svelte │ │ ├── UnsyncedNeovimConfigMetaData.svelte │ │ ├── accordion.svelte │ │ ├── add │ │ │ └── AddNewConfig.svelte │ │ └── welcome-steps │ │ │ └── InitFilePicker.svelte │ ├── installInstructions.ts │ ├── navigate.ts │ ├── server │ │ ├── api │ │ │ ├── AdminRequestValidator.ts │ │ │ └── bulkApi.ts │ │ ├── auth │ │ │ ├── errors.ts │ │ │ ├── github │ │ │ │ ├── api.ts │ │ │ │ ├── schema.ts │ │ │ │ ├── services.ts │ │ │ │ └── settings.ts │ │ │ └── services.ts │ │ ├── github │ │ │ ├── api.ts │ │ │ ├── schema.ts │ │ │ └── services.ts │ │ ├── media │ │ │ ├── parser.spec.ts │ │ │ └── parser.ts │ │ ├── nvim-sync │ │ │ ├── config │ │ │ │ ├── FileContentTraverser.ts │ │ │ │ ├── InitFileFinder.ts │ │ │ │ ├── LanguageServerFinder.ts │ │ │ │ ├── NeovimConfigSyncer.ts │ │ │ │ └── syncRepoInfo.ts │ │ │ └── schema.ts │ │ ├── openai │ │ │ ├── api.ts │ │ │ └── prompts │ │ │ │ ├── install-instructions.ts │ │ │ │ └── plugin-description.ts │ │ ├── prisma │ │ │ ├── breakingChanges │ │ │ │ └── service.ts │ │ │ ├── client.ts │ │ │ ├── languageservers │ │ │ │ └── service.ts │ │ │ ├── media │ │ │ │ └── service.ts │ │ │ ├── neovimconfigs │ │ │ │ ├── schema.ts │ │ │ │ └── service.ts │ │ │ ├── neovimconfigsync │ │ │ │ ├── schema.ts │ │ │ │ └── service.ts │ │ │ ├── neovimplugins │ │ │ │ ├── schema.ts │ │ │ │ └── service.ts │ │ │ ├── pagination.ts │ │ │ ├── posts │ │ │ │ └── services.ts │ │ │ └── users │ │ │ │ ├── schema.ts │ │ │ │ └── service.ts │ │ ├── reddit │ │ │ └── fetcher.ts │ │ ├── rss │ │ │ └── plugins.ts │ │ ├── seeder │ │ │ └── plugins.ts │ │ ├── sync │ │ │ └── plugins │ │ │ │ └── sync.ts │ │ └── twin │ │ │ ├── builder.ts │ │ │ └── getRecentCoreCommits.ts │ ├── services │ │ └── twin.ts │ ├── stores │ │ ├── session.ts │ │ └── unsyncedConfigStore.ts │ ├── theme.ts │ ├── trpc │ │ ├── client.ts │ │ ├── context.ts │ │ ├── domains │ │ │ └── twin.ts │ │ ├── middlewares │ │ │ └── auth.ts │ │ ├── router.ts │ │ └── t.ts │ ├── types.ts │ ├── utils.ts │ └── validation.ts └── routes │ ├── +error.svelte │ ├── +layout.svelte │ ├── +page.svelte │ ├── +page.ts │ ├── [username] │ ├── +page.server.ts │ ├── +page.svelte │ └── [slug] │ │ ├── +page.svelte │ │ ├── +page.ts │ │ ├── badges │ │ ├── leaderkey │ │ │ └── +server.ts │ │ ├── plugin-manager │ │ │ └── +server.ts │ │ └── plugins │ │ │ └── +server.ts │ │ └── readme │ │ ├── +page.svelte │ │ └── +page.ts │ ├── add │ ├── +page.server.ts │ └── +page.svelte │ ├── api │ ├── auth │ │ ├── +server.ts │ │ ├── github │ │ │ ├── +server.ts │ │ │ └── callback │ │ │ │ └── +server.ts │ │ └── refresh │ │ │ └── +server.ts │ ├── seeder │ │ └── plugins │ │ │ └── +server.ts │ └── sync │ │ ├── configs │ │ └── +server.ts │ │ └── plugins │ │ ├── +server.ts │ │ └── trending │ │ └── +server.ts │ ├── configs │ └── +page.ts │ ├── guides │ ├── auto-generated-readme │ │ ├── +page.svelte │ │ └── +page.ts │ └── plugin-usage-badge │ │ ├── +page.svelte │ │ └── +page.ts │ ├── neovim │ ├── colorscheme │ │ └── [sort] │ │ │ ├── +page.svelte │ │ │ └── +page.ts │ ├── configurations │ │ └── [sort] │ │ │ ├── +page.svelte │ │ │ └── +page.ts │ └── plugins │ │ ├── [sort] │ │ ├── +page.svelte │ │ └── +page.ts │ │ ├── add │ │ ├── +page.server.ts │ │ └── +page.svelte │ │ └── rss.xml │ │ └── +server.ts │ ├── plugins │ ├── +page.ts │ └── [owner] │ │ └── [plugin] │ │ ├── +page.svelte │ │ ├── +page.ts │ │ └── shield │ │ └── +server.ts │ ├── privacy │ └── +page.svelte │ ├── rss │ └── +server.ts │ ├── sitemap.xml │ └── +server.ts │ ├── terms │ └── +page.svelte │ ├── this-week-in-neovim │ ├── +layout.svelte │ ├── +page.svelte │ ├── +page.ts │ ├── [issue] │ │ ├── +page.svelte │ │ ├── +page.ts │ │ └── edit │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ ├── create │ │ ├── +page.server.ts │ │ └── +page.svelte │ ├── rss.xml │ │ └── +server.ts │ └── subscribe │ │ └── +page.svelte │ ├── twin │ ├── +server.ts │ ├── [issue] │ │ └── +server.ts │ └── [year] │ │ └── [month] │ │ └── [day] │ │ └── +server.ts │ └── welcome │ ├── +page.server.ts │ └── +page.svelte ├── static ├── .well-known │ └── security.txt ├── android │ ├── android-launchericon-144-144.png │ ├── android-launchericon-192-192.png │ ├── android-launchericon-48-48.png │ ├── android-launchericon-512-512.png │ ├── android-launchericon-72-72.png │ └── android-launchericon-96-96.png ├── dotfyle.png ├── favicon.ico ├── icons.json ├── ios │ ├── 100.png │ ├── 1024.png │ ├── 114.png │ ├── 120.png │ ├── 128.png │ ├── 144.png │ ├── 152.png │ ├── 16.png │ ├── 167.png │ ├── 180.png │ ├── 192.png │ ├── 20.png │ ├── 256.png │ ├── 29.png │ ├── 32.png │ ├── 40.png │ ├── 50.png │ ├── 512.png │ ├── 57.png │ ├── 58.png │ ├── 60.png │ ├── 64.png │ ├── 72.png │ ├── 76.png │ ├── 80.png │ └── 87.png ├── new-plugins.png ├── popular-plugins.png ├── robots.txt ├── security.txt ├── trending-plugins.png ├── twin.png └── windows11 │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-20.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-30.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-36.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-40.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-44.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-60.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-64.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-72.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-80.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-96.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-20.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-30.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-36.png │ ├── Square44x44Logo.altform-unplated_targetsize-40.png │ ├── Square44x44Logo.altform-unplated_targetsize-44.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-60.png │ ├── Square44x44Logo.altform-unplated_targetsize-64.png │ ├── Square44x44Logo.altform-unplated_targetsize-72.png │ ├── Square44x44Logo.altform-unplated_targetsize-80.png │ ├── Square44x44Logo.altform-unplated_targetsize-96.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-20.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.targetsize-30.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-36.png │ ├── Square44x44Logo.targetsize-40.png │ ├── Square44x44Logo.targetsize-44.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.targetsize-60.png │ ├── Square44x44Logo.targetsize-64.png │ ├── Square44x44Logo.targetsize-72.png │ ├── Square44x44Logo.targetsize-80.png │ ├── Square44x44Logo.targetsize-96.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ └── Wide310x150Logo.scale-400.png ├── svelte.config.js ├── tailwind.config.ts ├── templates └── plugin.md ├── tsconfig.json ├── twin ├── core-commit-template.md ├── new-plugin-template.md └── template.md └── vite.config.ts /.env.example: -------------------------------------------------------------------------------- 1 | DATABASE_URL="postgresql://:@localhost:5432/dotfyle_dev" 2 | DATABASE_PRIVATE_URL="postgresql://:@localhost:5432/dotfyle_dev" 3 | JWT_ACCESS_SECRET= 4 | GITHUB_ID= 5 | GITHUB_SECRET= 6 | INTERNAL_API_TOKEN= 7 | PUBLIC_ADMIN_USER_GITHUB_ID= 8 | PUBLIC_MAINTENANCE_ENABLED=false 9 | OPEN_AI_KEY= 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.github/workflows/seed-plugins.yml: -------------------------------------------------------------------------------- 1 | name: 'seed-plugins' 2 | on: 3 | schedule: 4 | - cron: '0 1 * * *' 5 | 6 | jobs: 7 | seedPlugins: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Seed plugins 📦 11 | uses: JamesIves/fetch-api-data-action@v2 12 | with: 13 | endpoint: https://dotfyle.com/api/seeder/plugins 14 | configuration: '{ "method": "GET", "headers": {"Authorization": "${{ secrets.INTERNAL_API_TOKEN }}"} }' 15 | retry: true 16 | -------------------------------------------------------------------------------- /.github/workflows/sync-configs.yml: -------------------------------------------------------------------------------- 1 | name: 'sync-configs' 2 | on: 3 | schedule: 4 | - cron: '0 3 * * *' 5 | 6 | jobs: 7 | syncConfigs: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Sync configs 📦 11 | uses: JamesIves/fetch-api-data-action@v2 12 | with: 13 | endpoint: https://dotfyle.com/api/sync/configs 14 | configuration: '{ "method": "GET", "headers": {"Authorization": "${{ secrets.INTERNAL_API_TOKEN }}"} }' 15 | retry: true 16 | -------------------------------------------------------------------------------- /.github/workflows/sync-plugins.yml: -------------------------------------------------------------------------------- 1 | name: 'sync-plugins' 2 | on: 3 | schedule: 4 | - cron: '0 2 * * 0' 5 | 6 | jobs: 7 | syncPlugins: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Sync plugins 📦 11 | uses: JamesIves/fetch-api-data-action@v2 12 | with: 13 | endpoint: https://dotfyle.com/api/sync/plugins 14 | configuration: '{ "method": "GET", "headers": {"Authorization": "${{ secrets.INTERNAL_API_TOKEN }}"} }' 15 | retry: true 16 | -------------------------------------------------------------------------------- /.github/workflows/sync-trending-plugins.yml: -------------------------------------------------------------------------------- 1 | name: 'sync-trending-plugins' 2 | on: 3 | schedule: 4 | - cron: '0 5 * * *' 5 | 6 | jobs: 7 | syncPlugins: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Sync trending plugins 📦 11 | uses: JamesIves/fetch-api-data-action@v2 12 | with: 13 | endpoint: https://dotfyle.com/api/sync/plugins/trending 14 | configuration: '{ "method": "GET", "headers": {"Authorization": "${{ secrets.INTERNAL_API_TOKEN }}"} }' 15 | retry: true 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | .mind 12 | 13 | # Sentry 14 | .sentryclirc 15 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.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 | "tabWidth": 2, 10 | "semi": true 11 | } 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 codico 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![image](https://github.com/codicocodes/dotfyle/assets/76068197/248963eb-75d5-4dbe-bee8-ea17f87d9e5e) 2 | 3 | ## About 4 | 5 | Dotfyle is a community site for Neovim users to discover plugins and share dotfiles. Dotfyle maintains an index of 1000+ Neovim plugins. You can upload your configuration and it automatically detects which plugins you're using, and syncs this on a daily basis. This enables us to detect trending and popular plugins based on actual usage. 6 | 7 | [This Week in Neovim](https://dotfyle.com/this-week-in-neovim) can be found on Dotfyle, a weekly newsletter about news from Neovim core and the plugin ecosystem. 8 | 9 | ## Contributing 10 | 11 | Contributions are welcome and much appreciated! Read [CONTRIBUTING.md](./CONTRIBUTING.md) on how to setup a local development environment. 12 | 13 | To add a plugin to Dotfyle you can do so using [this form](https://dotfyle.com/neovim/plugins/add) 14 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Use postgres/example user/password credentials 2 | version: '3.1' 3 | 4 | services: 5 | db: 6 | image: postgres 7 | restart: always 8 | 9 | ports: 10 | - 5432:5432 11 | 12 | environment: 13 | POSTGRES_USERNAME: postgres 14 | POSTGRES_PASSWORD: postgres 15 | 16 | adminer: 17 | image: adminer 18 | restart: always 19 | ports: 20 | - 8080:8080 21 | -------------------------------------------------------------------------------- /giscus.json: -------------------------------------------------------------------------------- 1 | { 2 | "origins": ["https://dotfyle.com"] 3 | } 4 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173 7 | }, 8 | testDir: 'tests' 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /prisma/migrations/20230312070424_init/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "User" ( 3 | "id" SERIAL NOT NULL, 4 | "username" TEXT NOT NULL, 5 | "avatarUrl" TEXT NOT NULL, 6 | "githubId" INTEGER NOT NULL, 7 | 8 | CONSTRAINT "User_pkey" PRIMARY KEY ("id") 9 | ); 10 | 11 | -- CreateIndex 12 | CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); 13 | 14 | -- CreateIndex 15 | CREATE UNIQUE INDEX "User_githubId_key" ON "User"("githubId"); 16 | -------------------------------------------------------------------------------- /prisma/migrations/20230312122749_add_github_token/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "GithubToken" ( 3 | "id" SERIAL NOT NULL, 4 | "accessToken" TEXT NOT NULL, 5 | "userId" INTEGER NOT NULL, 6 | 7 | CONSTRAINT "GithubToken_pkey" PRIMARY KEY ("id") 8 | ); 9 | 10 | -- CreateIndex 11 | CREATE UNIQUE INDEX "GithubToken_userId_key" ON "GithubToken"("userId"); 12 | 13 | -- AddForeignKey 14 | ALTER TABLE "GithubToken" ADD CONSTRAINT "GithubToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 15 | -------------------------------------------------------------------------------- /prisma/migrations/20230313195333_add_neovim_config/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "NeovimConfig" ( 3 | "id" SERIAL NOT NULL, 4 | "owner" TEXT NOT NULL, 5 | "repo" TEXT NOT NULL, 6 | "root" TEXT NOT NULL, 7 | "initFile" TEXT NOT NULL, 8 | "githubId" INTEGER NOT NULL, 9 | "stars" INTEGER NOT NULL, 10 | "userId" INTEGER NOT NULL, 11 | 12 | CONSTRAINT "NeovimConfig_pkey" PRIMARY KEY ("id") 13 | ); 14 | 15 | -- CreateIndex 16 | CREATE UNIQUE INDEX "NeovimConfig_userId_key" ON "NeovimConfig"("userId"); 17 | 18 | -- CreateIndex 19 | CREATE UNIQUE INDEX "NeovimConfig_owner_repo_root_key" ON "NeovimConfig"("owner", "repo", "root"); 20 | 21 | -- AddForeignKey 22 | ALTER TABLE "NeovimConfig" ADD CONSTRAINT "NeovimConfig_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 23 | -------------------------------------------------------------------------------- /prisma/migrations/20230313220248_add_plugin_manager/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateEnum 2 | CREATE TYPE "PluginManager" AS ENUM ('Lazy', 'Packer'); 3 | 4 | -- AlterTable 5 | ALTER TABLE "NeovimConfig" ADD COLUMN "pluginManager" "PluginManager"; 6 | -------------------------------------------------------------------------------- /prisma/migrations/20230313233651_add_plugin_manager/migration.sql: -------------------------------------------------------------------------------- 1 | -- DropIndex 2 | DROP INDEX "NeovimConfig_userId_key"; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230314122537_add_branch/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - Added the required column `branch` to the `NeovimConfig` table without a default value. This is not possible if the table is not empty. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "NeovimConfig" ADD COLUMN "branch" TEXT NOT NULL; 9 | -------------------------------------------------------------------------------- /prisma/migrations/20230314124012_add_fork/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - Added the required column `fork` to the `NeovimConfig` table without a default value. This is not possible if the table is not empty. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "NeovimConfig" ADD COLUMN "fork" BOOLEAN NOT NULL; 9 | -------------------------------------------------------------------------------- /prisma/migrations/20230314132630_cascade_deletes/migration.sql: -------------------------------------------------------------------------------- 1 | -- DropForeignKey 2 | ALTER TABLE "GithubToken" DROP CONSTRAINT "GithubToken_userId_fkey"; 3 | 4 | -- DropForeignKey 5 | ALTER TABLE "NeovimConfig" DROP CONSTRAINT "NeovimConfig_userId_fkey"; 6 | 7 | -- AddForeignKey 8 | ALTER TABLE "GithubToken" ADD CONSTRAINT "GithubToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; 9 | 10 | -- AddForeignKey 11 | ALTER TABLE "NeovimConfig" ADD CONSTRAINT "NeovimConfig_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; 12 | -------------------------------------------------------------------------------- /prisma/migrations/20230314173013_add_plugins/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - The `pluginManager` column on the `NeovimConfig` table would be dropped and recreated. This will lead to data loss if there is data in the column. 5 | 6 | */ 7 | -- CreateEnum 8 | CREATE TYPE "NeovimPluginManager" AS ENUM ('Lazy', 'Packer'); 9 | 10 | -- AlterTable 11 | ALTER TABLE "NeovimConfig" DROP COLUMN "pluginManager", 12 | ADD COLUMN "pluginManager" "NeovimPluginManager"; 13 | 14 | -- DropEnum 15 | DROP TYPE "PluginManager"; 16 | 17 | -- CreateTable 18 | CREATE TABLE "NeovimPlugin" ( 19 | "id" SERIAL NOT NULL, 20 | "owner" TEXT NOT NULL, 21 | "name" TEXT NOT NULL, 22 | "type" TEXT NOT NULL, 23 | "source" TEXT NOT NULL, 24 | "category" TEXT NOT NULL, 25 | "link" TEXT NOT NULL, 26 | "shortDescription" TEXT NOT NULL, 27 | 28 | CONSTRAINT "NeovimPlugin_pkey" PRIMARY KEY ("id") 29 | ); 30 | -------------------------------------------------------------------------------- /prisma/migrations/20230314173312_add_unqique_plugin/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - A unique constraint covering the columns `[owner,name]` on the table `NeovimPlugin` will be added. If there are existing duplicate values, this will fail. 5 | 6 | */ 7 | -- CreateIndex 8 | CREATE UNIQUE INDEX "NeovimPlugin_owner_name_key" ON "NeovimPlugin"("owner", "name"); 9 | -------------------------------------------------------------------------------- /prisma/migrations/20230314193111_add_config_plugin_mapping/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "GithubToken" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 3 | 4 | -- AlterTable 5 | ALTER TABLE "NeovimConfig" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 6 | 7 | -- AlterTable 8 | ALTER TABLE "NeovimPlugin" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 9 | 10 | -- CreateTable 11 | CREATE TABLE "NeovimConfigPlugins" ( 12 | "configId" INTEGER NOT NULL, 13 | "pluginId" INTEGER NOT NULL, 14 | "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, 15 | 16 | CONSTRAINT "NeovimConfigPlugins_pkey" PRIMARY KEY ("configId","pluginId") 17 | ); 18 | 19 | -- CreateTable 20 | CREATE TABLE "_NeovimConfigToNeovimPlugin" ( 21 | "A" INTEGER NOT NULL, 22 | "B" INTEGER NOT NULL 23 | ); 24 | 25 | -- CreateIndex 26 | CREATE UNIQUE INDEX "_NeovimConfigToNeovimPlugin_AB_unique" ON "_NeovimConfigToNeovimPlugin"("A", "B"); 27 | 28 | -- CreateIndex 29 | CREATE INDEX "_NeovimConfigToNeovimPlugin_B_index" ON "_NeovimConfigToNeovimPlugin"("B"); 30 | 31 | -- AddForeignKey 32 | ALTER TABLE "NeovimConfigPlugins" ADD CONSTRAINT "NeovimConfigPlugins_configId_fkey" FOREIGN KEY ("configId") REFERENCES "NeovimConfig"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 33 | 34 | -- AddForeignKey 35 | ALTER TABLE "NeovimConfigPlugins" ADD CONSTRAINT "NeovimConfigPlugins_pluginId_fkey" FOREIGN KEY ("pluginId") REFERENCES "NeovimPlugin"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 36 | 37 | -- AddForeignKey 38 | ALTER TABLE "_NeovimConfigToNeovimPlugin" ADD CONSTRAINT "_NeovimConfigToNeovimPlugin_A_fkey" FOREIGN KEY ("A") REFERENCES "NeovimConfig"("id") ON DELETE CASCADE ON UPDATE CASCADE; 39 | 40 | -- AddForeignKey 41 | ALTER TABLE "_NeovimConfigToNeovimPlugin" ADD CONSTRAINT "_NeovimConfigToNeovimPlugin_B_fkey" FOREIGN KEY ("B") REFERENCES "NeovimPlugin"("id") ON DELETE CASCADE ON UPDATE CASCADE; 42 | -------------------------------------------------------------------------------- /prisma/migrations/20230315172158_remove_implicit_plugins/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the `_NeovimConfigToNeovimPlugin` table. If the table is not empty, all the data it contains will be lost. 5 | 6 | */ 7 | -- DropForeignKey 8 | ALTER TABLE "_NeovimConfigToNeovimPlugin" DROP CONSTRAINT "_NeovimConfigToNeovimPlugin_A_fkey"; 9 | 10 | -- DropForeignKey 11 | ALTER TABLE "_NeovimConfigToNeovimPlugin" DROP CONSTRAINT "_NeovimConfigToNeovimPlugin_B_fkey"; 12 | 13 | -- DropTable 14 | DROP TABLE "_NeovimConfigToNeovimPlugin"; 15 | -------------------------------------------------------------------------------- /prisma/migrations/20230317161234_add_slug_to_config/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - A unique constraint covering the columns `[owner,slug]` on the table `NeovimConfig` will be added. If there are existing duplicate values, this will fail. 5 | - Added the required column `slug` to the `NeovimConfig` table without a default value. This is not possible if the table is not empty. 6 | 7 | */ 8 | -- AlterTable 9 | ALTER TABLE "NeovimConfig" ADD COLUMN "slug" TEXT NOT NULL; 10 | 11 | -- CreateIndex 12 | CREATE UNIQUE INDEX "NeovimConfig_owner_slug_key" ON "NeovimConfig"("owner", "slug"); 13 | -------------------------------------------------------------------------------- /prisma/migrations/20230317163536_add_cascade_to_config_plugins/migration.sql: -------------------------------------------------------------------------------- 1 | -- DropForeignKey 2 | ALTER TABLE "NeovimConfigPlugins" DROP CONSTRAINT "NeovimConfigPlugins_configId_fkey"; 3 | 4 | -- DropForeignKey 5 | ALTER TABLE "NeovimConfigPlugins" DROP CONSTRAINT "NeovimConfigPlugins_pluginId_fkey"; 6 | 7 | -- AddForeignKey 8 | ALTER TABLE "NeovimConfigPlugins" ADD CONSTRAINT "NeovimConfigPlugins_configId_fkey" FOREIGN KEY ("configId") REFERENCES "NeovimConfig"("id") ON DELETE CASCADE ON UPDATE CASCADE; 9 | 10 | -- AddForeignKey 11 | ALTER TABLE "NeovimConfigPlugins" ADD CONSTRAINT "NeovimConfigPlugins_pluginId_fkey" FOREIGN KEY ("pluginId") REFERENCES "NeovimPlugin"("id") ON DELETE CASCADE ON UPDATE CASCADE; 12 | -------------------------------------------------------------------------------- /prisma/migrations/20230317200201_add_created_at/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfig" ADD COLUMN "lastSyncedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 3 | 4 | -- AlterTable 5 | ALTER TABLE "User" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 6 | -------------------------------------------------------------------------------- /prisma/migrations/20230318005305_add_last_synced_at_plugin/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfigPlugins" ADD COLUMN "lastSyncedAt" TIMESTAMP(3); 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230318005522_add_last_synced_at_plugin/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `lastSyncedAt` on the `NeovimConfigPlugins` table. All the data in the column will be lost. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "NeovimConfigPlugins" DROP COLUMN "lastSyncedAt"; 9 | 10 | -- AlterTable 11 | ALTER TABLE "NeovimPlugin" ADD COLUMN "lastSyncedAt" TIMESTAMP(3); 12 | -------------------------------------------------------------------------------- /prisma/migrations/20230318171949_add_readme_to_plugin/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimPlugin" ADD COLUMN "readme" TEXT DEFAULT ''; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230318173710_add_stars_to_plugin/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - Made the column `readme` on table `NeovimPlugin` required. This step will fail if there are existing NULL values in that column. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "NeovimPlugin" ADD COLUMN "stars" INTEGER NOT NULL DEFAULT 0, 9 | ALTER COLUMN "readme" SET NOT NULL; 10 | -------------------------------------------------------------------------------- /prisma/migrations/20230323210150_add_default_to_root/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfig" ALTER COLUMN "root" SET DEFAULT ''; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230323224550_add_last_login/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "User" ADD COLUMN "lastLoginAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, 3 | ADD COLUMN "loginCount" INTEGER NOT NULL DEFAULT 0; 4 | -------------------------------------------------------------------------------- /prisma/migrations/20230611110251_add_sync_table/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfigPlugins" ADD COLUMN "syncId" INTEGER; 3 | 4 | -- CreateTable 5 | CREATE TABLE "NeovimConfigSync" ( 6 | "id" SERIAL NOT NULL, 7 | "sha" TEXT NOT NULL, 8 | "syncedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, 9 | "configId" INTEGER NOT NULL, 10 | 11 | CONSTRAINT "NeovimConfigSync_pkey" PRIMARY KEY ("id") 12 | ); 13 | 14 | -- AddForeignKey 15 | ALTER TABLE "NeovimConfigPlugins" ADD CONSTRAINT "NeovimConfigPlugins_syncId_fkey" FOREIGN KEY ("syncId") REFERENCES "NeovimConfigSync"("id") ON DELETE CASCADE ON UPDATE CASCADE; 16 | 17 | -- AddForeignKey 18 | ALTER TABLE "NeovimConfigSync" ADD CONSTRAINT "NeovimConfigSync_configId_fkey" FOREIGN KEY ("configId") REFERENCES "NeovimConfig"("id") ON DELETE CASCADE ON UPDATE CASCADE; 19 | -------------------------------------------------------------------------------- /prisma/migrations/20230611112844_modify_last_login/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `syncId` on the `NeovimConfigPlugins` table. All the data in the column will be lost. 5 | - The primary key for the `NeovimConfigSync` table will be changed. If it partially fails, the table could be left without primary key constraint. 6 | - You are about to drop the column `id` on the `NeovimConfigSync` table. All the data in the column will be lost. 7 | 8 | */ 9 | -- DropForeignKey 10 | ALTER TABLE "NeovimConfigPlugins" DROP CONSTRAINT "NeovimConfigPlugins_syncId_fkey"; 11 | 12 | -- AlterTable 13 | ALTER TABLE "NeovimConfigPlugins" DROP COLUMN "syncId", 14 | ADD COLUMN "sha" TEXT; 15 | 16 | -- AlterTable 17 | ALTER TABLE "NeovimConfigSync" DROP CONSTRAINT "NeovimConfigSync_pkey", 18 | DROP COLUMN "id", 19 | ADD CONSTRAINT "NeovimConfigSync_pkey" PRIMARY KEY ("configId", "sha"); 20 | 21 | -- AddForeignKey 22 | ALTER TABLE "NeovimConfigPlugins" ADD CONSTRAINT "NeovimConfigPlugins_sha_configId_fkey" FOREIGN KEY ("sha", "configId") REFERENCES "NeovimConfigSync"("sha", "configId") ON DELETE CASCADE ON UPDATE CASCADE; 23 | -------------------------------------------------------------------------------- /prisma/migrations/20230611132309_weekly_added_plugins/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimPlugin" ADD COLUMN "addedLastWeek" INTEGER NOT NULL DEFAULT 0; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230611174409_add_leaderkey/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfig" ADD COLUMN "leaderkey" TEXT NOT NULL DEFAULT 'unknown'; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230611194924_add_language_servers/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - A unique constraint covering the columns `[sha,configId]` on the table `NeovimConfigSync` will be added. If there are existing duplicate values, this will fail. 5 | 6 | */ 7 | -- CreateTable 8 | CREATE TABLE "LanguageServer" ( 9 | "name" TEXT NOT NULL, 10 | "neovimConfigId" INTEGER 11 | ); 12 | 13 | -- CreateIndex 14 | CREATE UNIQUE INDEX "LanguageServer_name_key" ON "LanguageServer"("name"); 15 | 16 | -- CreateIndex 17 | CREATE UNIQUE INDEX "NeovimConfigSync_sha_configId_key" ON "NeovimConfigSync"("sha", "configId"); 18 | 19 | -- AddForeignKey 20 | ALTER TABLE "LanguageServer" ADD CONSTRAINT "LanguageServer_neovimConfigId_fkey" FOREIGN KEY ("neovimConfigId") REFERENCES "NeovimConfig"("id") ON DELETE SET NULL ON UPDATE CASCADE; 21 | -------------------------------------------------------------------------------- /prisma/migrations/20230611195814_fix_language_servers/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `neovimConfigId` on the `LanguageServer` table. All the data in the column will be lost. 5 | 6 | */ 7 | -- DropForeignKey 8 | ALTER TABLE "LanguageServer" DROP CONSTRAINT "LanguageServer_neovimConfigId_fkey"; 9 | 10 | -- AlterTable 11 | ALTER TABLE "LanguageServer" DROP COLUMN "neovimConfigId", 12 | ADD CONSTRAINT "LanguageServer_pkey" PRIMARY KEY ("name"); 13 | 14 | -- CreateTable 15 | CREATE TABLE "_LanguageServerToNeovimConfig" ( 16 | "A" TEXT NOT NULL, 17 | "B" INTEGER NOT NULL 18 | ); 19 | 20 | -- CreateIndex 21 | CREATE UNIQUE INDEX "_LanguageServerToNeovimConfig_AB_unique" ON "_LanguageServerToNeovimConfig"("A", "B"); 22 | 23 | -- CreateIndex 24 | CREATE INDEX "_LanguageServerToNeovimConfig_B_index" ON "_LanguageServerToNeovimConfig"("B"); 25 | 26 | -- AddForeignKey 27 | ALTER TABLE "_LanguageServerToNeovimConfig" ADD CONSTRAINT "_LanguageServerToNeovimConfig_A_fkey" FOREIGN KEY ("A") REFERENCES "LanguageServer"("name") ON DELETE CASCADE ON UPDATE CASCADE; 28 | 29 | -- AddForeignKey 30 | ALTER TABLE "_LanguageServerToNeovimConfig" ADD CONSTRAINT "_LanguageServerToNeovimConfig_B_fkey" FOREIGN KEY ("B") REFERENCES "NeovimConfig"("id") ON DELETE CASCADE ON UPDATE CASCADE; 31 | -------------------------------------------------------------------------------- /prisma/migrations/20230611202243_language_server_explicit_mapping/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the `_LanguageServerToNeovimConfig` table. If the table is not empty, all the data it contains will be lost. 5 | 6 | */ 7 | -- DropForeignKey 8 | ALTER TABLE "_LanguageServerToNeovimConfig" DROP CONSTRAINT "_LanguageServerToNeovimConfig_A_fkey"; 9 | 10 | -- DropForeignKey 11 | ALTER TABLE "_LanguageServerToNeovimConfig" DROP CONSTRAINT "_LanguageServerToNeovimConfig_B_fkey"; 12 | 13 | -- AlterTable 14 | ALTER TABLE "LanguageServer" ADD COLUMN "neovimConfigSyncConfigId" INTEGER, 15 | ADD COLUMN "neovimConfigSyncSha" TEXT; 16 | 17 | -- DropTable 18 | DROP TABLE "_LanguageServerToNeovimConfig"; 19 | 20 | -- CreateTable 21 | CREATE TABLE "NeovimConfigToLanguageServer" ( 22 | "languageServerName" TEXT NOT NULL, 23 | "configId" INTEGER NOT NULL, 24 | "neovimConfigId" INTEGER NOT NULL, 25 | 26 | CONSTRAINT "NeovimConfigToLanguageServer_pkey" PRIMARY KEY ("languageServerName","configId") 27 | ); 28 | 29 | -- AddForeignKey 30 | ALTER TABLE "LanguageServer" ADD CONSTRAINT "LanguageServer_neovimConfigSyncConfigId_neovimConfigSyncSh_fkey" FOREIGN KEY ("neovimConfigSyncConfigId", "neovimConfigSyncSha") REFERENCES "NeovimConfigSync"("configId", "sha") ON DELETE SET NULL ON UPDATE CASCADE; 31 | 32 | -- AddForeignKey 33 | ALTER TABLE "NeovimConfigToLanguageServer" ADD CONSTRAINT "NeovimConfigToLanguageServer_languageServerName_fkey" FOREIGN KEY ("languageServerName") REFERENCES "LanguageServer"("name") ON DELETE CASCADE ON UPDATE CASCADE; 34 | 35 | -- AddForeignKey 36 | ALTER TABLE "NeovimConfigToLanguageServer" ADD CONSTRAINT "NeovimConfigToLanguageServer_neovimConfigId_fkey" FOREIGN KEY ("neovimConfigId") REFERENCES "NeovimConfig"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 37 | -------------------------------------------------------------------------------- /prisma/migrations/20230611212040_fix_language_server_sync_mapping/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `neovimConfigSyncConfigId` on the `LanguageServer` table. All the data in the column will be lost. 5 | - You are about to drop the column `neovimConfigSyncSha` on the `LanguageServer` table. All the data in the column will be lost. 6 | - Added the required column `sha` to the `NeovimConfigToLanguageServer` table without a default value. This is not possible if the table is not empty. 7 | 8 | */ 9 | -- DropForeignKey 10 | ALTER TABLE "LanguageServer" DROP CONSTRAINT "LanguageServer_neovimConfigSyncConfigId_neovimConfigSyncSh_fkey"; 11 | 12 | -- AlterTable 13 | ALTER TABLE "LanguageServer" DROP COLUMN "neovimConfigSyncConfigId", 14 | DROP COLUMN "neovimConfigSyncSha"; 15 | 16 | -- AlterTable 17 | ALTER TABLE "NeovimConfigToLanguageServer" ADD COLUMN "sha" TEXT NOT NULL; 18 | 19 | -- AddForeignKey 20 | ALTER TABLE "NeovimConfigToLanguageServer" ADD CONSTRAINT "NeovimConfigToLanguageServer_configId_sha_fkey" FOREIGN KEY ("configId", "sha") REFERENCES "NeovimConfigSync"("configId", "sha") ON DELETE RESTRICT ON UPDATE CASCADE; 21 | -------------------------------------------------------------------------------- /prisma/migrations/20230611212246_fix_language_servers_2/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `neovimConfigId` on the `NeovimConfigToLanguageServer` table. All the data in the column will be lost. 5 | 6 | */ 7 | -- DropForeignKey 8 | ALTER TABLE "NeovimConfigToLanguageServer" DROP CONSTRAINT "NeovimConfigToLanguageServer_neovimConfigId_fkey"; 9 | 10 | -- AlterTable 11 | ALTER TABLE "NeovimConfigToLanguageServer" DROP COLUMN "neovimConfigId"; 12 | 13 | -- AddForeignKey 14 | ALTER TABLE "NeovimConfigToLanguageServer" ADD CONSTRAINT "NeovimConfigToLanguageServer_configId_fkey" FOREIGN KEY ("configId") REFERENCES "NeovimConfig"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 15 | -------------------------------------------------------------------------------- /prisma/migrations/20230622211042_add_breaking_changes/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "Post" ( 3 | "id" TEXT NOT NULL, 4 | "title" TEXT NOT NULL, 5 | "text" TEXT NOT NULL, 6 | "type" TEXT NOT NULL, 7 | 8 | CONSTRAINT "Post_pkey" PRIMARY KEY ("id") 9 | ); 10 | 11 | -- CreateTable 12 | CREATE TABLE "BreakingChange" ( 13 | "id" SERIAL NOT NULL, 14 | "postId" TEXT NOT NULL, 15 | "pluginId" INTEGER NOT NULL, 16 | "external_url" TEXT NOT NULL, 17 | 18 | CONSTRAINT "BreakingChange_pkey" PRIMARY KEY ("id") 19 | ); 20 | 21 | -- CreateIndex 22 | CREATE UNIQUE INDEX "BreakingChange_postId_key" ON "BreakingChange"("postId"); 23 | 24 | -- CreateIndex 25 | CREATE UNIQUE INDEX "BreakingChange_pluginId_key" ON "BreakingChange"("pluginId"); 26 | 27 | -- CreateIndex 28 | CREATE UNIQUE INDEX "BreakingChange_external_url_key" ON "BreakingChange"("external_url"); 29 | 30 | -- AddForeignKey 31 | ALTER TABLE "BreakingChange" ADD CONSTRAINT "BreakingChange_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; 32 | 33 | -- AddForeignKey 34 | ALTER TABLE "BreakingChange" ADD CONSTRAINT "BreakingChange_pluginId_fkey" FOREIGN KEY ("pluginId") REFERENCES "NeovimPlugin"("id") ON DELETE CASCADE ON UPDATE CASCADE; 35 | -------------------------------------------------------------------------------- /prisma/migrations/20230622211616_fix_external_url_name/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `external_url` on the `BreakingChange` table. All the data in the column will be lost. 5 | - A unique constraint covering the columns `[externalUrl]` on the table `BreakingChange` will be added. If there are existing duplicate values, this will fail. 6 | - Added the required column `externalUrl` to the `BreakingChange` table without a default value. This is not possible if the table is not empty. 7 | 8 | */ 9 | -- DropIndex 10 | DROP INDEX "BreakingChange_external_url_key"; 11 | 12 | -- AlterTable 13 | ALTER TABLE "BreakingChange" DROP COLUMN "external_url", 14 | ADD COLUMN "externalUrl" TEXT NOT NULL; 15 | 16 | -- CreateIndex 17 | CREATE UNIQUE INDEX "BreakingChange_externalUrl_key" ON "BreakingChange"("externalUrl"); 18 | -------------------------------------------------------------------------------- /prisma/migrations/20230622212411_add_sha_to_breaking_changes/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - Added the required column `sha` to the `BreakingChange` table without a default value. This is not possible if the table is not empty. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "BreakingChange" ADD COLUMN "sha" TEXT NOT NULL; 9 | -------------------------------------------------------------------------------- /prisma/migrations/20230622212626_add_created_at_to_posts/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "Post" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230622213348_remove_unique_plugin_on_breaking_change/migration.sql: -------------------------------------------------------------------------------- 1 | -- DropIndex 2 | DROP INDEX "BreakingChange_pluginId_key"; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230627205006_add_twin_post/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "TwinPost" ( 3 | "issue" INTEGER NOT NULL, 4 | "content" TEXT NOT NULL, 5 | "postId" TEXT NOT NULL, 6 | 7 | CONSTRAINT "TwinPost_pkey" PRIMARY KEY ("issue") 8 | ); 9 | 10 | -- CreateIndex 11 | CREATE UNIQUE INDEX "TwinPost_issue_key" ON "TwinPost"("issue"); 12 | 13 | -- CreateIndex 14 | CREATE UNIQUE INDEX "TwinPost_postId_key" ON "TwinPost"("postId"); 15 | 16 | -- AddForeignKey 17 | ALTER TABLE "TwinPost" ADD CONSTRAINT "TwinPost_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; 18 | -------------------------------------------------------------------------------- /prisma/migrations/20230627213031_add_title_to_twin_post/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - Added the required column `title` to the `TwinPost` table without a default value. This is not possible if the table is not empty. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "TwinPost" ADD COLUMN "title" TEXT NOT NULL; 9 | -------------------------------------------------------------------------------- /prisma/migrations/20230627213910_add_created_at_to_twin_post/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "TwinPost" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230627222532_remove_post_blog_connection/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `postId` on the `TwinPost` table. All the data in the column will be lost. 5 | 6 | */ 7 | -- DropForeignKey 8 | ALTER TABLE "TwinPost" DROP CONSTRAINT "TwinPost_postId_fkey"; 9 | 10 | -- DropIndex 11 | DROP INDEX "TwinPost_postId_key"; 12 | 13 | -- AlterTable 14 | ALTER TABLE "TwinPost" DROP COLUMN "postId"; 15 | -------------------------------------------------------------------------------- /prisma/migrations/20230627223140_add_license/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "TwinPost" ADD COLUMN "license" TEXT; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230630195203_add_media/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "Media" ( 3 | "id" SERIAL NOT NULL, 4 | "url" TEXT NOT NULL, 5 | "neovimPluginId" INTEGER, 6 | 7 | CONSTRAINT "Media_pkey" PRIMARY KEY ("id") 8 | ); 9 | 10 | -- CreateIndex 11 | CREATE UNIQUE INDEX "Media_url_key" ON "Media"("url"); 12 | 13 | -- AddForeignKey 14 | ALTER TABLE "Media" ADD CONSTRAINT "Media_neovimPluginId_fkey" FOREIGN KEY ("neovimPluginId") REFERENCES "NeovimPlugin"("id") ON DELETE SET NULL ON UPDATE CASCADE; 15 | -------------------------------------------------------------------------------- /prisma/migrations/20230709113442_at_published_at/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "TwinPost" ADD COLUMN "publishedAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230709232302_add_type_to_media/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "Media" ADD COLUMN "type" TEXT NOT NULL DEFAULT ''; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230720193550_add_track_dotfyle_shield/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimPlugin" ADD COLUMN "hasDotfyleShield" BOOLEAN NOT NULL DEFAULT false; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230720194427_add_dotfyle_shield_added_at/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `hasDotfyleShield` on the `NeovimPlugin` table. All the data in the column will be lost. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE "NeovimPlugin" DROP COLUMN "hasDotfyleShield", 9 | ADD COLUMN "dotfyleShieldAddedAt" TIMESTAMP(3); 10 | -------------------------------------------------------------------------------- /prisma/migrations/20230723152544_nvim_config_shield_added_at/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfig" ADD COLUMN "dotfyleShieldAddedAt" TIMESTAMP(3); 3 | -------------------------------------------------------------------------------- /prisma/migrations/20230826190240_drop_login_count/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to drop the column `lastLoginAt` on the `User` table. All the data in the column will be lost. 5 | - You are about to drop the column `loginCount` on the `User` table. All the data in the column will be lost. 6 | 7 | */ 8 | -- AlterTable 9 | ALTER TABLE "User" DROP COLUMN "lastLoginAt", 10 | DROP COLUMN "loginCount"; 11 | -------------------------------------------------------------------------------- /prisma/migrations/20230828211201_add_loc_to_neovim_configuration/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfig" ADD COLUMN "linesOfCode" INTEGER NOT NULL DEFAULT 0; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20240113165546_add_thumbnail_to_media/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "Media" ADD COLUMN "thumbnail" BOOLEAN NOT NULL DEFAULT false; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20240119224322_add_paths_to_neovim_config_plugins/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimConfigPlugins" ADD COLUMN "paths" TEXT NOT NULL DEFAULT ''; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20240124185427_add_description_to_plugin/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "NeovimPlugin" ADD COLUMN "description" TEXT NOT NULL DEFAULT ''; 3 | -------------------------------------------------------------------------------- /prisma/migrations/20240124212324_add_install_instructions/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "NeovimPluginInstallInstructions" ( 3 | "id" SERIAL NOT NULL, 4 | "pluginId" INTEGER NOT NULL, 5 | "pluginManager" TEXT NOT NULL, 6 | "instructions" TEXT NOT NULL, 7 | 8 | CONSTRAINT "NeovimPluginInstallInstructions_pkey" PRIMARY KEY ("id") 9 | ); 10 | 11 | -- CreateIndex 12 | CREATE UNIQUE INDEX "NeovimPluginInstallInstructions_pluginId_pluginManager_key" ON "NeovimPluginInstallInstructions"("pluginId", "pluginManager"); 13 | 14 | -- AddForeignKey 15 | ALTER TABLE "NeovimPluginInstallInstructions" ADD CONSTRAINT "NeovimPluginInstallInstructions_pluginId_fkey" FOREIGN KEY ("pluginId") REFERENCES "NeovimPlugin"("id") ON DELETE CASCADE ON UPDATE CASCADE; 16 | -------------------------------------------------------------------------------- /prisma/migrations/20240203130818_cascade_deletes_on_language_server_mappings/migration.sql: -------------------------------------------------------------------------------- 1 | -- DropForeignKey 2 | ALTER TABLE "NeovimConfigToLanguageServer" DROP CONSTRAINT "NeovimConfigToLanguageServer_configId_fkey"; 3 | 4 | -- AddForeignKey 5 | ALTER TABLE "NeovimConfigToLanguageServer" ADD CONSTRAINT "NeovimConfigToLanguageServer_configId_fkey" FOREIGN KEY ("configId") REFERENCES "NeovimConfig"("id") ON DELETE CASCADE ON UPDATE CASCADE; 6 | -------------------------------------------------------------------------------- /prisma/migrations/20240922092246_neovim_config_unique_for_id_user_id/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - A unique constraint covering the columns `[id,userId]` on the table `NeovimConfig` will be added. If there are existing duplicate values, this will fail. 5 | 6 | */-- CreateIndex 7 | CREATE UNIQUE INDEX "NeovimConfig_id_userId_key" 8 | ON "NeovimConfig"("id", "userId"); 9 | -------------------------------------------------------------------------------- /prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "postgresql" -------------------------------------------------------------------------------- /sentry.properties: -------------------------------------------------------------------------------- 1 | defaults.url=https://sentry.io/ 2 | defaults.org=speedtyperdev 3 | defaults.project=dotfyle 4 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // for information about these interfaces 2 | declare global { 3 | namespace App { 4 | // interface Error {} 5 | // interface Locals { 6 | // user: User; 7 | // } 8 | // interface PageData {} 9 | // interface Platform {} 10 | } 11 | } 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 20 | %sveltekit.head% 21 | 22 | 23 |
%sveltekit.body%
24 |
27 | 28 | 29 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import * as Sentry from '@sentry/sveltekit'; 2 | import { createContext } from '$lib/trpc/context'; 3 | import { router, type Router } from '$lib/trpc/router'; 4 | import type { Handle } from '@sveltejs/kit'; 5 | import { sequence } from '@sveltejs/kit/hooks'; 6 | import type { TRPCError, inferRouterContext, ProcedureType } from '@trpc/server'; 7 | import { createTRPCHandle } from 'trpc-sveltekit'; 8 | import { env } from '$env/dynamic/private'; 9 | import { verifyToken } from '$lib/server/auth/services'; 10 | import { NODE_ENV } from '$env/static/private'; 11 | import { prismaClient } from '$lib/server/prisma/client'; 12 | 13 | console.log('Starting server: ', { NODE_ENV }); 14 | 15 | if (NODE_ENV === 'production') { 16 | Sentry.init({ 17 | dsn: env.SENTRY_DSN, 18 | tracesSampleRate: 0.01, 19 | environment: NODE_ENV, 20 | integrations: [new Sentry.Integrations.Prisma({ client: prismaClient })] 21 | }); 22 | } 23 | 24 | export const onError = (opts: { 25 | ctx?: inferRouterContext; 26 | error: TRPCError; 27 | path: string; 28 | input: unknown; 29 | req: RequestInit; 30 | type: ProcedureType | 'unknown'; 31 | }) => { 32 | const { error } = opts; 33 | if (error.code === 'INTERNAL_SERVER_ERROR') { 34 | console.log(error); 35 | error.message = 'Something went wrong'; 36 | } 37 | delete error.stack; 38 | }; 39 | 40 | export const profilePerformance: Handle = async ({ event, resolve }) => { 41 | Sentry.withScope((scope) => { 42 | const user = verifyToken(event.cookies); 43 | scope.setUser({ id: user?.id ?? 'Anonymous' }); 44 | }); 45 | const route = event.url.pathname; 46 | 47 | const qs = event.url.search; 48 | 49 | const start = performance.now(); 50 | const response = await resolve(event); 51 | const end = performance.now(); 52 | 53 | const responseTime = end - start; 54 | 55 | const prefixIcon = responseTime >= 1000 ? '🐢' : '🚀'; 56 | 57 | console.log(`${prefixIcon} ${route}${qs} took ${responseTime.toFixed(2)} ms`); 58 | 59 | return response; 60 | }; 61 | 62 | const handleTrpc = createTRPCHandle({ 63 | router, 64 | createContext, 65 | onError 66 | }) satisfies Handle; 67 | 68 | export const handle = sequence(Sentry.sentryHandle(), profilePerformance, handleTrpc); 69 | -------------------------------------------------------------------------------- /src/lib/components/ActionButton.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /src/lib/components/BigGridContainer.svelte: -------------------------------------------------------------------------------- 1 |
4 | 5 |
6 | -------------------------------------------------------------------------------- /src/lib/components/BreakingChangePost.svelte: -------------------------------------------------------------------------------- 1 | 19 | 20 |
23 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | {humanizeAbsolute(date)} 40 |
41 |
42 |
43 | 44 | {text} 45 | 46 |
47 |
48 | -------------------------------------------------------------------------------- /src/lib/components/Button.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 38 | -------------------------------------------------------------------------------- /src/lib/components/ColorschemeSwitcher.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | {#if isOpen} 20 |
25 | {/if} 26 | 27 | 37 | 38 | { 41 | isOpen = false; 42 | }} 43 | > 44 |

45 | 46 |

47 |
48 | 49 |
50 |
51 | {#each colorschemes as theme} 52 | 67 | {/each} 68 |
69 |
70 | -------------------------------------------------------------------------------- /src/lib/components/Comments.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 30 | 31 | 32 |
33 | -------------------------------------------------------------------------------- /src/lib/components/ConfigCard.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 |
15 |
16 |
17 | 18 | 19 | 20 | {owner} 21 | 22 | 23 | / 24 | 25 | 26 | {repo} 27 | 28 | 29 |
30 |
31 | 32 | 33 | {stars} 34 | 35 | {#each tools.slice(0, 4) as tool} 36 | 37 | {tool} 38 | 39 | {/each} 40 |
41 |
42 |
43 | 44 |
45 |
46 | 47 | 52 |
53 |
54 |
55 | -------------------------------------------------------------------------------- /src/lib/components/CoolLink.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/lib/components/CoolText.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | {text} 7 | 8 | -------------------------------------------------------------------------------- /src/lib/components/CoolTextOnHover.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/lib/components/CoolTextWithChildren.svelte: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /src/lib/components/EmailSubscribe.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 |
14 |
15 |

16 | 17 | {title} 18 |

19 |

{description}

20 |
21 |
27 |
32 | (isfocused = true)} 39 | on:blur={() => (isfocused = false)} 40 | /> 41 |
42 |
43 | 48 |
49 |
50 |
51 | -------------------------------------------------------------------------------- /src/lib/components/GithubLoginButton.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 40 |
41 | -------------------------------------------------------------------------------- /src/lib/components/GlossyCard.svelte: -------------------------------------------------------------------------------- 1 | 4 |
11 | 12 |
13 | -------------------------------------------------------------------------------- /src/lib/components/GridContainer.svelte: -------------------------------------------------------------------------------- 1 |
4 | 5 |
6 | -------------------------------------------------------------------------------- /src/lib/components/HeroTitle.svelte: -------------------------------------------------------------------------------- 1 |
2 |
3 |
6 |

9 | 10 |

11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /src/lib/components/HtmlContent.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 | {@html content} 8 |
9 | 10 | 51 | -------------------------------------------------------------------------------- /src/lib/components/MediumHeroTitle.svelte: -------------------------------------------------------------------------------- 1 |
2 |
3 |

6 | 7 |

8 |
9 |
10 | -------------------------------------------------------------------------------- /src/lib/components/Modal.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | onClose()} 18 | on:click|self={() => dialog.close()} 19 | > 20 |
21 | 22 | 23 |
24 |
26 |
27 |
28 | 29 | 64 | -------------------------------------------------------------------------------- /src/lib/components/OpenGraph.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/lib/components/OuterLayout.svelte: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /src/lib/components/Pagination.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | {#if !previous} 13 |
14 | {/if} 15 | {#if previous} 16 |
39 | -------------------------------------------------------------------------------- /src/lib/components/PluginList.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | 62 | -------------------------------------------------------------------------------- /src/lib/components/PluginSearchNavigation.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 |
18 | {#each links as link} 19 | 25 | {link.label} 26 | 27 | {/each} 28 |
29 | -------------------------------------------------------------------------------- /src/lib/components/PostContainer.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | {#if post.breakingChange} 9 | 10 | {/if} 11 | 12 | -------------------------------------------------------------------------------- /src/lib/components/RepoPickerItem.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 13 |
18 | 19 | 20 | {name} 21 | 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /src/lib/components/RepositoryCard.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 68 | -------------------------------------------------------------------------------- /src/lib/components/Search.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 |
{ 20 | navigate($page, 'page', '1'); 21 | navigate($page, 'q', search, true); 22 | }} 23 | > 24 | 25 |
30 | 31 | (isfocused = true)} 38 | on:blur={() => (isfocused = false)} 39 | /> 40 | {#if search} 41 | 51 | {/if} 52 |
53 |
54 | -------------------------------------------------------------------------------- /src/lib/components/SearchHeader.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 | 21 | 22 | 23 | 24 |

25 | {content.description} 26 |

27 |
28 |
29 | 30 | 31 |
32 |
33 |
34 | {#each navigation as nav} 35 | {#if $page.params.sort === nav.value} 36 | 37 | 40 | 41 | {:else} 42 | 43 | 46 | 47 | {/if} 48 | {/each} 49 |
50 |
51 |
52 | -------------------------------------------------------------------------------- /src/lib/components/ShareConfig.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | 38 | 39 | {#if open} 40 |
(open = false)} 42 | class="z-10 fixed top-0 right-0 h-screen w-screen flex items-center justify-center" 43 | > 44 |
{ 46 | e.stopPropagation(); 47 | }} 48 | class="z-50 fixed bg-black/30 p-8 flex flex-col gap-8 rounded w-full mx-2 sm:w-1/3" 49 | > 50 |

Share

51 |
52 | 53 | 54 | 55 |
56 |
57 |
58 | {/if} 59 | -------------------------------------------------------------------------------- /src/lib/components/ShareContainer.svelte: -------------------------------------------------------------------------------- 1 | 19 | 20 |
21 | 28 | 34 | 35 | 36 | 41 | 42 | 43 |
44 | -------------------------------------------------------------------------------- /src/lib/components/ShowcaseCard.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 14 |
15 | {#if getMediaType(thumbnail) === 'image'} 16 | console.log('failed loading thumbnail')} 19 | style="object-position: center;" 20 | src={thumbnail.url} 21 | alt="{name} thumbnail" 22 | /> 23 | {/if} 24 | {#if getMediaType(thumbnail) === 'video'} 25 |
36 |
37 |
38 |
39 |
40 |
41 | 42 | {name} 43 | 44 |
45 | 46 | {description} 47 | 48 |
49 |
50 |
51 | 52 |
53 |
54 | -------------------------------------------------------------------------------- /src/lib/components/SmallTitle.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |

9 | 10 |

11 | -------------------------------------------------------------------------------- /src/lib/components/TextGeneration.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 |
25 |