gitextract_60zq8mk5/ ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── BUG_REPORT.yml │ │ └── FEATURE_REQUEST.yml │ ├── dependabot.yml │ └── workflows/ │ ├── bruno-check.yml │ ├── codeql.yml │ ├── deploy-docs.yml │ └── spammy-guardian.yml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── assets/ │ ├── media/ │ │ ├── conduit-logo.svg.generate.ts │ │ └── mobile_icons/ │ │ ├── ios/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── README.md │ │ └── watchkit/ │ │ └── AppIcon.appiconset/ │ │ └── Contents.json │ └── theme/ │ └── styles.css ├── docs/ │ ├── .gitignore │ ├── .vscode/ │ │ ├── extensions.json │ │ └── launch.json │ ├── README.md │ ├── astro.config.mjs │ ├── non-included/ │ │ └── LICENSES_LOGOS.md │ ├── package.json │ ├── src/ │ │ ├── content/ │ │ │ ├── config.ts │ │ │ └── docs/ │ │ │ ├── community/ │ │ │ │ ├── authors.md │ │ │ │ ├── resources.md │ │ │ │ └── special-thanks.md │ │ │ ├── implementation-creation/ │ │ │ │ ├── expectations.md │ │ │ │ ├── features.md │ │ │ │ └── introduction.md │ │ │ ├── index.mdx │ │ │ ├── introduction.mdx │ │ │ └── specifications/ │ │ │ ├── backend/ │ │ │ │ ├── api-response-format.md │ │ │ │ ├── bruno.md │ │ │ │ ├── cors.md │ │ │ │ ├── endpoints.md │ │ │ │ ├── error-handling.md │ │ │ │ ├── hurl.md │ │ │ │ ├── introduction.md │ │ │ │ ├── postman.md │ │ │ │ └── tests.md │ │ │ ├── frontend/ │ │ │ │ ├── api.md │ │ │ │ ├── routing.md │ │ │ │ ├── styles.md │ │ │ │ ├── templates.md │ │ │ │ └── tests.md │ │ │ └── mobile-specs/ │ │ │ └── introduction.md │ │ ├── env.d.ts │ │ └── tailwind.css │ └── tsconfig.json └── specs/ ├── api/ │ ├── README.md │ ├── bruno/ │ │ ├── articles/ │ │ │ ├── 01-setup-register.bru │ │ │ ├── 02-create-article-with-tags.bru │ │ │ ├── 03-list-all-articles.bru │ │ │ ├── 04-list-by-author.bru │ │ │ ├── 05-list-all-articles-with-auth.bru │ │ │ ├── 06-list-by-author-with-auth.bru │ │ │ ├── 07-list-by-tag.bru │ │ │ ├── 08-list-articles-without-auth.bru │ │ │ ├── 09-get-single-article.bru │ │ │ ├── 10-update-article-body.bru │ │ │ ├── 11-verify-update-persisted.bru │ │ │ ├── 12-update-article-without-taglist-tags-should-be-preserved.bru │ │ │ ├── 13-update-article-remove-all-tags-with-empty-array.bru │ │ │ ├── 14-verify-tags-were-actually-removed.bru │ │ │ ├── 15-update-article-taglist-null-should-be-rejected.bru │ │ │ ├── 16-delete-article.bru │ │ │ └── 17-verify-deletion.bru │ │ ├── auth/ │ │ │ ├── 01-register.bru │ │ │ ├── 02-login.bru │ │ │ ├── 03-get-current-user.bru │ │ │ ├── 04-update-user.bru │ │ │ ├── 05-verify-update-persisted.bru │ │ │ ├── 06-update-user-bio-to-empty-string-should-normalize-to-null.bru │ │ │ ├── 07-verify-empty-string-normalization-persisted.bru │ │ │ ├── 08-restore-bio-then-set-to-null.bru │ │ │ ├── 09-update-user-bio-to-null-should-accept-for-nullable-field.bru │ │ │ ├── 10-verify-null-bio-persisted.bru │ │ │ ├── 11-restore-bio.bru │ │ │ ├── 12-update-user-image.bru │ │ │ ├── 13-verify-image-update-persisted.bru │ │ │ ├── 14-update-image-to-empty-string-should-normalize-to-null.bru │ │ │ ├── 15-verify-image-empty-string-normalization-persisted.bru │ │ │ ├── 16-set-image-then-update-to-null-should-accept-for-nullable-field.bru │ │ │ ├── 17-put-user.bru │ │ │ ├── 18-verify-null-image-persisted.bru │ │ │ ├── 19-update-username-and-email.bru │ │ │ └── 20-verify-username-email-update-persisted.bru │ │ ├── bruno.json │ │ ├── collection.bru │ │ ├── comments/ │ │ │ ├── 01-setup-register.bru │ │ │ ├── 02-setup-create-article.bru │ │ │ ├── 03-create-comment.bru │ │ │ ├── 04-list-comments.bru │ │ │ ├── 05-list-comments-without-auth.bru │ │ │ ├── 06-delete-comment.bru │ │ │ ├── 07-verify-deletion.bru │ │ │ ├── 08-selective-deletion-create-two-comments-delete-one-verify-the-other-remains.bru │ │ │ ├── 09-post-comments.bru │ │ │ ├── 10-verify-two-comments-exist.bru │ │ │ ├── 11-delete-the-first-comment.bru │ │ │ ├── 12-verify-only-the-second-comment-remains.bru │ │ │ └── 13-cleanup.bru │ │ ├── environments/ │ │ │ └── local.bru │ │ ├── errors-articles/ │ │ │ ├── 01-create-article-no-auth.bru │ │ │ ├── 02-get-unknown-slug.bru │ │ │ ├── 03-update-no-auth.bru │ │ │ ├── 04-delete-no-auth.bru │ │ │ ├── 05-get-feed-no-auth.bru │ │ │ ├── 06-favorite-no-auth.bru │ │ │ ├── 07-unfavorite-no-auth.bru │ │ │ ├── 08-setup-register-for-authenticated-error-tests.bru │ │ │ ├── 09-create-article-empty-title.bru │ │ │ ├── 10-create-article-empty-description.bru │ │ │ ├── 11-create-article-empty-body.bru │ │ │ ├── 12-duplicate-titles-are-allowed-each-gets-a-unique-slug.bru │ │ │ ├── 13-post-articles.bru │ │ │ ├── 14-update-unknown-slug.bru │ │ │ ├── 15-favorite-unknown-slug.bru │ │ │ ├── 16-unfavorite-unknown-slug.bru │ │ │ ├── 17-update-unknown-slug.bru │ │ │ ├── 18-delete-unknown-slug.bru │ │ │ ├── 19-cleanup.bru │ │ │ └── 20-delete-slug2.bru │ │ ├── errors-auth/ │ │ │ ├── 01-register-empty-username.bru │ │ │ ├── 02-register-empty-email.bru │ │ │ ├── 03-register-empty-password.bru │ │ │ ├── 04-register-valid-user-for-duplicate-and-login-tests.bru │ │ │ ├── 05-register-duplicate-username.bru │ │ │ ├── 06-register-duplicate-email.bru │ │ │ ├── 07-login-empty-email.bru │ │ │ ├── 08-login-empty-password.bru │ │ │ ├── 09-login-wrong-password.bru │ │ │ ├── 10-get-user-no-auth.bru │ │ │ ├── 11-put-user-no-auth.bru │ │ │ ├── 12-update-email-to-empty-string-should-reject.bru │ │ │ ├── 13-update-username-to-empty-string-should-reject.bru │ │ │ ├── 14-update-email-to-null-should-reject.bru │ │ │ └── 15-update-username-to-null-should-reject.bru │ │ ├── errors-authorization/ │ │ │ ├── 01-register-user-a.bru │ │ │ ├── 02-register-user-b.bru │ │ │ ├── 03-user-a-creates-article.bru │ │ │ ├── 04-user-b-tries-to-delete-403.bru │ │ │ ├── 05-user-b-tries-to-update-403.bru │ │ │ ├── 06-user-a-creates-a-comment-on-the-article.bru │ │ │ ├── 07-user-b-tries-to-delete-a-s-comment-403.bru │ │ │ ├── 08-verify-comment-survived-the-failed-delete.bru │ │ │ └── 09-cleanup-user-a-deletes-article.bru │ │ ├── errors-comments/ │ │ │ ├── 01-post-comment-no-auth.bru │ │ │ ├── 02-delete-comment-no-auth.bru │ │ │ ├── 03-setup-register-create-article.bru │ │ │ ├── 04-post-articles.bru │ │ │ ├── 05-post-comment-empty-body.bru │ │ │ ├── 06-post-comment-on-unknown-article.bru │ │ │ ├── 07-get-comments-on-unknown-article.bru │ │ │ ├── 08-delete-comment-on-unknown-article.bru │ │ │ ├── 09-delete-non-existent-comment-on-existing-article.bru │ │ │ └── 10-cleanup.bru │ │ ├── errors-profiles/ │ │ │ ├── 01-get-unknown-profile.bru │ │ │ ├── 02-follow-no-auth.bru │ │ │ ├── 03-unfollow-no-auth.bru │ │ │ ├── 04-setup-register-for-authenticated-404-tests.bru │ │ │ ├── 05-follow-unknown-user-authed.bru │ │ │ └── 06-unfollow-unknown-user-authed.bru │ │ ├── favorites/ │ │ │ ├── 01-setup-register.bru │ │ │ ├── 02-setup-create-article.bru │ │ │ ├── 03-favorite-article.bru │ │ │ ├── 04-verify-favorite-persists.bru │ │ │ ├── 05-articles-filtered-by-favorited-username.bru │ │ │ ├── 06-articles-filtered-by-favorited-username-with-auth.bru │ │ │ ├── 07-unfavorite-article.bru │ │ │ ├── 08-verify-unfavorite-persists.bru │ │ │ └── 09-cleanup.bru │ │ ├── feed/ │ │ │ ├── 01-register-main-user.bru │ │ │ ├── 02-register-celeb-user.bru │ │ │ ├── 03-feed-for-new-user-returns-empty.bru │ │ │ ├── 04-main-follows-celeb.bru │ │ │ ├── 05-celeb-creates-article-1.bru │ │ │ ├── 06-celeb-creates-article-2.bru │ │ │ ├── 07-main-checks-feed.bru │ │ │ ├── 08-feed-with-limit-1.bru │ │ │ ├── 09-feed-with-limit-1-offset-1.bru │ │ │ ├── 10-cleanup-delete-articles.bru │ │ │ ├── 11-delete-slug2.bru │ │ │ └── 12-cleanup-unfollow.bru │ │ ├── pagination/ │ │ │ ├── 01-setup-register.bru │ │ │ ├── 02-create-article-1.bru │ │ │ ├── 03-create-article-2.bru │ │ │ ├── 04-list-with-limit-1-most-recent-first-so-slug2.bru │ │ │ ├── 05-list-with-limit-1-offset-1-second-page-so-slug1.bru │ │ │ ├── 06-cleanup.bru │ │ │ └── 07-delete-slug2.bru │ │ ├── profiles/ │ │ │ ├── 01-register-main-user.bru │ │ │ ├── 02-register-celeb-user.bru │ │ │ ├── 03-get-profile-without-auth.bru │ │ │ ├── 04-get-profile-with-auth.bru │ │ │ ├── 05-follow-profile.bru │ │ │ ├── 06-unfollow-profile.bru │ │ │ └── 07-verify-unfollow-persisted.bru │ │ └── tags/ │ │ ├── 01-setup-register.bru │ │ ├── 02-setup-create-article-with-tags.bru │ │ ├── 03-get-tags.bru │ │ └── 04-cleanup.bru │ ├── hurl/ │ │ ├── articles.hurl │ │ ├── auth.hurl │ │ ├── comments.hurl │ │ ├── errors_articles.hurl │ │ ├── errors_auth.hurl │ │ ├── errors_authorization.hurl │ │ ├── errors_comments.hurl │ │ ├── errors_profiles.hurl │ │ ├── favorites.hurl │ │ ├── feed.hurl │ │ ├── pagination.hurl │ │ ├── profiles.hurl │ │ ├── run-hurl-tests.sh │ │ └── tags.hurl │ ├── hurl-to-bruno.js │ ├── openapi.yml │ ├── run-api-tests-bruno.sh │ └── run-api-tests-hurl.sh └── e2e/ ├── SELECTORS.md ├── articles.spec.ts ├── auth.spec.ts ├── comments.spec.ts ├── error-handling.spec.ts ├── health.spec.ts ├── helpers/ │ ├── api.ts │ ├── articles.ts │ ├── auth.ts │ ├── comments.ts │ ├── config.ts │ ├── debug.ts │ ├── profile.ts │ └── setup.ts ├── navigation.spec.ts ├── null-fields.spec.ts ├── playwright.base.ts ├── settings.spec.ts ├── social.spec.ts ├── url-navigation.spec.ts ├── user-fetch-errors.spec.ts └── xss-security.spec.ts