fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

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

fix(config): keep '=' inside the value of config set - #411

Open
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value
Open

fix(config): keep '=' inside the value of config set#411
JspIIV wants to merge 1 commit into
genlayerlabs:v0.40-devfrom
JspIIV:fix/config-set-preserves-equals-in-value

Conversation

@JspIIV

Copy link
Copy Markdown

Problem

config set destructures the split, so it only ever keeps the first two parts:

const[key,value]=keyValue.split("=");

A value containing = is silently truncated at the first one. Two everyday cases:

genlayer config set apiKey=YWJjZGVm==
stored: YWJjZGVm # base64 padding dropped
genlayer config set rpcUrl=https://rpc.example.com/v1?key=abc&mode=fast
stored: https://rpc.example.com/v1?key # query string cut off

There is no error and no warning. The command reports Configuration successfully updated, and the value only turns out to be wrong later, when whatever reads it fails for a reason that does not point back here.

Change

Splits on the first separator instead:

constseparatorIndex=keyValue.indexOf("=");constkey=separatorIndex===-1 ? "" : keyValue.slice(0,separatorIndex);constvalue=separatorIndex===-1 ? undefined : keyValue.slice(separatorIndex+1);

The two existing behaviours are unchanged:

  • no separator at all (config set invalidFormat) still fails with Invalid format. Use 'key=value'.
  • an empty value (config set defaultNetwork=) still stores ""

Tests

Three cases added to tests/actions/getSetReset.test.ts: base64 padding, a query string, and the empty value. The first two fail on v0.40-dev and pass with the change; the empty-value and invalid-format tests pass either way, which is what pins the unchanged behaviour.

Verification

Run against v0.40-dev at e822a9e:

npx vitest run 72 files, 799 tests, all passing
npx vitest run tests/actions/getSetReset.test.ts 10 passing

And with the fix reverted, to confirm the new tests actually catch it:

× set method keeps '=' inside the value
→ expected "writeConfig" to be called with arguments: [ 'apiKey', 'YWJjZGVm==' ]
× set method keeps a query string intact
→ expected "writeConfig" to be called with arguments: [ 'rpcUrl', …(1) ]

Branch

Targeting v0.40-dev as the active integration branch per docs/BRANCHING.md. Happy to retarget at a stable branch if you would rather ship it directly.

One thing I left alone

reset() has a delete config[key] that operates on a local copy and is never written back — the removal actually happens because writeConfig(key, undefined) makes JSON.stringify drop the key. It works, so I did not touch it here, but removeConfig(key) already exists and says it directly. Happy to send that separately if it is worth having.

keyValue.split("=") destructures only the first two parts, so a value
containing "=" was silently truncated at the first one. base64 padding
and URLs with a query string are the common cases:
config set apiKey=YWJjZGVm== stored YWJjZGVm
config set rpcUrl=https://x/v1?key=a&m=fast stored https://x/v1?key
Splits on the first separator instead. An empty value and a missing
separator behave as before.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f1f2e65-9b1a-46f1-86db-95f456722b3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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.

1 participant

@JspIIV