From 5396bfa15edf34783021e6471a8384a442ea6184 Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Tue, 7 Apr 2026 15:33:01 -0400 Subject: [PATCH 1/2] fix: resolve gsc issues --- .../index.mdx | 14 +- .../index.mdx | 6 +- .../index.mdx | 14 +- .../index.mdx | 8 +- .../index.mdx | 18 +- .../index.mdx | 6 +- .../index.mdx | 14 +- .../index.mdx | 321 ++ .../index.mdx | 14 +- .../index.mdx | 18 +- .../index.mdx | 20 +- .../index.mdx | 22 +- .../index.mdx | 48 +- .../index.mdx | 10 +- .../index.mdx | 26 +- .../index.mdx | 22 +- .../index.mdx | 42 +- .../index.mdx | 34 +- .../index.mdx | 10 +- .../index.mdx | 14 +- .../index.mdx | 20 +- .../index.mdx | 12 +- .../index.mdx | 12 +- .../index.mdx | 20 +- .../index.mdx | 10 +- .../index.mdx | 14 +- .../index.mdx | 10 +- .../index.mdx | 14 +- .../index.mdx | 8 +- .../index.mdx | 18 +- .../index.mdx | 20 +- .../index.mdx | 20 +- .../index.mdx | 14 +- .../index.mdx | 8 +- .../index.mdx | 12 +- .../index.mdx | 57 +- .../index.mdx | 16 +- .../index.mdx | 6 +- .../index.mdx | 20 +- .../index.mdx | 16 +- .../index.mdx | 8 +- .../index.mdx | 14 +- .../index.mdx | 16 +- .../index.mdx | 16 +- .../index.mdx | 28 +- .../index.mdx | 26 +- .../index.mdx | 10 +- .../index.mdx | 10 +- ...d144f63f476efc98b9ba9d5ccb29a8-400x400.jpg | Bin ...7e1bb0e8ca928e5d1a0b58ccfe8220-800x800.jpg | Bin .../imgs/formbricks.svg | 0 ...f2a86abd05659c94c3069e7577a0f5-844x474.svg | 0 .../imgs/logo-cal.svg | 0 ...6c00b0ca55e1e440dde26f43dcb3f-1266x711.png | Bin ...5ded8d448f28db203012147fdcd39e-846x426.png | Bin ...5c52078065ee2ae0b44d6cdf0da1e-1692x852.png | Bin ...-83d5bddb-e3e7-46fa-9d47-f247ce42c68b.jpeg | Bin .../imgs/amplication-prisma-diagram2.png | Bin .../imgs/amplication-ui.png | Bin ...fca054011688621bfe51ea1836af10-844x474.svg | 0 ...a8e13e23367137d5a17515119aaf-2881x1620.png | Bin .../imgs/discord-screenshot.png | Bin ...6a1f6a68f815b4cffee5ee1b1ce934-844x474.svg | 0 ...0f7eeaf42604a4645c93dd051af6a-1267x712.png | Bin ...60a393f68694b8bab707306822df3-1692x852.png | Bin ...907c22c0ef2dd88e69992f950026-2400x1256.png | Bin .../imgs/svelte-typescript-1.png | Bin .../imgs/svelte-typescript-2.png | Bin .../imgs/svelte-typescript-3.png | Bin .../imgs/svelte-typescript-4.png | Bin .../imgs/svelte-typescript-5.png | Bin .../imgs/svelte-typescript-6.png | Bin .../imgs/svelte-typescript-7.png | Bin .../imgs/svelte-typescript-8.png | Bin ...de2f9288368dacbce578b790bfd66d-844x474.svg | 0 ...67ad67ce89e682aca57f5e19fd65a-1266x712.png | Bin .../imgs/cockroach-diagram.png | Bin ...dab44f271d4f0dd1ad658507f55b66-844x474.svg | 0 ...789939fb2b2af2bf3f82378cebc0-1920x1080.png | Bin .../imgs/migration.png | Bin .../imgs/release-notes.png | Bin .../imgs/statements.png | Bin ...95779722b9fca14e1e517d94aa9726-844x474.svg | 3037 +++++++++++++++++ ...16384d9635415e90e434abfda6c58-1692x952.png | Bin 0 -> 1385189 bytes .../Screenshot_2022-07-11_at_16.53.33.png | Bin 0 -> 113158 bytes .../Screenshot_2022-07-12_at_15.46.25.png | Bin 0 -> 170088 bytes .../Screenshot_2022-07-12_at_16.11.16.png | Bin 0 -> 206316 bytes .../Screenshot_2022-07-12_at_16.13.16.png | Bin 0 -> 156843 bytes .../Screenshot_2022-07-12_at_17.40.23.png | Bin 0 -> 121283 bytes .../Screenshot_2022-07-12_at_17.41.31.png | Bin 0 -> 155797 bytes .../Screenshot_2022-07-12_at_17.44.48.png | Bin 0 -> 147101 bytes .../Screenshot_2022-07-12_at_21.09.08.png | Bin 0 -> 166919 bytes .../imgs/add-database-url.png | Bin 0 -> 177262 bytes .../imgs/create-project.png | Bin 0 -> 147468 bytes .../imgs/name-your-project.png | Bin 0 -> 172733 bytes .../imgs/project-dashboard.png | Bin 0 -> 185636 bytes .../imgs/set_env_variables_and_deploy.png | Bin 0 -> 152525 bytes ...0-06d2f780-9f63-11eb-9f82-f7bd75d58558.png | Bin ...9-bfa72f80-9f7f-11eb-9fde-f995c6f51262.png | Bin ...6-ef583680-9f83-11eb-9155-753600312788.png | Bin .../imgs/1_btqXg9fLTExVjRDyrY1vsA.jpeg | Bin ...70f0c52daa613dae904b463342823-1692x852.png | Bin .../imgs/finished-ui.png | Bin ...1e7f9a0250db211bdf5284da11d2d8-844x474.svg | 0 .../imgs/localhost.png | Bin .../imgs/messages-displayed.png | Bin ...8391e4b3d0374523d45639d1318a6-1269x715.png | Bin .../imgs/tailwind-complete.png | Bin .../imgs/user-displayed.png | Bin .../imgs/vite-starter.png | Bin ...17165045cc051d8845880e5a313baf-844x474.svg | 0 ...be93c511d0ef6cbc29e2cff49e387-1269x715.png | Bin .../imgs/railway-connect.png | Bin .../imgs/railway-data.png | Bin .../imgs/railway-home.png | Bin .../imgs/railway-new-db.png | Bin .../imgs/railway-postgres-option.png | Bin .../imgs/railway-tables.png | Bin .../imgs/run-dev.png | Bin .../imgs/data.png | Bin .../imgs/explorer.png | Bin .../imgs/generate.png | Bin ...bf7e691114b2768df5ddfe12e00934-844x474.svg | 0 ...277e7cf2cfde5311381d601463251-1269x715.png | Bin .../imgs/model-auto.png | Bin .../imgs/playground.png | Bin .../imgs/prisma-client-required.png | Bin .../imgs/prisma-type-required.png | Bin .../imgs/yoga-start.png | Bin .../imgs/1.png | Bin .../imgs/2.png | Bin .../imgs/3.png | Bin .../imgs/api-url.png | Bin .../imgs/app-complete.png | Bin .../imgs/codegen.png | Bin .../imgs/finished.png | Bin .../imgs/generated-types.png | Bin .../imgs/github-api-url.png | Bin .../imgs/github-api.png | Bin .../imgs/github-create.png | Bin .../imgs/github-new.png | Bin ...2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg | 0 ...52b8e3e634d75bc70b9d624431cf7-1269x715.png | Bin .../imgs/render-api-connection.png | Bin .../imgs/render-api-url.png | Bin .../imgs/render-connect.png | Bin .../imgs/render-deploy-service.png | Bin .../imgs/render-free.png | Bin .../imgs/render-new.png | Bin .../imgs/render-web-service.png | Bin .../imgs/url-github.png | Bin .../imgs/elsevier-architecture-diagram.png | Bin ...703742d0016b7a60b69e0cc262dc8-1692x852.png | Bin .../imgs/peer-review-diagram-V3.png | Bin ...24fc37acc24f269c8b6a0628ad5a18-870x438.jpg | Bin ...fb62ed50e0da3deed2b2908d0156-2398x1208.png | Bin .../imgs/nx-prisma-1.png | Bin .../imgs/nx-prisma-10.png | Bin .../imgs/nx-prisma-2.png | Bin .../imgs/nx-prisma-3.png | Bin .../imgs/nx-prisma-4.png | Bin .../imgs/nx-prisma-5.png | Bin .../imgs/nx-prisma-6.png | Bin .../imgs/nx-prisma-7.png | Bin .../imgs/nx-prisma-8.png | Bin .../imgs/nx-prisma-9.png | Bin .../imgs/auth-flow.png | Bin .../imgs/embedded-doc-helpers.png | Bin .../imgs/error-message.png | Bin .../imgs/form-toggle-incomplete.gif | Bin .../imgs/form-toggle.gif | Bin ...59403f81349c8247116f8f084a0ae2-844x474.svg | 0 .../imgs/initial-login.png | Bin .../imgs/login-form.png | Bin ...9eaddac2a48baa614189c5fa74c2-1920x1080.png | Bin .../imgs/signin-success.gif | Bin .../imgs/dynamic-filename.png | Bin ...de348ea063b18dba5fb66f7dbb7594-844x474.svg | 0 .../imgs/home-initial.png | Bin .../imgs/kudo-feed.png | Bin .../imgs/kudo-preview.gif | Bin ...9320447e9fa9610b276088e86dd8-1920x1080.png | Bin .../imgs/nested-route-names.gif | Bin .../imgs/nested-route.png | Bin .../imgs/portal-diagram.png | Bin .../imgs/portal.gif | Bin .../imgs/recent-kudos.png | Bin .../imgs/search-bar-sort.png | Bin .../imgs/search-bar.png | Bin .../imgs/select-boxes.png | Bin .../imgs/sorting-functional.gif | Bin .../imgs/sub-routes.png | Bin .../imgs/user-list.png | Bin .../imgs/user-panel.png | Bin .../imgs/users-logged.png | Bin .../imgs/working-modal.gif | Bin .../imgs/congrats.gif | Bin .../imgs/create-repo.png | Bin ...238e170ebeea1caa4d9a67fec1db3d-844x474.svg | 0 .../imgs/ip-modal.png | Bin .../imgs/kudos-error.png | Bin ...6096b266ce2463146d441aef52f4-1920x1080.png | Bin .../imgs/mongodb-network.png | Bin .../imgs/new-repo.png | Bin .../imgs/repo-pushed.png | Bin .../imgs/repo-url.png | Bin .../imgs/success.gif | Bin .../imgs/vercel-deployed-dash.png | Bin .../imgs/vercel-deploying.png | Bin .../imgs/vercel-env.png | Bin .../imgs/vercel-new.png | Bin .../imgs/vercel-repos.png | Bin .../imgs/KZX2GIV.png | Bin .../imgs/eSb3LiB.png | Bin ...1c68af69d2c13eafb3369f343e0856-844x474.svg | 0 ...205088c9beee9cc8b5b4553e3988a-1692x852.png | Bin ...-019df6d2-acdf-4383-a064-4521b67c5bda.jpeg | Bin ...-9739c8a3-7522-457b-aae9-50d48239eb2c.jpeg | Bin .../imgs/2021-06-05-invisible-diagram.png | Bin ...9b2a389f2419759abe8b2089f4b2d4-870x438.png | Bin ...cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png | Bin .../imgs/connection-pool.svg | 0 .../imgs/containers.png | Bin .../imgs/edge-w-db.png | Bin .../imgs/edge.png | Bin ...34872f6ce4c951529f02ea55725adc-844x474.svg | 0 ...8cf22a31f583608f1717f4dfffb34-1266x712.png | Bin .../imgs/on-prem.png | Bin .../imgs/serverless.png | Bin .../imgs/virtual-machine.png | Bin .../imgs/after-json.png | Bin .../imgs/after-same-region.png | Bin .../imgs/db-near-server.png | Bin ...a41b7b452a43664dea361d78f10e82-844x474.svg | 0 ...ffe2930cc868334e99844d136473b-1266x711.png | Bin ...f41f22d8a54c882cd24da906c51479-844x474.svg | 0 .../imgs/index.png | Bin ...9b1df6f8104fced300d5e49233bd0-1269x714.png | Bin .../imgs/query-parallelization.png | Bin .../imgs/table-partitioning.png | Bin ...2-b8ec58e9-3540-4a60-9408-84e51a4f9f19.png | Bin ...8-92dea6ed-6486-46b8-b99e-62a0af29c01a.png | Bin ...5-1a680505-14fc-47ef-8862-126ef0d15708.png | Bin ...0-9fc9fa57-88b1-45d7-9b75-b49b8e4e8d70.png | Bin ...4-4429c674-6c8e-4827-a1b1-49231aa8e3b6.mp4 | Bin ...7-7ff4c4c8-c91c-4ff0-b32c-c4ab5a45db97.png | Bin ...13badff0117580a169a45609788d7e-844x474.svg | 0 .../imgs/index.png | Bin ...e89e7dd52fb5ba19e0850dd24a8fa-1692x952.png | Bin ...02b6a9c6be975ada9fd1d26f31173-1692x852.png | Bin .../imgs/iopool-diagram-after.png | Bin .../imgs/iopool-diagram-before.png | Bin .../imgs/2KmUO33.png | Bin .../imgs/7cfLBlC.gif | Bin .../imgs/OHfXWDh.png | Bin .../imgs/QnI7OrB.png | Bin ...b088978a9224cbe939e35fa9e58056-870x438.png | Bin ...c739fc1f24dc165998b1bdd3ae30a-1692x852.png | Bin ...c104c189e556f5a0a65cc59adde9b3-870x438.png | Bin ...030645338459b4feaf9733da97717-1692x852.png | Bin ...typescript-pocketguide-prisma-studio-1.png | Bin ...typescript-pocketguide-prisma-studio-2.png | Bin .../imgs/401-GET-users.png | Bin .../imgs/auth-login-endpoint.png | Bin .../imgs/auth-workflow-swagger.gif | Bin ...5bc6f5047c3e3ba1972005f90ea2bb-843x474.svg | 0 .../imgs/locked-endpoints.png | Bin ...7fa36e7051613296031be0344159-1920x1080.png | Bin .../imgs/article-not-exist-404.png | Bin ...9ead629ccc386f69880911bbb014c8-844x474.svg | 0 ...7c0dc9c0a72557fe3a277a11700a4-1272x716.png | Bin ...75e64a7ae28b6915e68d77e197f2-1920x1080.png | Bin .../imgs/password-omitted-get-articles.png | Bin .../imgs/password-omitted.png | Bin .../imgs/password-revealed-get-articles.png | Bin .../imgs/password-revealed.png | Bin .../imgs/users-crud-1.png | Bin .../imgs/users-crud-2.png | Bin .../imgs/articles-crud-1.png | Bin .../imgs/articles-endpoints-grouped.png | Bin .../imgs/create-article-dto.png | Bin .../imgs/final-app.png | Bin ...e028072f5e7d90b2eff2435ad6dabb-844x474.svg | 0 .../imgs/response-types.png | Bin .../imgs/swagger-findall.png | Bin .../imgs/swagger-findone.png | Bin .../imgs/swagger-ui.png | Bin ...b3f3e751cd795ba7e184ce98a3ed81-844x474.svg | 0 .../imgs/id-string.png | Bin .../imgs/inject-dates.png | Bin .../imgs/invalid-args-specific.png | Bin .../imgs/invalid-args.png | Bin ...a4eacbd9270a105ff912a0e91eec5-1272x716.png | Bin .../imgs/valid-args.png | Bin .../imgs/validation-error.png | Bin .../imgs/connection_pooling.png | Bin .../imgs/distributed_db.png | Bin ...26ec5a3d262e4e598ea35dd95aa7b0-844x474.svg | 0 ...a83db1dd2d474906b3c9b36a0be05-1267x711.png | Bin .../imgs/with_cdn.png | Bin .../imgs/without_cdn.png | Bin ...fdb1bc38c55016a41fd23b3ea650a0-870x439.svg | 0 ...e418b222844b771f5b3ffcff456f4-1692x852.png | Bin .../imgs/pearly_diagram.png | Bin ...e203a79d806c2f7ab3ff3d177b7ee-1692x852.png | Bin .../imgs/poppy-diagram.png | Bin .../imgs/vJyrhA4.png | Bin ...4b102c538279eae67bb1bb601991-1266x711.png} | Bin .../imgs/after-json.png | Bin 0 -> 19097 bytes .../imgs/after-same-region.png | Bin 0 -> 17723 bytes .../imgs/after-schema-builder.png | Bin 0 -> 16688 bytes .../imgs/before.png | Bin 0 -> 22566 bytes .../imgs/db-near-server.png | Bin 0 -> 10778 bytes ...74189eda737c807804fda0b018a05-844x474.svg} | 0 .../imgs/proof.png | Bin 0 -> 135441 bytes .../imgs/serhii.png | Bin 0 -> 23233 bytes .../imgs/tls-comparison.png | Bin 0 -> 20673 bytes .../imgs/after-json.png | Bin 69320 -> 0 bytes .../imgs/after-same-region.png | Bin 58761 -> 0 bytes .../imgs/after-schema-builder.png | Bin 53631 -> 0 bytes .../imgs/before.png | Bin 72197 -> 0 bytes .../imgs/db-near-server.png | Bin 41099 -> 0 bytes .../imgs/proof.png | Bin 405526 -> 0 bytes .../imgs/serhii.png | Bin 89632 -> 0 bytes .../imgs/tls-comparison.png | Bin 87038 -> 0 bytes .../imgs/add-filter-prisma-data.png | Bin .../imgs/data-proxy-performance.png | Bin .../imgs/explore-prisma-data-model.png | Bin ...231a1a3c1958c52182a480a8e5f8f7-844x474.svg | 0 ...711f25503a0a7af6f077b4ad57d2d-1266x711.png | Bin .../imgs/online-query-console.png | Bin .../imgs/prisma-github-synch.png | Bin ...fcf829b794355791d859059f7beb0b-844x474.svg | 0 ...1d5632f2170265bd9c63167d3f978-1268x721.png | Bin .../imgs/embedded-replica-create-copy.png | Bin .../imgs/embedded-replica-read.png | Bin .../imgs/embedded-replica-remote-read.png | Bin .../imgs/embedded-replica-timing.png | Bin .../embedded-replica-write-propagation.png | Bin ...955da7f55308c6531d0e28e6ed262d-844x475.svg | 0 ...f8abb7b2e576e7da9e728058bf1bd-1200x675.png | Bin .../imgs/mind-blown.gif | Bin .../imgs/remote-sqlite-timing.png | Bin .../imgs/connection-pooling.png | Bin ...349573b2f17ef889d25a23a427b0e2-844x474.svg | 0 ...d6fde0769ab278a33890eecc24240-1266x711.png | Bin .../imgs/neon-logo.png | Bin .../imgs/planetscale-logo.png | Bin .../imgs/with-driver-adapter.png | Bin .../imgs/without-driver-adapter.png | Bin ...fac30be65afcc3da2556f9cb07cbdd-844x478.svg | 0 ...fb2927aec03119e98cf6e5c04271b-1266x712.png | Bin .../imgs/sveltekit-fullstack-app.png | Bin ...f42d2c52751fac51563dbc8f01b52c-844x474.svg | 0 ...f90f758778c5a9f5e6db96af0efd2-1266x712.png | Bin .../imgs/mock-functions.png | Bin .../imgs/spy-functions.png | Bin .../imgs/testing_meme.png | Bin .../imgs/undefined.png | Bin .../imgs/file-nesting-config.png | Bin .../imgs/file-nesting-option.png | Bin ...8bdd2e62b432a8fad0f7e6f4859ede-844x474.svg | 0 ...ebeccdc7962534c6e45d87869900d-1266x712.png | Bin .../imgs/nested-files.png | Bin .../imgs/success.png | Bin .../imgs/test-graphic.svg | 0 .../imgs/all-tests-success.png | Bin .../imgs/docker-compose-running.png | Bin .../imgs/example.png | Bin ...1c33bbb498244fe0303813fad6a657-844x474.svg | 0 .../imgs/signup-suite-success.png | Bin .../imgs/test-success.png | Bin .../imgs/tests-run.png | Bin .../imgs/empty-suite.png | Bin .../imgs/five-success.png | Bin .../imgs/four-success.png | Bin ...c41a4e2b56b77d5a68ccc8e67742db-844x474.svg | 0 .../imgs/intellisense.png | Bin .../imgs/invalid-login.png | Bin .../imgs/login.png | Bin ...22c22e27db8dae8010454522fba88-1266x712.png | Bin .../imgs/playwright-options.png | Bin .../imgs/single-success.png | Bin .../imgs/three-success.png | Bin .../imgs/two-success.png | Bin .../imgs/all-success.png | Bin .../imgs/create-pr.png | Bin ...9524174c2aefb95145a831d4c0fd34-844x474.svg | 0 ...e335c8252420b638b7dfa43b135f2-1267x712.png | Bin .../imgs/new-pr.png | Bin .../imgs/new-repo-button.png | Bin .../imgs/new-repo-form.png | Bin .../imgs/new-repo-url.png | Bin .../imgs/successful-test.png | Bin .../imgs/unit-int-success.png | Bin .../imgs/unit-tests-running.png | Bin .../imgs/Tryg_Prisma_Image_1.png | Bin .../imgs/Tryg_Prisma_Image_2.png | Bin ...102a57b7c9d1b71e7120cf47a8f068-846x426.png | Bin ...e751fc30531dc46b2e3edb1700df1-1692x852.png | Bin ...4-400cd980-d8bb-11eb-9084-cd44a1cd53f0.png | Bin ...9-04fc37e4-d8ba-4ba6-af76-479bfd2e0379.mov | Bin .../imgs/I5g4bnQ | 0 ...8a149cca2bec7d980182d69a7d540c-870x438.png | Bin ...ea2fc83cd43cbab1505eb11f517be-1692x852.png | Bin .../src/app/pricing/pricing-calculator.tsx | 216 +- .../src/data/prisma-with/cockroachdb.json | 2 +- apps/site/src/data/showcase.ts | 16 +- 408 files changed, 3908 insertions(+), 499 deletions(-) rename apps/blog/content/blog/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/index.mdx (92%) rename apps/blog/content/blog/{ambassador-program-nxkwgcgnuvfx => ambassador-program-nxkWGcGNuvFx}/index.mdx (97%) rename apps/blog/content/blog/{amplication-customer-story-nmlkbnlllxnn => amplication-customer-story-nmlkBNlLlxnN}/index.mdx (95%) rename apps/blog/content/blog/{announcing-discord-1liaops7lxv9 => announcing-discord-1LiAOpS7lxV9}/index.mdx (93%) rename apps/blog/content/blog/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/index.mdx (96%) rename apps/blog/content/blog/{client-extensions-ga-4g4yiu8eosbb => client-extensions-ga-4g4yIu8eOSbB}/index.mdx (97%) rename apps/blog/content/blog/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/index.mdx (94%) create mode 100644 apps/blog/content/blog/database-access-on-the-edge-8F0t1s1BqOJE/index.mdx rename apps/blog/content/blog/{documenting-apis-mjjpz7e7nkvp => documenting-apis-mjjpZ7E7NkVP}/index.mdx (97%) rename apps/blog/content/blog/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/index.mdx (96%) rename apps/blog/content/blog/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/index.mdx (95%) rename apps/blog/content/blog/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/index.mdx (97%) rename apps/blog/content/blog/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/index.mdx (93%) rename apps/blog/content/blog/{elsevier-customer-story-ssaaskagmhtn => elsevier-customer-story-SsAASKagMHtN}/index.mdx (95%) rename apps/blog/content/blog/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/index.mdx (96%) rename apps/blog/content/blog/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/index.mdx (98%) rename apps/blog/content/blog/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/index.mdx (97%) rename apps/blog/content/blog/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/index.mdx (89%) rename apps/blog/content/blog/{grover-customer-success-story-nxkwgcgnuvfd => grover-customer-success-story-nxkWGcGNuvFd}/index.mdx (96%) rename apps/blog/content/blog/{how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q => how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q}/index.mdx (93%) rename apps/blog/content/blog/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/index.mdx (96%) rename apps/blog/content/blog/{how-to-improve-startup-times-kdrb9mjpev => how-to-improve-startup-times-kdRB9MjPEv}/index.mdx (97%) rename apps/blog/content/blog/{improving-query-performance-using-indexes-1-zulnzwbkul => improving-query-performance-using-indexes-1-zuLNZwBkuL}/index.mdx (95%) rename apps/blog/content/blog/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/index.mdx (95%) rename apps/blog/content/blog/{iopool-customer-success-story-ulscwvaqzxoa => iopool-customer-success-story-uLsCWvaqzXoa}/index.mdx (96%) rename apps/blog/content/blog/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/index.mdx (98%) rename apps/blog/content/blog/{learn-typescript-a-pocketguide-tutorial-q329xmxqhujz => learn-typescript-a-pocketguide-tutorial-q329XmXQHUjz}/index.mdx (98%) rename apps/blog/content/blog/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/index.mdx (98%) rename apps/blog/content/blog/{nestjs-prisma-error-handling-7d056s1koop2 => nestjs-prisma-error-handling-7D056s1kOop2}/index.mdx (98%) rename apps/blog/content/blog/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/index.mdx (98%) rename apps/blog/content/blog/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/index.mdx (98%) rename apps/blog/content/blog/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/index.mdx (96%) rename apps/blog/content/blog/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/index.mdx (98%) rename apps/blog/content/blog/{pearly-plan-customer-success-pdmdrrhtupve => pearly-plan-customer-success-pdmdrRhTupve}/index.mdx (96%) rename apps/blog/content/blog/{poppy-customer-success-story-swnwqcgrrvpd => poppy-customer-success-story-swnWQcGRRvpd}/index.mdx (95%) rename apps/blog/content/blog/{prisma-and-serverless-73hbgknz6t => prisma-and-serverless-73hbgKnZ6t}/index.mdx (93%) rename apps/blog/content/blog/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/index.mdx (93%) rename apps/blog/content/blog/{prisma-foss-fund-announcement-xw9dqi1hc24l => prisma-foss-fund-announcement-XW9DqI1HC24L}/index.mdx (95%) rename apps/blog/content/blog/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/index.mdx (95%) rename apps/blog/content/blog/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/index.mdx (96%) rename apps/blog/content/blog/{sveltekit-prisma-kvcoeoeqlc => sveltekit-prisma-kvCOEoeQlC}/index.mdx (99%) rename apps/blog/content/blog/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/index.mdx (98%) rename apps/blog/content/blog/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/index.mdx (98%) rename apps/blog/content/blog/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/index.mdx (98%) rename apps/blog/content/blog/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/index.mdx (98%) rename apps/blog/content/blog/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/index.mdx (96%) rename apps/blog/content/blog/{tryg-customer-story-pdmdrrhtupvd => tryg-customer-story-pdmdrRhTupvd}/index.mdx (96%) rename apps/blog/content/blog/{type-safe-js-with-jsdoc-typesaf3js => type-safe-js-with-jsdoc-typeSaf3js}/index.mdx (97%) rename apps/blog/public/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/imgs/48bf68ea87d144f63f476efc98b9ba9d5ccb29a8-400x400.jpg (100%) rename apps/blog/public/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/imgs/832974c6ad7e1bb0e8ca928e5d1a0b58ccfe8220-800x800.jpg (100%) rename apps/blog/public/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/imgs/formbricks.svg (100%) rename apps/blog/public/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/imgs/hero-de83f5f843f2a86abd05659c94c3069e7577a0f5-844x474.svg (100%) rename apps/blog/public/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/imgs/logo-cal.svg (100%) rename apps/blog/public/{accelerate-ga-release-i9cqm6bsf2g6 => accelerate-ga-release-I9cQM6bSf2g6}/imgs/meta-42554fa75736c00b0ca55e1e440dde26f43dcb3f-1266x711.png (100%) rename apps/blog/public/{ambassador-program-nxkwgcgnuvfx => ambassador-program-nxkWGcGNuvFx}/imgs/hero-1bdf6237d95ded8d448f28db203012147fdcd39e-846x426.png (100%) rename apps/blog/public/{ambassador-program-nxkwgcgnuvfx => ambassador-program-nxkWGcGNuvFx}/imgs/meta-de28b5e0df55c52078065ee2ae0b44d6cdf0da1e-1692x852.png (100%) rename apps/blog/public/{amplication-customer-story-nmlkbnlllxnn => amplication-customer-story-nmlkBNlLlxnN}/imgs/159914408-83d5bddb-e3e7-46fa-9d47-f247ce42c68b.jpeg (100%) rename apps/blog/public/{amplication-customer-story-nmlkbnlllxnn => amplication-customer-story-nmlkBNlLlxnN}/imgs/amplication-prisma-diagram2.png (100%) rename apps/blog/public/{amplication-customer-story-nmlkbnlllxnn => amplication-customer-story-nmlkBNlLlxnN}/imgs/amplication-ui.png (100%) rename apps/blog/public/{amplication-customer-story-nmlkbnlllxnn => amplication-customer-story-nmlkBNlLlxnN}/imgs/hero-b1fb9ec0c8fca054011688621bfe51ea1836af10-844x474.svg (100%) rename apps/blog/public/{amplication-customer-story-nmlkbnlllxnn => amplication-customer-story-nmlkBNlLlxnN}/imgs/meta-4baa84e48a0da8e13e23367137d5a17515119aaf-2881x1620.png (100%) rename apps/blog/public/{announcing-discord-1liaops7lxv9 => announcing-discord-1LiAOpS7lxV9}/imgs/discord-screenshot.png (100%) rename apps/blog/public/{announcing-discord-1liaops7lxv9 => announcing-discord-1LiAOpS7lxV9}/imgs/hero-7ae00282956a1f6a68f815b4cffee5ee1b1ce934-844x474.svg (100%) rename apps/blog/public/{announcing-discord-1liaops7lxv9 => announcing-discord-1LiAOpS7lxV9}/imgs/meta-388b596e6a40f7eeaf42604a4645c93dd051af6a-1267x712.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/hero-0e8c20420d860a393f68694b8bab707306822df3-1692x852.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/meta-711f2d3f2094907c22c0ef2dd88e69992f950026-2400x1256.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-1.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-2.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-3.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-4.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-5.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-6.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-7.png (100%) rename apps/blog/public/{build-an-app-with-svelte-and-typescript-pzdy3t93qatd => build-an-app-with-svelte-and-typescript-PZDY3t93qAtd}/imgs/svelte-typescript-8.png (100%) rename apps/blog/public/{client-extensions-ga-4g4yiu8eosbb => client-extensions-ga-4g4yIu8eOSbB}/imgs/hero-b404c12ca7de2f9288368dacbce578b790bfd66d-844x474.svg (100%) rename apps/blog/public/{client-extensions-ga-4g4yiu8eosbb => client-extensions-ga-4g4yIu8eOSbB}/imgs/meta-50e7e57ea5967ad67ce89e682aca57f5e19fd65a-1266x712.png (100%) rename apps/blog/public/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/imgs/cockroach-diagram.png (100%) rename apps/blog/public/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg (100%) rename apps/blog/public/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png (100%) rename apps/blog/public/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/imgs/migration.png (100%) rename apps/blog/public/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/imgs/release-notes.png (100%) rename apps/blog/public/{cockroach-ga-5jrd9xvwqdyl => cockroach-ga-5JrD9XVWQDYL}/imgs/statements.png (100%) create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/1fc839965595779722b9fca14e1e517d94aa9726-844x474.svg create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/41eccd0c9a716384d9635415e90e434abfda6c58-1692x952.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-11_at_16.53.33.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_15.46.25.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_16.11.16.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_16.13.16.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.40.23.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.41.31.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.44.48.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_21.09.08.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/add-database-url.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/create-project.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/name-your-project.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/project-dashboard.png create mode 100644 apps/blog/public/database-access-on-the-edge-8F0t1s1BqOJE/imgs/set_env_variables_and_deploy.png rename apps/blog/public/{documenting-apis-mjjpz7e7nkvp => documenting-apis-mjjpZ7E7NkVP}/imgs/115104730-06d2f780-9f63-11eb-9f82-f7bd75d58558.png (100%) rename apps/blog/public/{documenting-apis-mjjpz7e7nkvp => documenting-apis-mjjpZ7E7NkVP}/imgs/115109659-bfa72f80-9f7f-11eb-9fde-f995c6f51262.png (100%) rename apps/blog/public/{documenting-apis-mjjpz7e7nkvp => documenting-apis-mjjpZ7E7NkVP}/imgs/115110406-ef583680-9f83-11eb-9155-753600312788.png (100%) rename apps/blog/public/{documenting-apis-mjjpz7e7nkvp => documenting-apis-mjjpZ7E7NkVP}/imgs/1_btqXg9fLTExVjRDyrY1vsA.jpeg (100%) rename apps/blog/public/{documenting-apis-mjjpz7e7nkvp => documenting-apis-mjjpZ7E7NkVP}/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/finished-ui.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/hero-2f58c7e9701e7f9a0250db211bdf5284da11d2d8-844x474.svg (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/localhost.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/messages-displayed.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/meta-dc0f147b1428391e4b3d0374523d45639d1318a6-1269x715.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/tailwind-complete.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/user-displayed.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-1-i2gxifxksz => e2e-type-safety-graphql-react-1-I2GxIfxkSZ}/imgs/vite-starter.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/hero-838c88ca3817165045cc051d8845880e5a313baf-844x474.svg (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/meta-06962f83ac8be93c511d0ef6cbc29e2cff49e387-1269x715.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/railway-connect.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/railway-data.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/railway-home.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/railway-new-db.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/railway-postgres-option.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/railway-tables.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-2-j9meyhy0ej => e2e-type-safety-graphql-react-2-j9mEyHY0Ej}/imgs/run-dev.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/data.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/explorer.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/generate.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/hero-78bb7b87f2bf7e691114b2768df5ddfe12e00934-844x474.svg (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/meta-c8b654f7165277e7cf2cfde5311381d601463251-1269x715.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/model-auto.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/playground.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/prisma-client-required.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/prisma-type-required.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-3-fbv2zvigwg => e2e-type-safety-graphql-react-3-fbV2ZVIGWg}/imgs/yoga-start.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/1.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/2.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/3.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/api-url.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/app-complete.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/codegen.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/finished.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/generated-types.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/github-api-url.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/github-api.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/github-create.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/github-new.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/hero-b277fdcfbb2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/meta-42c1cab53d152b8e3e634d75bc70b9d624431cf7-1269x715.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-api-connection.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-api-url.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-connect.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-deploy-service.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-free.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-new.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/render-web-service.png (100%) rename apps/blog/public/{e2e-type-safety-graphql-react-4-jaha8gbker => e2e-type-safety-graphql-react-4-JaHA8GbkER}/imgs/url-github.png (100%) rename apps/blog/public/{elsevier-customer-story-ssaaskagmhtn => elsevier-customer-story-SsAASKagMHtN}/imgs/elsevier-architecture-diagram.png (100%) rename apps/blog/public/{elsevier-customer-story-ssaaskagmhtn => elsevier-customer-story-SsAASKagMHtN}/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png (100%) rename apps/blog/public/{elsevier-customer-story-ssaaskagmhtn => elsevier-customer-story-SsAASKagMHtN}/imgs/peer-review-diagram-V3.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/hero-2e21e72be724fc37acc24f269c8b6a0628ad5a18-870x438.jpg (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/meta-6edf92a2f15ffb62ed50e0da3deed2b2908d0156-2398x1208.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-1.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-10.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-2.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-3.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-4.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-5.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-6.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-7.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-8.png (100%) rename apps/blog/public/{full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc => full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc}/imgs/nx-prisma-9.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/auth-flow.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/embedded-doc-helpers.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/error-message.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/form-toggle-incomplete.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/form-toggle.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/hero-29016ded5a59403f81349c8247116f8f084a0ae2-844x474.svg (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/initial-login.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/login-form.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/meta-4b70ee51aee99eaddac2a48baa614189c5fa74c2-1920x1080.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-2-ztmoy58p4re8 => fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8}/imgs/signin-success.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/dynamic-filename.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/hero-45f6a2c1b0de348ea063b18dba5fb66f7dbb7594-844x474.svg (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/home-initial.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/kudo-feed.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/kudo-preview.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/meta-ec93dfa6d5929320447e9fa9610b276088e86dd8-1920x1080.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/nested-route-names.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/nested-route.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/portal-diagram.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/portal.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/recent-kudos.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/search-bar-sort.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/search-bar.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/select-boxes.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/sorting-functional.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/sub-routes.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/user-list.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/user-panel.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/users-logged.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v => fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v}/imgs/working-modal.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/congrats.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/create-repo.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/hero-a00a8da49b238e170ebeea1caa4d9a67fec1db3d-844x474.svg (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/ip-modal.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/kudos-error.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/meta-0c44161122fc6096b266ce2463146d441aef52f4-1920x1080.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/mongodb-network.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/new-repo.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/repo-pushed.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/repo-url.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/success.gif (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/vercel-deployed-dash.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/vercel-deploying.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/vercel-env.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/vercel-new.png (100%) rename apps/blog/public/{fullstack-remix-prisma-mongodb-5-gohqsnfupxsx => fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx}/imgs/vercel-repos.png (100%) rename apps/blog/public/{grover-customer-success-story-nxkwgcgnuvfd => grover-customer-success-story-nxkWGcGNuvFd}/imgs/KZX2GIV.png (100%) rename apps/blog/public/{grover-customer-success-story-nxkwgcgnuvfd => grover-customer-success-story-nxkWGcGNuvFd}/imgs/eSb3LiB.png (100%) rename apps/blog/public/{grover-customer-success-story-nxkwgcgnuvfd => grover-customer-success-story-nxkWGcGNuvFd}/imgs/hero-3fcd833a161c68af69d2c13eafb3369f343e0856-844x474.svg (100%) rename apps/blog/public/{grover-customer-success-story-nxkwgcgnuvfd => grover-customer-success-story-nxkWGcGNuvFd}/imgs/meta-cb121051733205088c9beee9cc8b5b4553e3988a-1692x852.png (100%) rename apps/blog/public/{how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q => how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q}/imgs/139663827-019df6d2-acdf-4383-a064-4521b67c5bda.jpeg (100%) rename apps/blog/public/{how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q => how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q}/imgs/139663846-9739c8a3-7522-457b-aae9-50d48239eb2c.jpeg (100%) rename apps/blog/public/{how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q => how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q}/imgs/2021-06-05-invisible-diagram.png (100%) rename apps/blog/public/{how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q => how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q}/imgs/hero-6c079320ad9b2a389f2419759abe8b2089f4b2d4-870x438.png (100%) rename apps/blog/public/{how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q => how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q}/imgs/meta-86c169055f2cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/connection-pool.svg (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/containers.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/edge-w-db.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/edge.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/hero-39edebe28834872f6ce4c951529f02ea55725adc-844x474.svg (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/meta-16bd738ba008cf22a31f583608f1717f4dfffb34-1266x712.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/on-prem.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/serverless.png (100%) rename apps/blog/public/{how-prisma-and-serverless-fit-together-iasfcpqvi0 => how-prisma-and-serverless-fit-together-iaSfcPQVi0}/imgs/virtual-machine.png (100%) rename apps/blog/public/{how-to-improve-startup-times-kdrb9mjpev => how-to-improve-startup-times-kdRB9MjPEv}/imgs/after-json.png (100%) rename apps/blog/public/{how-to-improve-startup-times-kdrb9mjpev => how-to-improve-startup-times-kdRB9MjPEv}/imgs/after-same-region.png (100%) rename apps/blog/public/{how-to-improve-startup-times-kdrb9mjpev => how-to-improve-startup-times-kdRB9MjPEv}/imgs/db-near-server.png (100%) rename apps/blog/public/{how-to-improve-startup-times-kdrb9mjpev => how-to-improve-startup-times-kdRB9MjPEv}/imgs/hero-e09fcabd4fa41b7b452a43664dea361d78f10e82-844x474.svg (100%) rename apps/blog/public/{how-to-improve-startup-times-kdrb9mjpev => how-to-improve-startup-times-kdRB9MjPEv}/imgs/meta-76ae590ec7affe2930cc868334e99844d136473b-1266x711.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-1-zulnzwbkul => improving-query-performance-using-indexes-1-zuLNZwBkuL}/imgs/hero-1c62649f62f41f22d8a54c882cd24da906c51479-844x474.svg (100%) rename apps/blog/public/{improving-query-performance-using-indexes-1-zulnzwbkul => improving-query-performance-using-indexes-1-zuLNZwBkuL}/imgs/index.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-1-zulnzwbkul => improving-query-performance-using-indexes-1-zuLNZwBkuL}/imgs/meta-c92a4afeb9d9b1df6f8104fced300d5e49233bd0-1269x714.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-1-zulnzwbkul => improving-query-performance-using-indexes-1-zuLNZwBkuL}/imgs/query-parallelization.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-1-zulnzwbkul => improving-query-performance-using-indexes-1-zuLNZwBkuL}/imgs/table-partitioning.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/184093462-b8ec58e9-3540-4a60-9408-84e51a4f9f19.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/184093478-92dea6ed-6486-46b8-b99e-62a0af29c01a.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/184096950-9fc9fa57-88b1-45d7-9b75-b49b8e4e8d70.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/185588924-4429c674-6c8e-4827-a1b1-49231aa8e3b6.mp4 (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/188598587-7ff4c4c8-c91c-4ff0-b32c-c4ab5a45db97.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/hero-21765b1aeb13badff0117580a169a45609788d7e-844x474.svg (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/index.png (100%) rename apps/blog/public/{improving-query-performance-using-indexes-2-myoijnmftsfq => improving-query-performance-using-indexes-2-MyoiJNMFTsfq}/imgs/meta-f47ff182b4ce89e7dd52fb5ba19e0850dd24a8fa-1692x952.png (100%) rename apps/blog/public/{iopool-customer-success-story-ulscwvaqzxoa => iopool-customer-success-story-uLsCWvaqzXoa}/imgs/hero-97ed1e5446a02b6a9c6be975ada9fd1d26f31173-1692x852.png (100%) rename apps/blog/public/{iopool-customer-success-story-ulscwvaqzxoa => iopool-customer-success-story-uLsCWvaqzXoa}/imgs/iopool-diagram-after.png (100%) rename apps/blog/public/{iopool-customer-success-story-ulscwvaqzxoa => iopool-customer-success-story-uLsCWvaqzXoa}/imgs/iopool-diagram-before.png (100%) rename apps/blog/public/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/imgs/2KmUO33.png (100%) rename apps/blog/public/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/imgs/7cfLBlC.gif (100%) rename apps/blog/public/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/imgs/OHfXWDh.png (100%) rename apps/blog/public/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/imgs/QnI7OrB.png (100%) rename apps/blog/public/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/imgs/hero-22883cd828b088978a9224cbe939e35fa9e58056-870x438.png (100%) rename apps/blog/public/{jamstack-with-nextjs-prisma-jamstackn3xt => jamstack-with-nextjs-prisma-jamstackN3XT}/imgs/meta-7a8c077c90bc739fc1f24dc165998b1bdd3ae30a-1692x852.png (100%) rename apps/blog/public/{learn-typescript-a-pocketguide-tutorial-q329xmxqhujz => learn-typescript-a-pocketguide-tutorial-q329XmXQHUjz}/imgs/hero-ed0603d756c104c189e556f5a0a65cc59adde9b3-870x438.png (100%) rename apps/blog/public/{learn-typescript-a-pocketguide-tutorial-q329xmxqhujz => learn-typescript-a-pocketguide-tutorial-q329XmXQHUjz}/imgs/meta-ea7367ba686030645338459b4feaf9733da97717-1692x852.png (100%) rename apps/blog/public/{learn-typescript-a-pocketguide-tutorial-q329xmxqhujz => learn-typescript-a-pocketguide-tutorial-q329XmXQHUjz}/imgs/typescript-pocketguide-prisma-studio-1.png (100%) rename apps/blog/public/{learn-typescript-a-pocketguide-tutorial-q329xmxqhujz => learn-typescript-a-pocketguide-tutorial-q329XmXQHUjz}/imgs/typescript-pocketguide-prisma-studio-2.png (100%) rename apps/blog/public/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/imgs/401-GET-users.png (100%) rename apps/blog/public/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/imgs/auth-login-endpoint.png (100%) rename apps/blog/public/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/imgs/auth-workflow-swagger.gif (100%) rename apps/blog/public/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/imgs/hero-7c1df9404c5bc6f5047c3e3ba1972005f90ea2bb-843x474.svg (100%) rename apps/blog/public/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/imgs/locked-endpoints.png (100%) rename apps/blog/public/{nestjs-prisma-authentication-7d056s1s0k3l => nestjs-prisma-authentication-7D056s1s0k3l}/imgs/meta-425dd76be3dd7fa36e7051613296031be0344159-1920x1080.png (100%) rename apps/blog/public/{nestjs-prisma-error-handling-7d056s1koop2 => nestjs-prisma-error-handling-7D056s1kOop2}/imgs/article-not-exist-404.png (100%) rename apps/blog/public/{nestjs-prisma-error-handling-7d056s1koop2 => nestjs-prisma-error-handling-7D056s1kOop2}/imgs/hero-c86e8991069ead629ccc386f69880911bbb014c8-844x474.svg (100%) rename apps/blog/public/{nestjs-prisma-error-handling-7d056s1koop2 => nestjs-prisma-error-handling-7D056s1kOop2}/imgs/meta-61137d012c97c0dc9c0a72557fe3a277a11700a4-1272x716.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/hero-2d5ec1b2f38575e64a7ae28b6915e68d77e197f2-1920x1080.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/password-omitted-get-articles.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/password-omitted.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/password-revealed-get-articles.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/password-revealed.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/users-crud-1.png (100%) rename apps/blog/public/{nestjs-prisma-relational-data-7d056s1koabc => nestjs-prisma-relational-data-7D056s1kOabc}/imgs/users-crud-2.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/articles-crud-1.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/articles-endpoints-grouped.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/create-article-dto.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/final-app.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/hero-4bb8a42e7fe028072f5e7d90b2eff2435ad6dabb-844x474.svg (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/response-types.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/swagger-findall.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/swagger-findone.png (100%) rename apps/blog/public/{nestjs-prisma-rest-api-7d056s1bmol0 => nestjs-prisma-rest-api-7D056s1BmOL0}/imgs/swagger-ui.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/hero-adc0af7eb5b3f3e751cd795ba7e184ce98a3ed81-844x474.svg (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/id-string.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/inject-dates.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/invalid-args-specific.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/invalid-args.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/meta-c114050a8b7a4eacbd9270a105ff912a0e91eec5-1272x716.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/valid-args.png (100%) rename apps/blog/public/{nestjs-prisma-validation-7d056s1kola1 => nestjs-prisma-validation-7D056s1kOla1}/imgs/validation-error.png (100%) rename apps/blog/public/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/imgs/connection_pooling.png (100%) rename apps/blog/public/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/imgs/distributed_db.png (100%) rename apps/blog/public/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/imgs/hero-bb568fc69c26ec5a3d262e4e598ea35dd95aa7b0-844x474.svg (100%) rename apps/blog/public/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/imgs/meta-1547411ba0da83db1dd2d474906b3c9b36a0be05-1267x711.png (100%) rename apps/blog/public/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/imgs/with_cdn.png (100%) rename apps/blog/public/{overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw => overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW}/imgs/without_cdn.png (100%) rename apps/blog/public/{pearly-plan-customer-success-pdmdrrhtupve => pearly-plan-customer-success-pdmdrRhTupve}/imgs/hero-865b17cd27fdb1bc38c55016a41fd23b3ea650a0-870x439.svg (100%) rename apps/blog/public/{pearly-plan-customer-success-pdmdrrhtupve => pearly-plan-customer-success-pdmdrRhTupve}/imgs/meta-d09ee96143ce418b222844b771f5b3ffcff456f4-1692x852.png (100%) rename apps/blog/public/{pearly-plan-customer-success-pdmdrrhtupve => pearly-plan-customer-success-pdmdrRhTupve}/imgs/pearly_diagram.png (100%) rename apps/blog/public/{poppy-customer-success-story-swnwqcgrrvpd => poppy-customer-success-story-swnWQcGRRvpd}/imgs/hero-e88c5bf7940e203a79d806c2f7ab3ff3d177b7ee-1692x852.png (100%) rename apps/blog/public/{poppy-customer-success-story-swnwqcgrrvpd => poppy-customer-success-story-swnWQcGRRvpd}/imgs/poppy-diagram.png (100%) rename apps/blog/public/{poppy-customer-success-story-swnwqcgrrvpd => poppy-customer-success-story-swnWQcGRRvpd}/imgs/vJyrhA4.png (100%) rename apps/blog/public/{prisma-and-serverless-73hbgknz6t/imgs/meta-73248ed5f8354b102c538279eae67bb1bb601991-1266x711.png => prisma-and-serverless-73hbgKnZ6t/imgs/73248ed5f8354b102c538279eae67bb1bb601991-1266x711.png} (100%) create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/after-json.png create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/after-same-region.png create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/after-schema-builder.png create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/before.png create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/db-near-server.png rename apps/blog/public/{prisma-and-serverless-73hbgknz6t/imgs/hero-e70e892329074189eda737c807804fda0b018a05-844x474.svg => prisma-and-serverless-73hbgKnZ6t/imgs/e70e892329074189eda737c807804fda0b018a05-844x474.svg} (100%) create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/proof.png create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/serhii.png create mode 100644 apps/blog/public/prisma-and-serverless-73hbgKnZ6t/imgs/tls-comparison.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/after-json.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/after-same-region.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/after-schema-builder.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/before.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/db-near-server.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/proof.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/serhii.png delete mode 100644 apps/blog/public/prisma-and-serverless-73hbgknz6t/imgs/tls-comparison.png rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/add-filter-prisma-data.png (100%) rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/data-proxy-performance.png (100%) rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/explore-prisma-data-model.png (100%) rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/hero-4d76a71d16231a1a3c1958c52182a480a8e5f8f7-844x474.svg (100%) rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/meta-ffc4c14399a711f25503a0a7af6f077b4ad57d2d-1266x711.png (100%) rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/online-query-console.png (100%) rename apps/blog/public/{prisma-data-platform-now-generally-available-8d058s1bqol1 => prisma-data-platform-now-generally-available-8D058s1BqOL1}/imgs/prisma-github-synch.png (100%) rename apps/blog/public/{prisma-foss-fund-announcement-xw9dqi1hc24l => prisma-foss-fund-announcement-XW9DqI1HC24L}/imgs/hero-1ece57b620fcf829b794355791d859059f7beb0b-844x474.svg (100%) rename apps/blog/public/{prisma-foss-fund-announcement-xw9dqi1hc24l => prisma-foss-fund-announcement-XW9DqI1HC24L}/imgs/meta-ab8f92c96761d5632f2170265bd9c63167d3f978-1268x721.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/embedded-replica-create-copy.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/embedded-replica-read.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/embedded-replica-remote-read.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/embedded-replica-timing.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/embedded-replica-write-propagation.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/hero-95bd2c2570955da7f55308c6531d0e28e6ed262d-844x475.svg (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/meta-c9c3aaf0efdf8abb7b2e576e7da9e728058bf1bd-1200x675.png (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/mind-blown.gif (100%) rename apps/blog/public/{prisma-turso-ea-support-rxgd_tmy3uxx => prisma-turso-ea-support-rXGd_Tmy3UXX}/imgs/remote-sqlite-timing.png (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/connection-pooling.png (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/hero-57908d058c349573b2f17ef889d25a23a427b0e2-844x474.svg (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/meta-216c379698ad6fde0769ab278a33890eecc24240-1266x711.png (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/neon-logo.png (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/planetscale-logo.png (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/with-driver-adapter.png (100%) rename apps/blog/public/{serverless-database-drivers-kml1ehxorxzv => serverless-database-drivers-KML1ehXORxZV}/imgs/without-driver-adapter.png (100%) rename apps/blog/public/{sveltekit-prisma-kvcoeoeqlc => sveltekit-prisma-kvCOEoeQlC}/imgs/hero-b3ac03355cfac30be65afcc3da2556f9cb07cbdd-844x478.svg (100%) rename apps/blog/public/{sveltekit-prisma-kvcoeoeqlc => sveltekit-prisma-kvCOEoeQlC}/imgs/meta-b2a7a9354acfb2927aec03119e98cf6e5c04271b-1266x712.png (100%) rename apps/blog/public/{sveltekit-prisma-kvcoeoeqlc => sveltekit-prisma-kvCOEoeQlC}/imgs/sveltekit-fullstack-app.png (100%) rename apps/blog/public/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/imgs/hero-c96c41c8c5f42d2c52751fac51563dbc8f01b52c-844x474.svg (100%) rename apps/blog/public/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/imgs/meta-4fe84c71772f90f758778c5a9f5e6db96af0efd2-1266x712.png (100%) rename apps/blog/public/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/imgs/mock-functions.png (100%) rename apps/blog/public/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/imgs/spy-functions.png (100%) rename apps/blog/public/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/imgs/testing_meme.png (100%) rename apps/blog/public/{testing-series-1-8erb5p0y8o => testing-series-1-8eRB5p0Y8o}/imgs/undefined.png (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/file-nesting-config.png (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/file-nesting-option.png (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/hero-c9711528e68bdd2e62b432a8fad0f7e6f4859ede-844x474.svg (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/meta-5b092626852ebeccdc7962534c6e45d87869900d-1266x712.png (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/nested-files.png (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/success.png (100%) rename apps/blog/public/{testing-series-2-xphjjmiesm => testing-series-2-xPhjjmIEsM}/imgs/test-graphic.svg (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/all-tests-success.png (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/docker-compose-running.png (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/example.png (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/hero-d60da664991c33bbb498244fe0303813fad6a657-844x474.svg (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/signup-suite-success.png (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/test-success.png (100%) rename apps/blog/public/{testing-series-3-abuyf8nxan => testing-series-3-aBUyF8nxAn}/imgs/tests-run.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/empty-suite.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/five-success.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/four-success.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/hero-205e6248fbc41a4e2b56b77d5a68ccc8e67742db-844x474.svg (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/intellisense.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/invalid-login.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/login.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/meta-b984941339322c22e27db8dae8010454522fba88-1266x712.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/playwright-options.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/single-success.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/three-success.png (100%) rename apps/blog/public/{testing-series-4-ovxtdis201 => testing-series-4-OVXtDis201}/imgs/two-success.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/all-success.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/create-pr.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/hero-1f810a93209524174c2aefb95145a831d4c0fd34-844x474.svg (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/meta-1688da94cebe335c8252420b638b7dfa43b135f2-1267x712.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/new-pr.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/new-repo-button.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/new-repo-form.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/new-repo-url.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/successful-test.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/unit-int-success.png (100%) rename apps/blog/public/{testing-series-5-xwogenroxm => testing-series-5-xWogenROXm}/imgs/unit-tests-running.png (100%) rename apps/blog/public/{tryg-customer-story-pdmdrrhtupvd => tryg-customer-story-pdmdrRhTupvd}/imgs/Tryg_Prisma_Image_1.png (100%) rename apps/blog/public/{tryg-customer-story-pdmdrrhtupvd => tryg-customer-story-pdmdrRhTupvd}/imgs/Tryg_Prisma_Image_2.png (100%) rename apps/blog/public/{tryg-customer-story-pdmdrrhtupvd => tryg-customer-story-pdmdrRhTupvd}/imgs/hero-efb10e8cb1102a57b7c9d1b71e7120cf47a8f068-846x426.png (100%) rename apps/blog/public/{tryg-customer-story-pdmdrrhtupvd => tryg-customer-story-pdmdrRhTupvd}/imgs/meta-4b9d0487846e751fc30531dc46b2e3edb1700df1-1692x852.png (100%) rename apps/blog/public/{type-safe-js-with-jsdoc-typesaf3js => type-safe-js-with-jsdoc-typeSaf3js}/imgs/123747164-400cd980-d8bb-11eb-9084-cd44a1cd53f0.png (100%) rename apps/blog/public/{type-safe-js-with-jsdoc-typesaf3js => type-safe-js-with-jsdoc-typeSaf3js}/imgs/146181009-04fc37e4-d8ba-4ba6-af76-479bfd2e0379.mov (100%) rename apps/blog/public/{type-safe-js-with-jsdoc-typesaf3js => type-safe-js-with-jsdoc-typeSaf3js}/imgs/I5g4bnQ (100%) rename apps/blog/public/{type-safe-js-with-jsdoc-typesaf3js => type-safe-js-with-jsdoc-typeSaf3js}/imgs/hero-98db3908d18a149cca2bec7d980182d69a7d540c-870x438.png (100%) rename apps/blog/public/{type-safe-js-with-jsdoc-typesaf3js => type-safe-js-with-jsdoc-typeSaf3js}/imgs/meta-e05807a6755ea2fc83cd43cbab1505eb11f517be-1692x852.png (100%) diff --git a/apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx b/apps/blog/content/blog/accelerate-ga-release-I9cQM6bSf2g6/index.mdx similarity index 92% rename from apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx rename to apps/blog/content/blog/accelerate-ga-release-I9cQM6bSf2g6/index.mdx index fb1a603a37..b9963bfe48 100644 --- a/apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx +++ b/apps/blog/content/blog/accelerate-ga-release-I9cQM6bSf2g6/index.mdx @@ -1,13 +1,13 @@ --- title: "Prisma Accelerate now in General Availability" -slug: "accelerate-ga-release-i9cqm6bsf2g6" +slug: "accelerate-ga-release-I9cQM6bSf2g6" date: "2023-10-26" authors: - "Sam Bhatti" metaTitle: "Prisma Accelerate now in General Availability" metaDescription: "Supercharge your applications with Prisma Accelerate's scalable connection pooling and global edge caching. Plus, enjoy our exclusive launch offer." -metaImagePath: "/accelerate-ga-release-i9cqm6bsf2g6/imgs/meta-42554fa75736c00b0ca55e1e440dde26f43dcb3f-1266x711.png" -heroImagePath: "/accelerate-ga-release-i9cqm6bsf2g6/imgs/hero-de83f5f843f2a86abd05659c94c3069e7577a0f5-844x474.svg" +metaImagePath: "/accelerate-ga-release-I9cQM6bSf2g6/imgs/meta-42554fa75736c00b0ca55e1e440dde26f43dcb3f-1266x711.png" +heroImagePath: "/accelerate-ga-release-I9cQM6bSf2g6/imgs/hero-de83f5f843f2a86abd05659c94c3069e7577a0f5-844x474.svg" heroImageAlt: "Prisma Accelerate now in General Availability" tags: - "announcement" @@ -36,7 +36,7 @@ To see what Prisma Accelerate can do, let's take a look at its implementation in ### Cal.com: Enhancing scheduling efficiency The logo of Cal.com @@ -46,7 +46,7 @@ To see what Prisma Accelerate can do, let's take a look at its implementation in Prisma Accelerate's robust connection pooling is designed to handle high volumes of database interactions efficiently. For platforms like Cal.com, this means over 4M queries every day to enable seamless management of appointments, even with heavy traffic peaks. @@ -61,7 +61,7 @@ Prisma Accelerate's robust connection pooling is designed to handle high volumes ### Formbricks: Privacy-first survey suite The logo of Formbricks @@ -71,7 +71,7 @@ Prisma Accelerate's robust connection pooling is designed to handle high volumes Leveraging Prisma Accelerate's connection pooling, Formbricks achieves seamless and rapid data access, with high-traffic peaking at 7M queries in a 24-hour time period. This allows them to maintain consistent performance, even when faced with unpredictable user traffic, ensuring a smooth experience for all their users. diff --git a/apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx b/apps/blog/content/blog/ambassador-program-nxkWGcGNuvFx/index.mdx similarity index 97% rename from apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx rename to apps/blog/content/blog/ambassador-program-nxkWGcGNuvFx/index.mdx index 168a461d4c..7f5b07b157 100644 --- a/apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx +++ b/apps/blog/content/blog/ambassador-program-nxkWGcGNuvFx/index.mdx @@ -1,14 +1,14 @@ --- title: "Prisma Ambassador Program — Building A Community of Experts" -slug: "ambassador-program-nxkwgcgnuvfx" +slug: "ambassador-program-nxkWGcGNuvFx" date: "2021-05-28" authors: - "Vladi Stevanovic" - "Nikolas Burk" metaTitle: "Announcing the Prisma Ambassador Program — Building A Community of Experts" metaDescription: "We are thrilled to announce the launch of the Ambassador Program to empower the Prisma community, while also helping individual contributors build their own brand." -metaImagePath: "/ambassador-program-nxkwgcgnuvfx/imgs/meta-de28b5e0df55c52078065ee2ae0b44d6cdf0da1e-1692x852.png" -heroImagePath: "/ambassador-program-nxkwgcgnuvfx/imgs/hero-1bdf6237d95ded8d448f28db203012147fdcd39e-846x426.png" +metaImagePath: "/ambassador-program-nxkWGcGNuvFx/imgs/meta-de28b5e0df55c52078065ee2ae0b44d6cdf0da1e-1692x852.png" +heroImagePath: "/ambassador-program-nxkWGcGNuvFx/imgs/hero-1bdf6237d95ded8d448f28db203012147fdcd39e-846x426.png" heroImageAlt: "Prisma Ambassador Program — Building A Community of Experts" tags: - "announcement" diff --git a/apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx b/apps/blog/content/blog/amplication-customer-story-nmlkBNlLlxnN/index.mdx similarity index 95% rename from apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx rename to apps/blog/content/blog/amplication-customer-story-nmlkBNlLlxnN/index.mdx index 236533d5f6..9039de9bb9 100644 --- a/apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx +++ b/apps/blog/content/blog/amplication-customer-story-nmlkBNlLlxnN/index.mdx @@ -1,13 +1,13 @@ --- title: "How Prisma helps Amplication evolutionize backend development" -slug: "amplication-customer-story-nmlkbnlllxnn" +slug: "amplication-customer-story-nmlkBNlLlxnN" date: "2022-04-29" authors: - "Alex Emerich" metaTitle: "How Prisma helps Amplication evolutionize backend development" metaDescription: "How Prisma helps Amplication evolutionize backend development" -metaImagePath: "/amplication-customer-story-nmlkbnlllxnn/imgs/meta-4baa84e48a0da8e13e23367137d5a17515119aaf-2881x1620.png" -heroImagePath: "/amplication-customer-story-nmlkbnlllxnn/imgs/hero-b1fb9ec0c8fca054011688621bfe51ea1836af10-844x474.svg" +metaImagePath: "/amplication-customer-story-nmlkBNlLlxnN/imgs/meta-4baa84e48a0da8e13e23367137d5a17515119aaf-2881x1620.png" +heroImagePath: "/amplication-customer-story-nmlkBNlLlxnN/imgs/hero-b1fb9ec0c8fca054011688621bfe51ea1836af10-844x474.svg" heroImageAlt: "How Prisma helps Amplication evolutionize backend development" tags: - "user-success-story" @@ -27,7 +27,7 @@ Working at larger companies, [Amplication](https://amplication.com/) founder, Yu With Amplication, you can easily create data models and configure role-based access control with a simple and intuitive UI (or even [via their CLI](https://github.com/amplication/amplication/tree/master/packages/amplication-cli#amp-entitiescreate-displayname)). Based on these model definitions, Amplication generates production-ready, yet fully customizable, application code. This code is continuously pushed to your GitHub repository, and you get a dedicated Docker container to house your database, a Node.js application, and a React client. -![Amplication UI](/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-ui.png) +![Amplication UI](/amplication-customer-story-nmlkBNlLlxnN/imgs/amplication-ui.png) For fullstack developers, their repetitive coding tasks are taken care of, but they still retain **complete ownership** of the code to deploy where they wish and are free to download the generated app code and continue development elsewhere. @@ -48,7 +48,7 @@ For the server side you get: - [Jest](https://jestjs.io/): A delightful JavaScript testing framework with a focus on simplicity - [Docker](https://www.docker.com/): An open platform for developing, shipping, and running applications -![Generated App Server-side Architecture](/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-prisma-diagram2.png) +![Generated App Server-side Architecture](/amplication-customer-story-nmlkBNlLlxnN/imgs/amplication-prisma-diagram2.png) The Amplication team strongly believes in open-source technology and a user focused community, so they made sure this belief was at the center of the tools they bring their users. @@ -57,7 +57,7 @@ The Amplication team strongly believes in open-source technology and a user focu When first beginning work on Amplication in 2020, [Yuval Hazaz](https://twitter.com/Yuvalhazaz1), CEO at Amplication, made an early bet on Prisma to not just be a tool used by himself and his engineers, but also a central cog in the stack managed by Amplication users. Among other ORM options, Yuval felt Prisma was meeting developer needs the best and was strongly convinced by the Prisma community. Yuval was impressed by the consistent work done by the Prisma team to bring new features to its users based on feedback directly from the community. Amplication places a strong importance on the open-source community’s ability to collaborate and make better developer experiences, a sentiment shared at Prisma. ``` -![Type error when passing an incorrect type to the UserDetails component](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-5.png) +![Type error when passing an incorrect type to the UserDetails component](/build-an-app-with-svelte-and-typescript-PZDY3t93qAtd/imgs/svelte-typescript-5.png) Right now we have `any` applied as the return type to the `getUserDetails` function in `UserDetails.svelte`. Let's apply type-safety here by defining a type and using it. @@ -516,7 +516,7 @@ This will open up Prisma Studio in the browser at `http://locahost:5555`. We can click into the `User` table to view it. We can also take this opportunity to create some new data right through the UI. -![Adding a record using Prisma Studio](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-7.png) +![Adding a record using Prisma Studio](/build-an-app-with-svelte-and-typescript-PZDY3t93qAtd/imgs/svelte-typescript-7.png) ### Create an Endpoint to Get the User Data @@ -590,7 +590,7 @@ In the Svelte project, let's swap our the github.com URL in the fetch call in `U With this simple change, we should now be getting data from our server instead of from GitHub. -![Svelte app pulling user data from our own API](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-8.png) +![Svelte app pulling user data from our own API](/build-an-app-with-svelte-and-typescript-PZDY3t93qAtd/imgs/svelte-typescript-8.png) ## Wrapping Up diff --git a/apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx b/apps/blog/content/blog/client-extensions-ga-4g4yIu8eOSbB/index.mdx similarity index 97% rename from apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx rename to apps/blog/content/blog/client-extensions-ga-4g4yIu8eOSbB/index.mdx index d8e429a5c0..e333d3fd86 100644 --- a/apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx +++ b/apps/blog/content/blog/client-extensions-ga-4g4yIu8eOSbB/index.mdx @@ -1,13 +1,13 @@ --- title: "Prisma Client Extensions Are Now Production Ready" -slug: "client-extensions-ga-4g4yiu8eosbb" +slug: "client-extensions-ga-4g4yIu8eOSbB" date: "2023-06-22" authors: - "Jon Harrell" metaTitle: "Prisma Client Extensions Are Now Production Ready (4.16.0)" metaDescription: "Make Prisma Client do even more with Client extensions, now Generally Available. Extend your client, models, queries, and results to tailor Prisma Client to your use case." -metaImagePath: "/client-extensions-ga-4g4yiu8eosbb/imgs/meta-50e7e57ea5967ad67ce89e682aca57f5e19fd65a-1266x712.png" -heroImagePath: "/client-extensions-ga-4g4yiu8eosbb/imgs/hero-b404c12ca7de2f9288368dacbce578b790bfd66d-844x474.svg" +metaImagePath: "/client-extensions-ga-4g4yIu8eOSbB/imgs/meta-50e7e57ea5967ad67ce89e682aca57f5e19fd65a-1266x712.png" +heroImagePath: "/client-extensions-ga-4g4yIu8eOSbB/imgs/hero-b404c12ca7de2f9288368dacbce578b790bfd66d-844x474.svg" heroImageAlt: "Prisma Client Extensions" tags: - "orm" diff --git a/apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx b/apps/blog/content/blog/cockroach-ga-5JrD9XVWQDYL/index.mdx similarity index 94% rename from apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx rename to apps/blog/content/blog/cockroach-ga-5JrD9XVWQDYL/index.mdx index 7a89a823ee..9b07080e30 100644 --- a/apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx +++ b/apps/blog/content/blog/cockroach-ga-5JrD9XVWQDYL/index.mdx @@ -1,13 +1,13 @@ --- title: "Prisma Support for CockroachDB Is Production Ready 🪳" -slug: "cockroach-ga-5jrd9xvwqdyl" +slug: "cockroach-ga-5JrD9XVWQDYL" date: "2022-05-25" authors: - "Sabin Adams" metaTitle: "Prisma support for CockroachDB is now in GA" metaDescription: "Prisma's support for CockroachDB is now in production ready! Read this article to learn about the features and benefits of Prisma with CockroachDb." -metaImagePath: "/cockroach-ga-5jrd9xvwqdyl/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png" -heroImagePath: "/cockroach-ga-5jrd9xvwqdyl/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg" +metaImagePath: "/cockroach-ga-5JrD9XVWQDYL/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png" +heroImagePath: "/cockroach-ga-5JrD9XVWQDYL/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg" heroImageAlt: "Prisma Support for CockroachDB Is Production Ready" tags: - "announcement" @@ -25,7 +25,7 @@ Back in February, as part of the [3.9.0](https://github.com/prisma/prisma/releas Thanks to the amazing community feedback and testing, along with collaboration from the amazing [Cockroach Labs](https://www.cockroachlabs.com/) team, this feature is now production-ready! -![](/cockroach-ga-5jrd9xvwqdyl/imgs/release-notes.png) +![](/cockroach-ga-5JrD9XVWQDYL/imgs/release-notes.png) ## The power of serverless with a familiar interface @@ -40,7 +40,7 @@ Using Prisma with CockroachDB is, for the most part, the same as using Prisma wi The magic behind Prisma _with_ CockroachDB is that developers now have access to the scalable infrastructure of a distributed SQL database without having to be an expert in hosting and scaling databases. CockroachDB handles that piece of things so developers can focus on building their product rather than spending time on operational overhead. -![](/cockroach-ga-5jrd9xvwqdyl/imgs/cockroach-diagram.png) +![](/cockroach-ga-5JrD9XVWQDYL/imgs/cockroach-diagram.png) The developer's experience when interacting with their CockroachDB database (or database cluster) is made super smooth as Prisma helps maintain advanced developer confidence and productivity via its type-safe client and migration tools while CockroachDB handles the complicated operational tasks such as: @@ -71,7 +71,7 @@ Then create a new migration to account for that change. ```shell npx prisma migrate dev --name add-age ``` -![](/cockroach-ga-5jrd9xvwqdyl/imgs/migration.png) +![](/cockroach-ga-5JrD9XVWQDYL/imgs/migration.png) Finally, ideally during a CI/CD step, the changes can be deployed to the database and CockroachDB will apply these across all of the databases in the cluster without downtime. @@ -86,7 +86,7 @@ Prisma Schema Language (PSL) supports configuring [indexes](https://www.prisma.i This, along with CockroachDB's [statement monitoring page](https://www.cockroachlabs.com/docs/stable/ui-statements-page.html) provide a super useful set of tools that empower developers to have clear insights into their queries' performance and pathways to optimizing them. -![](/cockroach-ga-5jrd9xvwqdyl/imgs/statements.png) +![](/cockroach-ga-5JrD9XVWQDYL/imgs/statements.png) ## Get started with CockroachDB and Prisma diff --git a/apps/blog/content/blog/database-access-on-the-edge-8F0t1s1BqOJE/index.mdx b/apps/blog/content/blog/database-access-on-the-edge-8F0t1s1BqOJE/index.mdx new file mode 100644 index 0000000000..3be7a9b4eb --- /dev/null +++ b/apps/blog/content/blog/database-access-on-the-edge-8F0t1s1BqOJE/index.mdx @@ -0,0 +1,321 @@ +--- +title: "Database access on the Edge with Next.js, Vercel & Prisma Accelerate" +slug: "database-access-on-the-edge-8F0t1s1BqOJE" +date: "2022-07-29" +authors: + - "Alex Ruheni" +metaTitle: "Database access on the Edge with Next.js, Vercel & Prisma Accelerate" +metaDescription: "Learn how you can query databases in Edge environments using Prisma and the Prisma Accelerate." +metaImagePath: "/database-access-on-the-edge-8F0t1s1BqOJE/imgs/41eccd0c9a716384d9635415e90e434abfda6c58-1692x952.png" +heroImagePath: "/database-access-on-the-edge-8F0t1s1BqOJE/imgs/1fc839965595779722b9fca14e1e517d94aa9726-844x474.svg" +heroImageAlt: "Database access on the Edge with Next.js, Vercel & Prisma Accelerate" +tags: + - "education" +--- + +The Edge enables application deployment across the globe. This article explores what Edge environments are, the challenges that arise when working in Edge environments and how to access databases on the Edge using Prisma Accelerate. + + +## What is the Edge? + +Traditionally, applications would be deployed to a single region or data center, in either a virtual machine, Platform as a Service (PaaS) like Heroku, or Functions as a Service (FaaS) like AWS Lambda. While this deployment pattern worked fine, the problem this created was that a user located on the other side of the globe would experience slightly longer response times. + +We — developers — attempted to fix this with the JAMstack architecture, where static assets, such as HTML, CSS, JavaScript, and images, would be distributed across the globe in a Content Delivery Network (CDN). This improved loading times — the [Time to First Byte (TTFB)](https://web.dev/ttfb/) — of web applications, but if the application required dynamic data, e.g., from an API or database, the application needed to make another request for the data. This also worked fine. However, the side effect was that we also distributed loading spinners across the web. + +{/* ![](https://user-images.githubusercontent.com/33921841/180798183-16041c47-48d8-4a30-b35d-1a3c09d1e6ed.gif) */} + +We took this a step further and introduced Edge computing such as [Vercel's Edge Network](https://vercel.com/features/edge-functions). The Edge is a form of _serverless compute_ that allows running server-side code geographically close to its end users. + +{/* ![[Source] Cloudflare workers](https://user-images.githubusercontent.com/33921841/180796884-3636b4f4-c065-4a85-8682-f7ee7114e2f6.png) */} + +Edge computing works similarly to serverless functions, without the cold starts because they have a smaller runtime. This is great because web apps would perform better, but it comes at a cost: A smaller runtime on the Edge means that you don't have the exact same capabilities as you would have in regular Node.js runtime used in serverless functions. + + +### Edge functions can easily exhaust database connections + +Edge functions are stateless, meaning they lack persistent state between requests. This architecture clashes with the stateful nature of traditional relational databases, where each request requires a new database connection. + +With every request to the application, a new database connection is established, adding substantial overhead to queries and potentially hindering application performance as it scales. Moreover, during traffic spikes, the database is at risk of running out of database connections, leading to downtimes. + +You can learn more about the challenges of database access in Edge environments, which is similar to serverless environments, in [this article](https://www.prisma.io/blog/overcoming-challenges-in-serverless-and-edge-environments-TQtONA0RVxuW). + +### Database access on the Edge with Prisma Accelerate + +[Prisma Accelerate](https://www.prisma.io/docs/accelerate) offers a connection pooler for your database, that reuses database connections and allows you to interact with your database over HTTP. + +The connection pool of Accelerate ensures optimal performance by efficiently reusing database connections for serverless and edge applications (i.e. applications using [Vercel Edge Functions](https://vercel.com/features/edge-functions) or [Cloudflare Workers](https://workers.cloudflare.com/)). + +In addition to providing connection pooling by default, Prisma Accelerate also offers a global edge cache. You can drastically improve the performance of your applications by opting-in and caching your query results in-line with your Prisma queries. You can learn more about caching with Accelerate [here](https://www.prisma.io/docs/accelerate/caching). + +### Do single-region databases and the Edge fit together? + +Edge computing is a fairly young, yet very promising technology that has the potential to drastically speed up applications in the future. The ecosystem around the Edge is still evolving and best practices for globally distributed applications are yet to be figured out. + +At Prisma, we are excited about the developments in the Edge ecosystem and want to help move it forward! However, connecting to a single-region database as shown in this article is probably not the best idea for real-world applications _today_. + +To reduce large roundtrips from edge functions to a single-region database, you can use a global cache, which allows you to store your data closer to your edge apps. Prisma Accelerate offers a [global cache](https://www.prisma.io/docs/accelerate/caching), which you can easily opt-in to drastically improve the performance of your edge apps. As a best practice, we still recommend to generally deploy your database as closely as possible to your API server to minimize latency in response times. + +While the architecture shown in this article might not cater to real-world use cases yet, we are excited about the possibilities that are opening up in this space and want to make sure Prisma can help solve the problems related to database access on the Edge in the future! + +Here's a video from Jeff Delaney, [Fireship](https://fireship.io/), on whether "edge" computing is faster. + + + + +## Demo: Database access on the Edge + +Let's now take a look how to access a database from Vercel's Edge functions using Prisma Accelerate. + +You can find the live demo of the application [here](http://prisma-edge-functions.vercel.app/) and the completed project on [GitHub](https://github.com/prisma/prisma-edge-functions). + +The demo application that is used here is a random quote generator built with Next.js and styled with TailwindCSS. The application will take advantage of Next.js' Edge server rendering and Edge API routes to fetch data from a remote PostgreSQL database on every page refresh. + +The final state of application you will be working on will resemble this: + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.40.23.png) + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.44.48.png) + +The application contains a single model called Quote with the following fields: + +```prisma +// schema.prisma + +model Quote { + id Int @id @default(autoincrement()) + content String + author String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} +``` + +### Prerequisites + +To successfully follow along, you will need: +- Node.js +- A cloud-hosted [PostgreSQL](https://postgresql.org/) database ([set up a free PostgreSQL database on Supabase](https://dev.to/prisma/set-up-a-free-postgresql-database-on-supabase-to-use-with-prisma-3pk6) or on [Neon](https://neon.tech/)) +- A [GitHub](https://github.com/) account to host your application code +- A [Prisma Data Platform](https://console.prisma.io/) account to provision a Prisma Accelerate project +- A [Vercel](http://vercel.com/) account to deploy the app + +### Clone application + +Navigate to your directory of choice and run the following command to set up a new Next.js project: + +```bash copy +npx create-next-app --example https://github.com/prisma/prisma-edge-functions/tree/starter prisma-edge-functions +``` + +Navigate into the directory: + +```bash copy +cd prisma-edge-functions +``` + +The page and API Route are also configured to use Vercel’s [Edge Runtime](https://nextjs.org/docs/api-reference/edge-runtime) with the following configuration in both files: + +```ts +export const config = { + runtime: 'experimental-edge', +} +``` + +### Set up the database + +You can use a free PostgreSQL database hosted on Supabase or Neon. + +Once you’ve set up the database, update the `.env` file at the root of your project with the database’s connection string: + +``` +# .env + +DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE" +``` + +With the `DATABASE_URL` environment variable set, apply the existing Prisma schema to your database schema using the `prisma migrate dev` command. The `prisma migrate dev` command will apply any pending migration in the `/prisma/migrations` folder against your database. + +```bash +npx prisma migrate dev +``` + +Next, populate the database with sample data. The project contains a seed script in the `./prisma/seed.ts` file and sample data in `./prisma/data.json`. The sample data includes 178 quotes. + +```bash +npx prisma db seed +``` + +You should see the following output: + +```bash +Environment variables loaded from .env +Running seed command `ts-node prisma/seed.ts` ... +[Elevator Music Cue] 🎸 +Done 🎉 + +🌱 The seed command has been executed. +``` + +### Set up Prisma Accelerate + +Navigate to [GitHub](https://www.github.com) and create a private repository: + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_15.46.25.png) + +Next, initialize your repository and push your changes to GitHub: + +```bash +git init +git remote add origin https://github.com//prisma-edge-functions +git add . +git commit -m "initial commit" +git push -u origin main +``` + +> **Note**: Replace the `` placeholder value with your GitHub username before pasting the value on your terminal. + +Once you’ve set up your repository, navigate to the [Platform Console](https://console.prisma.io/) and sign up for a free account if you don’t have one yet. + + +After signing up: + +1. Create a new project by clicking the **New project** button + ![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/create-project.png) + +2. Fill out your **Project’s name** and the click the **Create Project** button + ![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/name-your-project.png) + +3. Enable Accelerate by clicking the **Enable Accelerate** button + ![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/project-dashboard.png) + +4. Add your database connection string to the **Database connection string** field and select a region close to your database from the **Region** drop down + ![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/add-database-url.png) + +5. Generate an Accelerate connection string by clicking the **Generate API key** button + +6. Copy the generated Accelerate connection string + +Accelerate has been successfully setup 🎉! + +### Update your application code + +Back in your project, rename the existing `DATABASE_URL` to `MIGRATE_DATABASE_URL` and paste the Prisma Accelerate URL into your `.env` file as the new `DATABASE_URL`: + +```bash +DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__" +MIGRATE_DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE" +``` + +> The `MIGRATE_DATABASE_URL` variable will be used to apply any pending migrations during the build process. +The `package.json` file uses the `vercel-build` hook script to run `prisma migrate deploy && next build` + +Then install the [Prisma Accelerate client extension](https://www.npmjs.com/package/@prisma/extension-accelerate): + +```bash +npm i @prisma/extension-accelerate +``` + +Next, generate Prisma Client that will connect through Prisma Accelerate using HTTP: + +```bash +npx prisma generate --no-engine +``` + +Then, navigate to `lib/prisma` and update Prisma Client’s import from `@prisma/client` to `@prisma/client/edge` to be make it compatible with edge environments: + +```ts diff +// lib/prisma.ts +-import { PrismaClient } from "@prisma/client"; ++import { PrismaClient } from "@prisma/client/edge"; ++import { withAccelerate } from "@prisma/extension-accelerate"; + +import { PrismaClient } from '@prisma/client' + +const prismaClientSingleton = () => { + +- return new PrismaClient() ++ return new PrismaClient().$extends(withAccelerate()) +} + +declare global { + var prisma: undefined | ReturnType +} + +const prisma = globalThis.prisma ?? prismaClientSingleton() + +export default prisma + +if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma +``` + +### Test the application locally + +Now that setup is done, you can start up your application locally: + +```bash +npm run dev +``` + +Navigate to [`http://localhost:3000`](http://localhost:3000), and this is what it might look like at the moment. + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-11_at_16.53.33.png) + +The quote you will see might be different because the quote is selected randomly. You can hit **Another one 🔄** to refresh the page with a new quote. + +You can also navigate to [`http://localhost:3000/api/quote`](http://localhost:3000/api/quote) to get a random quote in JSON format. + +## Deploy the application + +Commit the existing changes to version control and push them to GitHub. + +``` +git add . +git commit -m "update prisma client" +git push +``` + +Navigate to [Vercel](https://vercel.com/new) and import your GitHub repository. + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_16.11.16.png) + +Give your project a name and open up the **Environment Variables** toggle and fill out the following environment variables: + +- `MIGRATE_DATABASE_URL`: the database’s connection string +- `DATABASE_URL`: the Prisma Accelerate connection string +- `PRISMA_GENERATE_NO_ENGINE`: `true` + +> The [`PRISMA_GENERATE_NO_ENGINE`](https://www.prisma.io/docs/orm/reference/environment-variables-reference#prisma_generate_no_engine) can be set to a truthy value to generate a Prisma Client without an included [query engine](https://www.prisma.io/docs/orm/more/under-the-hood/engines#the-query-engine-file) in order to reduce deployed application size when paired with Prisma Accelerate. + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/set_env_variables_and_deploy.png) + +Finally, click **Deploy** to kick off the build: + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_16.13.16.png) + +### Congratulations + +Once the build is successful, you should see the following: + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_21.09.08.png) + +Click the **Visit** button to view the deployed version of the application. + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.40.23.png) + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.44.48.png) + +Back on the Vercel dashboard in the **Overview** tab, click **View Function Logs**. Next, select the “index” function. You will see that your application’s runtime is **Edge** and the Region is **Global**. + +![](/database-access-on-the-edge-8F0t1s1BqOJE/imgs/Screenshot_2022-07-12_at_17.41.31.png) + +Refresh the page in your application, and back on Vercel, you will see the request’s status logged. + +Congratulations! 🎉  + +## Conclusion + +The Edge enables instant application deployment across the globe, changing how developers think about application development and deployment. + +Prisma Accelerate is one tool that enables developers to build and ship web apps requiring database access on the Edge. + +The Edge is still in its early stages, with a few drawbacks. However, it's exciting to see how building web apps on the Edge will look. diff --git a/apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx b/apps/blog/content/blog/documenting-apis-mjjpZ7E7NkVP/index.mdx similarity index 97% rename from apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx rename to apps/blog/content/blog/documenting-apis-mjjpZ7E7NkVP/index.mdx index b5de669e0d..3eaf6823d0 100644 --- a/apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx +++ b/apps/blog/content/blog/documenting-apis-mjjpZ7E7NkVP/index.mdx @@ -1,12 +1,12 @@ --- title: "5 Tools for Documenting Your Web API" -slug: "documenting-apis-mjjpz7e7nkvp" +slug: "documenting-apis-mjjpZ7E7NkVP" date: "2021-05-06" authors: - "Alex Ruheni" metaTitle: "Learn 5 Tools for Documenting Web APIs" -metaImagePath: "/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" -heroImagePath: "/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" +metaImagePath: "/documenting-apis-mjjpZ7E7NkVP/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" +heroImagePath: "/documenting-apis-mjjpZ7E7NkVP/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" heroImageAlt: "5 Tools for Documenting Your Web API" tags: - "education" @@ -34,7 +34,7 @@ Building an API is half the job. An API lacking documentation would lead to fric Manual updates to documentation are a common problem that exists because they are prone to error. Failing to keep documentation up-to-date creates a point of failure for others who depend on it. ` tag i ``` If your webpage looks like this, congrats! You've successfully set up TailwindCSS! -![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/tailwind-complete.png) +![](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ/imgs/tailwind-complete.png) > **Note**: If not, try restarting your development server and ensure the steps above were followed correctly. @@ -362,7 +362,7 @@ export default App ``` If you head back to your browser you should see a nice box displaying your user's name! The only thing missing at this point is the user's messages. -![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/user-displayed.png) +![](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ/imgs/user-displayed.png) ## Display each user's messages @@ -433,7 +433,7 @@ function UserDisplay({ user }: Props) { ``` Over in your browser, you should now see each user's messages to their right! -![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/messages-displayed.png) +![](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ/imgs/messages-displayed.png) That looks great, however there is one last thing to add. You are building a tree view, so the final piece is to render "branches" that connect each message to its user. @@ -497,7 +497,7 @@ export default MessageDisplay ``` Back over in your browser, you will now see branches for each message! Hover over a message to highlight the branch ✨ -![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/finished-ui.png) +![](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ/imgs/finished-ui.png) ## Summary & What's next diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/index.mdx similarity index 95% rename from apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx rename to apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/index.mdx index a317d9cd40..54ba552972 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/index.mdx @@ -1,13 +1,13 @@ --- title: "End-To-End Type-Safety with GraphQL, Prisma & React: API Prep" -slug: "e2e-type-safety-graphql-react-2-j9meyhy0ej" +slug: "e2e-type-safety-graphql-react-2-j9mEyHY0Ej" date: "2022-08-30" authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: API Prep" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through setting up a TypeScript project, a PostgreSQL database, and Prisma." -metaImagePath: "/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/meta-06962f83ac8be93c511d0ef6cbc29e2cff49e387-1269x715.png" -heroImagePath: "/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/hero-838c88ca3817165045cc051d8845880e5a313baf-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/meta-06962f83ac8be93c511d0ef6cbc29e2cff49e387-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/hero-838c88ca3817165045cc051d8845880e5a313baf-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" @@ -159,7 +159,7 @@ You can now use the following command to run your code: ```shell npm run dev ``` -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/run-dev.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/run-dev.png) ## Set up the database @@ -170,21 +170,21 @@ Head over to [https://railway.app](https://railway.app) and, if you don't alread After creating an account and logging in, you should see a page like this: -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-home.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/railway-home.png) Hit the **New Project** button, or simply click the **Create a New Project** area. You will be presented with a search box and a few common options. Select the **Provision PostgreSQL** option. -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-postgres-option.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/railway-postgres-option.png) The option selected above creates a new PostgreSQL database and deploys it. Once the server is ready, you should see your provisioned database on the screen. Click the **PostgreSQL** instance. -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-new-db.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/railway-new-db.png) That will open up a menu with a few different tabs. On the **Connect** tab, you will find your database's connection string. Take note of where to find this string as you will need them in just a little while. -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-connect.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/railway-connect.png) ## Set up Prisma @@ -310,7 +310,7 @@ The above command will create a new migration file named `init`, apply that migr If you head back over to the Railway UI, in the **Data** tab you should see your tables listed. If so, the migration worked and your database is ready to be put to work! -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-tables.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/railway-tables.png) ### Seed the database 🌱 @@ -407,7 +407,7 @@ npx prisma db seed ``` After running the script, if you head back to the Railway UI and into the **Data** tab, you should be able to navigate through the newly added data. -![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-data.png) +![](/e2e-type-safety-graphql-react-2-j9mEyHY0Ej/imgs/railway-data.png) ## Summary & What's next diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/index.mdx similarity index 97% rename from apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx rename to apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/index.mdx index d126a9c580..b85f2d7b9e 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/index.mdx @@ -1,13 +1,13 @@ --- title: "End-To-End Type-Safety with GraphQL, Prisma & React: GraphQL API" -slug: "e2e-type-safety-graphql-react-3-fbv2zvigwg" +slug: "e2e-type-safety-graphql-react-3-fbV2ZVIGWg" date: "2022-08-29" authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: GraphQL API" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through building a type-safe GraphQL API" -metaImagePath: "/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/meta-c8b654f7165277e7cf2cfde5311381d601463251-1269x715.png" -heroImagePath: "/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/hero-78bb7b87f2bf7e691114b2768df5ddfe12e00934-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/meta-c8b654f7165277e7cf2cfde5311381d601463251-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/hero-78bb7b87f2bf7e691114b2768df5ddfe12e00934-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" @@ -120,7 +120,7 @@ If you start up your server, you will have access to a running _(empty)_ GraphQL ```shell npm run dev ``` -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/yoga-start.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/yoga-start.png) > **Note**: The GraphQL server is up and running, however it is not usable because you have not yet defined any queries or mutations. @@ -265,7 +265,7 @@ npm run build ``` When you run the command above, you should see that Prisma Client and the Pothos integration were both generated. -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/generate.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/generate.png) Now that those types are generated, head over to `src/builder.ts`. Here you will import the `PrismaPlugin` and the generated Pothos types and apply them to your builder: @@ -288,7 +288,7 @@ builder.addScalarType("Date", DateResolver, {}); ``` As soon as you add the generated types, you will notice a TypeScript error occur within the instantiation of the `SchemaBuilder`. -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-type-required.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/prisma-type-required.png) Pothos is smart enough to know that, because you are using the Prisma plugin, you need to provide a `prisma` instance to the builder. This is used by Pothos to infer information about the types in your Prisma Client. In the next step you will create and add that instance to the builder. @@ -312,7 +312,7 @@ export const builder = new SchemaBuilder<{ ``` You will, again, see a TypeScript error at this point. This is because the `builder` now expects an instance of Prisma Client to be provided to the function. -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-client-required.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/prisma-client-required.png) In the next step, you will instantiate Prisma Client and provide it here in the `builder`. @@ -401,7 +401,7 @@ import { builder } from "../builder"; +builder.prismaObject("User", {}) ``` > **Note**: If you press Ctrl + Space within an empty set of quotes before typing in the `name` field, you should get some nice auto-completion with a list of available models from your Prisma schema thanks to the Prisma plugin. -> ![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/model-auto.png) +> ![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/model-auto.png) Within the `options` object, add a `fields` key that defines the `id`, `name` and `messages` fields using Pothos's ["expose"](https://pothos-graphql.dev/docs/guide/fields#exposing-fields-from-the-underlying-data) functions: @@ -846,17 +846,17 @@ npm run dev ``` After running the above command, open up [http://localhost:4000/graphql](http://localhost:4000/graphql) in your browser to access the GraphQL playground. You should be presented with a page that looks like this: -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/playground.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/playground.png) In the top-left corner of the screen, hit the **Explorer** button to see your API's available queries and mutations: -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/explorer.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/explorer.png) If you click on the **users** query type, the right side of the screen will be automatically populated with a query for your user data. Run that query by hitting the "execute query" button to see the API in action: -![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/data.png) +![](/e2e-type-safety-graphql-react-3-fbV2ZVIGWg/imgs/data.png) Feel free to play around with the different options to choose which fields you would like to query for and which data from the "messages" relation you would like to include. diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-4-JaHA8GbkER/index.mdx similarity index 93% rename from apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx rename to apps/blog/content/blog/e2e-type-safety-graphql-react-4-JaHA8GbkER/index.mdx index 30d741930b..54c87cff14 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-4-JaHA8GbkER/index.mdx @@ -1,13 +1,13 @@ --- title: "End-To-End Type-Safety with GraphQL, Prisma & React: Codegen & Deployment" -slug: "e2e-type-safety-graphql-react-4-jaha8gbker" +slug: "e2e-type-safety-graphql-react-4-JaHA8GbkER" date: "2022-09-01" authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: Codegen & Deployment" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through setting up code generation to allow you to keep your TypeScript types in sync across your frontend and API. You will also deploy your completed project." -metaImagePath: "/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/meta-42c1cab53d152b8e3e634d75bc70b9d624431cf7-1269x715.png" -heroImagePath: "/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/hero-b277fdcfbb2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/meta-42c1cab53d152b8e3e634d75bc70b9d624431cf7-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/hero-b277fdcfbb2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" @@ -85,17 +85,17 @@ To follow along with the examples provided, you will be expected to have: Currently, Prisma generates a set of TypeScript types based off of your database schema. Pothos uses those types to help build GraphQL type definitions. The result of those two pieces is a GraphQL schema: -![GraphQL API Type Flow](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/2.png) +![GraphQL API Type Flow](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/2.png) Your frontend project currently has a set of manually defined types, which were built in the first section of this series. These are "compatible with" the types in your API, but not directly related: -![React Application Types](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/3.png) +![React Application Types](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/3.png) Until now, this worked fine. But what happens if a new field is introduced, updated, or removed form the API? Your frontend application would have no idea a change occurred in the API and the type definitions in the two projects would become out of sync. How can you be sure a `user` object you retrieve over the network, for example, will contain all of the fields your React application is expecting? This is where [GraphQL Codegen](https://www.graphql-code-generator.com/) comes in: -![Fullstack Type Flow](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/1.png) +![Fullstack Type Flow](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/1.png) GraphQL Codegen will generate TypeScript types and query helpers in your React project based off of your GraphQL schema and the queries you write in your frontend application. @@ -217,7 +217,7 @@ npm run codegen ``` You should see output similar to this: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/codegen.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/codegen.png) As configured in your `codegen.yml` file, you will find a new file in `src/graphql` named `generated.ts`. @@ -339,7 +339,7 @@ export type User = GetUsersQuery["users"][0]; ``` If you head over to `src/components/UserDisplay.tsx` and inspect the type being used for the `user` prop, you will now see it uses the type generated from your GraphQL query and API: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/generated-types.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/generated-types.png) You now have almost every piece of the end-to-end type-safety puzzle put in place. Your types are in sync from your database all the way to your frontend application. @@ -467,7 +467,7 @@ export default App ``` Notice your API request results are properly typed based off of the types within the API itself! If both your API and Client are running, head over to the browser. You should now see all of your data! -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/finished.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/finished.png) Congrats! 🎉 At this point, you have implemented a completely end-to-end type safe application with two separate pieces: an API and the client. @@ -481,15 +481,15 @@ You will be using [Render](https://render.com/) to deploy both of your codebases In the top left corner of the home page, hit the **New** button to create a new repository: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/github-new.png) Give your repository a name and then hit **Create repository**: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-create.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/github-create.png) You will need to retrieve the SSH url for this repository to use later on. Grab that from the location shown below: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/url-github.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/url-github.png) Now within your React application, run the follwing command to initialize and push a local repository, replacing `` with the SSH url: @@ -516,15 +516,15 @@ git push -u origin main Next, you will repeat these steps for your API's codebase. Create another new repository from your Github dashboard: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/github-new.png) Title the repository and hit **Create repository**: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/github-api.png) You should again see a page with some setup instructions. Grab the SSH url from the same location as before: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api-url.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/github-api-url.png) Finally, navigate via the terminal into your GraphQL API's codebase and run the following set of commands. Again, replace `` with your SSH url: @@ -556,11 +556,11 @@ Head over to [Render](https://render.com) and create a free account if you do no The first thing you will deploy is your GraphQL API. On your dashboard, hit the **New Web Service** button, which will allow you to deploy a Node.js application: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-web-service.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-web-service.png) On this page, if you haven't already, click **+ Connect account** under the **Github** header to give Render access to list your Github repositories: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-connect.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-connect.png) After connecting your account, you should see your repositories available under the **Connect a repository** header. Choose your GraphQL API repository. @@ -575,24 +575,24 @@ You will be prompted for a few different options: Beneath those options, choose the **Free** plan: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-free.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-free.png) Expand the **Advanced** section near the bottom of the page. Here you will define an environment variable that will hold your database URL. Click the **Add Environment Variable** button and add a variable named `DATABASE_URL` whose value is the connection string to your Postgres database: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-connection.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-api-connection.png) Finally, at the bottom of the page, hit the **Create Web Service** button: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-deploy-service.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-deploy-service.png) This will trigger the deployment process! Once that finishes deploying, you will be able to access the URL Render provides to see your GraphQL API. Copy the URL from the location shown below and navigate to it in a new browser window at the `/graphql` route: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/api-url.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/api-url.png) ## Deploy the React application @@ -600,7 +600,7 @@ Now that your API is deployed, you will deploy your React application. Head back over to the Render dashboard and hit the **New** button at the top of the page. Choose the **Static Site** option: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-new.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-new.png) Connect this static site to your React application's Github repostory. @@ -613,13 +613,13 @@ You will be prompted again to fill out some details for deploying this applicati Under the **Advanced** section, add an environment variable named `VITE_API_URL` whose value is the URL of your deployed GraphQL API at the `/graphql` route. For example: -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-url.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/render-api-url.png) Finally, hit the **Create Static Site** button at the bottom of the page to deploy the application. When that finishes deploying, head over to the URL available at the top of the page. If all went well, you should see your application is live! -![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/app-complete.png) +![](/e2e-type-safety-graphql-react-4-JaHA8GbkER/imgs/app-complete.png) ## Summary & Final thoughts diff --git a/apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx b/apps/blog/content/blog/elsevier-customer-story-SsAASKagMHtN/index.mdx similarity index 95% rename from apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx rename to apps/blog/content/blog/elsevier-customer-story-SsAASKagMHtN/index.mdx index b7d6e3ad37..7adf6122c5 100644 --- a/apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx +++ b/apps/blog/content/blog/elsevier-customer-story-SsAASKagMHtN/index.mdx @@ -1,13 +1,13 @@ --- title: "How Elsevier Piloted an Innovative Publication Process Quickly and Flexibly with Prisma" -slug: "elsevier-customer-story-ssaaskagmhtn" +slug: "elsevier-customer-story-SsAASKagMHtN" date: "2021-11-15" authors: - "Alex Emerich" metaTitle: "How Elsevier piloted an innovative publication process with Prisma" metaDescription: "Elsevier is a global leader in information and analytics in scientific publishing. Learn how they modernized the publication process efficiently and flexibly with Prisma." -metaImagePath: "/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" -heroImagePath: "/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" +metaImagePath: "/elsevier-customer-story-SsAASKagMHtN/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" +heroImagePath: "/elsevier-customer-story-SsAASKagMHtN/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" heroImageAlt: "Elsevier" tags: - "user-success-story" @@ -21,7 +21,7 @@ With the help of Prisma, Elsevier is in the process of modernizing the scientifi [Elsevier's](https://www.elsevier.com/) mission of helping researchers and healthcare professionals is rooted in publishing and has also evolved into a global leader in information and analytics. With so much health-related information being shared in real time, Elsevier decided it was time to modernize and speed up their existing manual peer review process. -![Peer Review Workflow](/elsevier-customer-story-ssaaskagmhtn/imgs/peer-review-diagram-V3.png) +![Peer Review Workflow](/elsevier-customer-story-SsAASKagMHtN/imgs/peer-review-diagram-V3.png) Building an application to speed up the peer review process would help Elsevier remain a leader in healthcare research. They dedicated a small project team consisting of Serghei Ghidora (Tech Lead), Paul Foeckler (Product Owner), and a UX Designer to develop a minimum viable product (MVP) to make the peer review process faster and more efficient. @@ -115,7 +115,7 @@ The flexibility proved to be a major contributor to a single tech lead producing In addition to Prisma, Serghei utilized several other technologies to achieve their MVP. The project structure looks like the following, with Prisma serving types to multiple apps. -![Elsevier MVP Architecture](/elsevier-customer-story-ssaaskagmhtn/imgs/elsevier-architecture-diagram.png) +![Elsevier MVP Architecture](/elsevier-customer-story-SsAASKagMHtN/imgs/elsevier-architecture-diagram.png) The **Prisma & Nexus** package includes the Prisma schema, migrations and all the generated types that are used across all apps and services. The lambdas import the Prisma client and update resources directly. This arrangement keeps the database and frontend types in sync because of Prisma Client's type-safe database access. diff --git a/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx b/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/index.mdx similarity index 96% rename from apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx rename to apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/index.mdx index 156e7e3c74..1789674e56 100644 --- a/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx +++ b/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/index.mdx @@ -1,12 +1,12 @@ --- title: "Full Stack Type Safety with Angular, Nest, Nx, and Prisma" -slug: "full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc" +slug: "full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc" date: "2021-01-19" authors: - "Ryan Chenkie" metaTitle: "Applying Full Stack Type Safety with Angular, Nest, Nx & Prisma" -metaImagePath: "/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/meta-6edf92a2f15ffb62ed50e0da3deed2b2908d0156-2398x1208.png" -heroImagePath: "/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/hero-2e21e72be724fc37acc24f269c8b6a0628ad5a18-870x438.jpg" +metaImagePath: "/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/meta-6edf92a2f15ffb62ed50e0da3deed2b2908d0156-2398x1208.png" +heroImagePath: "/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/hero-2e21e72be724fc37acc24f269c8b6a0628ad5a18-870x438.jpg" heroImageAlt: "Full Stack Type Safety with Angular, Nest, Nx, and Prisma" tags: - "education" @@ -28,7 +28,7 @@ In this article, we'll look at how we can use the types generated by Prisma to a Check out the [code for the project on GitHub](https://github.com/chenkie/shirt-shop). -![Products from ShirtShop](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png) +![Products from ShirtShop](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-10.png) ## Create an Nx Workspace @@ -47,7 +47,7 @@ npx create-nx-workspace --preset=angular An interactive prompt takes us through the setup process. Select a name for the workspace and application and then continue through the prompts. -![Interactive prompts for setting up an Nx workspace](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-1.png) +![Interactive prompts for setting up an Nx workspace](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-1.png) Once Nx finishes wiring up the workspace, open it up and try running the Angular application. @@ -60,7 +60,7 @@ npm start This command will tell Nx to serve the Angular application that was created as the workspace initialized. After it compiles, open up `localhost:4200` to make sure everything is working. -![The Angular application running on localhost:4200](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-2.png) +![The Angular application running on localhost:4200](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-2.png) ## Add a NestJS Application @@ -190,17 +190,17 @@ npx prisma studio Running this command will open Prisma Studio. In the browser, it opens at `localhost:5555`. -![Prisma Studio running at localhost:5555](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-4.png) +![Prisma Studio running at localhost:5555](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-4.png) We can use Prisma Studio to add data to the database manually. This isn't a great approach if we have a lot of data to seed, but it's useful if we want to add a few records to test with. Add as many rows as you like and input data for them. If you would like to work with the data seen in this article, you can grab it in [this gist](https://gist.github.com/chenkie/9bd80bc2767e72f71582a02e05c7f853). -![New rows in Prisma Studio](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-5.png) +![New rows in Prisma Studio](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-5.png) Next, save the changes. IDs for each row will automatically be generated. -![Saved data in Prisma Studio](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-6.png) +![Saved data in Prisma Studio](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-6.png) We now have all the pieces of our stack in place! We're ready to start writing some code to surface the data from the API and call for it from the Angular app. @@ -300,11 +300,11 @@ export class AppModule {} Now head over to the browser and test it out by going to `http://localhost:3333/api/products`. -![Products data from the API](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-7.png) +![Products data from the API](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-7.png) It may not be very apparent at this point, but our endpoint has a layer of type safety applied to it that can help us out if we need to manipulate and/or modify data before it is returned to the client. For example, if we need to map over our data and get access to its properties, we now have full autocompletion enabled when we do so. This occurs because we told the `getProducts` method in the `ProductsService` that the return type is a `Promise` that resolves with an array of type `Product`. -![Autocompletion on the Product type](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-8.png) +![Autocompletion on the Product type](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-8.png) Now that we have the API working, let's wire up the Angular application to make a call for this data and display it! @@ -563,7 +563,7 @@ export class ProductsComponent implements OnInit { This is another spot where we're using our `Product` type from `@prisma/client` to give ourselves type safety. Applying this type directly to the `$products` observable means that we can get autocompletion in our Angular templates. -![Autocompletion in the Angular template](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-9.png) +![Autocompletion in the Angular template](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-9.png) With our component in place, we're now ready to call it from the `shirt-shop` app and display the results! @@ -577,7 +577,7 @@ Open up `apps/shirt-shop/src/app/app.component.html` and include the `Products` ``` -![Products from ShirtShop](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png) +![Products from ShirtShop](/full-stack-typesafety-with-angular-nest-nx-and-prisma-CcMK7fbQfTWc/imgs/nx-prisma-10.png) ## Going Beyond Displaying Data diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/index.mdx similarity index 98% rename from apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx rename to apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/index.mdx index bbb8c92222..dfa1d1ad6b 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/index.mdx @@ -1,13 +1,13 @@ --- title: "Build A Fullstack App with Remix, Prisma & MongoDB: Authentication" -slug: "fullstack-remix-prisma-mongodb-2-ztmoy58p4re8" +slug: "fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8" date: "2022-04-26" authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB - Authentication" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be setting up authentication for our Remix application using session-based authentication." -metaImagePath: "/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/meta-4b70ee51aee99eaddac2a48baa614189c5fa74c2-1920x1080.png" -heroImagePath: "/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/hero-29016ded5a59403f81349c8247116f8f084a0ae2-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/meta-4b70ee51aee99eaddac2a48baa614189c5fa74c2-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/hero-29016ded5a59403f81349c8247116f8f084a0ae2-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: Authentication" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" @@ -86,7 +86,7 @@ The default export of a route file is the component Remix renders into the brows Start the development server using `npm run dev` and navigate to [`http://localhost:3000/login`](http://localhost:3000/login), and you should see the route rendered. -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/initial-login.png) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/initial-login.png) This works, but doesn't look very nice yet... Next you will spruce it up a bit by adding an actual sign in form. @@ -193,7 +193,7 @@ export default function Login() { ) } ``` -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/login-form.png) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/login-form.png) At this point, you don't need to worry about where the `
`'s action is pointing, just that it has a `method` value of `"post"`. Later on you will check out some cool Remix magic that sets up the action for us! @@ -373,7 +373,7 @@ This new button has a `name` and a `value` attribute. The value is set to whatev Depending on the form you have selected, you should now see updated messages. Give this a try by clicking the "Sign Up" and "Sign In" buttons a few times. -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle-incomplete.gif) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/form-toggle-incomplete.gif) ### Add toggleable fields @@ -435,7 +435,7 @@ Two changes were made here: Your sign in and sign up forms are now visually complete! It's time to move on to the next piece: making the form functional. -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle.gif) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/form-toggle.gif) ## The authentication flow @@ -452,7 +452,7 @@ Authentication will be session-based, following the same patterns used in the [a To better visualize what the flow of your app's authentication will look like, take a look at the graphic below. -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/auth-flow.png) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/auth-flow.png) There will be a series of steps to take in order to authenticate a user, with two potential pathways (_sign in_ and _sign up_): @@ -633,7 +633,7 @@ This `createUser` function does a couple of things: > **Note**: You were able to fill in the details of the `profile` embedded document directly in this query by passing in a JSON object, and you will see some nice autocompletion because of the typings Prisma generates. -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/embedded-doc-helpers.png) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/embedded-doc-helpers.png) This function will be used in your `register` function to handle the actual creation of a user. Over in `app/utils/auth.server.ts` import the new `createUser` function and invoke it within the `register` function. @@ -954,7 +954,7 @@ In order to actually trigger this action, the forms need to post to this route. If you try to log in or create an account, you should see you are sent to the main screen afterwards. Success! 🎉 -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/signin-success.gif) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/signin-success.gif) ### Authorize users on private routes @@ -1224,7 +1224,7 @@ diff // app/routes/login.tsx ``` Now you should see error messages and form resets working properly on your sign up and sign in forms! -![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/error-message.png) +![](/fullstack-remix-prisma-mongodb-2-ZTmOy58p4re8/imgs/error-message.png) ## Summary & What's next diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/index.mdx similarity index 97% rename from apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx rename to apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/index.mdx index 5e57bbb195..a860656291 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/index.mdx @@ -1,13 +1,13 @@ --- title: "Build A Fullstack App with Remix, Prisma & MongoDB: CRUD, Filtering & Sorting" -slug: "fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v" +slug: "fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v" date: "2022-04-27" authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB: CRUD, Filtering & Sorting" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be building the functionality that allows users to send kudos to each other along with some searching and sorting options." -metaImagePath: "/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/meta-ec93dfa6d5929320447e9fa9610b276088e86dd8-1920x1080.png" -heroImagePath: "/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/hero-45f6a2c1b0de348ea063b18dba5fb66f7dbb7594-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/meta-ec93dfa6d5929320447e9fa9610b276088e86dd8-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/hero-45f6a2c1b0de348ea063b18dba5fb66f7dbb7594-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: CRUD, Filtering & Sorting" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" @@ -118,7 +118,7 @@ The `loader` above will first check if a user is logged in when they hit the `/` If there is a valid session, the `loader` returns a `redirect` to the `/home` page. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/home-initial.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/home-initial.png) ## Add the user list panel @@ -177,7 +177,7 @@ export default function Home() { ``` The code above imports the new component and the `Layout` component, then renders the new component within the layout. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-panel.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/user-panel.png) ### Query for all users and sort the results @@ -235,7 +235,7 @@ export const loader: LoaderFunction = async ({ request }) => { If you had any users in your database and outputted the `users` variable inside of the loader, you should see a list of all users _except yourself_. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/users-logged.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/users-logged.png) > **Note**: The entire `profile` embedded document was retrieved as a nested object without having to explicitly include it. @@ -332,7 +332,7 @@ export function UserPanel({ users }: { users: User[] }) { ``` Beautiful! Your users will now be rendered in a nice column on the left side of the home page. The only non-functional piece of the side panel at this point is the sign out button. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-list.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/user-list.png) ## Add the ability to log out @@ -469,11 +469,11 @@ To create the nested route, first add a new folder in `app/routes` named `home`. Within the new `app/routes/home` directory, create a new file named `kudo.$userId.tsx`. This will allow you to handle the modal component as if it were its own route. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sub-routes.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/sub-routes.png) The `$userId` portion of this file name is a [route param](https://remix.run/docs/en/v1/guides/data-loading#route-params), which acts as a dynamic value you can provide your application via the URL. Remix will then translate that file name to the route: `/home/kudos/$userId` where `$userId` can be any value. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/dynamic-filename.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/dynamic-filename.png) In that new file export a `loader` function and a React component that renders some text to make sure the dynamic value is working: @@ -526,7 +526,7 @@ export default function Home() { ``` If you head over to [http://localhost:3000/home/kudo/123](http://localhost:3000/home/kudo/123), you should now see the text "User: 123" displayed at the very top of the page. If you change the value in the URL to something other than `123` you should see that change reflected on the screen. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/nested-route.png) ### Fetch a user by their id @@ -598,7 +598,7 @@ export function UserPanel({ users }: props) { ``` Now when your users click on another user in that panel, they will be navigated to a sub-route with that user's information. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route-names.gif) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/nested-route-names.gif) If that all looks good, the next step is building the modal component that will display your form. @@ -606,7 +606,7 @@ If that all looks good, the next step is building the modal component that will To build this modal you will first need to build a helper component that creates a [portal](https://reactjs.org/docs/portals.html), which allows you to render a child component somewhere outside of the parent's document object model (DOM) branch while still allowing the parent component to manage it as if it were a direct child. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal-diagram.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/portal-diagram.png) > **Note**: This portal will be important because it will allow you to render the modal in a location that does not have any inherited styles or positioning from a parent that could affect the positioning of the modal. @@ -688,7 +688,7 @@ export default function KudoModal() { ``` If you navigate to your nested route, you will see a `div` with an `id` of `"kudo-modal"` is now rendered as a direct child of the `body` rather than where the nested route is being rendered in the DOM tree. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal.gif) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/portal.gif) ### Build the modal component @@ -769,7 +769,7 @@ export default function KudoModal() { ``` The modal should now open up when a user from the side panel is clicked. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/working-modal.gif) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/working-modal.gif) Your form will need the logged in user's information when it displays a preview of the message, so before building the form add that data to the response from the `loader` function: @@ -1045,7 +1045,7 @@ export default function KudoModal() { ``` The select boxes will now appear with all of the possible options. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/select-boxes.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/select-boxes.png) ## Add a kudo display component @@ -1117,7 +1117,7 @@ export default function KudoModal() { ``` The preview will now be rendered, displaying the currently logged in user's information and the styled message they are going to send. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-preview.gif) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/kudo-preview.gif) ### Build the action to send kudos @@ -1330,7 +1330,7 @@ The `Kudo` and `Profile` types generated by Prisma are combined to create a `Kud If you send a couple of kudos to an account and log in to that account, you should now see a rendered list of kudos on your feed. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-feed.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/kudo-feed.png) You may notice when `getFilteredKudos` invocation is providing empty objects for the sort and filter options. This is because there is not yet a way in the UI to filter or sort the feed. Next, you will create the search bar at the top of the feed to handle this. @@ -1421,7 +1421,7 @@ export default function Home() { ) } ``` -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/search-bar.png) These changes will handle filtering the feed, however you also want to sort the feed by various columns. @@ -1478,7 +1478,7 @@ export function SearchBar() { ``` Now you should see a dropdown available in the search bar with your options. -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar-sort.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/search-bar-sort.png) ### Build the search bar action @@ -1551,7 +1551,7 @@ The code above: Now if you submit form you should see your results reflected on the feed! -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sorting-functional.gif) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/sorting-functional.gif) ## Display the most recent kudos @@ -1665,7 +1665,7 @@ export default function Home() { ``` With that, your home page is complete and you should see a list of the three most recent kudos sent in your application! -![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/recent-kudos.png) +![](/fullstack-remix-prisma-mongodb-3-By5pmN5Nzo1v/imgs/recent-kudos.png) ## Summary & What's next diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/index.mdx similarity index 89% rename from apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx rename to apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/index.mdx index 684f37c76c..779adf24e8 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/index.mdx @@ -1,13 +1,13 @@ --- title: "Build A Fullstack App with Remix, Prisma & MongoDB: Deployment" -slug: "fullstack-remix-prisma-mongodb-5-gohqsnfupxsx" +slug: "fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx" date: "2022-04-29" authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB - Deployment" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be deploying the application we have built throughout this series." -metaImagePath: "/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/meta-0c44161122fc6096b266ce2463146d441aef52f4-1920x1080.png" -heroImagePath: "/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/hero-a00a8da49b238e170ebeea1caa4d9a67fec1db3d-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/meta-0c44161122fc6096b266ce2463146d441aef52f4-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/hero-a00a8da49b238e170ebeea1caa4d9a67fec1db3d-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: Deployment" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" @@ -58,15 +58,15 @@ The first step in this process is making sure your project is hosted on GitHub. If you do need to set up your codebase in a repository, you will first need to sign in to [GitHub](https://github.com/). Once on GitHub's home page, click the green **New** button at the top left of the screen to create a new repository. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/new-repo.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/new-repo.png) That will take you a page where you are asked for some details and options to configure about the repository. Fill those out however you would like and hit the **Create repository** button at the bottom. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/create-repo.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/create-repo.png) After creating the repository, you will land in the repository page with a _Quick setup_ section at the top of the view. This section will have a connection string which you will use to push your codebase to the repository. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-url.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/repo-url.png) In a terminal, navigate to the kudos project in your file system and run the following commands, providing the URL for your repository: @@ -80,7 +80,7 @@ git push -u origin main ``` Once that finishes, head over to the repository page on GitHub. You should see your codebase has been pushed up and made available on GitHub. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-pushed.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/repo-pushed.png) ## Set up your project in Vercel @@ -88,13 +88,13 @@ Next, log in to your account on [Vercel](https://vercel.com/login?). If you don' Once you have signed in, on your dashboard you will see a **New Project** button. Hit that button to start configuring your project. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-new.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/vercel-new.png) On this page you will be asked to import a GitHub repository or choose a pre-made template. If you haven't already linked your GitHub account to your Vercel account you will do so here as will. Select your project's repository from the list of repos under _Import Git Repository_. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-repos.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/vercel-repos.png) After you click **Import** on your repository you will be brought to a page where you can configure the project and deploy it. @@ -106,7 +106,7 @@ Inside of the **Environment Variables** block you have the ability to add your e These will correlate to the variables you've set up in your project's `.env` file. Add all of your environment variables here. As an example, in the image below the information is filled out the for the `DATABASE_URL` variable. Hit **Add** after filling out the form for each variable. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-env.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/vercel-env.png) ## Deploy @@ -114,11 +114,11 @@ Once all of your environment variables are configured, go ahead and click the ** Clicking this button will kick off the application's build process, run any checks that need to be made, and deploy the application with a URL provisioned by Vercel. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deploying.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/vercel-deploying.png) When the deployment is finished, if you head back over to the dashboard you should see your kudos project available and accessible at the provisioned domain. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deployed-dash.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/vercel-deployed-dash.png) If you click the **Visit** button on this page, you should be navigated to the live version of your site! Congrats! @@ -126,7 +126,7 @@ If you click the **Visit** button on this page, you should be navigated to the l You aren't quite done yet, however. You may notice if you attempt to sign in or sign up on your live site, you receive a nasty error. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/kudos-error.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/kudos-error.png) This is due to the fact that your MongoDB database is still configured to only be accessible from _your development machine's IP address_. @@ -136,11 +136,11 @@ That will need to be opened up to allow _any_ IP address connections since Verce Open up the MongoDB dashboard and navigate to the **Network Access** tab on the left-hand menu. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/mongodb-network.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/mongodb-network.png) Here you will find a green button labeled **ADD IP ADDRESS**. Click that and you will be shown the modal below. -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/ip-modal.png) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/ip-modal.png) In this modal, hit the **ALLOW ACCESS FROM ANYWHERE** button and then hit the green **Confirm** button at the bottom. @@ -148,13 +148,13 @@ This will open up your database to connections from any IP address, allowing you Now if you head back to your deployed application and attempt a sign in or sign up, you should now be able to complete the action successfully! -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/success.gif) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/success.gif) ## Summary & Final remarks Congratulations! 🎉 -![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/congrats.gif) +![](/fullstack-remix-prisma-mongodb-5-gOhQsnfUPXSx/imgs/congrats.gif) Throughout this series you: diff --git a/apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx b/apps/blog/content/blog/grover-customer-success-story-nxkWGcGNuvFd/index.mdx similarity index 96% rename from apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx rename to apps/blog/content/blog/grover-customer-success-story-nxkWGcGNuvFd/index.mdx index c299b2b7ac..4735d962ef 100644 --- a/apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx +++ b/apps/blog/content/blog/grover-customer-success-story-nxkWGcGNuvFd/index.mdx @@ -1,13 +1,13 @@ --- title: "How Grover Moves Faster with Prisma" -slug: "grover-customer-success-story-nxkwgcgnuvfd" +slug: "grover-customer-success-story-nxkWGcGNuvFd" date: "2021-05-10" authors: - "Ryan Chenkie" metaTitle: "How Grover Moves Faster and is More Productive with Prisma" metaDescription: "Grover has many individual development teams that each work in slightly different stacks. Prisma is catching on as a way to help their teams move faster and be more confident in their code." -metaImagePath: "/grover-customer-success-story-nxkwgcgnuvfd/imgs/meta-cb121051733205088c9beee9cc8b5b4553e3988a-1692x852.png" -heroImagePath: "/grover-customer-success-story-nxkwgcgnuvfd/imgs/hero-3fcd833a161c68af69d2c13eafb3369f343e0856-844x474.svg" +metaImagePath: "/grover-customer-success-story-nxkWGcGNuvFd/imgs/meta-cb121051733205088c9beee9cc8b5b4553e3988a-1692x852.png" +heroImagePath: "/grover-customer-success-story-nxkWGcGNuvFd/imgs/hero-3fcd833a161c68af69d2c13eafb3369f343e0856-844x474.svg" heroImageAlt: "How Grover Moves Faster with Prisma" tags: - "user-success-story" @@ -35,7 +35,7 @@ Specifically for their Apollo Federation, Grover has 14 unique services develope Languages used across the teams include TypeScript, Ruby, and Python. Some teams use [TypeGraphQL](https://typegraphql.com/), while others use [Nexus](https://nexusjs.org/). -![Overview of Grover's Apollo federated GraphQL API](/grover-customer-success-story-nxkwgcgnuvfd/imgs/KZX2GIV.png) +![Overview of Grover's Apollo federated GraphQL API](/grover-customer-success-story-nxkWGcGNuvFd/imgs/KZX2GIV.png) ## Experimentation Encouraged @@ -130,7 +130,7 @@ Prisma Migrate offers another powerful glimpse. With Migrate, a few commands wil Since Prisma is useful anywhere you can install a node module, it fits in perfectly with the various stacks in use at Grover. -![Grover has 14 different services using various tech stacks](/grover-customer-success-story-nxkwgcgnuvfd/imgs/eSb3LiB.png) +![Grover has 14 different services using various tech stacks](/grover-customer-success-story-nxkWGcGNuvFd/imgs/eSb3LiB.png) ## Conclusion diff --git a/apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx b/apps/blog/content/blog/how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q/index.mdx similarity index 93% rename from apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx rename to apps/blog/content/blog/how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q/index.mdx index 3906d6b53e..68867446af 100644 --- a/apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx +++ b/apps/blog/content/blog/how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q/index.mdx @@ -1,13 +1,13 @@ --- title: "How migrating from Sequelize to Prisma allowed Invisible to scale" -slug: "how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q" +slug: "how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q" date: "2021-07-06" authors: - "Vladi Stevanovic" metaTitle: "The migration to Prisma was so smooth that none of their hundreds of agents and customers experienced any downtime." metaDescription: "Invisible combines best-in-class, easy to implement, scalable automation solutions. Prisma was crucial in future proofing their stack and supporting its scale." -metaImagePath: "/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/meta-86c169055f2cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png" -heroImagePath: "/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/hero-6c079320ad9b2a389f2419759abe8b2089f4b2d4-870x438.png" +metaImagePath: "/how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q/imgs/meta-86c169055f2cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png" +heroImagePath: "/how-migrating-from-Sequelize-to-Prisma-allowed-Invisible-to-scale-i4pz2mwu6q/imgs/hero-6c079320ad9b2a389f2419759abe8b2089f4b2d4-870x438.png" heroImageAlt: "How migrating from Sequelize to Prisma allowed Invisible to scale" tags: - "user-success-story" @@ -26,7 +26,7 @@ However, by themselves, both these solutions are insufficient. Every enterprise [Invisible solved this problem with Worksharing](https://www.youtube.com/playlist?list=PL4135pGQh8yvHRwKatYrMDuKL7ODHBXHI). It combines the best elements of BPOs and RPAs, without losing the crucial component of human discretion. */} +{/*