Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
d4dde6f
chore(deps): Bump ruby/setup-ruby
dependabot[bot] Jan 13, 2026
ff2a69e
chore(deps): Bump puma
dependabot[bot] Jan 26, 2026
adcc4e9
chore(deps): Bump the npm-minor-and-patch group across 5 directories …
dependabot[bot] Feb 3, 2026
cbbb609
chore(deps): Bump puma from 7.1.0 to 7.2.0 in /sites/site-with-errors…
JoyceZhu Feb 9, 2026
2a0fb28
Merge branch 'main' into dependabot/npm_and_yarn/npm-minor-and-patch-…
JoyceZhu Feb 9, 2026
f793c6c
chore(deps): Bump the npm-minor-and-patch group across 5 directories …
JoyceZhu Feb 9, 2026
e8183f6
Merge branch 'main' into dependabot/github_actions/github-actions-c79…
JoyceZhu Feb 9, 2026
341a1e3
chore(deps): Bump ruby/setup-ruby from 1.275.0 to 1.281.0 in the gith…
JoyceZhu Feb 9, 2026
41d88d5
chore(deps): Bump ruby/setup-ruby
dependabot[bot] Feb 9, 2026
ba75df3
chore(deps-dev): Bump @actions/core from 2.0.1 to 3.0.0
dependabot[bot] Feb 9, 2026
d87402c
chore(deps): Bump ruby/setup-ruby from 1.281.0 to 1.288.0 in the gith…
JoyceZhu Feb 11, 2026
5f69f92
chore(deps-dev): Bump @actions/core from 2.0.1 to 3.0.0 (#113)
JoyceZhu Feb 13, 2026
5b27994
Revert "chore(deps): Bump puma from 7.1.0 to 7.2.0 in /sites/site-wit…
JoyceZhu Feb 13, 2026
377aa88
Revert "chore(deps): Bump puma from 7.1.0 to 7.2.0 in /sites/site-wit…
JoyceZhu Feb 13, 2026
05c638d
chore(deps): Bump rack from 3.2.4 to 3.2.5 in /sites/site-with-errors
dependabot[bot] Feb 17, 2026
11627d6
chore(deps): Bump rack from 3.2.4 to 3.2.5 in /sites/site-with-errors…
smockle Feb 17, 2026
06024ab
chore(deps): Bump puma
dependabot[bot] Feb 17, 2026
7b1ad39
chore(deps): Bump puma from 7.1.0 to 7.2.0 in /sites/site-with-errors…
smockle Feb 17, 2026
7a08475
Extracts issue body generation in prepration for adding screenshots
lindseywild Feb 18, 2026
0e99f4a
Adds test
lindseywild Feb 18, 2026
7c85a7e
Adds tests, updates package.json to include new tests
lindseywild Feb 18, 2026
14a7ae9
Adds screenshots to issues
lindseywild Feb 18, 2026
91072df
Extracts issue body generation in prepration for adding screenshots (…
lindseywild Feb 19, 2026
177a78a
Updates to wait until DOMContentLoaded, moves Axe scan
lindseywild Feb 19, 2026
7b42fca
Fixes markdown
lindseywild Feb 19, 2026
ae45dcd
Fixes screenshot location
lindseywild Feb 19, 2026
c7fa1f5
Moves axe builder back
lindseywild Feb 19, 2026
e7ace49
Updates save action
lindseywild Feb 19, 2026
706e363
Ensures re-opened issues are updated
lindseywild Feb 19, 2026
dba8913
Updates action
lindseywild Feb 19, 2026
b3430a2
Changes screenshot to link
lindseywild Feb 19, 2026
4618a36
Removes duplicate save workflow
lindseywild Feb 19, 2026
6d230de
Attempt to fix matrix gh-cache push
lindseywild Feb 19, 2026
3420115
Removes gh-cache updates
lindseywild Feb 19, 2026
d462476
Adds screenshot repo to ensure we are targeting the correct gh-cache …
lindseywild Feb 19, 2026
c4fbd5b
Minor tweaks after initial code review
lindseywild Feb 19, 2026
a5b6a29
Adds additional tests
lindseywild Feb 19, 2026
b150539
Merge branch 'main' into adds-screenshots
lindseywild Feb 19, 2026
e28ed11
Updates site-with-errors test
lindseywild Feb 19, 2026
7cfce7c
Updates test
lindseywild Feb 19, 2026
e2bf89a
Adds crypto import
lindseywild Feb 19, 2026
4bbb8bc
Adds eslint & prettier
lindseywild Feb 19, 2026
74498c8
Files that are linted and prettiered
lindseywild Feb 19, 2026
dab687e
Sets back to any
lindseywild Feb 19, 2026
0a35dcc
Adds lint to CI
lindseywild Feb 19, 2026
7320f1c
Testing reverting file
lindseywild Feb 19, 2026
853ba27
Testing reverting file
lindseywild Feb 19, 2026
1300fe4
Updates find files
lindseywild Feb 19, 2026
e796fc6
Updates a few files
lindseywild Feb 19, 2026
d630300
Removes auth unused files
lindseywild Feb 19, 2026
310d936
Updates generate issue body
lindseywild Feb 19, 2026
41e9a3b
More files
lindseywild Feb 19, 2026
f052c0b
More
lindseywild Feb 19, 2026
889e90b
Uses GitHub prettier config
lindseywild Feb 20, 2026
4f3fa07
Initial updates from PR review
lindseywild Feb 20, 2026
4dd03c7
Removes page.waitForLoadState
lindseywild Feb 20, 2026
0fbb9d7
Extracts generareScreenshots into another function
lindseywild Feb 20, 2026
124d17c
Fixes naming
lindseywild Feb 20, 2026
dfc8c4b
Updates ternary
lindseywild Feb 20, 2026
95a0df4
Adds prettier and eslint (#138)
lindseywild Feb 20, 2026
7131561
Merge branch 'main' into adds-screenshots
lindseywild Feb 20, 2026
a0e058e
Formatting / linting
lindseywild Feb 20, 2026
f03c192
Changes include_screenshots from true to false
lindseywild Feb 20, 2026
51b0cc5
Updates README
lindseywild Feb 20, 2026
035975f
Update tests
lindseywild Feb 20, 2026
8dee19c
Fixes bad semi
lindseywild Feb 20, 2026
594d6b6
Removes extra tests
lindseywild Feb 20, 2026
0b1f891
Removes silly destructure
lindseywild Feb 20, 2026
cc07ea1
Adds links to screenshots when `include_screenshots` is true (#137)
lindseywild Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions .github/actions/auth/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions .github/actions/auth/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
"type": "module",
"dependencies": {
"@actions/core": "^2.0.1",
"playwright": "^1.57.0"
"playwright": "^1.58.1"
},
"devDependencies": {
"@types/node": "^25.0.3",
"@types/node": "^25.2.0",
"typescript": "^5.9.3"
}
}
110 changes: 52 additions & 58 deletions .github/actions/auth/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,102 +1,96 @@
import type { AuthContextOutput } from "./types.d.js";
import crypto from "node:crypto";
import process from "node:process";
import * as url from "node:url";
import core from "@actions/core";
import playwright from "playwright";
import type {AuthContextOutput} from './types.d.js'
import process from 'node:process'
import core from '@actions/core'
import playwright from 'playwright'

export default async function () {
core.info("Starting 'auth' action");
core.info("Starting 'auth' action")

let browser: playwright.Browser | undefined;
let context: playwright.BrowserContext | undefined;
let page: playwright.Page | undefined;
let browser: playwright.Browser | undefined
let context: playwright.BrowserContext | undefined
let page: playwright.Page | undefined
try {
// Get inputs
const loginUrl = core.getInput("login_url", { required: true });
const username = core.getInput("username", { required: true });
const password = core.getInput("password", { required: true });
core.setSecret(password);

// Determine storage path for authenticated session state
// Playwright will create missing directories, if needed
const actionDirectory = `${url.fileURLToPath(new URL(import.meta.url))}/..`;
const sessionStatePath = `${
process.env.RUNNER_TEMP ?? actionDirectory
}/.auth/${crypto.randomUUID()}/sessionState.json`;
const loginUrl = core.getInput('login_url', {required: true})
const username = core.getInput('username', {required: true})
const password = core.getInput('password', {required: true})
core.setSecret(password)

// Launch a headless browser
browser = await playwright.chromium.launch({
headless: true,
executablePath: process.env.CI ? "/usr/bin/google-chrome" : undefined,
});
executablePath: process.env.CI ? '/usr/bin/google-chrome' : undefined,
})
context = await browser.newContext({
// Try HTTP Basic authentication
httpCredentials: {
username,
password,
},
});
page = await context.newPage();
})
page = await context.newPage()

// Navigate to login page
core.info("Navigating to login page");
await page.goto(loginUrl);
core.info('Navigating to login page')
await page.goto(loginUrl)

// Check for a login form.
// If no login form is found, then either HTTP Basic auth succeeded, or the page does not require authentication.
core.info("Checking for login form");
core.info('Checking for login form')
const [usernameField, passwordField] = await Promise.all([
page.getByLabel(/user ?name/i).first(),
page.getByLabel(/password/i).first(),
]);
const [usernameFieldExists, passwordFieldExists] = await Promise.all([
usernameField.count(),
passwordField.count(),
]);
])
const [usernameFieldExists, passwordFieldExists] = await Promise.all([usernameField.count(), passwordField.count()])
if (usernameFieldExists && passwordFieldExists) {
// Try form authentication
core.info("Filling username");
await usernameField.fill(username);
core.info("Filling password");
await passwordField.fill(password);
core.info("Logging in");
core.info('Filling username')
await usernameField.fill(username)
core.info('Filling password')
await passwordField.fill(password)
core.info('Logging in')
await page
.getByLabel(/password/i)
.locator("xpath=ancestor::form")
.evaluate((form) => (form as HTMLFormElement).submit());
.locator('xpath=ancestor::form')
.evaluate(form => (form as HTMLFormElement).submit())
} else {
core.info("No login form detected");
core.info('No login form detected')
// This occurs if HTTP Basic auth succeeded, or if the page does not require authentication.
}

