Skip to content

Commit a720cd9

Browse files
Remove legacy schema
1 parent 70fd1c3 commit a720cd9

26 files changed

+503
-535
lines changed

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {appFlags} from '../../flags.js'
22
import {deploy} from '../../services/deploy.js'
3-
import {getAppConfigurationState} from '../../models/app/loader.js'
43
import {validateVersion} from '../../validations/version-name.js'
54
import {validateMessage} from '../../validations/message.js'
65
import metadata from '../../metadata.js'
@@ -81,10 +80,7 @@ export default class Deploy extends AppLinkedCommand {
8180
}))
8281

8382
const requiredNonTTYFlags = ['force']
84-
const configurationState = await getAppConfigurationState(flags.path, flags.config)
85-
if (configurationState.state === 'template-only' && !clientId) {
86-
requiredNonTTYFlags.push('client-id')
87-
}
83+
// Apps always have client_id now, no need to check for template-only state
8884
this.failMissingNonTTYFlags(flags, requiredNonTTYFlags)
8985

9086
const {app, remoteApp, developerPlatformClient, organization} = await linkedAppContext({

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {appFlags} from '../../flags.js'
22
import {release} from '../../services/release.js'
33
import AppLinkedCommand, {AppLinkedCommandOutput} from '../../utilities/app-linked-command.js'
44
import {linkedAppContext} from '../../services/app-context.js'
5-
import {getAppConfigurationState} from '../../models/app/loader.js'
65
import {Flags} from '@oclif/core'
76
import {globalFlags} from '@shopify/cli-kit/node/cli'
87
import {addPublicMetadata} from '@shopify/cli-kit/node/metadata'
@@ -42,10 +41,7 @@ export default class Release extends AppLinkedCommand {
4241
}))
4342

4443
const requiredNonTTYFlags = ['force']
45-
const configurationState = await getAppConfigurationState(flags.path, flags.config)
46-
if (configurationState.state === 'template-only' && !clientId) {
47-
requiredNonTTYFlags.push('client-id')
48-
}
44+
// Apps always have client_id now, no need to check for template-only state
4945
this.failMissingNonTTYFlags(flags, requiredNonTTYFlags)
5046

