@@ -23,6 +23,12 @@ import {getArrayRejectingUndefined} from '@shopify/cli-kit/common/array'
2323
2424// Schemas for loading app configuration
2525
26+ const ExtensionDirectoriesSchema = zod
27+ . array ( zod . string ( ) )
28+ . optional ( )
29+ . transform ( removeTrailingPathSeparator )
30+ . transform ( fixSingleWildcards )
31+
2632/**
2733 * Schema for a freshly minted app template.
2834 */
@@ -34,7 +40,7 @@ export const LegacyAppSchema = zod
3440 . string ( )
3541 . transform ( ( scopes ) => normalizeDelimitedString ( scopes ) ?? '' )
3642 . default ( '' ) ,
37- extension_directories : zod . array ( zod . string ( ) ) . optional ( ) . transform ( removeTrailingPathSeparator ) ,
43+ extension_directories : ExtensionDirectoriesSchema ,
3844 web_directories : zod . array ( zod . string ( ) ) . optional ( ) ,
3945 webhooks : zod
4046 . object ( {
@@ -49,6 +55,13 @@ function removeTrailingPathSeparator(value: string[] | undefined) {
4955 // eslint-disable-next-line no-useless-escape
5056 return value ?. map ( ( dir ) => dir . replace ( / [ \/ \\ ] + $ / , '' ) )
5157}
58+
59+ // If a path ends with a single asterisk, modify it to end with a double asterisk.
60+ // This is to support the glob pattern used by chokidar and watch for changes in subfolders.
61+ function fixSingleWildcards ( value : string [ ] | undefined ) {
62+ return value ?. map ( ( dir ) => dir . replace ( / \* $ / , '**' ) )
63+ }
64+
5265/**
5366 * Schema for a normal, linked app. Properties from modules are not validated.
5467 */
@@ -62,7 +75,7 @@ export const AppSchema = zod.object({
6275 include_config_on_deploy : zod . boolean ( ) . optional ( ) ,
6376 } )
6477 . optional ( ) ,
65- extension_directories : zod . array ( zod . string ( ) ) . optional ( ) . transform ( removeTrailingPathSeparator ) ,
78+ extension_directories : ExtensionDirectoriesSchema ,
6679 web_directories : zod . array ( zod . string ( ) ) . optional ( ) ,
6780} )
6881
0 commit comments