4 Commits

Author SHA1 Message Date
minori f1ac1ab4e9 deps: update cspell to 9.6.4
Node.js CI / CI (pull_request) Failing after 31s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m28s
2026-02-14 07:02:59 -08:00
minori de9272d8d1 deps: update cspell to 9.6.3
Node.js CI / CI (pull_request) Failing after 32s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m28s
2026-02-13 07:04:16 -08:00
minori f94202bbf5 deps: update cspell to 9.6.2
Node.js CI / CI (pull_request) Failing after 39s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m59s
2026-02-05 07:06:48 -08:00
minori f61075eb36 deps: update cspell to 9.6.0
Node.js CI / CI (pull_request) Failing after 27s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m37s
2026-02-04 08:24:58 -08:00
6 changed files with 555 additions and 567 deletions
+25
View File
@@ -0,0 +1,25 @@
# Package Manager Configuration
# Force pnpm usage - breaks npm/yarn intentionally
node-linker=pnpm
# Security: Disable all lifecycle scripts
ignore-scripts=true
enable-pre-post-scripts=false
# Security: Require packages to be 10+ days old before installation
minimum-release-age=14400
# Security: Verify package integrity hashes
verify-store-integrity=true
# Security: Enforce strict trust policies
trust-policy=strict
# Security: Strict peer dependency resolution
strict-peer-dependencies=true
# Performance: Use symlinks for node_modules
symlink=true
# Lockfile: Ensure lockfile is not modified during install
frozen-lockfile=false
+1 -1
View File
@@ -17,7 +17,7 @@
"devDependencies": {
"@nhcarrigan/eslint-config": "5.2.0",
"@types/node": "22.14.0",
"cspell": "8.18.1",
"cspell": "9.6.4",
"eslint": "9.24.0",
"tsx": "4.19.3",
"vitest": "3.1.1",
+526 -491
View File
File diff suppressed because it is too large Load Diff
-21
View File
@@ -1,21 +0,0 @@
# Security
# Do not execute any scripts of installed packages (project scripts still run)
ignoreDepScripts: true
# Do not automatically run pre/post scripts (e.g. preinstall, postbuild)
enablePrePostScripts: false
# Only allow packages published at least 10 days ago (reduces risk of compromised packages)
minimumReleaseAge: 14400
# Fail if a package's trust level has decreased compared to previous releases
trustPolicy: no-downgrade
# Ignore trust policy for packages published more than 1 year ago (predates provenance signing)
trustPolicyIgnoreAfter: 525960
# Fail if there are missing or invalid peer dependencies
strictPeerDependencies: true
# Prevent transitive dependencies from using exotic sources (git repos, direct tarball URLs)
blockExoticSubdeps: true
# Lockfile
# Allow the lockfile to be updated during install (set to true in CI for stricter reproducibility)
preferFrozenLockfile: false
+3 -42
View File
@@ -28,42 +28,6 @@ const htmlBeginning = `<!DOCTYPE html>
const htmlEnd = ` </main>
</body>
<script src="./dates.js"></script>
<script>
var _cdnStyle = null;
var _condensedSections = [];
window.addEventListener("beforeprint", function() {
_cdnStyle = document.getElementById("nhcarrigan-global-styles");
if (_cdnStyle) { _cdnStyle.remove(); }
});
window.addEventListener("afterprint", function() {
if (_cdnStyle) { document.head.appendChild(_cdnStyle); _cdnStyle = null; }
_condensedSections.forEach(function(el) { el.style.display = ""; });
_condensedSections = [];
});
function downloadFile(url, filename) {
fetch(url)
.then(function(r) { return r.blob(); })
.then(function(blob) {
var a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(a.href);
});
}
function printCondensed() {
["certifications", "projects", "publications"].forEach(function(id) {
var el = document.getElementById(id);
if (el) { el.style.display = "none"; _condensedSections.push(el); }
});
window.print();
}
</script>
</html>`;
const request = await fetch(
@@ -150,12 +114,9 @@ const heading = `<h1>${yaml.name}</h1>
<a href="#projects">Projects</a> |
<a href="#publications">Publications</a> |
</p>
<div id="formats">
<button onclick="downloadFile('https://data.nhcarrigan.com/resume.yml', 'resume.yml')">Download YAML</button>
<button onclick="downloadFile('https://data.nhcarrigan.com/resume.json', 'resume.json')">Download JSON</button>
<button onclick="window.print()">Print Resume</button>
<button onclick="printCondensed()">Print Condensed Resume</button>
</div>
<p id="formats">
Get this resume in <a href="https://data.nhcarrigan.com/resume.yml">YAML</a> or <a href="https://data.nhcarrigan.com/resume.json">JSON</a> format. You can also <span style="text-decoration: underline" onclick="window.print();return false;">print</span> the resume (and optionally save as a PDF).
</p>
<p class="cta">
Interested in hiring me?
<a href="https://testimonials.nhcarrigan.com" target="_blank"
-12
View File
@@ -42,9 +42,6 @@ hr {
box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.7);
margin-bottom: 10px;
}
footer {
z-index: 1;
}
}
@media print {
:root {
@@ -53,15 +50,6 @@ hr {
* {
color: black;
font-family: "Times New Roman", serif;
margin: 0;
padding: 0;
}
h1 {
text-align: center;
font-size: 1.8rem;
}
.info {
text-align: center;
}
video,
footer,