Skip to content

✨ Released Transistor.fm integration#26967

Merged
9larsons merged 2 commits intomainfrom
ga-transistor
Mar 25, 2026
Merged

✨ Released Transistor.fm integration#26967
9larsons merged 2 commits intomainfrom
ga-transistor

Conversation

@9larsons
Copy link
Contributor

no ref

Released new transistor.fm integration, enabling customizable Portal account settings re: podcast RSS feeds and new embed/editor card support in the editor.

no ref

Released new transistor.fm integration, enabling customizable Portal account settings re: podcast RSS feeds and new embed/editor card support in the editor.
@9larsons 9larsons requested a review from EvanHahn March 25, 2026 19:04
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 25, 2026

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • ghost/core/test/e2e-api/admin/__snapshots__/settings.test.js.snap is excluded by !**/*.snap

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7eef09cc-dcb9-4aaf-9bdf-25e07865c901

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

Walkthrough

The changes transition the transistor feature from a private lab feature to a generally available feature. The transistor feature flag is removed from the private features UI, moved from the PRIVATE_FEATURES list to the GA_FEATURES list in the core labs configuration, added as a new boolean setting attribute, included in the settings load query, and the Koenig editor is updated to read the transistor config from settings instead of the feature service.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: moving the Transistor feature from private labs to general availability (GA) and enabling the integration throughout the system.
Description check ✅ Passed The description relates to the changeset by explaining that the Transistor.fm integration is being released and includes Portal settings and editor support changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ga-transistor

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 and usage tips.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should've always pointed to the setting, not the feature flag. I think it was a hangover from earlier implementations so this is a 'fix'.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is wiring up the setting. As is the file below.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@ghost/admin/app/services/settings.js`:
- Line 54: The settings import/export mapping is missing entries for the
Transistor integration: update the keyGroupMapping object in settings.js to
include mappings for 'transistor' and the portal keys so they map to the
'transistor' group; specifically add entries for transistor,
transistor_portal_enabled, transistor_portal_heading,
transistor_portal_description, transistor_portal_button_text, and
transistor_portal_url_template all set to 'transistor' (look for the
keyGroupMapping constant and the existing mappings like 'slack': 'slack' to
mirror that pattern).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 5db7b750-b002-4378-acc9-9ed37c1a62ad

📥 Commits

Reviewing files that changed from the base of the PR and between 27b35dc and 281723a.

📒 Files selected for processing (5)
  • apps/admin-x-settings/src/components/settings/advanced/labs/private-features.tsx
  • ghost/admin/app/components/koenig-lexical-editor.js
  • ghost/admin/app/models/setting.js
  • ghost/admin/app/services/settings.js
  • ghost/core/core/shared/labs.js
💤 Files with no reviewable changes (1)
  • apps/admin-x-settings/src/components/settings/advanced/labs/private-features.tsx

if (!this._loadingPromise) {
this._loadingPromise = this.store
.queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,labs,slack,unsplash,views,firstpromoter,editor,comments,analytics,announcement,pintura,donations,recommendations,security,social_web,explore'})
.queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,labs,slack,unsplash,views,firstpromoter,editor,comments,analytics,announcement,pintura,donations,recommendations,security,social_web,explore,transistor'})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify that 'transistor' group mapping exists in settings-key-group-mapper

echo "=== Searching for transistor group mapping ==="
rg -n "transistor" --type js -g '**/settings-key-group-mapper*'

echo ""
echo "=== Checking full group mapper content ==="
fd "settings-key-group-mapper" --type f --exec cat {}

Repository: TryGhost/Ghost

Length of output: 1824


🏁 Script executed:

#!/bin/bash
# Search for transistor settings in the codebase

echo "=== Searching for transistor references in settings/admin ==="
rg -n "transistor" --type js -g '**/settings/**' -g '**/admin/**'

