From e82b6167ef51d8a54fa3cea0e239628b6ab847bd Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Tue, 7 Apr 2026 22:58:28 -0500 Subject: [PATCH] perf(test): test performance improvements --- cliff.toml | 94 +++++++++++++++++++++++++++++++++++++++++++++++ e2e/pages/util.ts | 5 ++- mise.toml | 1 + src/web/auth.rs | 12 ++++-- src/web/mod.rs | 12 ++++-- 5 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 cliff.toml diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..8228887 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,94 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + + +[changelog] +# A Tera template to be rendered for each release in the changelog. +# See https://keats.github.io/tera/docs/#introduction +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ + {% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# render body even when there are no releases to process +# render_always = true +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = true +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = true +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' }, +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^doc", group = "Documentation" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactor" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, + { body = ".*security", group = "🛡️ Security" }, + { message = "^revert", group = "◀️ Revert" }, + { message = ".*", group = "💼 Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# Fail on a commit that is not matched by any commit parser. +fail_on_unmatched_commit = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order commits topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "oldest" +# Process submodules commits +recurse_submodules = false diff --git a/e2e/pages/util.ts b/e2e/pages/util.ts index f73c74a..d23e326 100644 --- a/e2e/pages/util.ts +++ b/e2e/pages/util.ts @@ -1,3 +1,4 @@ +import { expect } from '@playwright/test'; import type { Page } from '@playwright/test'; export const login = async (page: Page) => { @@ -15,9 +16,9 @@ type UserFields = { }; export const verifyCreateUser = async (page: Page, fields: UserFields) => { await page.getByRole('button', { name: /add contact/i }).click(); + await page.waitForResponse('/contact/new'); - // TODO this is stupid but playwright kept filling while alpine was initializing - await page.waitForTimeout(200); + await expect(page.locator('#alpine-loaded')).not.toHaveAttribute('x-cloak'); const { names, ...simple } = fields; for (const name of (names ?? [])) { diff --git a/mise.toml b/mise.toml index 6846e14..fe79931 100644 --- a/mise.toml +++ b/mise.toml @@ -2,3 +2,4 @@ "rust-analyzer" = "latest" "jj" = "latest" node = "24" +git-cliff = "latest" diff --git a/src/web/auth.rs b/src/web/auth.rs index 42890cc..79eb733 100644 --- a/src/web/auth.rs +++ b/src/web/auth.rs @@ -81,9 +81,15 @@ mod get { link rel="manifest" href=(format!("/static/{}", asset!("site.webmanifest"))); title { "Mascarpone CRM" } meta name="viewport" content="width=device-width"; - script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.min.js" {} - script src="https://cdn.jsdelivr.net/npm/htmx-ext-response-targets@2.0.4" integrity="sha384-T41oglUPvXLGBVyRdZsVRxNWnOOqCynaPubjUVjxhsjFTKrFJGEMm3/0KGmNQ+Pg" crossorigin="anonymous" {} - script src="https://cdn.jsdelivr.net/npm/alpinejs@3.15.0/dist/cdn.min.js" defer {} + @if cfg!(debug_assertions) { + script src=(format!("/static/{}", asset!("htmx.min.js"))) defer {} + script src=(format!("/static/{}", asset!("htmx-ext-response-targets.js"))) defer {} + script src=(format!("/static/{}", asset!("alpinejs.min.js"))) defer {} + } @else { + script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.min.js" defer {} + script src="https://cdn.jsdelivr.net/npm/htmx-ext-response-targets@2.0.4" integrity="sha384-T41oglUPvXLGBVyRdZsVRxNWnOOqCynaPubjUVjxhsjFTKrFJGEMm3/0KGmNQ+Pg" crossorigin="anonymous" defer {} + script src="https://cdn.jsdelivr.net/npm/alpinejs@3.15.0/dist/cdn.min.js" defer {} + } link rel="stylesheet" type="text/css" href=(format!("/static/{}", asset!("index.css"))); link rel="stylesheet" type="text/css" href=(format!("/static/{}", asset!("login.css"))); title { "Mascarpone" } diff --git a/src/web/mod.rs b/src/web/mod.rs index c6b0462..0cf96dc 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -94,9 +94,15 @@ impl Layout { link rel="manifest" href=(format!("/static/{}", asset!("site.webmanifest"))); link rel="stylesheet" type="text/css" href=(format!("/static/{}", asset!("index.css"))); meta name="viewport" content="width=device-width"; - script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.min.js" {} - script src="https://cdn.jsdelivr.net/npm/htmx-ext-response-targets@2.0.4" integrity="sha384-T41oglUPvXLGBVyRdZsVRxNWnOOqCynaPubjUVjxhsjFTKrFJGEMm3/0KGmNQ+Pg" crossorigin="anonymous" {} - script src="https://cdn.jsdelivr.net/npm/alpinejs@3.15.0/dist/cdn.min.js" defer {} + @if cfg!(debug_assertions) { + script src=(format!("/static/{}", asset!("htmx.min.js"))) defer {} + script src=(format!("/static/{}", asset!("htmx-ext-response-targets.js"))) defer {} + script src=(format!("/static/{}", asset!("alpinejs.min.js"))) defer {} + } @else { + script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.min.js" defer {} + script src="https://cdn.jsdelivr.net/npm/htmx-ext-response-targets@2.0.4" integrity="sha384-T41oglUPvXLGBVyRdZsVRxNWnOOqCynaPubjUVjxhsjFTKrFJGEMm3/0KGmNQ+Pg" crossorigin="anonymous" defer {} + script src="https://cdn.jsdelivr.net/npm/alpinejs@3.15.0/dist/cdn.min.js" defer {} + } @if let Some(hrefs) = css { @for href in hrefs { link rel="stylesheet" type="text/css" href=(format!("/static/{}", href));