Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.
| Usage, Billing settings and prepaid AI credit; fixes from the UX audit | 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; | |
| 3 | ||
| Merge branch 'main' into worktree-agent-a69aeabc4b0deeb97 | 4 | import { |
| 5 | PER_PAGE, | |
| 6 | SOURCE_LABEL, | |
| 7 | STATE_WORD, | |
| 8 | buildError, | |
| 9 | choices, | |
| 10 | environmentLabel, | |
| 11 | environmentUrl, | |
| 12 | groupBuilds, | |
| 13 | hasPayload, | |
| 14 | isFiltered, | |
| Merge branch 'site-fixes' into fast-push | 15 | isNewestStatus, |
| Merge branch 'main' into worktree-agent-a69aeabc4b0deeb97 | 16 | isPageBuild, |
| 17 | orderEnvironments, | |
| 18 | pageRange, | |
| 19 | parseFilter, | |
| 20 | productionEnvironment, | |
| 21 | shortSha, | |
| 22 | withFilter, | |
| 23 | } from "./deployments.ts"; | |
| Usage, Billing settings and prepaid AI credit; fixes from the UX audit | 24 | |
| 25 | const GIT = | |
| 26 | "the commit could not be checked out: git -c failed: fatal: reference is not a tree: d2ca224ba0fea430dcc9933cda14d8aa9fa94b4b"; | |
| 27 | ||
| 28 | type Build = Parameters<typeof groupBuilds>[0][number] & { id: string }; | |
| 29 | ||
| 30 | let hour = 0; | |
| 31 | const build = (over: Partial<Build>): Build => ({ | |
| 32 | id: `dep_${hour}`, | |
| 33 | kind: "preview", | |
| 34 | branch: "v2", | |
| 35 | number: 1, | |
| 36 | status: "failed", | |
| 37 | error: GIT, | |
| 38 | createdAt: new Date(Date.parse("2026-10-07T12:00:00Z") - hour++ * 3_600_000).toISOString(), | |
| 39 | ...over, | |
| 40 | }); | |
| 41 | ||
| 42 | test("a commit that is gone is said plainly, naming the pull request", () => { | |
| 43 | assert.equal( | |
| 44 | buildError({ kind: "preview", number: 1, error: GIT }), | |
| 45 | "This pull request's commit no longer exists. Push again, or close pull request #1.", | |
| 46 | ); | |
| 47 | assert.match(buildError({ kind: "production", number: null, error: GIT })!, /default branch/); | |
| 48 | assert.equal(buildError({ kind: "preview", number: 1, error: "npm run build exited 1." }), "npm run build exited 1."); | |
| 49 | assert.equal(buildError({ kind: "preview", number: 1, error: null }), null); | |
| 50 | }); | |
| 51 | ||
| 52 | test("a run of the same failure of one app is one row, counted, linking to the newest", () => { | |
| 53 | hour = 0; | |
| 54 | const builds = [build({}), build({}), build({}), build({ status: "ready", error: null }), build({})]; | |
| 55 | const groups = groupBuilds(builds); | |
| 56 | assert.deepEqual( | |
| 57 | groups.map((g) => [g.build.id, g.count]), | |
| 58 | [ | |
| 59 | ["dep_0", 3], | |
| 60 | ["dep_3", 1], | |
| 61 | ["dep_4", 1], | |
| 62 | ], | |
| 63 | ); | |
| 64 | assert.equal(groups[0]!.firstAt, builds[2]!.createdAt); | |
| 65 | }); | |
| 66 | ||
| 67 | test("other apps' builds in between do not break a run; a different error does", () => { | |
| 68 | hour = 0; | |
| 69 | const groups = groupBuilds([ | |
| 70 | build({}), | |
| 71 | build({ kind: "production", branch: null, number: null, status: "ready", error: null }), | |
| 72 | build({}), | |
| 73 | build({ branch: "add-ci", number: 2, error: "fatal: reference is not a tree: 213e9095" }), | |
| 74 | build({}), | |
| 75 | build({ error: "npm run build exited 1." }), | |
| 76 | build({ error: "npm run build exited 1." }), | |
| 77 | ]); | |
| 78 | assert.deepEqual( | |
| 79 | groups.map((g) => [g.build.id, g.count]), | |
| 80 | [ | |
| 81 | ["dep_0", 3], | |
| 82 | ["dep_1", 1], | |
| 83 | ["dep_3", 1], | |
| 84 | ["dep_5", 2], | |
| 85 | ], | |
| 86 | ); | |
| 87 | }); | |
| 88 | ||
| 89 | test("builds that did not fail are never folded", () => { | |
| 90 | hour = 0; | |
| 91 | const ready = groupBuilds([build({ status: "ready", error: null }), build({ status: "ready", error: null })]); | |
| 92 | assert.deepEqual(ready.map((g) => g.count), [1, 1]); | |
| 93 | assert.deepEqual(groupBuilds([]), []); | |
| 94 | }); | |
| Merge branch 'main' into worktree-agent-a69aeabc4b0deeb97 | 95 | |
| 96 | // --- A repository's deployments ------------------------------------------------ | |
| 97 | ||
| 98 | type Env = Parameters<typeof productionEnvironment>[0][number]; | |
| 99 | const env = (name: string, over: Partial<Env> = {}): Env => ({ | |
| 100 | name, | |
| 101 | production_environment: false, | |
| 102 | transient_environment: false, | |
| 103 | updated_at: "2026-10-07T12:00:00Z", | |
| 104 | latest: null, | |
| 105 | ...over, | |
| 106 | }); | |
| 107 | const deployed = { id: "dep_1" } as unknown as Env["latest"]; | |
| 108 | ||
| 109 | test("environments list production first, then lasting ones, then previews, newest first in each", () => { | |
| 110 | const ordered = orderEnvironments([ | |
| 111 | env("preview", { transient_environment: true, updated_at: "2026-10-07T11:00:00Z" }), | |
| 112 | env("staging", { updated_at: "2026-10-01T00:00:00Z" }), | |
| 113 | env("qa", { updated_at: "2026-10-06T00:00:00Z" }), | |
| 114 | env("production-eu", { production_environment: true, updated_at: "2026-10-07T11:59:00Z" }), | |
| 115 | env("production", { production_environment: true, updated_at: "2026-10-01T00:00:00Z" }), | |
| 116 | ]); | |
| 117 | assert.deepEqual( | |
| 118 | ordered.map((e) => e.name), | |
| 119 | ["production", "production-eu", "qa", "staging", "preview"], | |
| 120 | ); | |
| 121 | }); | |
| 122 | ||
| 123 | test("production is the production environment that has had a deployment, named production first", () => { | |
| 124 | assert.equal(productionEnvironment([env("staging", { latest: deployed })]), null); | |
| 125 | assert.equal(productionEnvironment([env("production", { production_environment: true })]), null); | |
| 126 | assert.equal( | |
| 127 | productionEnvironment([ | |
| 128 | env("live", { production_environment: true, latest: deployed }), | |
| 129 | env("production", { production_environment: true, latest: deployed }), | |
| 130 | ])?.name, | |
| 131 | "production", | |
| 132 | ); | |
| 133 | assert.equal( | |
| 134 | productionEnvironment([env("production", { production_environment: true }), env("live", { production_environment: true, latest: deployed })]) | |
| 135 | ?.name, | |
| 136 | "live", | |
| 137 | ); | |
| 138 | }); | |
| 139 | ||
| 140 | test("an environment is served at its own address, else its current deployment's", () => { | |
| 141 | const at = (environment_url: string | null, state = "success") => ({ environment_url, state }) as never; | |
| 142 | assert.equal(environmentUrl({ url: "https://g1t.sh", current: null, latest: null }), "https://g1t.sh"); | |
| 143 | assert.equal( | |
| 144 | environmentUrl({ url: null, current: at("https://a.g1t.page"), latest: at("https://b.g1t.page", "failure") }), | |
| 145 | "https://a.g1t.page", | |
| 146 | ); | |
| 147 | assert.equal(environmentUrl({ url: null, current: null, latest: at("https://b.g1t.page", "failure") }), null); | |
| 148 | }); | |
| 149 | ||
| 150 | test("the list's filter is read from the address, ignoring what it cannot be", () => { | |
| 151 | const filter = parseFilter(new URLSearchParams("environment=production&state=failure&source=actions&creator=syntaqx&ref=main&page=3")); | |
| 152 | assert.deepEqual(filter, { | |
| 153 | environment: "production", | |
| 154 | state: "failure", | |
| 155 | source: "actions", | |
| 156 | creator: "syntaqx", | |
| 157 | ref: "main", | |
| 158 | page: 3, | |
| 159 | per_page: PER_PAGE, | |
| 160 | }); | |
| 161 | const junk = parseFilter(new URLSearchParams("state=exploded&source=ftp&page=-2&per_page=1000&environment=%20")); | |
| 162 | assert.equal(junk.state, null); | |
| 163 | assert.equal(junk.source, null); | |
| 164 | assert.equal(junk.environment, null); | |
| 165 | assert.equal(junk.page, 1); | |
| 166 | assert.equal(junk.per_page, 100); | |
| 167 | assert.equal(isFiltered(junk), false); | |
| 168 | assert.equal(isFiltered(filter), true); | |
| 169 | }); | |
| 170 | ||
| 171 | test("changing a filter keeps the others and starts again from the first page", () => { | |
| 172 | const filter = parseFilter(new URLSearchParams("environment=production&state=failure&page=2")); | |
| 173 | assert.equal(withFilter("/a/b/deployments", filter, "state", "success"), "/a/b/deployments?environment=production&state=success#history"); | |
| 174 | assert.equal(withFilter("/a/b/deployments", filter, "environment", null), "/a/b/deployments?state=failure#history"); | |
| 175 | assert.equal(withFilter("/a/b/deployments", filter, "page", 3), "/a/b/deployments?environment=production&state=failure&page=3#history"); | |
| 176 | assert.equal(withFilter("/a/b/deployments", parseFilter(new URLSearchParams()), "page", 1), "/a/b/deployments#history"); | |
| 177 | }); | |
| 178 | ||
| 179 | test("a filter's choices are each value once, sorted, keeping the chosen one", () => { | |
| 180 | const list = [{ creator: "g1t", ref: "main" }, { creator: "syntaqx", ref: "main" }, null, { creator: "g1t", ref: "v2" }]; | |
| 181 | assert.deepEqual(choices(list, "creator"), ["g1t", "syntaqx"]); | |
| 182 | assert.deepEqual(choices(list, "ref", "release"), ["main", "release", "v2"]); | |
| 183 | }); | |
| 184 | ||
| 185 | test("words for states, sources, environments and pages", () => { | |
| 186 | assert.equal(STATE_WORD.in_progress, "Deploying"); | |
| 187 | assert.equal(SOURCE_LABEL.g1t_page, "g1t.page"); | |
| 188 | assert.equal(environmentLabel("production"), "Production"); | |
| 189 | assert.equal(shortSha("d2ca224ba0fea430"), "d2ca224"); | |
| 190 | assert.equal(isPageBuild("dpl_123"), true); | |
| 191 | assert.equal(isPageBuild("dep_123"), false); | |
| 192 | assert.equal(pageRange(2, 30, 304), "31–60 of 304"); | |
| 193 | assert.equal(pageRange(11, 30, 304), "301–304 of 304"); | |
| 194 | assert.equal(pageRange(1, 30, 0), "0 of 0"); | |
| 195 | assert.equal(hasPayload({}), false); | |
| 196 | assert.equal(hasPayload({ region: "wnam" }), true); | |
| 197 | assert.equal(hasPayload(null), false); | |
| 198 | }); | |
| Merge branch 'site-fixes' into fast-push | 199 | |
| 200 | test("only a deployment's newest status can still be under way", () => { | |
| 201 | const statuses = [ | |
| 202 | { created_at: "2026-10-08T10:00:00.000Z" }, // Deploying, building | |
| 203 | { created_at: "2026-10-08T10:02:00.000Z" }, // Deployed | |
| 204 | ]; | |
| 205 | assert.equal(isNewestStatus(statuses, 0), false); | |
| 206 | assert.equal(isNewestStatus(statuses, 1), true); | |
| 207 | // Listed out of order: the newest is still the latest written. | |
| 208 | assert.equal(isNewestStatus([...statuses].reverse(), 0), true); | |
| 209 | // Written in the same moment: the last listed is the newest. | |
| 210 | const tied = [{ created_at: "2026-10-08T10:00:00.000Z" }, { created_at: "2026-10-08T10:00:00.000Z" }]; | |
| 211 | assert.equal(isNewestStatus(tied, 0), false); | |
| 212 | assert.equal(isNewestStatus(tied, 1), true); | |
| 213 | assert.equal(isNewestStatus([], 0), false); | |
| 214 | }); |
This file's history is long; its oldest lines are credited to the oldest commit read.