Skip to content

Commit

Permalink
Merge branch 'main' into drop-editions-command
Browse files Browse the repository at this point in the history
  • Loading branch information
gonzaloriestra committed Jan 25, 2023
2 parents 11e2875 + 8b190e1 commit dc0c7be
Show file tree
Hide file tree
Showing 125 changed files with 720 additions and 652 deletions.
1 change: 1 addition & 0 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
benchmark:
name: benchmark with Node ${{ matrix.node }} in ${{ matrix.os }}
runs-on: ${{ matrix.os }}
if: github.repository_owner == 'Shopify'
timeout-minutes: 30
strategy:
matrix:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/shopify-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,12 @@ jobs:
run: pnpm nx run features:test
- name: Run and save test coverage
uses: ./.github/actions/run-and-save-test-coverage
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '18.7.0' }}
if: ${{ github.repository_owner == 'Shopify' && matrix.os == 'ubuntu-latest' && matrix.node == '18.7.0' }}
with:
branch-name: "${{ github.head_ref }}"
- name: Download and publish test coverage
uses: ./.github/actions/download-and-publish-test-coverage
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '18.7.0' }}
if: ${{ github.repository_owner == 'Shopify' && matrix.os == 'ubuntu-latest' && matrix.node == '18.7.0' }}
with:
base-branch-name: "${{ github.base_ref }}"

Expand Down
4 changes: 2 additions & 2 deletions packages/app/src/cli/commands/app/env/pull.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import Command from '../../../utilities/app-command.js'
import {loadExtensionsSpecifications} from '../../../models/extensions/specifications.js'
import {Flags} from '@oclif/core'
import {globalFlags} from '@shopify/cli-kit/node/cli'
import {output} from '@shopify/cli-kit'
import {outputInfo} from '@shopify/cli-kit/node/output'
import {resolvePath, cwd} from '@shopify/cli-kit/node/path'

export default class EnvPull extends Command {
Expand All @@ -29,6 +29,6 @@ export default class EnvPull extends Command {
const envFile = resolvePath(directory, flags['env-file'])
const specifications = await loadExtensionsSpecifications(this.config)
const app: AppInterface = await loadApp({directory, specifications, mode: 'report'})
output.info(await pullEnv(app, {envFile}))
outputInfo(await pullEnv(app, {envFile}))
}
}
4 changes: 2 additions & 2 deletions packages/app/src/cli/commands/app/env/show.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import {load as loadApp} from '../../../models/app/loader.js'
import {showEnv} from '../../../services/app/env/show.js'
import Command from '../../../utilities/app-command.js'
import {loadExtensionsSpecifications} from '../../../models/extensions/specifications.js'
import {output} from '@shopify/cli-kit'
import {globalFlags} from '@shopify/cli-kit/node/cli'
import {resolvePath, cwd} from '@shopify/cli-kit/node/path'
import {outputInfo} from '@shopify/cli-kit/node/output'

export default class EnvShow extends Command {
static description = 'Display app and extensions environment variables.'
Expand All @@ -21,6 +21,6 @@ export default class EnvShow extends Command {
const directory = flags.path ? resolvePath(flags.path) : cwd()
const specifications = await loadExtensionsSpecifications(this.config)
const app: AppInterface = await loadApp({directory, specifications, mode: 'report'})
output.info(await showEnv(app))
outputInfo(await showEnv(app))
}
}
8 changes: 4 additions & 4 deletions packages/app/src/cli/commands/app/generate/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import {loadExtensionsSpecifications} from '../../../models/extensions/specifica
import {Flags} from '@oclif/core'
import {globalFlags} from '@shopify/cli-kit/node/cli'
import Command from '@shopify/cli-kit/node/base-command'
import {output} from '@shopify/cli-kit'
import {resolvePath, cwd} from '@shopify/cli-kit/node/path'
import {AbortError} from '@shopify/cli-kit/node/error'
import {outputContent, outputInfo} from '@shopify/cli-kit/node/output'

export default class GenerateSchema extends Command {
static description = 'Generates a GraphQL schema for a function.'
Expand Down Expand Up @@ -38,11 +38,11 @@ export default class GenerateSchema extends Command {
const functions = app.extensions.function.map((extension) => extension.localIdentifier).join(', ')

throw new AbortError(
output.content`No function named ${args.function} found in this app.`,
output.content`Use one of the available functions: ${functions}`,
outputContent`No function named ${args.function} found in this app.`,
outputContent`Use one of the available functions: ${functions}`,
)
}

output.info(await generateSchemaService({app, extension, apiKey}))
outputInfo(await generateSchemaService({app, extension, apiKey}))
}
}
4 changes: 2 additions & 2 deletions packages/app/src/cli/commands/app/info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import Command from '../../utilities/app-command.js'
import {loadExtensionsSpecifications} from '../../models/extensions/specifications.js'
import {Flags} from '@oclif/core'
import {globalFlags} from '@shopify/cli-kit/node/cli'
import {output} from '@shopify/cli-kit'
import {outputInfo} from '@shopify/cli-kit/node/output'
import {resolvePath, cwd} from '@shopify/cli-kit/node/path'

