Skip to content

Commit f1bf879

Browse files
authored
Merge pull request #7035 from Shopify/03-17-remove-project-fields-from-app
Remove packageManager, nodeDependencies, usesWorkspaces from App
2 parents 7c5f114 + f8d9783 commit f1bf879

35 files changed

Lines changed: 244 additions & 243 deletions

packages/app/src/cli/commands/app/build.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ export default class Build extends AppUnlinkedCommand {
3434
cmd_app_dependency_installation_skipped: flags['skip-dependencies-installation'],
3535
}))
3636

37-
const app = await localAppContext({
37+
const {app, project} = await localAppContext({
3838
directory: flags.path,
3939
userProvidedConfigName: flags.config,
4040
})
4141

42-
await build({app, skipDependenciesInstallation: flags['skip-dependencies-installation'], apiKey: clientId})
42+
await build({app, project, skipDependenciesInstallation: flags['skip-dependencies-installation'], apiKey: clientId})
4343

4444
return {app}
4545
}

packages/app/src/cli/commands/app/config/use.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default class ConfigUse extends AppUnlinkedCommand {
3535
public async run(): Promise<AppUnlinkedCommandOutput> {
3636
const {flags, args} = await this.parse(ConfigUse)
3737

38-
const app = await localAppContext({
38+
const {app} = await localAppContext({
3939
directory: flags.path,
4040
userProvidedConfigName: args.config,
4141
})

packages/app/src/cli/commands/app/deploy.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ export default class Deploy extends AppLinkedCommand {
118118
}
119119
this.failMissingNonTTYFlags(flags, requiredNonTTYFlags)
120120

121-
const {app, remoteApp, developerPlatformClient, organization} = await linkedAppContext({
121+
const {app, project, remoteApp, developerPlatformClient, organization} = await linkedAppContext({
122122
directory: flags.path,
123123
clientId,
124124
forceRelink: flags.reset,
@@ -130,6 +130,7 @@ export default class Deploy extends AppLinkedCommand {
130130

131131
const result = await deploy({
132132
app,
133+
project,
133134
remoteApp,
134135
organization,
135136
developerPlatformClient,

packages/app/src/cli/commands/app/function/build.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class FunctionBuild extends AppUnlinkedCommand {
2222
public async run(): Promise<AppUnlinkedCommandOutput> {
2323
const {flags} = await this.parse(FunctionBuild)
2424

25-
const app = await localAppContext({
25+
const {app} = await localAppContext({
2626
directory: flags.path,
2727
userProvidedConfigName: flags.config,
2828
})

packages/app/src/cli/commands/app/function/info.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export default class FunctionInfo extends AppUnlinkedCommand {
3333
public async run(): Promise<AppUnlinkedCommandOutput> {
3434
const {flags} = await this.parse(FunctionInfo)
3535

36-
const app = await localAppContext({
36+
const {app} = await localAppContext({
3737
directory: flags.path,
3838
userProvidedConfigName: flags.config,
3939
})

packages/app/src/cli/commands/app/function/run.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export default class FunctionRun extends AppUnlinkedCommand {
4040

4141
let functionExport = DEFAULT_FUNCTION_EXPORT
4242

43-
const app = await localAppContext({
43+
const {app} = await localAppContext({
4444
directory: flags.path,
4545
userProvidedConfigName: flags.config,
4646
})

packages/app/src/cli/commands/app/function/typegen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class FunctionTypegen extends AppUnlinkedCommand {
2222
public async run(): Promise<AppUnlinkedCommandOutput> {
2323
const {flags} = await this.parse(FunctionTypegen)
2424

25-
const app = await localAppContext({
25+
const {app} = await localAppContext({
2626
directory: flags.path,
2727
userProvidedConfigName: flags.config,
2828
})

packages/app/src/cli/commands/app/generate/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export default class AppGenerateExtension extends AppLinkedCommand {
7777

7878
await checkFolderIsValidApp(flags.path)
7979

80-
const {app, specifications, remoteApp, developerPlatformClient} = await linkedAppContext({
80+
const {app, project, specifications, remoteApp, developerPlatformClient} = await linkedAppContext({
8181
directory: flags.path,
8282
clientId: flags['client-id'],
8383
forceRelink: flags.reset,
@@ -92,6 +92,7 @@ export default class AppGenerateExtension extends AppLinkedCommand {
9292
template: flags.template,
9393
flavor: flags.flavor,
9494
app,
95+
project,
9596
specifications,
9697
remoteApp,
9798
developerPlatformClient,

packages/app/src/cli/commands/app/info.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ export default class AppInfo extends AppLinkedCommand {
3434
public async run(): Promise<AppLinkedCommandOutput> {
3535
const {flags} = await this.parse(AppInfo)
3636

37-
const {app, remoteApp, organization, developerPlatformClient} = await linkedAppContext({
37+
const {app, project, remoteApp, organization, developerPlatformClient} = await linkedAppContext({
3838
directory: flags.path,
3939
clientId: flags['client-id'],
4040
forceRelink: flags.reset,
4141
userProvidedConfigName: flags.config,
4242
unsafeReportMode: true,
4343
})
44-
const results = await info(app, remoteApp, organization, {
44+
const results = await info(app, remoteApp, organization, project, {
4545
format: (flags.json ? 'json' : 'text') as Format,
4646
webEnv: flags['web-env'],
4747
configName: flags.config,

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

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,14 @@ import {SchemaDefinitionByTargetQueryVariables} from '../../api/graphql/function
7474
import {SchemaDefinitionByApiTypeQueryVariables} from '../../api/graphql/functions/generated/schema-definition-by-api-type.js'
7575
import {AppHomeSpecIdentifier} from '../extensions/specifications/app_config_app_home.js'
7676
import {AppProxySpecIdentifier} from '../extensions/specifications/app_config_app_proxy.js'
77-
import {ExtensionSpecification, isAppConfigSpecification} from '../extensions/specification.js'
77+
import {ExtensionSpecification} from '../extensions/specification.js'
7878
import {AppLogsOptions} from '../../services/app-logs/utils.js'
7979
import {AppLogsSubscribeMutationVariables} from '../../api/graphql/app-management/generated/app-logs-subscribe.js'
80+
import {Project} from '../project/project.js'
8081
import {Session} from '@shopify/cli-kit/node/session'
8182
import {vi} from 'vitest'
8283
import {joinPath} from '@shopify/cli-kit/node/path'
84+
import {PackageManager} from '@shopify/cli-kit/node/node-package-manager'
8385

8486
export const DEFAULT_CONFIG = {
8587
application_url: 'https://myapp.com',
@@ -104,9 +106,7 @@ export function testApp(app: Partial<AppInterface> = {}): AppInterface {
104106
name: app.name ?? 'App',
105107
directory: app.directory ?? '/tmp/project',
106108
configPath: app.configPath ?? '/tmp/project/shopify.app.toml',
107-
packageManager: app.packageManager ?? 'yarn',
108109
configuration: app.configuration ?? getConfig(),
109-
nodeDependencies: app.nodeDependencies ?? {},
110110
webs: app.webs ?? [
111111
{
112112
directory: '',
@@ -117,7 +117,6 @@ export function testApp(app: Partial<AppInterface> = {}): AppInterface {
117117
},
118118
],
119119
modules: app.allExtensions ?? [],
120-
usesWorkspaces: app.usesWorkspaces ?? false,
121120
dotenv: app.dotenv,
122121
errors: app.errors,
123122
specifications: app.specifications ?? [],
@@ -127,9 +126,6 @@ export function testApp(app: Partial<AppInterface> = {}): AppInterface {
127126
devApplicationURLs: app.devApplicationURLs,
128127
})
129128

130-
if (app.updateDependencies) {
131-
Object.getPrototypeOf(newApp).updateDependencies = app.updateDependencies
132-
}
133129
if (app.extensionsForType) {
134130
Object.getPrototypeOf(newApp).extensionsForType = app.extensionsForType
135131
}
@@ -155,6 +151,34 @@ export function testAppWithConfig(options?: TestAppWithConfigOptions): AppLinked
155151
return app
156152
}
157153

154+
interface TestProjectOptions {
155+
directory?: string
156+
packageManager?: PackageManager
157+
nodeDependencies?: Record<string, string>
158+
usesWorkspaces?: boolean
159+
}
160+
161+
/**
162+
* Creates a minimal Project mock for testing.
163+
* Use this when a service needs a Project for packageManager, usesWorkspaces, or directory.
164+
*/
165+
export function testProject(options: TestProjectOptions = {}): Project {
166+
return {
167+
directory: options.directory ?? '/tmp/project',
168+
packageManager: options.packageManager ?? 'yarn',
169+
nodeDependencies: options.nodeDependencies ?? {},
170+
usesWorkspaces: options.usesWorkspaces ?? false,
171+
appConfigFiles: [],
172+
extensionConfigFiles: [],
173+
webConfigFiles: [],
174+
dotenvFiles: new Map(),
175+
hiddenConfigRaw: {},
176+
appConfigByName: () => undefined,
177+
appConfigByClientId: () => undefined,
178+
defaultAppConfig: undefined,
179+
} as unknown as Project
180+
}
181+
158182
export function getWebhookConfig(webhookConfigOverrides?: WebhooksConfig): CurrentAppConfiguration {
159183
return {
160184
...DEFAULT_CONFIG,
@@ -1526,5 +1550,5 @@ export async function buildVersionedAppSchema() {
15261550
}
15271551

15281552
export async function configurationSpecifications() {
1529-
return (await loadLocalExtensionsSpecifications()).filter(isAppConfigSpecification)
1553+
return (await loadLocalExtensionsSpecifications()).filter((spec) => spec.uidStrategy === 'single')
15301554
}

0 commit comments

Comments
 (0)