feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, '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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, '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 > 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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, '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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, '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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, '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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio
, '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

feat: add --incremental flag to skip up-to-date page object generation - #243

Open
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files
Open

feat: add --incremental flag to skip up-to-date page object generation#243
intermezzio wants to merge 1 commit into
salesforce:devfrom
intermezzio:ajgm/only-generate-updated-files

Conversation

@intermezzio

@intermezziointermezzio commented Jun 11, 2026

Copy link
Copy Markdown

Closes#244

Summary

  • Adds an opt-in --incremental (-I) CLI flag (and matching JsonCompilerConfig constructor parameter) that causes the compiler to skip generation for page objects whose generated .java artifacts are newer than the source .utam.json.
  • New TranslatorTargetConfig.isUpToDate(...) interface method with a default return false, preserving behavior for downstream custom target configs.
  • DefaultTargetConfiguration overrides isUpToDate with a per-page-object timestamp check (interface and impl .java paths must exist and be ≥ source mtime; impl-only POs only require the impl artifact).
  • DefaultTranslatorRunner.write() consults isUpToDate before invoking getGeneratedCode() (which is where google-java-format runs) and skips the interface, class, JSON resource, and unit-test writes for that PO. Aggregate outputs (manifest, dependency-injection config) still cover every PO.

Motivation

When this library is consumed via the compiler plugin in a downstream project, mvn triggers an all-or-nothing rebuild on every invocation, with google-java-format dominating the cost. Incremental mode skips the formatter and file writes for page objects whose targets are already current, which is a large speedup on iterative dev loops.

Behavior

  • Default off; existing CLI/JSON-config callers unchanged.
  • With --incremental: a PO is skipped iff its generated targets exist and have mtime ≥ the source .utam.json mtime. Any missing or older target forces regeneration. Source mtime ≤ 0 also forces regeneration (matters for unit tests with synthetic sources).

Test plan

  • New tests in DefaultTargetConfigurationTests covering isUpToDate for: flag off, source mtime zero, missing interface file, missing class file, source newer than targets, targets newer than source, interface-only PO, impl-only PO.
  • New tests in DefaultTranslatorRunnerTests verifying write() skips all POs when target reports up-to-date and writes only the out-of-date PO when the target is selective.
  • New test in JsonCompilerConfigTests verifying the 4-arg constructor wires the incremental flag through to the resulting TranslatorTargetConfig.
  • mvn -pl utam-compiler test — 644/644 pass.
  • mvn -pl utam-core test — 385/385 pass.
  • mvn spotless:check clean.

@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Unfortunately we can't verify the commit author(s): Andrew Mascillaro <a***@s***.com>. One possible solution is to add that email to your GitHub account. Alternatively you can change your commits to another email and force push the change. After getting your commits associated with your GitHub account, refresh the status of this Pull Request.

@intermezzio
intermezzioforce-pushed the ajgm/only-generate-updated-files branch from 4b30990 to 7582172CompareJune 11, 2026 17:11
@salesforce-cla

Copy link
Copy Markdown

Thanks for the contribution! Before we can merge this, we need @intermezzio to sign the Salesforce Inc. Contributor License Agreement.

@intermezzio
intermezzio marked this pull request as ready for review June 11, 2026 17:28
Introduces an opt-in --incremental (-I) CLI flag and JsonCompilerConfig
constructor parameter that causes the compiler to skip generation for
page objects whose generated .java artifacts are newer than their source
.utam.json. TranslatorTargetConfig gains a default isUpToDate() method
(returns false to preserve behavior for downstream custom configs);
DefaultTargetConfiguration overrides it with a per-page-object timestamp
check, and DefaultTranslatorRunner.write() consults it before invoking
the (expensive) google-java-format pass.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support incremental page object generation

1 participant

@intermezzio