// Output authenticated session state
const { cookies, origins } = await context.storageState();
const {cookies, origins} = await context.storageState()
const authContextOutput: AuthContextOutput = {
username,
password,
cookies,
localStorage: origins.reduce((acc, { origin, localStorage }) => {
acc[origin] = localStorage.reduce((acc, { name, value }) => {
acc[name] = value;
return acc;
}, {} as Record<string, string>);
return acc;
}, {} as Record<string, Record<string, string>>),
};
core.setOutput("auth_context", JSON.stringify(authContextOutput));
core.debug("Output: 'auth_context'");
localStorage: origins.reduce(
(acc, {origin, localStorage}) => {
acc[origin] = localStorage.reduce(
(acc, {name, value}) => {
acc[name] = value
return acc
},
{} as Record<string, string>,
)
return acc
},
{} as Record<string, Record<string, string>>,
),
}
core.setOutput('auth_context', JSON.stringify(authContextOutput))
core.debug("Output: 'auth_context'")
} catch (error) {
if (page) {
core.info(`Errored at page URL: ${page.url()}`);
core.info(`Errored at page URL: ${page.url()}`)
}
core.setFailed(`${error}`);
process.exit(1);
core.setFailed(`${error}`)
process.exit(1)
} finally {
// Clean up
await context?.close();
await browser?.close();
await context?.close()
await browser?.close()
}

