ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ref: Centralize dry-run logic with Proxy-based abstraction - #685

Merged
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction
Dec 31, 2025
Merged

ref: Centralize dry-run logic with Proxy-based abstraction#685
BYK merged 9 commits into
masterfrom
byk/refactor/dry-run-abstraction

Conversation

@BYK

@BYKBYK commented Dec 29, 2025

Copy link
Copy Markdown
Member

Summary

Replaces scattered isDryRun() checks throughout the codebase with a centralized abstraction layer that automatically intercepts destructive operations using JavaScript Proxies.

Changes

New Module: src/utils/dryRun.ts

  • createDryRunGit() - Proxy wrapper for SimpleGit that blocks mutating operations (push, commit, checkout, merge, etc.)
  • createDryRunOctokit() - Proxy wrapper for Octokit that blocks mutating API calls (create*, update*, delete*, upload*)
  • dryRunFs - Object with file system operations that respect dry-run (writeFile, unlink, mkdir, rename)
  • dryRunExec() / dryRunExecSync() - Generic action wrappers for custom operations
  • logDryRun() - Consistent log formatting

Integration

  • getGitClient() and new createGitClient() return dry-run-aware git clients
  • getGitHubClient() returns dry-run-aware Octokit instance
  • Migrated commands (prepare.ts, publish.ts) and all targets to use wrapped APIs

ESLint Enforcement

Added no-restricted-syntax rules to catch:

  • Direct simpleGit() calls → use createGitClient()
  • Direct new Octokit() → use getGitHubClient()

Testing & Documentation

  • Added comprehensive tests for proxy behavior (19 tests)
  • Documented the pattern in AGENTS.md

Benefits

  • Automatic enforcement via ESLint - hard to forget dry-run checks
  • Consistent [dry-run] Would execute: ... log formatting
  • Reduced boilerplate in commands and targets
  • Self-documenting error messages guide developers to correct APIs

Replaces scattered isDryRun() checks with a centralized abstraction layer
that automatically intercepts destructive operations:
- Add src/utils/dryRun.ts with Proxy wrappers for SimpleGit, Octokit, and fs
- Update getGitClient()/createGitClient() to return dry-run-aware git clients
- Update getGitHubClient() to return dry-run-aware Octokit instance
- Add dryRunFs for file write operations (writeFile, unlink, mkdir, rename)
- Add dryRunExec() helper for custom destructive operations
- Migrate commands and targets to use wrapped APIs
- Add ESLint rules to enforce using dry-run wrapped APIs
- Add comprehensive tests for proxy behavior
- Document the pattern in AGENTS.md
@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (registry) Auto-create package structure for new packages by BYK in #689

Bug Fixes 🐛

Changelog

  • Deduplicate merged PR entries in preview by BYK in #690
  • Disable author mentions in PR preview comments by BYK in #684

Other

  • (github) Clean up orphaned draft releases on publish failure by BYK in #681
  • (publish) Fail early on dirty git repository by BYK in #683

Build / dependencies / internal 🔧

  • Centralize dry-run logic with Proxy-based abstraction by BYK in #685

🤖 This preview updates automatically when you update the PR.

@BYKBYK changed the title refactor: Centralize dry-run logic with Proxy-based abstractionref: Centralize dry-run logic with Proxy-based abstractionDec 29, 2025
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/commands/prepare.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/brew.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts
Comment threadsrc/targets/github.ts
- Remove repetitive dry-run proxy comments
- Remove isDryRun() checks from brew.ts, awsLambdaLayer.ts, github.ts
(use proxied APIs instead)
- Allow clone() through dry-run proxy (safe local operation)
- Remove eslint-disable comments for clone operations
- Update Octokit proxy to return mock status for status-based checks
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/awsLambdaLayer.ts Outdated
Comment threadsrc/targets/commitOnGitRepository.ts Outdated
Comment threadsrc/targets/github.ts Outdated
Comment threadsrc/targets/registry.ts Outdated
- Add cloneRepo() helper for cleaner clone+createGitClient pattern
- Rename dryRunFs to safeFs, dryRunExec to safeExec
- Remove remaining isDryRun() checks from github.ts using safeExec
- Remove repetitive dry-run proxy comments from registry.ts and ghPages.ts
- Update AGENTS.md with new naming
- Fix GCS download to return null in dry-run mode (instead of invalid path)
- Use explicit isDryRun() check in createDraftRelease for mock data
- Cache wrapped git instances in proxy to avoid recreation on chaining
- Add copyFile/copyFileSync to safeFs
- Fix import ordering in prepare.ts
- Add tests for chained git operations and proxy caching
@BYK
BYK marked this pull request as ready for review December 31, 2025 12:58
Comment threadsrc/utils/dryRun.ts
Comment threadsrc/utils/dryRun.ts
…mode
In dry-run mode, git methods like commit() now return proper mock result
objects instead of the proxy itself. This fixes issues where code expects
to access properties like commitResult.commit to get the commit hash.
@BYK
BYK enabled auto-merge (squash) December 31, 2025 13:37
Comment threadsrc/utils/dryRun.ts
@BYK
BYK disabled auto-merge December 31, 2025 13:50
Remove pull and push from GIT_MOCK_RESULTS because they are used in
method chains like git.pull().merge().push() in publish.ts. Returning
a mock object instead of the proxy breaks these chains.
Only commit needs a mock result because upm.ts accesses commitResult.commit.
Comment threadsrc/utils/dryRun.ts Outdated
Refactor safeFs to use the same Proxy pattern as Git and Octokit
for consistency. This also exports safeFsPromises and safeFsSync
for direct access to the full proxied fs modules.
Comment threadsrc/utils/dryRun.ts
Return proxy directly instead of Promise.resolve(proxy) to support
method chaining like git.pull().merge().push(). The proxy wraps
SimpleGit which is thenable, so await still works correctly.
Only methods in GIT_MOCK_RESULTS (like commit) return a Promise
with mock data since their return values are actually accessed.
@BYK
BYK merged commit d01268a into masterDec 31, 2025
14 checks passed
@BYK
BYK deleted the byk/refactor/dry-run-abstraction branch December 31, 2025 14:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@BYK@MathurAditya724