From f8b818bea2f3f4e83e4f69d081066a4381452d8b Mon Sep 17 00:00:00 2001 From: Craig Martin Date: Tue, 10 Feb 2026 13:01:22 -0500 Subject: [PATCH 1/2] Revert "Add dev-console=show to app dev preview url" This reverts commit a7349658a5f231166c6e5f88535bfbdacf7c1bbf. --- .../cli/services/dev/processes/setup-dev-processes.test.ts | 4 ++-- packages/app/src/cli/utilities/app/app-url.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts b/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts index eb1585b6a9..c3926ef8f2 100644 --- a/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts +++ b/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts @@ -176,7 +176,7 @@ describe('setup-dev-processes', () => { }) // Dev console is NOT shown by default (only shown for 1P devs) - expect(res.previewUrl).toBe('https://admin.shopify.com/store/store/apps/api-key?dev-console=show') + expect(res.previewUrl).toBe('https://admin.shopify.com/store/store/apps/api-key') expect(res.processes[0]).toMatchObject({ type: 'web', prefix: 'web-backend-frontend', @@ -206,7 +206,7 @@ describe('setup-dev-processes', () => { apiKey: 'api-key', apiSecret: 'api-secret', port: expect.any(Number), - appUrl: 'https://admin.shopify.com/store/store/apps/api-key?dev-console=show', + appUrl: 'https://admin.shopify.com/store/store/apps/api-key', key: 'somekey', storeFqdn: 'store.myshopify.io', }, diff --git a/packages/app/src/cli/utilities/app/app-url.ts b/packages/app/src/cli/utilities/app/app-url.ts index 79afa5cd86..76152b567a 100644 --- a/packages/app/src/cli/utilities/app/app-url.ts +++ b/packages/app/src/cli/utilities/app/app-url.ts @@ -10,7 +10,7 @@ export function buildAppURLForAdmin(storeFqdn: string, apiKey: string, adminDoma const normalizedFQDN = normalizeStoreFqdn(storeFqdn) const storeName = normalizedFQDN.split('.')[0] - return `https://${adminDomain}/store/${storeName}/apps/${apiKey}?dev-console=show` + return `https://${adminDomain}/store/${storeName}/apps/${apiKey}` } export function buildAppURLForMobile(storeFqdn: string, apiKey: string) { From f318cd78ae858eb1379b951667ec0b92929c8a6f Mon Sep 17 00:00:00 2001 From: Craig Martin Date: Tue, 10 Feb 2026 13:02:04 -0500 Subject: [PATCH 2/2] Revert "Use unified admin store domain for non-1P dev sessions" This reverts commit e703e55b0fd5db060ab46f890203d1d82bd4bc10. --- .../dev/processes/setup-dev-processes.test.ts | 13 ++--------- .../dev/processes/setup-dev-processes.ts | 22 ++++--------------- packages/app/src/cli/utilities/app/app-url.ts | 7 ------ 3 files changed, 6 insertions(+), 36 deletions(-) diff --git a/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts b/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts index c3926ef8f2..bb9d3ff1bf 100644 --- a/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts +++ b/packages/app/src/cli/services/dev/processes/setup-dev-processes.test.ts @@ -36,7 +36,6 @@ import {getEnvironmentVariables} from '@shopify/cli-kit/node/environment' import {isStorefrontPasswordProtected} from '@shopify/theme' import {fetchTheme} from '@shopify/cli-kit/node/themes/api' import {firstPartyDev} from '@shopify/cli-kit/node/context/local' -import {adminFqdn} from '@shopify/cli-kit/node/context/fqdn' vi.mock('../../context/identifiers.js') vi.mock('@shopify/cli-kit/node/session.js') @@ -45,13 +44,6 @@ vi.mock('@shopify/cli-kit/node/environment') vi.mock('@shopify/theme') vi.mock('@shopify/cli-kit/node/themes/api') vi.mock('@shopify/cli-kit/node/context/local') -vi.mock('@shopify/cli-kit/node/context/fqdn', async (importOriginal) => { - const original = await importOriginal() - return { - ...original, - adminFqdn: vi.fn(), - } -}) beforeEach(() => { // mocked for draft extensions @@ -79,7 +71,6 @@ beforeEach(() => { }) // By default, firstPartyDev is false (local dev console only shown for 1P devs) vi.mocked(firstPartyDev).mockReturnValue(false) - vi.mocked(adminFqdn).mockResolvedValue('admin.shopify.com') }) const appContextResult = { @@ -176,7 +167,7 @@ describe('setup-dev-processes', () => { }) // Dev console is NOT shown by default (only shown for 1P devs) - expect(res.previewUrl).toBe('https://admin.shopify.com/store/store/apps/api-key') + expect(res.previewUrl).toBe('https://store.myshopify.io/admin/oauth/redirect_from_cli?client_id=api-key') expect(res.processes[0]).toMatchObject({ type: 'web', prefix: 'web-backend-frontend', @@ -206,7 +197,7 @@ describe('setup-dev-processes', () => { apiKey: 'api-key', apiSecret: 'api-secret', port: expect.any(Number), - appUrl: 'https://admin.shopify.com/store/store/apps/api-key', + appUrl: 'https://store.myshopify.io/admin/oauth/redirect_from_cli?client_id=api-key', key: 'somekey', storeFqdn: 'store.myshopify.io', }, diff --git a/packages/app/src/cli/services/dev/processes/setup-dev-processes.ts b/packages/app/src/cli/services/dev/processes/setup-dev-processes.ts index 2ab5609397..0687de5a44 100644 --- a/packages/app/src/cli/services/dev/processes/setup-dev-processes.ts +++ b/packages/app/src/cli/services/dev/processes/setup-dev-processes.ts @@ -15,7 +15,7 @@ import {AppLinkedInterface, getAppScopes, WebType} from '../../../models/app/app import {OrganizationApp} from '../../../models/organization.js' import {DevOptions} from '../../dev.js' import {LocalhostCert, getProxyingWebServer} from '../../../utilities/app/http-reverse-proxy.js' -import {buildAppURLForAdmin, buildAppURLForWeb} from '../../../utilities/app/app-url.js' +import {buildAppURLForWeb} from '../../../utilities/app/app-url.js' import {ApplicationURLs} from '../urls.js' import {DeveloperPlatformClient} from '../../../utilities/developer-platform-client.js' import {AppEventWatcher} from '../app-events/app-event-watcher.js' @@ -25,7 +25,6 @@ import {isTruthy} from '@shopify/cli-kit/node/context/utilities' import {firstPartyDev} from '@shopify/cli-kit/node/context/local' import {getEnvironmentVariables} from '@shopify/cli-kit/node/environment' import {outputInfo} from '@shopify/cli-kit/node/output' -import {adminFqdn} from '@shopify/cli-kit/node/context/fqdn' interface ProxyServerProcess extends BaseProcess<{ @@ -92,6 +91,7 @@ export async function setupDevProcesses({ }> { const apiKey = remoteApp.apiKey const apiSecret = remoteApp.apiSecretKeys[0]?.secret ?? '' + const appPreviewUrl = buildAppURLForWeb(storeFqdn, apiKey) const env = getEnvironmentVariables() const shouldRenderGraphiQL = !isTruthy(env[environmentVariableNames.disableGraphiQLExplorer]) @@ -100,24 +100,10 @@ export async function setupDevProcesses({ const appWatcher = new AppEventWatcher(reloadedApp, network.proxyUrl) // Decide on the appropriate preview URL for a session with these processes - // - 1P developers with previewable extensions: use local dev console - // - 1P developers without previewable extensions: use legacy OAuth redirect URL - // - 3P developers: use unified admin URL + // Use local dev console only for 1P developers (SHOPIFY_CLI_1P_DEV is enabled) const anyPreviewableExtensions = reloadedApp.allExtensions.some((ext) => ext.isPreviewable) const devConsoleURL = `${network.proxyUrl}/extensions/dev-console` - const is1PDev = firstPartyDev() - - // appPreviewUrl is the direct app URL (used by GraphiQL and dev session fallback) - // previewURL is what's shown to the user (may be dev console for 1P devs) - let appPreviewUrl: string - if (is1PDev) { - appPreviewUrl = buildAppURLForWeb(storeFqdn, apiKey) - } else { - const adminDomain = await adminFqdn() - appPreviewUrl = buildAppURLForAdmin(storeFqdn, apiKey, adminDomain) - } - - const useDevConsole = is1PDev && anyPreviewableExtensions + const useDevConsole = firstPartyDev() && anyPreviewableExtensions const previewURL = useDevConsole ? devConsoleURL : appPreviewUrl const graphiqlURL = shouldRenderGraphiQL diff --git a/packages/app/src/cli/utilities/app/app-url.ts b/packages/app/src/cli/utilities/app/app-url.ts index 76152b567a..265b90a95f 100644 --- a/packages/app/src/cli/utilities/app/app-url.ts +++ b/packages/app/src/cli/utilities/app/app-url.ts @@ -6,13 +6,6 @@ export function buildAppURLForWeb(storeFqdn: string, apiKey: string) { return `https://${adminUrl}/admin/oauth/redirect_from_cli?client_id=${apiKey}` } -export function buildAppURLForAdmin(storeFqdn: string, apiKey: string, adminDomain: string) { - const normalizedFQDN = normalizeStoreFqdn(storeFqdn) - const storeName = normalizedFQDN.split('.')[0] - - return `https://${adminDomain}/store/${storeName}/apps/${apiKey}` -} - export function buildAppURLForMobile(storeFqdn: string, apiKey: string) { const normalizedFQDN = normalizeStoreFqdn(storeFqdn) const adminUrl = storeAdminUrl(normalizedFQDN)