export default class AppInfo extends Command {
Expand All @@ -33,7 +33,7 @@ export default class AppInfo extends Command {
const directory = flags.path ? resolvePath(flags.path) : cwd()
const specifications = await loadExtensionsSpecifications(this.config)
const app: AppInterface = await loadApp({directory, specifications, mode: 'report'})
output.info(await info(app, {format: (flags.json ? 'json' : 'text') as Format, webEnv: flags['web-env']}))
outputInfo(await info(app, {format: (flags.json ? 'json' : 'text') as Format, webEnv: flags['web-env']}))
if (app.errors) process.exit(2)
}
}
6 changes: 3 additions & 3 deletions packages/app/src/cli/models/app/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {FunctionSpec, FunctionConfigType} from '../extensions/functions.js'
import {ThemeConfigContents, ThemeExtensionSpec} from '../extensions/theme.js'
import {UIExtensionSpec} from '../extensions/ui.js'
import {BaseConfigContents} from '../extensions/schemas.js'
import {output} from '@shopify/cli-kit'
import {TokenizedString} from '@shopify/cli-kit/node/output'
import {Result} from '@shopify/cli-kit/node/result'
import {DependencyVersion} from '@shopify/cli-kit/node/node-package-manager'

Expand Down Expand Up @@ -41,7 +41,7 @@ export type FunctionExtension<TConfiguration extends FunctionConfigType = Functi

export type ThemeExtension<TConfiguration extends ThemeConfigContents = ThemeConfigContents> = Extension & {
configuration: TConfiguration
previewMessage(url: string, storeFqdn: string): output.TokenizedString | undefined
previewMessage(url: string, storeFqdn: string): TokenizedString | undefined
outputBundlePath: string
}

Expand All @@ -56,7 +56,7 @@ export type UIExtension<TConfiguration extends BaseConfigContents = BaseConfigCo
validate(): Promise<Result<unknown, string>>
preDeployValidation(): Promise<void>
deployConfig(): Promise<{[key: string]: unknown}>
previewMessage(url: string, storeFqdn: string): output.TokenizedString | undefined
previewMessage(url: string, storeFqdn: string): TokenizedString | undefined
shouldFetchCartUrl(): boolean
hasExtensionPointTarget(target: string): boolean
}
Expand Down
40 changes: 20 additions & 20 deletions packages/app/src/cli/models/app/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {UIExtensionInstance, UIExtensionSpec} from '../extensions/ui.js'
import {ThemeExtensionInstance, ThemeExtensionSpec} from '../extensions/theme.js'
import {ThemeExtensionSchema, TypeSchema} from '../extensions/schemas.js'
import {FunctionInstance, FunctionSpec} from '../extensions/functions.js'
import {output} from '@shopify/cli-kit'
import {schema} from '@shopify/cli-kit/node/schema'
import {fileExists, readFile, glob, findPathUp} from '@shopify/cli-kit/node/fs'
import {readAndParseDotEnv, DotEnvFile} from '@shopify/cli-kit/node/dot-env'
Expand All @@ -24,17 +23,18 @@ import {decodeToml} from '@shopify/cli-kit/node/toml'
import {isShopify} from '@shopify/cli-kit/node/environment/local'
import {joinPath, dirname, basename} from '@shopify/cli-kit/node/path'
import {AbortError} from '@shopify/cli-kit/node/error'
import {outputContent, outputDebug, OutputMessage, outputToken} from '@shopify/cli-kit/node/output'

const defaultExtensionDirectory = 'extensions/*'

export type AppLoaderMode = 'strict' | 'report'

