@@ -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,14 @@ 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+ // eslint-disable-next-line no-useless-escape
63+ return value ?. map ( ( dir ) => dir . replace ( / ( [ ^ \* ] ) \* $ / , '$1**' ) )
64+ }
65+
5266/**
5367 * Schema for a normal, linked app. Properties from modules are not validated.
5468 */
@@ -62,7 +76,7 @@ export const AppSchema = zod.object({
6276 include_config_on_deploy : zod . boolean ( ) . optional ( ) ,
6377 } )
6478 . optional ( ) ,
65- extension_directories : zod . array ( zod . string ( ) ) . optional ( ) . transform ( removeTrailingPathSeparator ) ,
79+ extension_directories : ExtensionDirectoriesSchema ,
6680 web_directories : zod . array ( zod . string ( ) ) . optional ( ) ,
6781} )
6882
0 commit comments