echo ""
echo "=== Searching for EDITABLE_SETTINGS or settings definitions ==="
fd "settings" --type f --exec grep -l "EDITABLE_SETTINGS\|transistor" {} \; 2>/dev/null | head -20

Repository: TryGhost/Ghost

Length of output: 29312


🏁 Script executed:

#!/bin/bash
# Check transistor settings in default settings and migration

echo "=== Checking default-settings.json for transistor ==="
rg -A 3 -B 1 '"transistor' ghost/core/core/server/data/schema/default-settings/default-settings.json | head -50

echo ""
echo "=== Checking migration file for transistor ==="
fd "add-transistor-portal-settings" --type f --exec cat {} \;

Repository: TryGhost/Ghost

Length of output: 2212


🏁 Script executed:

#!/bin/bash
# Search for all transistor-related migrations

echo "=== All migration files with transistor ==="
find ghost/core/core/server/data/migrations -name "*transistor*" -type f

echo ""
echo "=== Searching migration content for transistor key without _portal_ ==="
rg "key.*:.*['\"]transistor['\"]" ghost/core/core/server/data/migrations -A 3 | grep -v "transistor_"

Repository: TryGhost/Ghost

Length of output: 495


🏁 Script executed:

#!/bin/bash
# Check the transistor integration migrations

echo "=== First transistor migration ==="
cat ghost/core/core/server/data/migrations/versions/6.14/2026-01-15-12-00-00-add-transistor-integration.js

echo ""
echo "=== Second transistor migration ==="
cat ghost/core/core/server/data/migrations/versions/6.14/2026-01-15-12-01-00-add-transistor-integration-api-key.js

Repository: TryGhost/Ghost

Length of output: 3441


🏁 Script executed:

#!/bin/bash
# Search for transistor setting key definition

echo "=== Searching for transistor setting creation in all migrations ==="
rg "addSetting.*transistor['\"]" ghost/core/core/server/data/migrations -B 2 -A 5 | grep -v "transistor_"

echo ""
echo "=== Check if transistor is in default-settings.json with group ==="
rg -B 2 -A 10 '"transistor":\s*{' ghost/core/core/server/data/schema/default-settings/default-settings.json | head -30

Repository: TryGhost/Ghost

Length of output: 308


🏁 Script executed:

#!/bin/bash
# Search for transistor setting key definition with fixed regex

echo "=== Searching for transistor setting creation ==="
rg '"transistor":' ghost/core/core/server/data/schema/default-settings/default-settings.json -B 2 -A 15

echo ""
echo "=== Check if transistor is in any migration with group ==="
rg "transistor.*group" ghost/core/core/server/data/migrations

Repository: TryGhost/Ghost

Length of output: 668


🏁 Script executed:

#!/bin/bash
# Check how other integrations define their main setting key in mapper

echo "=== Check mapper entries for other integrations ==="
rg "slack|unsplash|labs" ghost/admin/app/services/settings-key-group-mapper.js

echo ""
echo "=== Search for main transistor setting migration ==="
rg -r "addSetting.*key.*transistor['\"]" ghost/core/core/server/data/migrations --type js | grep -v "transistor_"

echo ""
echo "=== Check if transistor key is created anywhere in migrations ==="
find ghost/core/core/server/data/migrations -type f -name "*.js" -exec grep -l "transistor" {} \;

Repository: TryGhost/Ghost

Length of output: 662


🏁 Script executed:

#!/bin/bash
# Find the actual settings-key-group-mapper file

echo "=== Finding settings mapper file ==="
find . -name "*settings*mapper*" -type f 2>/dev/null

echo ""
echo "=== Search for mapKeyToGroup function ==="
rg "mapKeyToGroup|keyGroupMapping" --type js | head -20

Repository: TryGhost/Ghost

Length of output: 1052


🏁 Script executed:

#!/bin/bash
# Get the correct settings-key-group-mapper.js content

echo "=== Full settings-key-group-mapper.js ==="
cat ghost/core/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js