core.info("Finished 'auth' action");
core.info("Finished 'auth' action")
}
34 changes: 17 additions & 17 deletions .github/actions/auth/src/types.d.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
export type Cookie = {
name: string;
value: string;
domain: string;
path: string;
expires?: number;
httpOnly?: boolean;
secure?: boolean;
sameSite?: "Strict" | "Lax" | "None";
};
name: string
value: string
domain: string
path: string
expires?: number
httpOnly?: boolean
secure?: boolean
sameSite?: 'Strict' | 'Lax' | 'None'
}

export type LocalStorage = {
[origin: string]: {
[key: string]: string;
};
};
[key: string]: string
}
}

export type AuthContextOutput = {
username?: string;
password?: string;
cookies?: Cookie[];
localStorage?: LocalStorage;
};
username?: string
password?: string
cookies?: Cookie[]
localStorage?: LocalStorage
}
3 changes: 3 additions & 0 deletions .github/actions/file/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ inputs:
cached_filings:
description: "Cached filings from previous runs, as stringified JSON. Without this, duplicate issues may be filed."
required: false
screenshot_repository:
description: "Repository (with owner) where screenshots are stored on the gh-cache branch. Defaults to the 'repository' input if not set. Required if issues are open in a different repo to construct proper screenshot URLs."
required: false

outputs:
filings:
Expand Down
9 changes: 4 additions & 5 deletions .github/actions/file/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/actions/file/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"@octokit/plugin-throttling": "^11.0.3"
},
"devDependencies": {
"@types/node": "^25.0.3",
"@types/node": "^25.2.0",
"typescript": "^5.9.3"
}
}
Loading