Skip to content

Commit bbc0817

Browse files
Clean up module outputFile calculation and move it to the specifications
1 parent 59f0139 commit bbc0817

10 files changed

Lines changed: 33 additions & 19 deletions

File tree

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

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export const CONFIG_EXTENSION_IDS: string[] = [
5959
* This class holds the public interface to interact with extensions
6060
*/
6161
export class ExtensionInstance<TConfiguration extends BaseConfigType = BaseConfigType> {
62+
outputFileName: string
6263
entrySourceFilePath: string
6364
devUUID: string
6465
localIdentifier: string
@@ -136,17 +137,6 @@ export class ExtensionInstance<TConfiguration extends BaseConfigType = BaseConfi
136137
return this.specification.appModuleFeatures(this.configuration)
137138
}
138139

139-
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-
}
148-
}
149-
150140
constructor(options: {
151141
configuration: TConfiguration
152142
configurationPath: string
@@ -165,6 +155,7 @@ export class ExtensionInstance<TConfiguration extends BaseConfigType = BaseConfi
165155
this.outputPath = this.directory
166156
this.uid = this.buildUIDFromStrategy()
167157
this.devUUID = `dev-${this.uid}`
158+
this.outputFileName = this.specification.getOutputFileName?.(this) ?? ''
168159

169160
if (this.features.includes('esbuild') || this.type === 'tax_calculation') {
170161
this.outputPath = joinPath(this.directory, 'dist', this.outputFileName)

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,9 @@ export interface BuildAsset {
5454
static?: boolean
5555
}
5656

57-
type BuildMode = 'copy_files' | 'theme' | 'function' | 'ui' | 'tax_calculation' | 'hosted_app_home' | 'none'
58-
59-
interface BuildConfig {
60-
mode: BuildMode
61-
filePatterns?: string[]
62-
ignoredFilePatterns?: string[]
63-
}
57+
type BuildConfig =
58+
| {mode: 'ui' | 'theme' | 'function' | 'tax_calculation' | 'none' | 'hosted_app_home'}
59+
| {mode: 'copy_files'; filePatterns: string[]; ignoredFilePatterns?: string[]}
6460

6561
/**
6662
* Extension specification with all the needed properties and methods to load an extension.
@@ -79,6 +75,7 @@ export interface ExtensionSpecification<TConfiguration extends BaseConfigType =
7975
buildConfig: BuildConfig
8076
dependency?: string
8177
graphQLType?: string
78+
getOutputFileName?: (extension: ExtensionInstance<TConfiguration>) => string
8279
getBundleExtensionStdinContent?: (config: TConfiguration) => {main: string; assets?: Asset[]}
8380
deployConfig?: (
8481
config: TConfiguration,

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

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

56
const dependency = '@shopify/post-purchase-ui-extensions'
67

8+
type CheckoutPostPurchaseConfigType = zod.infer<typeof CheckoutPostPurchaseSchema>
79
const CheckoutPostPurchaseSchema = BaseSchema.extend({
810
metafields: zod.array(MetafieldSchema).optional(),
911
})
@@ -15,6 +17,7 @@ const checkoutPostPurchaseSpec = createExtensionSpecification({
1517
schema: CheckoutPostPurchaseSchema,
1618
appModuleFeatures: (_) => ['ui_preview', 'cart_url', 'esbuild', 'single_js_entry_path'],
1719
buildConfig: {mode: 'ui'},
20+
getOutputFileName: (extension: ExtensionInstance<CheckoutPostPurchaseConfigType>) => `${extension.handle}.js`,
1821
deployConfig: async (config, _) => {
1922
return {metafields: config.metafields ?? []}
2023
},

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
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'
56

67
const dependency = '@shopify/checkout-ui-extensions'
78

9+
type CheckoutConfigType = zod.infer<typeof CheckoutSchema>
810
const CheckoutSchema = BaseSchema.extend({
911
name: zod.string(),
1012
extension_points: zod.array(zod.string()).optional(),
@@ -22,6 +24,7 @@ const checkoutSpec = createExtensionSpecification({
2224
schema: CheckoutSchema,
2325
appModuleFeatures: (_) => ['ui_preview', 'cart_url', 'esbuild', 'single_js_entry_path', 'generates_source_maps'],
2426
buildConfig: {mode: 'ui'},
27+
getOutputFileName: (extension: ExtensionInstance<CheckoutConfigType>) => `${extension.handle}.js`,
2528
deployConfig: async (config, directory) => {
2629
return {
2730
extension_points: config.extension_points,

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

Lines changed: 2 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,7 @@ const functionSpec = createExtensionSpecification({
8889
schema: FunctionExtensionSchema,
8990
appModuleFeatures: (_) => ['function'],
9091
buildConfig: {mode: 'function'},
92+
getOutputFileName: (_extension: ExtensionInstance<FunctionConfigType>) => 'index.wasm',
9193
deployConfig: async (config, directory, apiKey) => {
9294
let inputQuery: string | undefined
9395
const moduleId = randomUUID()

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
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'
67

78
const dependency = '@shopify/retail-ui-extensions'
89

10+
type PosUIConfigType = zod.infer<typeof PosUISchema>
11+
const PosUISchema = BaseSchema.extend({name: zod.string()})
12+
913
const posUISpec = createExtensionSpecification({
1014
identifier: 'pos_ui_extension',
1115
dependency,
12-
schema: BaseSchema.extend({name: zod.string()}),
16+
schema: PosUISchema,
1317
appModuleFeatures: (_) => ['ui_preview', 'esbuild', 'single_js_entry_path'],
1418
buildConfig: {mode: 'ui'},
19+
getOutputFileName: (extension: ExtensionInstance<PosUIConfigType>) => `${extension.handle}.js`,
1520
deployConfig: async (config, directory) => {
1621
const result = await getDependencyVersion(dependency, directory)
1722
if (result === 'not_found') throw new BugError(`Dependency ${dependency} not found`)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
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'
57

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

10+
type ProductSubscriptionConfigType = zod.infer<typeof BaseSchema>
11+
812
const productSubscriptionSpec = createExtensionSpecification({
913
identifier: 'product_subscription',
1014
additionalIdentifiers: ['subscription_management'],
@@ -13,6 +17,7 @@ const productSubscriptionSpec = createExtensionSpecification({
1317
schema: BaseSchema,
1418
appModuleFeatures: (_) => ['ui_preview', 'esbuild', 'single_js_entry_path'],
1519
buildConfig: {mode: 'ui'},
20+
getOutputFileName: (extension: ExtensionInstance<ProductSubscriptionConfigType>) => `${extension.handle}.js`,
1621
deployConfig: async (_, directory) => {
1722
const result = await getDependencyVersion(dependency, directory)
1823
if (result === 'not_found') throw new BugError(`Dependency ${dependency} not found`)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
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'
45

56
const CartLinePropertySchema = zod.object({
67
key: zod.string(),
78
})
89

10+
type TaxCalculationsConfigType = zod.infer<typeof TaxCalculationsSchema>
911
const TaxCalculationsSchema = BaseSchema.extend({
1012
production_api_base_url: zod.string(),
1113
benchmark_api_base_url: zod.string().optional(),
@@ -29,6 +31,7 @@ const spec = createExtensionSpecification({
2931
schema: TaxCalculationsSchema,
3032
appModuleFeatures: (_) => [],
3133
buildConfig: {mode: 'tax_calculation'},
34+
getOutputFileName: (extension: ExtensionInstance<TaxCalculationsConfigType>) => `${extension.handle}.js`,
3235
deployConfig: async (config, _) => {
3336
return {
3437
production_api_base_url: config.production_api_base_url,

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

Lines changed: 2 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,7 @@ const uiExtensionSpec = createExtensionSpecification({
102103
dependency,
103104
schema: UIExtensionSchema,
104105
buildConfig: {mode: 'ui'},
106+
getOutputFileName: (extension: ExtensionInstance<UIExtensionConfigType>) => `${extension.handle}.js`,
105107
appModuleFeatures: (config) => {
106108
const basic: ExtensionFeature[] = ['ui_preview', 'esbuild', 'generates_source_maps']
107109
const needsCart =

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
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'
@@ -10,6 +11,7 @@ const BUNDLE_SIZE_LIMIT = BUNDLE_SIZE_LIMIT_KB * kilobytes
1011

1112
const dependency = '@shopify/web-pixels-extension'
1213

14+
type WebPixelConfigType = zod.infer<typeof WebPixelSchema>
1315
const WebPixelSchema = BaseSchema.extend({
1416
runtime_context: zod.string(),
1517
version: zod.string().optional(),
@@ -32,6 +34,7 @@ const webPixelSpec = createExtensionSpecification({
3234
schema: WebPixelSchema,
3335
appModuleFeatures: (_) => ['esbuild', 'single_js_entry_path'],
3436
buildConfig: {mode: 'ui'},
37+
getOutputFileName: (extension: ExtensionInstance<WebPixelConfigType>) => `${extension.handle}.js`,
3538
deployConfig: async (config, _) => {
3639
return {
3740
runtime_context: config.runtime_context,

0 commit comments

Comments
 (0)