echo ""
echo "=== Check if transistor key is in the mapping ==="
rg "transistor" ghost/core/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js

Repository: TryGhost/Ghost

Length of output: 1826


🏁 Script executed:

#!/bin/bash
# Verify how the mapper is used in the codebase

echo "=== Where is mapKeyToGroup used? ==="
rg "mapKeyToGroup|settings-key-group-mapper" ghost/core --type js | grep -v ".test.js" | head -20

echo ""
echo "=== Check the filter-type-group-mapper to understand usage ==="
cat ghost/core/core/server/api/endpoints/utils/serializers/input/utils/settings-filter-type-group-mapper.js

Repository: TryGhost/Ghost

Length of output: 1342


🏁 Script executed:

#!/bin/bash
# Check how mapKeyToGroup is used in settings-importer

echo "=== settings-importer usage ==="
cat ghost/core/core/server/data/importer/importers/data/settings-importer.js | grep -A 20 -B 5 "mapKeyToGroup"

echo ""
echo "=== Check if transistor_portal_* keys need to be in mapper too ==="
rg "transistor_portal" ghost/core/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js

Repository: TryGhost/Ghost

Length of output: 157


🏁 Script executed:

#!/bin/bash
# Check the full settings-importer file

echo "=== Full settings-importer.js ==="
cat ghost/core/core/server/data/importer/importers/data/settings-importer.js

Repository: TryGhost/Ghost

Length of output: 9826


🏁 Script executed:

#!/bin/bash
# Check if other integration main keys like 'slack' are mapped

echo "=== Comparing slack integration handling ==="
rg "'slack'" ghost/core/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js

echo ""
echo "=== Check if transistor key is referenced anywhere that requires mapping ==="
rg "transistor['\"]:" ghost/admin/app/services/settings.js -A 2 -B 2

Repository: TryGhost/Ghost

Length of output: 200


Add transistor settings mappings to the settings-key-group-mapper.

The transistor group is queried in settings.js, but the mapper is missing entries for the transistor and related settings keys. While the transistor_portal_* settings work because they're created with explicit group assignment in the migration, the main transistor key and potentially the portal settings should be added to keyGroupMapping for consistency with other integrations (e.g., slack: 'slack') and to support settings import/export functionality.

Add the following mappings:

transistor: 'transistor',
transistor_portal_enabled: 'transistor',
transistor_portal_heading: 'transistor',
transistor_portal_description: 'transistor',
transistor_portal_button_text: 'transistor',
transistor_portal_url_template: 'transistor'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ghost/admin/app/services/settings.js` at line 54, The settings import/export
mapping is missing entries for the Transistor integration: update the
keyGroupMapping object in settings.js to include mappings for 'transistor' and
the portal keys so they map to the 'transistor' group; specifically add entries
for transistor, transistor_portal_enabled, transistor_portal_heading,
transistor_portal_description, transistor_portal_button_text, and
transistor_portal_url_template all set to 'transistor' (look for the
keyGroupMapping constant and the existing mappings like 'slack': 'slack' to
mirror that pattern).

@codecov
Copy link

codecov bot commented Mar 25, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 73.18%. Comparing base (31e09b5) to head (64a644a).
⚠️ Report is 8 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #26967   +/-   ##
=======================================
  Coverage   73.18%   73.18%           
=======================================
  Files        1539     1539           
  Lines      121668   121668           
  Branches    14718    14721    +3     
=======================================
+ Hits        89039    89044    +5     
+ Misses      31621    31594   -27     
- Partials     1008     1030   +22     
Flag Coverage Δ
admin-tests 54.37% <ø> (ø)
e2e-tests 73.18% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@9larsons 9larsons enabled auto-merge (squash) March 25, 2026 20:10
@9larsons 9larsons merged commit 3e33f9b into main Mar 25, 2026
67 of 69 checks passed
@9larsons 9larsons deleted the ga-transistor branch March 25, 2026 20:15
Sign up for free to 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