Skip to content

Commit dd63de8

Browse files
Clean up module outputFile calculation and move it to the specifications
1 parent 5300218 commit dd63de8

11 files changed

Lines changed: 44 additions & 24 deletions

File tree

packages/app/src/cli/models/extensions/extension-instance.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,7 @@ export class ExtensionInstance<TConfiguration extends BaseConfigType = BaseConfi
137137
}
138138

139139
get outputFileName() {
140-
const mode = this.specification.buildConfig.mode
141-
if (mode === 'copy_files' || mode === 'theme') {
142-
return ''
143-
} else if (mode === 'function') {
144-
return 'index.wasm'
145-
} else {
146-
return `${this.handle}.js`
147-
}
140+
return basename(this.specification.getOutputFileName?.(this) ?? '')
148141
}
149142

150143
constructor(options: {
@@ -162,19 +155,9 @@ export class ExtensionInstance<TConfiguration extends BaseConfigType = BaseConfi
162155
this.handle = this.buildHandle()
163156
this.localIdentifier = this.handle
164157
this.idEnvironmentVariableName = `SHOPIFY_${constantize(this.localIdentifier)}_ID`
165-
this.outputPath = this.directory
158+
this.outputPath = joinPath(this.directory, this.specification.getOutputFileName?.(this) ?? '')
166159
this.uid = this.buildUIDFromStrategy()
167160
this.devUUID = `dev-${this.uid}`
168-
169-
if (this.features.includes('esbuild') || this.type === 'tax_calculation') {
170-
this.outputPath = joinPath(this.directory, 'dist', this.outputFileName)
171-
}
172-
173-
if (this.isFunctionExtension) {
174-
const config = this.configuration as unknown as FunctionConfigType
175-
const defaultPath = joinPath('dist', 'index.wasm')
176-
this.outputPath = joinPath(this.directory, config.build?.path ?? defaultPath)
177-
}
178161
}
179162

180163
get draftMessages() {
@@ -408,8 +391,7 @@ export class ExtensionInstance<TConfiguration extends BaseConfigType = BaseConfi
408391

409392
getOutputPathForDirectory(directory: string, outputId?: string) {
410393
const id = this.getOutputFolderId(outputId)
411-
const outputFile = this.outputFileName === '' ? '' : joinPath('dist', this.outputFileName)
412-
return joinPath(directory, id, outputFile)
394+
return joinPath(directory, id, this.specification.getOutputFileName?.(this) ?? '')
413395
}
414396

415397
get singleTarget() {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export interface ExtensionSpecification<TConfiguration extends BaseConfigType =
7272
buildConfig: BuildConfig
7373
dependency?: string
7474
graphQLType?: string
75+
getOutputFileName?: (extension: ExtensionInstance<TConfiguration>) => string
7576
getBundleExtensionStdinContent?: (config: TConfiguration) => {main: string; assets?: Asset[]}
7677
deployConfig?: (
7778
config: TConfiguration,

packages/app/src/cli/models/extensions/specifications/checkout_post_purchase.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import {ExtensionInstance} from '../extension-instance.js'
12
import {BaseSchema, MetafieldSchema} from '../schemas.js'
23
import {createExtensionSpecification} from '../specification.js'
4+
import {joinPath} from '@shopify/cli-kit/node/path'
35
import {zod} from '@shopify/cli-kit/node/schema'
46

57
const dependency = '@shopify/post-purchase-ui-extensions'
68

9+
type CheckoutPostPurchaseConfigType = zod.infer<typeof CheckoutPostPurchaseSchema>
710
const CheckoutPostPurchaseSchema = BaseSchema.extend({
811
metafields: zod.array(MetafieldSchema).optional(),
912
})
@@ -15,6 +18,8 @@ const checkoutPostPurchaseSpec = createExtensionSpecification({
1518
schema: CheckoutPostPurchaseSchema,
1619
appModuleFeatures: (_) => ['ui_preview', 'cart_url', 'esbuild', 'single_js_entry_path'],
1720
buildConfig: {mode: 'ui'},
21+
getOutputFileName: (extension: ExtensionInstance<CheckoutPostPurchaseConfigType>) =>
22+
joinPath('dist', `${extension.handle}.js`),
1823
deployConfig: async (config, _) => {
1924
return {metafields: config.metafields ?? []}
2025
},

packages/app/src/cli/models/extensions/specifications/checkout_ui_extension.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import {createExtensionSpecification} from '../specification.js'
22
import {BaseSchema, MetafieldSchema} from '../schemas.js'
33
import {loadLocalesConfig} from '../../../utilities/extensions/locales-configuration.js'
4+
import {ExtensionInstance} from '../extension-instance.js'
45
import {zod} from '@shopify/cli-kit/node/schema'
6+
import {joinPath} from '@shopify/cli-kit/node/path'
57

68
const dependency = '@shopify/checkout-ui-extensions'
79

10+
type CheckoutConfigType = zod.infer<typeof CheckoutSchema>
811
const CheckoutSchema = BaseSchema.extend({
912
name: zod.string(),
1013
extension_points: zod.array(zod.string()).optional(),
@@ -22,6 +25,7 @@ const checkoutSpec = createExtensionSpecification({
2225
schema: CheckoutSchema,
2326
appModuleFeatures: (_) => ['ui_preview', 'cart_url', 'esbuild', 'single_js_entry_path', 'generates_source_maps'],
2427
buildConfig: {mode: 'ui'},
28+
getOutputFileName: (extension: ExtensionInstance<CheckoutConfigType>) => joinPath('dist', `${extension.handle}.js`),
2529
deployConfig: async (config, directory) => {
2630
return {
2731
extension_points: config.extension_points,

packages/app/src/cli/models/extensions/specifications/function.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {createExtensionSpecification} from '../specification.js'
22
import {BaseSchema} from '../schemas.js'
33
import {loadLocalesConfig} from '../../../utilities/extensions/locales-configuration.js'
4+
import {ExtensionInstance} from '../extension-instance.js'
45
import {zod} from '@shopify/cli-kit/node/schema'
56
import {joinPath} from '@shopify/cli-kit/node/path'
67
import {fileExists, readFile} from '@shopify/cli-kit/node/fs'
@@ -88,6 +89,8 @@ const functionSpec = createExtensionSpecification({
8889
schema: FunctionExtensionSchema,
8990
appModuleFeatures: (_) => ['function'],
9091
buildConfig: {mode: 'function'},
92+
getOutputFileName: (extension: ExtensionInstance<FunctionConfigType>) =>
93+
extension.configuration.build?.path ?? joinPath('dist', 'index.wasm'),
9194
deployConfig: async (config, directory, apiKey) => {
9295
let inputQuery: string | undefined
9396
const moduleId = randomUUID()

packages/app/src/cli/models/extensions/specifications/pos_ui_extension.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
import {getDependencyVersion} from '../../app/app.js'
22
import {createExtensionSpecification} from '../specification.js'
33
import {BaseSchema} from '../schemas.js'
4+
import {ExtensionInstance} from '../extension-instance.js'
45
import {BugError} from '@shopify/cli-kit/node/error'
56
import {zod} from '@shopify/cli-kit/node/schema'
7+
import {joinPath} from '@shopify/cli-kit/node/path'
68

79
const dependency = '@shopify/retail-ui-extensions'
810

11+
type PosUIConfigType = zod.infer<typeof PosUISchema>
12+
const PosUISchema = BaseSchema.extend({name: zod.string()})
13+
914
const posUISpec = createExtensionSpecification({
1015
identifier: 'pos_ui_extension',
1116
dependency,
12-
schema: BaseSchema.extend({name: zod.string()}),
17+
schema: PosUISchema,
1318
appModuleFeatures: (_) => ['ui_preview', 'esbuild', 'single_js_entry_path'],
1419
buildConfig: {mode: 'ui'},
20+
getOutputFileName: (extension: ExtensionInstance<PosUIConfigType>) => joinPath('dist', `${extension.handle}.js`),
1521
deployConfig: async (config, directory) => {
1622
const result = await getDependencyVersion(dependency, directory)
1723
if (result === 'not_found') throw new BugError(`Dependency ${dependency} not found`)

packages/app/src/cli/models/extensions/specifications/product_subscription.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import {getDependencyVersion} from '../../app/app.js'
22
import {createExtensionSpecification} from '../specification.js'
33
import {BaseSchema} from '../schemas.js'
4+
import {ExtensionInstance} from '../extension-instance.js'
45
import {BugError} from '@shopify/cli-kit/node/error'
6+
import {zod} from '@shopify/cli-kit/node/schema'
7+
import {joinPath} from '@shopify/cli-kit/node/path'
58

69
const dependency = '@shopify/admin-ui-extensions'
710

11+
type ProductSubscriptionConfigType = zod.infer<typeof BaseSchema>
12+
813
const productSubscriptionSpec = createExtensionSpecification({
914
identifier: 'product_subscription',
1015
additionalIdentifiers: ['subscription_management'],
@@ -13,6 +18,8 @@ const productSubscriptionSpec = createExtensionSpecification({
1318
schema: BaseSchema,
1419
appModuleFeatures: (_) => ['ui_preview', 'esbuild', 'single_js_entry_path'],
1520
buildConfig: {mode: 'ui'},
21+
getOutputFileName: (extension: ExtensionInstance<ProductSubscriptionConfigType>) =>
22+
joinPath('dist', `${extension.handle}.js`),
1623
deployConfig: async (_, directory) => {
1724
const result = await getDependencyVersion(dependency, directory)
1825
if (result === 'not_found') throw new BugError(`Dependency ${dependency} not found`)

packages/app/src/cli/models/extensions/specifications/tax_calculation.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import {createExtensionSpecification} from '../specification.js'
22
import {BaseSchema, MetafieldSchema} from '../schemas.js'
3+
import {ExtensionInstance} from '../extension-instance.js'
34
import {zod} from '@shopify/cli-kit/node/schema'
5+
import {joinPath} from '@shopify/cli-kit/node/path'
46

57
const CartLinePropertySchema = zod.object({
68
key: zod.string(),
79
})
810

11+
type TaxCalculationsConfigType = zod.infer<typeof TaxCalculationsSchema>
912
const TaxCalculationsSchema = BaseSchema.extend({
1013
production_api_base_url: zod.string(),
1114
benchmark_api_base_url: zod.string().optional(),
@@ -29,6 +32,8 @@ const spec = createExtensionSpecification({
2932
schema: TaxCalculationsSchema,
3033
appModuleFeatures: (_) => [],
3134
buildConfig: {mode: 'tax_calculation'},
35+
getOutputFileName: (extension: ExtensionInstance<TaxCalculationsConfigType>) =>
36+
joinPath('dist', `${extension.handle}.js`),
3237
deployConfig: async (config, _) => {
3338
return {
3439
production_api_base_url: config.production_api_base_url,

packages/app/src/cli/models/extensions/specifications/ui_extension.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export interface BuildManifest {
3636

3737
const missingExtensionPointsMessage = 'No extension targets defined, add a `targeting` field to your configuration'
3838

39+
type UIExtensionConfigType = zod.infer<typeof UIExtensionSchema>
3940
export const UIExtensionSchema = BaseSchema.extend({
4041
name: zod.string(),
4142
type: zod.literal('ui_extension'),
@@ -102,6 +103,8 @@ const uiExtensionSpec = createExtensionSpecification({
102103
dependency,
103104
schema: UIExtensionSchema,
104105
buildConfig: {mode: 'ui'},
106+
getOutputFileName: (extension: ExtensionInstance<UIExtensionConfigType>) =>
107+
joinPath('dist', `${extension.handle}.js`),
105108
appModuleFeatures: (config) => {
106109
const basic: ExtensionFeature[] = ['ui_preview', 'esbuild', 'generates_source_maps']
107110
const needsCart =

packages/app/src/cli/models/extensions/specifications/web_pixel_extension.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import {createExtensionSpecification} from '../specification.js'
22
import {BaseSchema} from '../schemas.js'
3+
import {ExtensionInstance} from '../extension-instance.js'
34
import {zod} from '@shopify/cli-kit/node/schema'
45
import {AbortError} from '@shopify/cli-kit/node/error'
56
import {fileSize} from '@shopify/cli-kit/node/fs'
7+
import {joinPath} from '@shopify/cli-kit/node/path'
68

79
const kilobytes = 1024
810
const BUNDLE_SIZE_LIMIT_KB = 128
911
const BUNDLE_SIZE_LIMIT = BUNDLE_SIZE_LIMIT_KB * kilobytes
1012

1113
const dependency = '@shopify/web-pixels-extension'
1214

15+
type WebPixelConfigType = zod.infer<typeof WebPixelSchema>
1316
const WebPixelSchema = BaseSchema.extend({
1417
runtime_context: zod.string(),
1518
version: zod.string().optional(),
@@ -32,6 +35,7 @@ const webPixelSpec = createExtensionSpecification({
3235
schema: WebPixelSchema,
3336
appModuleFeatures: (_) => ['esbuild', 'single_js_entry_path'],
3437
buildConfig: {mode: 'ui'},
38+
getOutputFileName: (extension: ExtensionInstance<WebPixelConfigType>) => joinPath('dist', `${extension.handle}.js`),
3539
deployConfig: async (config, _) => {
3640
return {
3741
runtime_context: config.runtime_context,

0 commit comments

Comments
 (0)