@@ -6,12 +6,6 @@ import * as fs from 'fs'
66import type { CLIContext , CLIProcess , ExecResult } from './cli.js'
77import type { BrowserContext } from './browser.js'
88
9- // Env override applied to all CLI helpers — strips CLIENT_ID so commands use the app's own toml.
10- // NOTE: Do NOT add SHOPIFY_CLI_PARTNERS_TOKEN here. The partners token overrides OAuth in the
11- // CLI's auth priority, and the App Management API token it exchanges to lacks permissions to
12- // create apps (403). OAuth provides the full set of required permissions.
13- const FRESH_APP_ENV = { SHOPIFY_FLAG_CLIENT_ID : undefined }
14-
159// ---------------------------------------------------------------------------
1610// CLI helpers — thin wrappers around cli.exec()
1711// ---------------------------------------------------------------------------
@@ -46,7 +40,7 @@ export async function createApp(ctx: {
4640
4741 const result = await cli . execCreateApp ( args , {
4842 // Strip CLIENT_ID so the CLI creates a new app instead of linking to a pre-existing one
49- env : { FORCE_COLOR : '0' , ... FRESH_APP_ENV } ,
43+ env : { FORCE_COLOR : '0' } ,
5044 timeout : 5 * 60 * 1000 ,
5145 } )
5246
@@ -81,6 +75,27 @@ export async function createApp(ctx: {
8175 return { ...result , appDir}
8276}
8377
78+ /**
79+ * Read the client_id from a shopify.app.toml file.
80+ */
81+ export function extractClientId ( appDir : string ) : string {
82+ const toml = fs . readFileSync ( path . join ( appDir , 'shopify.app.toml' ) , 'utf8' )
83+ const match = toml . match ( / c l i e n t _ i d \s * = \s * " ( [ ^ " ] + ) " / )
84+ if ( ! match ?. [ 1 ] ) {
85+ throw new Error ( `Could not find client_id in ${ path . join ( appDir , 'shopify.app.toml' ) } ` )
86+ }
87+ return match [ 1 ]
88+ }
89+
90+ /**
91+ * Overwrite a created app's shopify.app.toml with a fixture TOML template.
92+ * The template should contain `__CLIENT_ID__` which gets replaced with the app's real client_id.
93+ */
94+ export function injectFixtureToml ( appDir : string , fixtureTomlContent : string ) : void {
95+ const clientId = extractClientId ( appDir )
96+ fs . writeFileSync ( path . join ( appDir , 'shopify.app.toml' ) , fixtureTomlContent . replace ( '__CLIENT_ID__' , clientId ) )
97+ }
98+
8499export async function generateExtension (
85100 ctx : CLIContext & {
86101 name : string
@@ -90,11 +105,11 @@ export async function generateExtension(
90105) : Promise < ExecResult > {
91106 const args = [ 'app' , 'generate' , 'extension' , '--name' , ctx . name , '--path' , ctx . appDir , '--template' , ctx . template ]
92107 if ( ctx . flavor ) args . push ( '--flavor' , ctx . flavor )
93- return ctx . cli . exec ( args , { env : FRESH_APP_ENV , timeout : 5 * 60 * 1000 } )
108+ return ctx . cli . exec ( args , { timeout : 5 * 60 * 1000 } )
94109}
95110
96111export async function buildApp ( ctx : CLIContext ) : Promise < ExecResult > {
97- return ctx . cli . exec ( [ 'app' , 'build' , '--path' , ctx . appDir ] , { env : FRESH_APP_ENV , timeout : 5 * 60 * 1000 } )
112+ return ctx . cli . exec ( [ 'app' , 'build' , '--path' , ctx . appDir ] , { timeout : 5 * 60 * 1000 } )
98113}
99114
100115export async function deployApp (
@@ -112,7 +127,7 @@ export async function deployApp(
112127 if ( ctx . version ) args . push ( '--version' , ctx . version )
113128 if ( ctx . message ) args . push ( '--message' , ctx . message )
114129 if ( ctx . config ) args . push ( '--config' , ctx . config )
115- return ctx . cli . exec ( args , { env : FRESH_APP_ENV , timeout : 5 * 60 * 1000 } )
130+ return ctx . cli . exec ( args , { timeout : 5 * 60 * 1000 } )
116131}
117132
118133export async function appInfo ( ctx : CLIContext ) : Promise < {
@@ -124,15 +139,15 @@ export async function appInfo(ctx: CLIContext): Promise<{
124139 entrySourceFilePath : string
125140 } [ ]
126141} > {
127- const result = await ctx . cli . exec ( [ 'app' , 'info' , '--path' , ctx . appDir , '--json' ] , { env : FRESH_APP_ENV } )
142+ const result = await ctx . cli . exec ( [ 'app' , 'info' , '--path' , ctx . appDir , '--json' ] )
128143 if ( result . exitCode !== 0 ) {
129144 throw new Error ( `app info failed (exit ${ result . exitCode } ):\nstdout: ${ result . stdout } \nstderr: ${ result . stderr } ` )
130145 }
131146 return JSON . parse ( result . stdout )
132147}
133148
134149export async function functionBuild ( ctx : CLIContext ) : Promise < ExecResult > {
135- return ctx . cli . exec ( [ 'app' , 'function' , 'build' , '--path' , ctx . appDir ] , { env : FRESH_APP_ENV , timeout : 3 * 60 * 1000 } )
150+ return ctx . cli . exec ( [ 'app' , 'function' , 'build' , '--path' , ctx . appDir ] , { timeout : 3 * 60 * 1000 } )
136151}
137152
138153export async function functionRun (
@@ -141,14 +156,12 @@ export async function functionRun(
141156 } ,
142157) : Promise < ExecResult > {
143158 return ctx . cli . exec ( [ 'app' , 'function' , 'run' , '--path' , ctx . appDir , '--input' , ctx . inputPath ] , {
144- env : FRESH_APP_ENV ,
145159 timeout : 60 * 1000 ,
146160 } )
147161}
148162
149163export async function versionsList ( ctx : CLIContext ) : Promise < ExecResult > {
150164 return ctx . cli . exec ( [ 'app' , 'versions' , 'list' , '--path' , ctx . appDir , '--json' ] , {
151- env : FRESH_APP_ENV ,
152165 timeout : 60 * 1000 ,
153166 } )
154167}
@@ -159,7 +172,6 @@ export async function configLink(
159172 } ,
160173) : Promise < ExecResult > {
161174 return ctx . cli . exec ( [ 'app' , 'config' , 'link' , '--path' , ctx . appDir , '--client-id' , ctx . clientId ] , {
162- env : FRESH_APP_ENV ,
163175 timeout : 2 * 60 * 1000 ,
164176 } )
165177}
@@ -374,13 +386,9 @@ export async function cleanupApp(
374386// ---------------------------------------------------------------------------
375387
376388export const appTestFixture = authFixture . extend < { authReady : void } > ( {
377- // Auto-trigger authLogin and strip CLIENT_ID so tests create their own apps
389+ // Auto-trigger authLogin so the OAuth session is available for all app tests
378390 authReady : [
379- async (
380- { authLogin : _authLogin , env} : { authLogin : void ; env : import ( './env.js' ) . E2EEnv } ,
381- use : ( ) => Promise < void > ,
382- ) => {
383- delete env . processEnv . SHOPIFY_FLAG_CLIENT_ID
391+ async ( { authLogin : _authLogin } : { authLogin : void } , use : ( ) => Promise < void > ) => {
384392 await use ( )
385393 } ,
386394 { auto : true } ,
0 commit comments