export class AppErrors {
private errors: {
[key: string]: output.Message
[key: string]: OutputMessage
} = {}

addError(path: string, message: output.Message): void {
addError(path: string, message: OutputMessage): void {
this.errors[path] = message
}

Expand All @@ -46,7 +46,7 @@ export class AppErrors {
return Object.keys(this.errors).length === 0
}

toJSON(): output.Message[] {
toJSON(): OutputMessage[] {
return Object.values(this.errors)
}
}
Expand Down Expand Up @@ -144,7 +144,7 @@ class AppLoader {

async findAppDirectory() {
if (!(await fileExists(this.directory))) {
throw new AbortError(output.content`Couldn't find directory ${output.token.path(this.directory)}`)
throw new AbortError(outputContent`Couldn't find directory ${outputToken.path(this.directory)}`)
}
return dirname(await this.getConfigurationPath())
}
Expand All @@ -158,7 +158,7 @@ class AppLoader {
})
if (!configurationPath) {
throw new AbortError(
output.content`Couldn't find the configuration file for ${output.token.path(
outputContent`Couldn't find the configuration file for ${outputToken.path(
this.directory,
)}, are you in an app directory?`,
)
Expand Down Expand Up @@ -198,7 +198,7 @@ class AppLoader {
): Promise<unknown> {
if (!(await fileExists(filepath))) {
return this.abortOrReport(
output.content`Couldn't find the configuration file at ${output.token.path(filepath)}`,
outputContent`Couldn't find the configuration file at ${outputToken.path(filepath)}`,
'',
filepath,
)
Expand All @@ -212,7 +212,7 @@ class AppLoader {
// TOML errors have line, pos and col properties
if (err.line && err.pos && err.col) {
return this.abortOrReport(
output.content`Fix the following error in ${output.token.path(filepath)}:\n${err.message}`,
outputContent`Fix the following error in ${outputToken.path(filepath)}:\n${err.message}`,
null,
filepath,
)
Expand Down Expand Up @@ -242,7 +242,7 @@ class AppLoader {
if (!parseResult.success) {
const formattedError = JSON.stringify(parseResult.error.issues, null, 2)
return this.abortOrReport(
output.content`Fix a schema error in ${output.token.path(filepath)}:\n${formattedError}`,
outputContent`Fix a schema error in ${outputToken.path(filepath)}:\n${formattedError}`,
fallbackOutput,
filepath,
)
Expand All @@ -269,9 +269,9 @@ class AppLoader {
const isShopifolk = await isShopify()
const shopifolkMessage = '\nYou might need to enable some beta flags on your Organization or App'
this.abortOrReport(
output.content`Unknown extension type ${output.token.yellow(type)} in ${output.token.path(
configurationPath,
)}. ${isShopifolk ? shopifolkMessage : ''}`,
outputContent`Unknown extension type ${outputToken.yellow(type)} in ${outputToken.path(configurationPath)}. ${
isShopifolk ? shopifolkMessage : ''
}`,
undefined,
configurationPath,
)
Expand All @@ -293,9 +293,9 @@ class AppLoader {
).find((sourcePath) => sourcePath !== undefined)
if (!entryPath) {
this.abortOrReport(
output.content`Couldn't find an index.{js,jsx,ts,tsx} file in the directories ${output.token.path(
outputContent`Couldn't find an index.{js,jsx,ts,tsx} file in the directories ${outputToken.path(
directory,
)} or ${output.token.path(joinPath(directory, 'src'))}`,
)} or ${outputToken.path(joinPath(directory, 'src'))}`,
undefined,
directory,
)
Expand All @@ -314,7 +314,7 @@ class AppLoader {
if (configuration.type) {
const validateResult = await extensionInstance.validate()
if (validateResult.isErr()) {
this.abortOrReport(output.content`\n${validateResult.error}`, undefined, configurationPath)
this.abortOrReport(outputContent`\n${validateResult.error}`, undefined, configurationPath)
}
}
return extensionInstance
Expand All @@ -340,7 +340,7 @@ class AppLoader {
const specification = this.findSpecificationForType(type) as FunctionSpec | undefined
if (!specification) {
this.abortOrReport(
output.content`Unknown function type ${output.token.yellow(type)} in ${output.token.path(configurationPath)}`,
outputContent`Unknown function type ${outputToken.yellow(type)} in ${outputToken.path(configurationPath)}`,
undefined,
configurationPath,
)
Expand Down Expand Up @@ -370,7 +370,7 @@ class AppLoader {

if (!specification) {
this.abortOrReport(
output.content`Unknown theme type ${output.token.yellow('theme')} in ${output.token.path(configurationPath)}`,
outputContent`Unknown theme type ${outputToken.yellow('theme')} in ${outputToken.path(configurationPath)}`,
undefined,
configurationPath,
)
Expand All @@ -392,7 +392,7 @@ class AppLoader {
return {themeExtensions, usedCustomLayout: extensionDirectories !== undefined}
}

abortOrReport<T>(errorMessage: output.Message, fallback: T, configurationPath: string): T {
abortOrReport<T>(errorMessage: OutputMessage, fallback: T, configurationPath: string): T {
if (this.mode === 'strict') {
throw new AbortError(errorMessage)
} else {
Expand All @@ -411,12 +411,12 @@ async function getProjectType(webs: Web[]): Promise<'node' | 'php' | 'ruby' | 'f
const backendWebs = webs.filter((web) => web.configuration.type === WebType.Backend)
const frontendWebs = webs.filter((web) => web.configuration.type === WebType.Frontend)
if (backendWebs.length > 1) {
output.debug('Unable to decide project type as multiple web backends')
outputDebug('Unable to decide project type as multiple web backends')
return
} else if (backendWebs.length === 0 && frontendWebs.length > 0) {
return 'frontend'
} else if (backendWebs.length === 0) {
output.debug('Unable to decide project type as no web backend')
outputDebug('Unable to decide project type as no web backend')
return
}
const {directory} = backendWebs[0]!
Expand Down
10 changes: 5 additions & 5 deletions packages/app/src/cli/models/extensions/theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import {ThemeExtensionSchema, ZodSchemaType} from './schemas.js'
import {loadThemeSpecifications} from './specifications.js'
import {GenericSpecification, ThemeExtension} from '../app/extensions.js'
import {RemoteSpecification} from '../../api/graphql/extension_specifications.js'
import {output} from '@shopify/cli-kit'
import {schema} from '@shopify/cli-kit/node/schema'
import {constantize} from '@shopify/cli-kit/common/string'
import {partnersFqdn} from '@shopify/cli-kit/node/environment/fqdn'
import {basename} from '@shopify/cli-kit/node/path'
import {outputContent, outputToken} from '@shopify/cli-kit/node/output'

// Base config type for a theme extension.
export type ThemeConfigContents = schema.infer<typeof ThemeExtensionSchema>
Expand Down Expand Up @@ -93,14 +93,14 @@ export class ThemeExtensionInstance<TConfiguration extends ThemeConfigContents =
}

previewMessage() {
const heading = output.token.heading(`${this.name} (${this.humanName})`)
const link = output.token.link(
const heading = outputToken.heading(`${this.name} (${this.humanName})`)
const link = outputToken.link(
'dev doc instructions',
'https://shopify.dev/apps/online-store/theme-app-extensions/getting-started#step-3-test-your-changes',
)
const message = output.content`Follow the ${link} by deploying your work as a draft`
const message = outputContent`Follow the ${link} by deploying your work as a draft`

return output.content`${heading}\n${message.value}\n`
return outputContent`${heading}\n${message.value}\n`
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {createUIExtensionSpecification} from '../ui.js'
import {BaseUIExtensionSchema} from '../schemas.js'
import {output} from '@shopify/cli-kit'
import {schema} from '@shopify/cli-kit/node/schema'
import {outputContent} from '@shopify/cli-kit/node/output'

const dependency = {name: '@shopify/customer-account-ui-extensions-react', version: '^0.0.20'}

Expand Down Expand Up @@ -51,7 +51,7 @@ const spec = createUIExtensionSpecification({
const origin = encodeURIComponent(`${host}/extensions`)
const publicURL = `https://${accountsUrl}/extensions-development?origin=${origin}&extensionId=${uuid}`
const notice = `Please open ${host} and click on 'Visit Site' and then close the tab to allow connections.\n`
return output.content`${notice}Preview link: ${publicURL}`
return outputContent`${notice}Preview link: ${publicURL}`
},
})

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {createUIExtensionSpecification} from '../ui.js'
import {BaseUIExtensionSchema} from '../schemas.js'
import {output} from '@shopify/cli-kit'
import {outputContent, outputToken, TokenizedString} from '@shopify/cli-kit/node/output'

const dependency = {name: '@shopify/post-purchase-ui-extensions-react', version: '^0.13.2'}

Expand All @@ -16,17 +16,17 @@ const spec = createUIExtensionSpecification({
deployConfig: async (config, _) => {
return {metafields: config.metafields}
},
previewMessage: (host, uuid, _): output.TokenizedString => {
previewMessage: (host, uuid, _): TokenizedString => {
const publicURL = `${host}/extensions/${uuid}`
const devDocsLink = output.token.link(
const devDocsLink = outputToken.link(
'dev docs',
'https://shopify.dev/apps/checkout/post-purchase/getting-started-post-purchase-extension#step-2-test-the-extension',
)
const chromeLink = output.token.link(
const chromeLink = outputToken.link(
'Shopify’s post-purchase Chrome extension',
'https://chrome.google.com/webstore/detail/shopify-post-purchase-dev/nenmcifhoegealiiblnpihbnjenleong',
)
return output.content`To view this extension:
return outputContent`To view this extension:
1. Install ${chromeLink}
2. Open the Chrome extension and paste this URL into it: ${publicURL}
3. Run a test purchase on your store to view your extension
Expand Down
Loading

0 comments on commit dc0c7be

Please sign in to comment.