Skip to content

Commit 6b8c002

Browse files
authored
Merge pull request #5160 from Shopify/01-07-fix_extension_directories_wildcards_to_always_be_recursive
Fix extension_directories wildcards to always be recursive
2 parents acbd399 + b874496 commit 6b8c002

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

packages/app/src/cli/models/app/app.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
AppSchema,
23
CurrentAppConfiguration,
34
LegacyAppConfiguration,
45
getAppScopes,
@@ -30,6 +31,7 @@ const CORRECT_CURRENT_APP_SCHEMA: CurrentAppConfiguration = {
3031
path: '',
3132
name: 'app 1',
3233
client_id: '12345',
34+
extension_directories: ['extensions/*'],
3335
webhooks: {
3436
api_version: '2023-04',
3537
privacy_compliance: {
@@ -91,6 +93,33 @@ describe('app schema validation', () => {
9193

9294
expect(isCurrentAppSchema(config)).toBe(false)
9395
})
96+
97+
test('extension_directories should be transformed to double asterisks', () => {
98+
const config = {
99+
...CORRECT_CURRENT_APP_SCHEMA,
100+
extension_directories: ['extensions/*'],
101+
}
102+
const parsed = AppSchema.parse(config)
103+
expect(parsed.extension_directories).toEqual(['extensions/**'])
104+
})
105+
106+
test('extension_directories is not transformed if it ends with double asterisks', () => {
107+
const config = {
108+
...CORRECT_CURRENT_APP_SCHEMA,
109+
extension_directories: ['extensions/**'],
110+
}
111+
const parsed = AppSchema.parse(config)
112+
expect(parsed.extension_directories).toEqual(['extensions/**'])
113+
})
114+
115+
test('extension_directories is not transformed if it doesnt end with a wildcard', () => {
116+
const config = {
117+
...CORRECT_CURRENT_APP_SCHEMA,
118+
extension_directories: ['extensions'],
119+
}
120+
const parsed = AppSchema.parse(config)
121+
expect(parsed.extension_directories).toEqual(['extensions'])
122+
})
94123
})
95124
})
96125

packages/app/src/cli/models/app/app.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)