Skip to content

Commit 9ae216c

Browse files
committed
Allow to create contract-based specifications with some local overrides
1 parent a659a26 commit 9ae216c

File tree

4 files changed

+20
-30
lines changed

4 files changed

+20
-30
lines changed

packages/app/src/cli/models/extensions/specification.integration.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ describe('allLocalSpecs', () => {
3131
describe('createContractBasedModuleSpecification', () => {
3232
test('creates a specification with the given identifier', () => {
3333
// When
34-
const got = createContractBasedModuleSpecification('test', ['localization'])
34+
const got = createContractBasedModuleSpecification({
35+
identifier: 'test',
36+
appModuleFeatures: () => ['localization'],
37+
})
3538

3639
// Then
3740
expect(got).toMatchObject(

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,17 @@ export function createConfigExtensionSpecification<TConfiguration extends BaseCo
255255
}
256256

257257
export function createContractBasedModuleSpecification<TConfiguration extends BaseConfigType = BaseConfigType>(
258-
identifier: string,
259-
appModuleFeatures?: ExtensionFeature[],
258+
spec: Pick<CreateExtensionSpecType<TConfiguration>, 'identifier' | 'appModuleFeatures' | 'buildConfig'>,
260259
) {
261260
return createExtensionSpecification({
262-
identifier,
261+
identifier: spec.identifier,
263262
schema: zod.any({}) as unknown as ZodSchemaType<TConfiguration>,
264-
appModuleFeatures: () => appModuleFeatures ?? [],
263+
appModuleFeatures: spec.appModuleFeatures,
264+
buildConfig: spec.buildConfig,
265265
deployConfig: async (config, directory) => {
266266
let parsedConfig = configWithoutFirstClassFields(config)
267-
if (appModuleFeatures?.includes('localization')) {
268-
const localization = await loadLocalesConfig(directory, identifier)
267+
if (spec.appModuleFeatures().includes('localization')) {
268+
const localization = await loadLocalesConfig(directory, spec.identifier)
269269
parsedConfig = {...parsedConfig, localization}
270270
}
271271
return parsedConfig
Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,16 @@
1-
import {createExtensionSpecification} from '../specification.js'
2-
import {BaseSchemaWithHandle} from '../schemas.js'
3-
import {zod} from '@shopify/cli-kit/node/schema'
1+
import {createContractBasedModuleSpecification} from '../specification.js'
42
import {joinPath} from '@shopify/cli-kit/node/path'
53

6-
const ChannelSpecificationSchema = BaseSchemaWithHandle.extend({
7-
type: zod.literal('channel_config'),
8-
name: zod.string().optional(),
9-
description: zod.string().optional(),
10-
})
11-
124
const SUBDIRECTORY_NAME = 'specifications'
135
const FILE_EXTENSIONS = ['json', 'toml', 'yaml', 'yml', 'svg']
146

15-
// Generate glob patterns for all supported file types
16-
const getGlobPatterns = () => FILE_EXTENSIONS.map((ext) => joinPath(SUBDIRECTORY_NAME, '**', `*.${ext}`))
17-
18-
const channelSpecificationSpec = createExtensionSpecification({
7+
const channelSpecificationSpec = createContractBasedModuleSpecification({
198
identifier: 'channel_config',
20-
schema: ChannelSpecificationSchema,
21-
buildConfig: {mode: 'copy_files', filePatterns: getGlobPatterns()},
22-
appModuleFeatures: () => [],
23-
deployConfig: async (config, _directory) => {
24-
return {
25-
handle: config.handle,
26-
name: config.name,
27-
description: config.description,
28-
}
9+
buildConfig: {
10+
mode: 'copy_files',
11+
filePatterns: FILE_EXTENSIONS.map((ext) => joinPath(SUBDIRECTORY_NAME, '**', `*.${ext}`)),
2912
},
13+
appModuleFeatures: () => [],
3014
})
3115

3216
export default channelSpecificationSpec

packages/app/src/cli/services/generate/fetch-extension-specifications.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ async function mergeLocalAndRemoteSpecs(
6868
if (!localSpec && remoteSpec.validationSchema?.jsonSchema) {
6969
const normalisedSchema = await normaliseJsonSchema(remoteSpec.validationSchema.jsonSchema)
7070
const hasLocalization = normalisedSchema.properties?.localization !== undefined
71-
localSpec = createContractBasedModuleSpecification(remoteSpec.identifier, hasLocalization ? ['localization'] : [])
71+
localSpec = createContractBasedModuleSpecification({
72+
identifier: remoteSpec.identifier,
73+
appModuleFeatures: () => (hasLocalization ? ['localization'] : []),
74+
})
7275
localSpec.uidStrategy = remoteSpec.options.uidIsClientProvided ? 'uuid' : 'single'
7376
}
7477
if (!localSpec) return undefined

0 commit comments

Comments
 (0)