@@ -17,15 +17,16 @@ import {AbortSignal, AbortController} from '@shopify/cli-kit/node/abort'
1717import { flushPromises } from '@shopify/cli-kit/node/promises'
1818import { inTemporaryDirectory } from '@shopify/cli-kit/node/fs'
1919import { joinPath } from '@shopify/cli-kit/node/path'
20+ import { nonRandomUUID } from '@shopify/cli-kit/node/crypto'
2021import { Writable } from 'stream'
2122
2223vi . mock ( '../../../models/app/loader.js' )
2324vi . mock ( './app-watcher-esbuild.js' )
2425
2526// Extensions 1 and 1B simulate extensions defined in the same directory (same toml)
26- const extension1 = await testUIExtension ( { type : 'ui_extension' , handle : 'h1 ' , directory : '/extensions/ui_extension_1 ' } )
27- const extension1B = await testUIExtension ( { type : 'ui_extension' , handle : 'h2 ' , directory : '/extensions/ui_extension_1 ' } )
28- const extension2 = await testUIExtension ( { type : 'ui_extension' , directory : '/extensions/ui_extension_2' } )
27+ const extension1 = await testUIExtension ( { type : 'ui_extension' , directory : '/extensions/ui_extension_1 ' , uid : 'uid1 ' } )
28+ const extension1B = await testUIExtension ( { type : 'ui_extension' , directory : '/extensions/ui_extension_1 ' , uid : 'uid1B ' } )
29+ const extension2 = await testUIExtension ( { type : 'ui_extension' , directory : '/extensions/ui_extension_2' , uid : 'uid2' } )
2930const flowExtension = await testFlowActionExtension ( '/extensions/flow_action' )
3031const posExtension = await testAppConfigExtensions ( )
3132const appAccessExtension = await testAppAccessConfigExtension ( )
@@ -35,14 +36,14 @@ const webhookExtension = await testSingleWebhookSubscriptionExtension()
3536const extension1Updated = await testUIExtension ( {
3637 type : 'ui_extension' ,
3738 name : 'updated_name1' ,
38- handle : 'h1' ,
3939 directory : '/extensions/ui_extension_1' ,
40+ uid : 'uid1' ,
4041} )
4142const extension1BUpdated = await testUIExtension ( {
4243 type : 'ui_extension' ,
4344 name : 'updated_name1B' ,
44- handle : 'h2' ,
4545 directory : '/extensions/ui_extension_1' ,
46+ uid : 'uid1B' ,
4647} )
4748const posExtensionUpdated = await testAppConfigExtensions ( true )
4849
@@ -105,9 +106,7 @@ const testCases: TestCase[] = [
105106 } ,
106107 initialExtensions : [ extension1 , posExtension ] ,
107108 finalExtensions : [ extension1 , extension2 , posExtension ] ,
108- extensionEvents : [
109- { type : EventType . Created , extension : extension2 , buildResult : { status : 'ok' , handle : 'test-ui-extension' } } ,
110- ] ,
109+ extensionEvents : [ { type : EventType . Created , extension : extension2 , buildResult : { status : 'ok' , uid : 'uid2' } } ] ,
111110 needsAppReload : true ,
112111 } ,
113112 {
@@ -120,7 +119,7 @@ const testCases: TestCase[] = [
120119 } ,
121120 initialExtensions : [ extension1 , extension2 , posExtension ] ,
122121 finalExtensions : [ extension1 , extension2 , posExtension ] ,
123- extensionEvents : [ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , handle : 'h1 ' } } ] ,
122+ extensionEvents : [ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , uid : 'uid1 ' } } ] ,
124123 } ,
125124 {
126125 name : 'file_updated affecting a single extension' ,
@@ -132,7 +131,7 @@ const testCases: TestCase[] = [
132131 } ,
133132 initialExtensions : [ extension1 , extension2 , posExtension ] ,
134133 finalExtensions : [ extension1 , extension2 , posExtension ] ,
135- extensionEvents : [ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , handle : 'h1 ' } } ] ,
134+ extensionEvents : [ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , uid : 'uid1 ' } } ] ,
136135 } ,
137136 {
138137 name : 'file_deleted affecting a single extension' ,
@@ -144,7 +143,7 @@ const testCases: TestCase[] = [
144143 } ,
145144 initialExtensions : [ extension1 , extension2 , posExtension ] ,
146145 finalExtensions : [ extension1 , extension2 , posExtension ] ,
147- extensionEvents : [ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , handle : 'h1 ' } } ] ,
146+ extensionEvents : [ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , uid : 'uid1 ' } } ] ,
148147 } ,
149148 {
150149 name : 'file_created affecting a multiple extensions' ,
@@ -157,8 +156,8 @@ const testCases: TestCase[] = [
157156 initialExtensions : [ extension1 , extension1B , extension2 , posExtension ] ,
158157 finalExtensions : [ extension1 , extension1B , extension2 , posExtension ] ,
159158 extensionEvents : [
160- { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , handle : 'h1 ' } } ,
161- { type : EventType . Updated , extension : extension1B , buildResult : { status : 'ok' , handle : 'h2 ' } } ,
159+ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , uid : 'uid1 ' } } ,
160+ { type : EventType . Updated , extension : extension1B , buildResult : { status : 'ok' , uid : 'uid1B ' } } ,
162161 ] ,
163162 } ,
164163 {
@@ -172,8 +171,8 @@ const testCases: TestCase[] = [
172171 initialExtensions : [ extension1 , extension1B , extension2 , posExtension ] ,
173172 finalExtensions : [ extension1 , extension1B , extension2 , posExtension ] ,
174173 extensionEvents : [
175- { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , handle : 'h1 ' } } ,
176- { type : EventType . Updated , extension : extension1B , buildResult : { status : 'ok' , handle : 'h2 ' } } ,
174+ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , uid : 'uid1 ' } } ,
175+ { type : EventType . Updated , extension : extension1B , buildResult : { status : 'ok' , uid : 'uid1B ' } } ,
177176 ] ,
178177 } ,
179178 {
@@ -187,8 +186,8 @@ const testCases: TestCase[] = [
187186 initialExtensions : [ extension1 , extension1B , extension2 , posExtension ] ,
188187 finalExtensions : [ extension1 , extension1B , extension2 , posExtension ] ,
189188 extensionEvents : [
190- { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , handle : 'h1 ' } } ,
191- { type : EventType . Updated , extension : extension1B , buildResult : { status : 'ok' , handle : 'h2 ' } } ,
189+ { type : EventType . Updated , extension : extension1 , buildResult : { status : 'ok' , uid : 'uid1 ' } } ,
190+ { type : EventType . Updated , extension : extension1B , buildResult : { status : 'ok' , uid : 'uid1B ' } } ,
192191 ] ,
193192 } ,
194193 {
@@ -202,9 +201,17 @@ const testCases: TestCase[] = [
202201 initialExtensions : [ extension1 , extension2 , posExtension , webhookExtension ] ,
203202 finalExtensions : [ extension1 , extension2 , posExtensionUpdated , appAccessExtension ] ,
204203 extensionEvents : [
205- { type : EventType . Updated , extension : posExtensionUpdated , buildResult : { status : 'ok' , handle : 'point-of-sale' } } ,
204+ {
205+ type : EventType . Updated ,
206+ extension : posExtensionUpdated ,
207+ buildResult : { status : 'ok' , uid : nonRandomUUID ( 'point-of-sale' ) } ,
208+ } ,
206209 { type : EventType . Deleted , extension : webhookExtension } ,
207- { type : EventType . Created , extension : appAccessExtension , buildResult : { status : 'ok' , handle : 'app-access' } } ,
210+ {
211+ type : EventType . Created ,
212+ extension : appAccessExtension ,
213+ buildResult : { status : 'ok' , uid : nonRandomUUID ( 'app-access' ) } ,
214+ } ,
208215 ] ,
209216 needsAppReload : true ,
210217 } ,
@@ -219,8 +226,8 @@ const testCases: TestCase[] = [
219226 initialExtensions : [ extension1 , extension1B , extension2 ] ,
220227 finalExtensions : [ extension1Updated , extension1BUpdated , extension2 ] ,
221228 extensionEvents : [
222- { type : EventType . Updated , extension : extension1Updated , buildResult : { status : 'ok' , handle : 'h1 ' } } ,
223- { type : EventType . Updated , extension : extension1BUpdated , buildResult : { status : 'ok' , handle : 'h2 ' } } ,
229+ { type : EventType . Updated , extension : extension1Updated , buildResult : { status : 'ok' , uid : 'uid1 ' } } ,
230+ { type : EventType . Updated , extension : extension1BUpdated , buildResult : { status : 'ok' , uid : 'uid1B ' } } ,
224231 ] ,
225232 needsAppReload : true ,
226233 } ,
@@ -295,7 +302,7 @@ describe('app-event-watcher', () => {
295302 const initialEvents = app . realExtensions . map ( ( eve ) => ( {
296303 type : EventType . Updated ,
297304 extension : eve ,
298- buildResult : { status : 'ok' , handle : eve . handle } ,
305+ buildResult : { status : 'ok' , uid : eve . uid } ,
299306 } ) )
300307 expect ( emitSpy ) . toHaveBeenCalledWith ( 'ready' , {
301308 app,
@@ -406,8 +413,9 @@ describe('app-event-watcher', () => {
406413class MockESBuildContextManager extends ESBuildContextManager {
407414 contexts = {
408415 // The keys are the extension handles, the values are the ESBuild contexts mocked
409- h1 : [ { rebuild : vi . fn ( ) , watch : vi . fn ( ) , serve : vi . fn ( ) , cancel : vi . fn ( ) , dispose : vi . fn ( ) } ] ,
410- h2 : [ { rebuild : vi . fn ( ) , watch : vi . fn ( ) , serve : vi . fn ( ) , cancel : vi . fn ( ) , dispose : vi . fn ( ) } ] ,
416+ uid1 : [ { rebuild : vi . fn ( ) , watch : vi . fn ( ) , serve : vi . fn ( ) , cancel : vi . fn ( ) , dispose : vi . fn ( ) } ] ,
417+ uid1B : [ { rebuild : vi . fn ( ) , watch : vi . fn ( ) , serve : vi . fn ( ) , cancel : vi . fn ( ) , dispose : vi . fn ( ) } ] ,
418+ uid2 : [ { rebuild : vi . fn ( ) , watch : vi . fn ( ) , serve : vi . fn ( ) , cancel : vi . fn ( ) , dispose : vi . fn ( ) } ] ,
411419 'test-ui-extension' : [ { rebuild : vi . fn ( ) , watch : vi . fn ( ) , serve : vi . fn ( ) , cancel : vi . fn ( ) , dispose : vi . fn ( ) } ] ,
412420 }
413421
0 commit comments