5147
const {app, remoteApp, developerPlatformClient} = await linkedAppContext({

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

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import {
22
App,
3-
AppConfiguration,
4-
AppConfigurationSchema,
3+
AppSchema,
54
AppConfigurationWithoutPath,
65
AppInterface,
76
AppLinkedInterface,
87
CurrentAppConfiguration,
9-
LegacyAppConfiguration,
108
WebType,
119
getAppVersionedSchema,
1210
} from './app.js'
@@ -93,16 +91,14 @@ export const DEFAULT_CONFIG = {
9391
embedded: true,
9492
access_scopes: {
9593
scopes: 'read_products',
94+
use_legacy_install_flow: true,
9695
},
9796
}
9897

9998
export function testApp(app: Partial<AppInterface> = {}, schemaType: 'current' | 'legacy' = 'legacy'): AppInterface {
10099
const getConfig = () => {
101-
if (schemaType === 'legacy') {
102-
return {scopes: '', extension_directories: [], path: ''}
103-
} else {
104-
return DEFAULT_CONFIG as CurrentAppConfiguration
105-
}
100+
// Always use current schema now
101+
return DEFAULT_CONFIG as CurrentAppConfiguration
106102
}
107103

108104
const newApp = new App({
@@ -125,7 +121,7 @@ export function testApp(app: Partial<AppInterface> = {}, schemaType: 'current' |
125121
dotenv: app.dotenv,
126122
errors: app.errors,
127123
specifications: app.specifications ?? [],
128-
configSchema: (app.configSchema ?? AppConfigurationSchema) as any,
124+
configSchema: (app.configSchema ?? AppSchema) as any,
129125
remoteFlags: app.remoteFlags ?? [],
130126
hiddenConfig: app.hiddenConfig ?? {},
131127
devApplicationURLs: app.devApplicationURLs,
@@ -149,20 +145,6 @@ interface TestAppWithConfigOptions {
149145
config: object
150146
}
151147

152-
export function testAppWithLegacyConfig({
153-
app = {},
154-
config = {},
155-
}: TestAppWithConfigOptions): AppInterface<LegacyAppConfiguration> {
156-
const configuration: AppConfiguration = {
157-
path: '',
158-
scopes: '',
159-
name: 'name',
160-
extension_directories: [],
161-
...config,
162-
}
163-
return testApp({...app, configuration}) as AppInterface<LegacyAppConfiguration>
164-
}
165-
166148
export function testAppWithConfig(options?: TestAppWithConfigOptions): AppLinkedInterface {
167149
const app = testAppLinked(options?.app)
168150
app.configuration = {
@@ -206,7 +188,9 @@ export function testOrganizationApp(app: Partial<OrganizationApp> = {}): Organiz
206188
return {...defaultApp, ...app}
207189
}
208190

209-
export const placeholderAppConfiguration: AppConfigurationWithoutPath = {scopes: ''}
191+
export const placeholderAppConfiguration: AppConfigurationWithoutPath = {
192+
client_id: '',
193+
}
210194

211195
export async function testUIExtension(
212196
uiExtension: Omit<Partial<ExtensionInstance>, 'configuration'> & {

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

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import {
22
AppSchema,
33
CurrentAppConfiguration,
4-
LegacyAppConfiguration,
54
getAppScopes,
65
getAppScopesArray,
76
getUIExtensionRendererVersion,
8-
isCurrentAppSchema,
9-
isLegacyAppSchema,
107
validateExtensionsHandlesInCollection,
118
validateFunctionExtensionsWithUiHandle,
129
} from './app.js'
@@ -61,43 +58,8 @@ const CORRECT_CURRENT_APP_SCHEMA: CurrentAppConfiguration = {
6158
},
6259
}
6360

64-
const CORRECT_LEGACY_APP_SCHEMA: LegacyAppConfiguration = {
65-
path: '',
66-
extension_directories: [],
67-
web_directories: [],
68-
scopes: 'write_products',
69-
}
70-
7161
describe('app schema validation', () => {
72-
describe('legacy schema validator', () => {
73-
test('checks whether legacy app schema is valid -- pass', () => {
74-
expect(isLegacyAppSchema(CORRECT_LEGACY_APP_SCHEMA)).toBe(true)
75-
})
76-
test('checks whether legacy app schema is valid -- fail', () => {
77-
const config = {
78-
...CORRECT_LEGACY_APP_SCHEMA,
79-
some_other_key: 'i am not valid, i will fail',
80-
}
81-
expect(isLegacyAppSchema(config)).toBe(false)
82-
})
83-
})
84-
8562
describe('current schema validator', () => {
86-
test('checks whether current app schema is valid -- pass', () => {
87-
expect(isCurrentAppSchema(CORRECT_CURRENT_APP_SCHEMA)).toBe(true)
88-
})
89-
test('checks whether current app schema is valid -- fail', () => {
90-
const config = {
91-
...CORRECT_CURRENT_APP_SCHEMA,
92-
}
93-
94-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
95-
// @ts-ignore
96-
delete config.client_id
97-
98-
expect(isCurrentAppSchema(config)).toBe(false)
99-
})
100-
10163
test('extension_directories should be transformed to double asterisks', () => {
10264
const config = {
10365
...CORRECT_CURRENT_APP_SCHEMA,
@@ -210,24 +172,14 @@ describe('getUIExtensionRendererVersion', () => {
210172
})
211173

212174
describe('getAppScopes', () => {
213-
test('returns the scopes key when schema is legacy', () => {
214-
const config = {path: '', scopes: 'read_themes,read_products'}
215-
expect(getAppScopes(config)).toEqual('read_themes,read_products')
216-
})
217-
218-
test('returns the access_scopes.scopes key when schema is current', () => {
175+
test('returns the access_scopes.scopes key', () => {
219176
const config = {...DEFAULT_CONFIG, access_scopes: {scopes: 'read_themes,read_themes'}}
220177
expect(getAppScopes(config)).toEqual('read_themes,read_themes')
221178
})
222179
})
223180

224181
describe('getAppScopesArray', () => {
225-
test('returns the scopes key when schema is legacy', () => {
226-
const config = {path: '', scopes: 'read_themes, read_order ,write_products'}
227-
expect(getAppScopesArray(config)).toEqual(['read_themes', 'read_order', 'write_products'])
228-
})
229-
230-
test('returns the access_scopes.scopes key when schema is current', () => {
182+
test('returns the access_scopes.scopes key', () => {
231183
const config = {...DEFAULT_CONFIG, access_scopes: {scopes: 'read_themes, read_order ,write_products'}}
232184
expect(getAppScopesArray(config)).toEqual(['read_themes', 'read_order', 'write_products'])
233185
})
@@ -328,18 +280,6 @@ Learn more: https://shopify.dev/docs/apps/build/authentication-authorization/app
328280
await expect(app.preDeployValidation()).resolves.not.toThrow()
329281
})
330282

331-
test('does not throw an error for legacy schema apps', async () => {
332-
// Given
333-
const configuration: LegacyAppConfiguration = {
334-
...CORRECT_LEGACY_APP_SCHEMA,
335-
scopes: 'read_orders',
336-
}
337-
const app = testApp(configuration, 'legacy')
338-
339-
// When/Then
340-
await expect(app.preDeployValidation()).resolves.not.toThrow()
341-
})
342-
343283
test('handles null/undefined subscriptions safely', async () => {
344284
// Given
345285
const configuration: CurrentAppConfiguration = {

0 commit comments

Comments
 (0)