@shopify/cli-kit 3.45.0-pre.5 → 3.46.0-pre.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/cli-ruby/Gemfile +0 -1
- package/assets/cli-ruby/Rakefile +0 -76
- package/assets/cli-ruby/lib/project_types/extension/cli.rb +5 -86
- package/assets/cli-ruby/lib/shopify_cli/admin_api.rb +0 -3
- package/assets/cli-ruby/lib/shopify_cli/api.rb +2 -3
- package/assets/cli-ruby/lib/shopify_cli/command/sub_command.rb +1 -2
- package/assets/cli-ruby/lib/shopify_cli/command.rb +0 -7
- package/assets/cli-ruby/lib/shopify_cli/commands.rb +0 -15
- package/assets/cli-ruby/lib/shopify_cli/context.rb +4 -2
- package/assets/cli-ruby/lib/shopify_cli/core.rb +0 -1
- package/assets/cli-ruby/lib/shopify_cli/identity_auth.rb +0 -1
- package/assets/cli-ruby/lib/shopify_cli/messages/messages.rb +1 -1
- package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy.rb +15 -2
- package/assets/cli-ruby/lib/shopify_cli.rb +1 -10
- package/assets/cli-ruby/test/test_helpers.rb +0 -2
- package/dist/private/node/api/graphql.d.ts +5 -10
- package/dist/private/node/api/graphql.js +4 -16
- package/dist/private/node/api/graphql.js.map +1 -1
- package/dist/private/node/conf-store.d.ts +2 -1
- package/dist/private/node/conf-store.js +3 -2
- package/dist/private/node/conf-store.js.map +1 -1
- package/dist/private/node/session.d.ts +2 -2
- package/dist/private/node/session.js +4 -4
- package/dist/private/node/session.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.js +1 -1
- package/dist/private/node/ui/components/SelectPrompt.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.test.js +16 -0
- package/dist/private/node/ui/components/SelectPrompt.test.js.map +1 -1
- package/dist/public/common/version.d.ts +1 -1
- package/dist/public/common/version.js +1 -1
- package/dist/public/common/version.js.map +1 -1
- package/dist/public/node/api/admin.d.ts +1 -1
- package/dist/public/node/api/admin.js +10 -3
- package/dist/public/node/api/admin.js.map +1 -1
- package/dist/public/node/api/graphql.d.ts +27 -0
- package/dist/public/node/api/graphql.js +26 -0
- package/dist/public/node/api/graphql.js.map +1 -0
- package/dist/public/node/api/partners.d.ts +1 -1
- package/dist/public/node/api/partners.js +9 -2
- package/dist/public/node/api/partners.js.map +1 -1
- package/dist/public/node/crypto.d.ts +7 -0
- package/dist/public/node/crypto.js +9 -0
- package/dist/public/node/crypto.js.map +1 -1
- package/dist/public/node/environment.d.ts +12 -0
- package/dist/public/node/environment.js +17 -0
- package/dist/public/node/environment.js.map +1 -1
- package/dist/public/node/git.d.ts +15 -0
- package/dist/public/node/git.js +23 -0
- package/dist/public/node/git.js.map +1 -1
- package/dist/public/node/hooks/deprecations.js +1 -1
- package/dist/public/node/hooks/deprecations.js.map +1 -1
- package/dist/public/node/ruby.d.ts +7 -0
- package/dist/public/node/ruby.js +29 -8
- package/dist/public/node/ruby.js.map +1 -1
- package/dist/public/node/session.d.ts +2 -2
- package/dist/public/node/session.js +4 -4
- package/dist/public/node/session.js.map +1 -1
- package/dist/public/node/ui.d.ts +2 -1
- package/dist/public/node/ui.js +2 -1
- package/dist/public/node/ui.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/assets/cli-ruby/lib/project_types/extension/commands/build.rb +0 -51
- package/assets/cli-ruby/lib/project_types/extension/commands/check.rb +0 -51
- package/assets/cli-ruby/lib/project_types/extension/commands/connect.rb +0 -35
- package/assets/cli-ruby/lib/project_types/extension/commands/create.rb +0 -100
- package/assets/cli-ruby/lib/project_types/extension/commands/info.rb +0 -86
- package/assets/cli-ruby/lib/project_types/extension/commands/push.rb +0 -112
- package/assets/cli-ruby/lib/project_types/extension/commands/register.rb +0 -67
- package/assets/cli-ruby/lib/project_types/extension/commands/tunnel.rb +0 -73
- package/assets/cli-ruby/lib/project_types/extension/forms/connect.rb +0 -42
- package/assets/cli-ruby/lib/project_types/extension/forms/create.rb +0 -49
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_app.rb +0 -53
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_name.rb +0 -48
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_registration.rb +0 -55
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_template.rb +0 -37
- package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_type.rb +0 -47
- package/assets/cli-ruby/lib/project_types/extension/models/development_server.rb +0 -77
- package/assets/cli-ruby/lib/project_types/extension/models/development_server_requirements.rb +0 -56
- package/assets/cli-ruby/lib/project_types/extension/models/npm_package.rb +0 -44
- package/assets/cli-ruby/lib/project_types/extension/models/product.rb +0 -12
- package/assets/cli-ruby/lib/project_types/extension/models/registration.rb +0 -20
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/app.rb +0 -13
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/base.rb +0 -31
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/capabilities.rb +0 -11
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development.rb +0 -33
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_entries.rb +0 -38
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_renderer.rb +0 -38
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_resource.rb +0 -13
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/extension.rb +0 -46
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/root.rb +0 -21
- package/assets/cli-ruby/lib/project_types/extension/models/server_config/user.rb +0 -10
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +0 -29
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +0 -170
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension.rb +0 -58
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config.rb +0 -33
- package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config_repository.rb +0 -75
- package/assets/cli-ruby/lib/project_types/extension/tasks/choose_next_available_port.rb +0 -36
- package/assets/cli-ruby/lib/project_types/extension/tasks/convert_server_config.rb +0 -85
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/app_converter.rb +0 -27
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/product_converter.rb +0 -21
- package/assets/cli-ruby/lib/project_types/extension/tasks/converters/registration_converter.rb +0 -28
- package/assets/cli-ruby/lib/project_types/extension/tasks/create_extension.rb +0 -31
- package/assets/cli-ruby/lib/project_types/extension/tasks/ensure_resource_url.rb +0 -39
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/base.rb +0 -15
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/build.rb +0 -30
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/create.rb +0 -30
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/outdated_extension_detection.rb +0 -57
- package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/serve.rb +0 -36
- package/assets/cli-ruby/lib/project_types/extension/tasks/find_npm_packages.rb +0 -106
- package/assets/cli-ruby/lib/project_types/extension/tasks/find_package_from_json.rb +0 -37
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_app.rb +0 -22
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_apps.rb +0 -26
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_extensions.rb +0 -33
- package/assets/cli-ruby/lib/project_types/extension/tasks/get_product.rb +0 -22
- package/assets/cli-ruby/lib/project_types/extension/tasks/merge_server_config.rb +0 -47
- package/assets/cli-ruby/lib/project_types/extension/tasks/update_draft.rb +0 -29
- package/assets/cli-ruby/lib/project_types/extension/tasks/user_errors.rb +0 -45
- package/assets/cli-ruby/lib/shopify_cli/admin_api/populate_resource_command.rb +0 -166
- package/assets/cli-ruby/lib/shopify_cli/admin_api/schema.rb +0 -35
- package/assets/cli-ruby/lib/shopify_cli/app_type_detector.rb +0 -36
- package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/index.html.erb +0 -34
- package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/style.css +0 -58
- package/assets/cli-ruby/lib/shopify_cli/changelog.rb +0 -148
- package/assets/cli-ruby/lib/shopify_cli/command/app_sub_command.rb +0 -26
- package/assets/cli-ruby/lib/shopify_cli/command_options/command_serve_options.rb +0 -53
- package/assets/cli-ruby/lib/shopify_cli/command_options.rb +0 -7
- package/assets/cli-ruby/lib/shopify_cli/commands/app/connect.rb +0 -22
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create/node.rb +0 -40
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create/php.rb +0 -37
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create/rails.rb +0 -42
- package/assets/cli-ruby/lib/shopify_cli/commands/app/create.rb +0 -28
- package/assets/cli-ruby/lib/shopify_cli/commands/app/deploy.rb +0 -51
- package/assets/cli-ruby/lib/shopify_cli/commands/app/open.rb +0 -19
- package/assets/cli-ruby/lib/shopify_cli/commands/app/serve.rb +0 -51
- package/assets/cli-ruby/lib/shopify_cli/commands/app/tunnel.rb +0 -43
- package/assets/cli-ruby/lib/shopify_cli/commands/app.rb +0 -29
- package/assets/cli-ruby/lib/shopify_cli/commands/config.rb +0 -76
- package/assets/cli-ruby/lib/shopify_cli/commands/help.rb +0 -52
- package/assets/cli-ruby/lib/shopify_cli/commands/login.rb +0 -98
- package/assets/cli-ruby/lib/shopify_cli/commands/logout.rb +0 -50
- package/assets/cli-ruby/lib/shopify_cli/commands/populate/customer.rb +0 -25
- package/assets/cli-ruby/lib/shopify_cli/commands/populate/draft_order.rb +0 -28
- package/assets/cli-ruby/lib/shopify_cli/commands/populate/product.rb +0 -24
- package/assets/cli-ruby/lib/shopify_cli/commands/populate.rb +0 -23
- package/assets/cli-ruby/lib/shopify_cli/commands/reporting.rb +0 -38
- package/assets/cli-ruby/lib/shopify_cli/commands/store.rb +0 -15
- package/assets/cli-ruby/lib/shopify_cli/commands/switch.rb +0 -39
- package/assets/cli-ruby/lib/shopify_cli/commands/system.rb +0 -165
- package/assets/cli-ruby/lib/shopify_cli/commands/version.rb +0 -15
- package/assets/cli-ruby/lib/shopify_cli/commands/whoami.rb +0 -28
- package/assets/cli-ruby/lib/shopify_cli/connect.rb +0 -32
- package/assets/cli-ruby/lib/shopify_cli/core/help_resolver.rb +0 -20
- package/assets/cli-ruby/lib/shopify_cli/heroku.rb +0 -140
- package/assets/cli-ruby/lib/shopify_cli/identity_auth/servlet.rb +0 -44
- package/assets/cli-ruby/lib/shopify_cli/js_deps.rb +0 -110
- package/assets/cli-ruby/lib/shopify_cli/packager.rb +0 -108
- package/assets/cli-ruby/lib/shopify_cli/php_deps.rb +0 -102
- package/assets/cli-ruby/lib/shopify_cli/process_supervision.rb +0 -228
- package/assets/cli-ruby/lib/shopify_cli/project_commands.rb +0 -16
- package/assets/cli-ruby/lib/shopify_cli/release.rb +0 -197
- package/assets/cli-ruby/lib/shopify_cli/sed.rb +0 -19
- package/assets/cli-ruby/lib/shopify_cli/services/app/connect_service.rb +0 -25
- package/assets/cli-ruby/lib/shopify_cli/services/app/create/node_service.rb +0 -143
- package/assets/cli-ruby/lib/shopify_cli/services/app/create/php_service.rb +0 -147
- package/assets/cli-ruby/lib/shopify_cli/services/app/create/rails_service.rb +0 -239
- package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +0 -101
- package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +0 -135
- package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +0 -120
- package/assets/cli-ruby/lib/shopify_cli/services/app/open_service.rb +0 -19
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/node_service.rb +0 -19
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/php_service.rb +0 -23
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/rails_service.rb +0 -28
- package/assets/cli-ruby/lib/shopify_cli/services/app/serve/serve_service.rb +0 -57
- package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/auth_service.rb +0 -21
- package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/start_service.rb +0 -20
- package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/stop_service.rb +0 -20
- package/assets/cli-ruby/lib/shopify_cli/services/base_service.rb +0 -13
- package/assets/cli-ruby/lib/shopify_cli/services/reporting_service.rb +0 -16
- package/assets/cli-ruby/lib/shopify_cli/services.rb +0 -38
- package/assets/cli-ruby/lib/shopify_cli/tunnel.rb +0 -255
- package/dist/public/node/api/oxygen.d.ts +0 -22
- package/dist/public/node/api/oxygen.js +0 -40
- package/dist/public/node/api/oxygen.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { environmentVariables } from '../../private/node/constants.js';
|
|
1
2
|
/**
|
|
2
3
|
* It returns the environment variables of the environment
|
|
3
4
|
* where the Node process is running.
|
|
@@ -11,4 +12,20 @@
|
|
|
11
12
|
export function getEnvironmentVariables() {
|
|
12
13
|
return process.env;
|
|
13
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Returns the value of the SHOPIFY_CLI_PARTNERS_TOKEN environment variable.
|
|
17
|
+
*
|
|
18
|
+
* @returns Current process environment variables.
|
|
19
|
+
*/
|
|
20
|
+
export function getPartnersToken() {
|
|
21
|
+
return getEnvironmentVariables()[environmentVariables.partnersToken];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if the current proccess is running using the partners token.
|
|
25
|
+
*
|
|
26
|
+
* @returns True if the current proccess is running using the partners token.
|
|
27
|
+
*/
|
|
28
|
+
export function usePartnersToken() {
|
|
29
|
+
return getPartnersToken() !== undefined;
|
|
30
|
+
}
|
|
14
31
|
//# sourceMappingURL=environment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/public/node/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC,GAAG,CAAA;AACpB,CAAC","sourcesContent":["/**\n * It returns the environment variables of the environment\n * where the Node process is running.\n *\n * This function exists to prevent the access of the process\n * global variable which is discouraged via the no-process-env\n * ESLint rule.\n *\n * @returns Current process environment variables.\n */\nexport function getEnvironmentVariables(): NodeJS.ProcessEnv {\n return process.env\n}\n"]}
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/public/node/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,iCAAiC,CAAA;AAEpE;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC,GAAG,CAAA;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,uBAAuB,EAAE,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAA;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,gBAAgB,EAAE,KAAK,SAAS,CAAA;AACzC,CAAC","sourcesContent":["import {environmentVariables} from '../../private/node/constants.js'\n\n/**\n * It returns the environment variables of the environment\n * where the Node process is running.\n *\n * This function exists to prevent the access of the process\n * global variable which is discouraged via the no-process-env\n * ESLint rule.\n *\n * @returns Current process environment variables.\n */\nexport function getEnvironmentVariables(): NodeJS.ProcessEnv {\n return process.env\n}\n\n/**\n * Returns the value of the SHOPIFY_CLI_PARTNERS_TOKEN environment variable.\n *\n * @returns Current process environment variables.\n */\nexport function getPartnersToken(): string | undefined {\n return getEnvironmentVariables()[environmentVariables.partnersToken]\n}\n\n/**\n * Check if the current proccess is running using the partners token.\n *\n * @returns True if the current proccess is running using the partners token.\n */\nexport function usePartnersToken(): boolean {\n return getPartnersToken() !== undefined\n}\n"]}
|
|
@@ -96,3 +96,18 @@ export declare class OutsideGitDirectoryError extends AbortError {
|
|
|
96
96
|
* @param directory - The directory to check.
|
|
97
97
|
*/
|
|
98
98
|
export declare function ensureInsideGitDirectory(directory?: string): Promise<void>;
|
|
99
|
+
export declare class GitDirectoryNotCleanError extends AbortError {
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* If the .git directory tree is not clean (has uncommitted changes)
|
|
103
|
+
* it throws an abort error.
|
|
104
|
+
*
|
|
105
|
+
* @param directory - The directory to check.
|
|
106
|
+
*/
|
|
107
|
+
export declare function ensureIsClean(directory?: string): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Returns true if the .git directory tree is clean (no uncommitted changes).
|
|
110
|
+
*
|
|
111
|
+
* @param directory - The directory to check.
|
|
112
|
+
*/
|
|
113
|
+
export declare function isClean(directory?: string): Promise<boolean>;
|
package/dist/public/node/git.js
CHANGED
|
@@ -202,4 +202,27 @@ export async function ensureInsideGitDirectory(directory) {
|
|
|
202
202
|
throw new OutsideGitDirectoryError(`${outputToken.path(directory || cwd())} is not a Git directory`);
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
|
+
export class GitDirectoryNotCleanError extends AbortError {
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* If the .git directory tree is not clean (has uncommitted changes)
|
|
209
|
+
* it throws an abort error.
|
|
210
|
+
*
|
|
211
|
+
* @param directory - The directory to check.
|
|
212
|
+
*/
|
|
213
|
+
export async function ensureIsClean(directory) {
|
|
214
|
+
if (!(await isClean(directory))) {
|
|
215
|
+
throw new GitDirectoryNotCleanError(`${outputToken.path(directory || cwd())} is not a clean Git directory`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Returns true if the .git directory tree is clean (no uncommitted changes).
|
|
220
|
+
*
|
|
221
|
+
* @param directory - The directory to check.
|
|
222
|
+
*/
|
|
223
|
+
export async function isClean(directory) {
|
|
224
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
225
|
+
// @ts-ignore
|
|
226
|
+
return (await git({ baseDir: directory }).status()).isClean;
|
|
227
|
+
}
|
|
205
228
|
//# sourceMappingURL=git.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/public/node/git.ts"],"names":[],"mappings":"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","sourcesContent":["import {hasGit, isTerminalInteractive} from './context/local.js'\nimport {appendFileSync} from './fs.js'\nimport {AbortError} from './error.js'\nimport {cwd} from './path.js'\nimport {outputContent, outputToken, outputDebug} from '../../public/node/output.js'\nimport git, {TaskOptions, SimpleGitProgressEvent, DefaultLogFields, ListLogLine, SimpleGit} from 'simple-git'\n\n/**\n * Initialize a git repository at the given directory.\n *\n * @param directory - The directory where the git repository will be initialized.\n * @param initialBranch - The name of the initial branch.\n */\nexport async function initializeGitRepository(directory: string, initialBranch = 'main'): Promise<void> {\n outputDebug(outputContent`Initializing git repository at ${outputToken.path(directory)}...`)\n await ensureGitIsPresentOrAbort()\n // We use init and checkout instead of `init --initial-branch` because the latter is only supported in git 2.28+\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const repo = git(directory)\n await repo.init()\n await repo.checkoutLocalBranch(initialBranch)\n}\n\n/**\n * Given a Git repository and a list of absolute paths to files contained\n * in the repository, it filters and returns the files that are ignored\n * by the .gitignore.\n *\n * @param directory - The absolute path to the directory containing the files.\n * @param files - The list of files to check against.\n */\nexport async function checkIfIgnoredInGitRepository(directory: string, files: string[]): Promise<string[]> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const repo = git(directory)\n const ignoredLockfile = await repo.checkIgnore(files)\n return ignoredLockfile\n}\n\nexport interface GitIgnoreTemplate {\n [section: string]: string[]\n}\n/**\n * Create a .gitignore file in the given directory.\n *\n * @param directory - The directory where the .gitignore file will be created.\n * @param template - The template to use to create the .gitignore file.\n */\nexport function createGitIgnore(directory: string, template: GitIgnoreTemplate): void {\n outputDebug(outputContent`Creating .gitignore at ${outputToken.path(directory)}...`)\n const filePath = `${directory}/.gitignore`\n\n let fileContent = ''\n for (const [section, lines] of Object.entries(template)) {\n fileContent += `# ${section}\\n`\n fileContent += `${lines.join('\\n')}\\n\\n`\n }\n\n appendFileSync(filePath, fileContent)\n}\n\n/**\n * Options to use when cloning a git repository.\n *\n * @param repoUrl - The URL of the repository to clone.\n * @param destination - The directory where the repository will be cloned.\n * @param progressUpdater - A function that will be called with the progress of the clone.\n * @param shallow - Whether to clone the repository shallowly.\n * @param latestTag - Whether to clone the latest tag instead of the default branch.\n */\nexport interface GitCloneOptions {\n repoUrl: string\n destination: string\n progressUpdater?: (statusString: string) => void\n shallow?: boolean\n latestTag?: boolean\n}\n/**\n * Clone a git repository.\n *\n * @param cloneOptions - The options to use to clone the repository.\n * @returns A promise that resolves when the clone is complete.\n */\nexport async function downloadGitRepository(cloneOptions: GitCloneOptions): Promise<void> {\n const {repoUrl, destination, progressUpdater, shallow, latestTag} = cloneOptions\n outputDebug(outputContent`Git-cloning repository ${repoUrl} into ${outputToken.path(destination)}...`)\n await ensureGitIsPresentOrAbort()\n const [repository, branch] = repoUrl.split('#')\n const options: TaskOptions = {'--recurse-submodules': null}\n\n if (branch && latestTag) {\n throw new AbortError(\"Error cloning the repository. Git can't clone the latest release with a 'branch'.\")\n }\n if (branch) {\n options['--branch'] = branch\n }\n\n if (shallow && latestTag) {\n throw new AbortError(\n \"Error cloning the repository. Git can't clone the latest release with the 'shallow' property.\",\n )\n }\n if (shallow) {\n options['--depth'] = 1\n }\n\n const progress = ({stage, progress, processed, total}: SimpleGitProgressEvent) => {\n const updateString = `${stage}, ${processed}/${total} objects (${progress}% complete)`\n if (progressUpdater) progressUpdater(updateString)\n }\n\n const simpleGitOptions = {\n progress,\n ...(!isTerminalInteractive() && {config: ['core.askpass=true']}),\n }\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n await git(simpleGitOptions).clone(repository!, destination, options)\n\n if (latestTag) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const localGitRepository = git(destination)\n const latestTag = await getLocalLatestTag(localGitRepository, repoUrl)\n await localGitRepository.checkout(latestTag)\n }\n } catch (err) {\n if (err instanceof Error) {\n const abortError = new AbortError(err.message)\n abortError.stack = err.stack\n throw abortError\n }\n throw err\n }\n}\n\n/**\n * Get the most recent tag of a local git repository.\n *\n * @param repository - The local git repository.\n * @param repoUrl - The URL of the repository.\n * @returns The most recent tag of the repository.\n */\nasync function getLocalLatestTag(repository: SimpleGit, repoUrl: string): Promise<string> {\n const latest = (await repository.tags()).latest\n\n if (!latest) {\n throw new AbortError(`Couldn't obtain the most recent tag of the repository ${repoUrl}`)\n }\n\n return latest\n}\n\n/**\n * Get the latest commit of a git repository.\n *\n * @param directory - The directory of the git repository.\n * @returns The latest commit of the repository.\n */\nexport async function getLatestGitCommit(directory?: string): Promise<DefaultLogFields & ListLogLine> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const logs = await git({baseDir: directory}).log({\n maxCount: 1,\n })\n if (!logs.latest) {\n throw new AbortError(\n 'Must have at least one commit to run command',\n outputContent`Run ${outputToken.genericShellCommand(\n \"git commit -m 'Initial commit'\",\n )} to create your first commit.`,\n )\n }\n return logs.latest\n}\n\n/**\n * Add all files to the git index from the given directory.\n *\n * @param directory - The directory where the git repository is located.\n * @returns A promise that resolves when the files are added to the index.\n */\nexport async function addAllToGitFromDirectory(directory?: string): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const simpleGit = git({baseDir: directory})\n await simpleGit.raw('add', '--all')\n}\n\nexport interface CreateGitCommitOptions {\n directory?: string\n author?: string\n}\n\n/**\n * Create a git commit.\n *\n * @param message - The message of the commit.\n * @param options - The options to use to create the commit.\n * @returns The hash of the created commit.\n */\nexport async function createGitCommit(message: string, options?: CreateGitCommitOptions): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const simpleGit = git({baseDir: options?.directory})\n\n const commitOptions = options?.author ? {'--author': options.author} : undefined\n const result = await simpleGit.commit(message, commitOptions)\n\n return result.commit\n}\n\n/**\n * Get the HEAD symbolic reference of a git repository.\n *\n * @param directory - The directory of the git repository.\n * @returns The HEAD symbolic reference of the repository.\n */\nexport async function getHeadSymbolicRef(directory?: string): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const ref = await git({baseDir: directory}).raw('symbolic-ref', '-q', 'HEAD')\n if (!ref) {\n throw new AbortError(\n \"Git HEAD can't be detached to run command\",\n outputContent`Run ${outputToken.genericShellCommand(\n 'git checkout [branchName]',\n )} to reattach HEAD or see git ${outputToken.link(\n 'documentation',\n 'https://git-scm.com/book/en/v2/Git-Internals-Git-References',\n )} for more details`,\n )\n }\n return ref.trim()\n}\n\n/**\n * If \"git\" is not present in the environment it throws\n * an abort error.\n */\nexport async function ensureGitIsPresentOrAbort(): Promise<void> {\n if (!(await hasGit())) {\n throw new AbortError(\n `Git is necessary in the environment to continue`,\n outputContent`Install ${outputToken.link(\n 'git',\n 'https://git-scm.com/book/en/v2/Getting-Started-Installing-Git',\n )}`,\n )\n }\n}\n\nexport class OutsideGitDirectoryError extends AbortError {}\n/**\n * If command run from outside a .git directory tree\n * it throws an abort error.\n *\n * @param directory - The directory to check.\n */\nexport async function ensureInsideGitDirectory(directory?: string): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (!(await git({baseDir: directory}).checkIsRepo())) {\n throw new OutsideGitDirectoryError(`${outputToken.path(directory || cwd())} is not a Git directory`)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/public/node/git.ts"],"names":[],"mappings":"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","sourcesContent":["import {hasGit, isTerminalInteractive} from './context/local.js'\nimport {appendFileSync} from './fs.js'\nimport {AbortError} from './error.js'\nimport {cwd} from './path.js'\nimport {outputContent, outputToken, outputDebug} from '../../public/node/output.js'\nimport git, {TaskOptions, SimpleGitProgressEvent, DefaultLogFields, ListLogLine, SimpleGit} from 'simple-git'\n\n/**\n * Initialize a git repository at the given directory.\n *\n * @param directory - The directory where the git repository will be initialized.\n * @param initialBranch - The name of the initial branch.\n */\nexport async function initializeGitRepository(directory: string, initialBranch = 'main'): Promise<void> {\n outputDebug(outputContent`Initializing git repository at ${outputToken.path(directory)}...`)\n await ensureGitIsPresentOrAbort()\n // We use init and checkout instead of `init --initial-branch` because the latter is only supported in git 2.28+\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const repo = git(directory)\n await repo.init()\n await repo.checkoutLocalBranch(initialBranch)\n}\n\n/**\n * Given a Git repository and a list of absolute paths to files contained\n * in the repository, it filters and returns the files that are ignored\n * by the .gitignore.\n *\n * @param directory - The absolute path to the directory containing the files.\n * @param files - The list of files to check against.\n */\nexport async function checkIfIgnoredInGitRepository(directory: string, files: string[]): Promise<string[]> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const repo = git(directory)\n const ignoredLockfile = await repo.checkIgnore(files)\n return ignoredLockfile\n}\n\nexport interface GitIgnoreTemplate {\n [section: string]: string[]\n}\n/**\n * Create a .gitignore file in the given directory.\n *\n * @param directory - The directory where the .gitignore file will be created.\n * @param template - The template to use to create the .gitignore file.\n */\nexport function createGitIgnore(directory: string, template: GitIgnoreTemplate): void {\n outputDebug(outputContent`Creating .gitignore at ${outputToken.path(directory)}...`)\n const filePath = `${directory}/.gitignore`\n\n let fileContent = ''\n for (const [section, lines] of Object.entries(template)) {\n fileContent += `# ${section}\\n`\n fileContent += `${lines.join('\\n')}\\n\\n`\n }\n\n appendFileSync(filePath, fileContent)\n}\n\n/**\n * Options to use when cloning a git repository.\n *\n * @param repoUrl - The URL of the repository to clone.\n * @param destination - The directory where the repository will be cloned.\n * @param progressUpdater - A function that will be called with the progress of the clone.\n * @param shallow - Whether to clone the repository shallowly.\n * @param latestTag - Whether to clone the latest tag instead of the default branch.\n */\nexport interface GitCloneOptions {\n repoUrl: string\n destination: string\n progressUpdater?: (statusString: string) => void\n shallow?: boolean\n latestTag?: boolean\n}\n/**\n * Clone a git repository.\n *\n * @param cloneOptions - The options to use to clone the repository.\n * @returns A promise that resolves when the clone is complete.\n */\nexport async function downloadGitRepository(cloneOptions: GitCloneOptions): Promise<void> {\n const {repoUrl, destination, progressUpdater, shallow, latestTag} = cloneOptions\n outputDebug(outputContent`Git-cloning repository ${repoUrl} into ${outputToken.path(destination)}...`)\n await ensureGitIsPresentOrAbort()\n const [repository, branch] = repoUrl.split('#')\n const options: TaskOptions = {'--recurse-submodules': null}\n\n if (branch && latestTag) {\n throw new AbortError(\"Error cloning the repository. Git can't clone the latest release with a 'branch'.\")\n }\n if (branch) {\n options['--branch'] = branch\n }\n\n if (shallow && latestTag) {\n throw new AbortError(\n \"Error cloning the repository. Git can't clone the latest release with the 'shallow' property.\",\n )\n }\n if (shallow) {\n options['--depth'] = 1\n }\n\n const progress = ({stage, progress, processed, total}: SimpleGitProgressEvent) => {\n const updateString = `${stage}, ${processed}/${total} objects (${progress}% complete)`\n if (progressUpdater) progressUpdater(updateString)\n }\n\n const simpleGitOptions = {\n progress,\n ...(!isTerminalInteractive() && {config: ['core.askpass=true']}),\n }\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n await git(simpleGitOptions).clone(repository!, destination, options)\n\n if (latestTag) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const localGitRepository = git(destination)\n const latestTag = await getLocalLatestTag(localGitRepository, repoUrl)\n await localGitRepository.checkout(latestTag)\n }\n } catch (err) {\n if (err instanceof Error) {\n const abortError = new AbortError(err.message)\n abortError.stack = err.stack\n throw abortError\n }\n throw err\n }\n}\n\n/**\n * Get the most recent tag of a local git repository.\n *\n * @param repository - The local git repository.\n * @param repoUrl - The URL of the repository.\n * @returns The most recent tag of the repository.\n */\nasync function getLocalLatestTag(repository: SimpleGit, repoUrl: string): Promise<string> {\n const latest = (await repository.tags()).latest\n\n if (!latest) {\n throw new AbortError(`Couldn't obtain the most recent tag of the repository ${repoUrl}`)\n }\n\n return latest\n}\n\n/**\n * Get the latest commit of a git repository.\n *\n * @param directory - The directory of the git repository.\n * @returns The latest commit of the repository.\n */\nexport async function getLatestGitCommit(directory?: string): Promise<DefaultLogFields & ListLogLine> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const logs = await git({baseDir: directory}).log({\n maxCount: 1,\n })\n if (!logs.latest) {\n throw new AbortError(\n 'Must have at least one commit to run command',\n outputContent`Run ${outputToken.genericShellCommand(\n \"git commit -m 'Initial commit'\",\n )} to create your first commit.`,\n )\n }\n return logs.latest\n}\n\n/**\n * Add all files to the git index from the given directory.\n *\n * @param directory - The directory where the git repository is located.\n * @returns A promise that resolves when the files are added to the index.\n */\nexport async function addAllToGitFromDirectory(directory?: string): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const simpleGit = git({baseDir: directory})\n await simpleGit.raw('add', '--all')\n}\n\nexport interface CreateGitCommitOptions {\n directory?: string\n author?: string\n}\n\n/**\n * Create a git commit.\n *\n * @param message - The message of the commit.\n * @param options - The options to use to create the commit.\n * @returns The hash of the created commit.\n */\nexport async function createGitCommit(message: string, options?: CreateGitCommitOptions): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const simpleGit = git({baseDir: options?.directory})\n\n const commitOptions = options?.author ? {'--author': options.author} : undefined\n const result = await simpleGit.commit(message, commitOptions)\n\n return result.commit\n}\n\n/**\n * Get the HEAD symbolic reference of a git repository.\n *\n * @param directory - The directory of the git repository.\n * @returns The HEAD symbolic reference of the repository.\n */\nexport async function getHeadSymbolicRef(directory?: string): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const ref = await git({baseDir: directory}).raw('symbolic-ref', '-q', 'HEAD')\n if (!ref) {\n throw new AbortError(\n \"Git HEAD can't be detached to run command\",\n outputContent`Run ${outputToken.genericShellCommand(\n 'git checkout [branchName]',\n )} to reattach HEAD or see git ${outputToken.link(\n 'documentation',\n 'https://git-scm.com/book/en/v2/Git-Internals-Git-References',\n )} for more details`,\n )\n }\n return ref.trim()\n}\n\n/**\n * If \"git\" is not present in the environment it throws\n * an abort error.\n */\nexport async function ensureGitIsPresentOrAbort(): Promise<void> {\n if (!(await hasGit())) {\n throw new AbortError(\n `Git is necessary in the environment to continue`,\n outputContent`Install ${outputToken.link(\n 'git',\n 'https://git-scm.com/book/en/v2/Getting-Started-Installing-Git',\n )}`,\n )\n }\n}\n\nexport class OutsideGitDirectoryError extends AbortError {}\n/**\n * If command run from outside a .git directory tree\n * it throws an abort error.\n *\n * @param directory - The directory to check.\n */\nexport async function ensureInsideGitDirectory(directory?: string): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (!(await git({baseDir: directory}).checkIsRepo())) {\n throw new OutsideGitDirectoryError(`${outputToken.path(directory || cwd())} is not a Git directory`)\n }\n}\n\nexport class GitDirectoryNotCleanError extends AbortError {}\n/**\n * If the .git directory tree is not clean (has uncommitted changes)\n * it throws an abort error.\n *\n * @param directory - The directory to check.\n */\nexport async function ensureIsClean(directory?: string): Promise<void> {\n if (!(await isClean(directory))) {\n throw new GitDirectoryNotCleanError(`${outputToken.path(directory || cwd())} is not a clean Git directory`)\n }\n}\n\n/**\n * Returns true if the .git directory tree is clean (no uncommitted changes).\n *\n * @param directory - The directory to check.\n */\nexport async function isClean(directory?: string): Promise<boolean> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return (await git({baseDir: directory}).status()).isClean\n}\n"]}
|
|
@@ -27,7 +27,7 @@ function renderUpgradeWarning(upgradeByDate, forThemes) {
|
|
|
27
27
|
});
|
|
28
28
|
const formattedDate = dateFormat.format(upgradeByDate);
|
|
29
29
|
const headline = `Upgrade to the latest CLI version by ${formattedDate}.`;
|
|
30
|
-
const body = 'This command
|
|
30
|
+
const body = 'This command requires an upgrade to continue working as intended.';
|
|
31
31
|
const upgradeLink = {
|
|
32
32
|
link: {
|
|
33
33
|
label: 'upgrade Shopify CLI',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deprecations.js","sourceRoot":"","sources":["../../../../src/public/node/hooks/deprecations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,qDAAqD,CAAA;AAC1F,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AAGtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAQ,EAAE;IACtD,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAA;IACpD,IAAI,mBAAmB,EAAE;QACvB,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAChD,oBAAoB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAA;KACrD;AACH,CAAC,CAAA;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,aAAmB,EAAE,SAAmB;IACpE,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;QACpD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAEtD,MAAM,QAAQ,GAAG,wCAAwC,aAAa,GAAG,CAAA;IACzE,MAAM,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"deprecations.js","sourceRoot":"","sources":["../../../../src/public/node/hooks/deprecations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,qDAAqD,CAAA;AAC1F,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AAGtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAQ,EAAE;IACtD,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAA;IACpD,IAAI,mBAAmB,EAAE;QACvB,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAChD,oBAAoB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAA;KACrD;AACH,CAAC,CAAA;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,aAAmB,EAAE,SAAmB;IACpE,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;QACpD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAEtD,MAAM,QAAQ,GAAG,wCAAwC,aAAa,GAAG,CAAA;IACzE,MAAM,IAAI,GAAG,mEAAmE,CAAA;IAChF,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE;YACJ,KAAK,EAAE,qBAAqB;YAC5B,GAAG,EAAE,SAAS;gBACZ,CAAC,CAAC,+DAA+D;gBACjE,CAAC,CAAC,6DAA6D;SAClE;KACF,CAAA;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IAEpE,aAAa,CAAC;QACZ,QAAQ;QACR,IAAI;QACJ,SAAS;KACV,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {getNextDeprecationDate} from '../../../private/node/context/deprecations-store.js'\nimport {renderWarning} from '@shopify/cli-kit/node/ui'\nimport {Command} from '@oclif/core'\n\n/**\n * After a successful command run, renders an upgrade warning if `nextDeprecationDate` is present.\n *\n * @param Command - The class of the command that was run.\n */\nexport const postrun = (Command: Command.Class): void => {\n const nextDeprecationDate = getNextDeprecationDate()\n if (nextDeprecationDate) {\n const forThemes = Command?.id?.includes('theme')\n renderUpgradeWarning(nextDeprecationDate, forThemes)\n }\n}\n\n/**\n * Renders a warning to upgrade to avoid using deprecated features\n * that will no longer be supported after the specified date.\n *\n * @param upgradeByDate - The earliest future date when deprecated features will no longer be supported.\n * @param forThemes - If true, references the upgrade link for themes, else for apps.\n */\nfunction renderUpgradeWarning(upgradeByDate: Date, forThemes?: boolean): void {\n const dateFormat = new Intl.DateTimeFormat('default', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })\n const formattedDate = dateFormat.format(upgradeByDate)\n\n const headline = `Upgrade to the latest CLI version by ${formattedDate}.`\n const body = 'This command requires an upgrade to continue working as intended.'\n const upgradeLink = {\n link: {\n label: 'upgrade Shopify CLI',\n url: forThemes\n ? `https://shopify.dev/docs/themes/tools/cli#upgrade-shopify-cli`\n : `https://shopify.dev/docs/apps/tools/cli#upgrade-shopify-cli`,\n },\n }\n const nextSteps = [['Run', {command: 'upgrade'}, 'to', upgradeLink]]\n\n renderWarning({\n headline,\n body,\n nextSteps,\n })\n}\n"]}
|
|
@@ -43,4 +43,11 @@ export declare function execThemeCheckCLI(options: ExecThemeCheckCLIOptions): Pr
|
|
|
43
43
|
* It returns the Ruby version present in the envirronment.
|
|
44
44
|
*/
|
|
45
45
|
export declare function version(): Promise<string | undefined>;
|
|
46
|
+
/**
|
|
47
|
+
* It returns a custom BUNDLE_USER_HOME. This is required in Windows because
|
|
48
|
+
* bundler will instead crash if the username contains UTF-8 characters.
|
|
49
|
+
*
|
|
50
|
+
* @returns The value of the environment variable.
|
|
51
|
+
*/
|
|
52
|
+
export declare function bundleUserHome(): string | undefined;
|
|
46
53
|
export {};
|
package/dist/public/node/ruby.js
CHANGED
|
@@ -46,7 +46,7 @@ export async function execCLI2(args, options = {}) {
|
|
|
46
46
|
};
|
|
47
47
|
try {
|
|
48
48
|
const shopifyExecutable = embedded ? [rubyExecutable(), await embeddedCLIExecutable()] : ['shopify'];
|
|
49
|
-
await
|
|
49
|
+
await runBundler(['exec', ...shopifyExecutable, ...args], {
|
|
50
50
|
...(options.stdout === undefined && { stdio: 'inherit' }),
|
|
51
51
|
cwd: options.directory ?? cwd(),
|
|
52
52
|
env,
|
|
@@ -87,7 +87,7 @@ export async function execThemeCheckCLI(options) {
|
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
});
|
|
90
|
-
await
|
|
90
|
+
await runBundler(['exec', 'theme-check'].concat([directory, ...(options.args || [])]), {
|
|
91
91
|
stdout: options.stdout,
|
|
92
92
|
stderr: customStderr,
|
|
93
93
|
cwd: themeCheckDirectory(),
|
|
@@ -173,7 +173,7 @@ async function validateRuby() {
|
|
|
173
173
|
async function validateBundler() {
|
|
174
174
|
let version;
|
|
175
175
|
try {
|
|
176
|
-
const stdout = await captureOutput(bundleExecutable(), ['-v']);
|
|
176
|
+
const stdout = await captureOutput(bundleExecutable(), ['-v'], { env: { BUNDLE_USER_HOME: bundleUserHome() } });
|
|
177
177
|
version = coerceSemverVersion(stdout);
|
|
178
178
|
}
|
|
179
179
|
catch {
|
|
@@ -366,14 +366,35 @@ async function getSpinEnvironmentVariables() {
|
|
|
366
366
|
* @param directory - Directory where the Gemfile is located.
|
|
367
367
|
*/
|
|
368
368
|
async function shopifyBundleInstall(directory) {
|
|
369
|
-
|
|
370
|
-
const shopifyGemsPath = shopifyGems.cache;
|
|
371
|
-
await exec(bundle, ['config', 'set', '--local', 'path', shopifyGemsPath], {
|
|
369
|
+
await runBundler(['config', 'set', '--local', 'path', shopifyGems.cache], {
|
|
372
370
|
cwd: directory,
|
|
373
371
|
});
|
|
374
|
-
await
|
|
372
|
+
await runBundler(['config', 'set', '--local', 'without', 'development:test'], {
|
|
375
373
|
cwd: directory,
|
|
376
374
|
});
|
|
377
|
-
await
|
|
375
|
+
await runBundler(['install'], { cwd: directory });
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* It returns a custom BUNDLE_USER_HOME. This is required in Windows because
|
|
379
|
+
* bundler will instead crash if the username contains UTF-8 characters.
|
|
380
|
+
*
|
|
381
|
+
* @returns The value of the environment variable.
|
|
382
|
+
*/
|
|
383
|
+
export function bundleUserHome() {
|
|
384
|
+
if (platformAndArch().platform === 'windows' && process.env.PUBLIC) {
|
|
385
|
+
return joinPath(process.env.PUBLIC, 'AppData', 'Local', 'shopify-bundler-nodejs', 'Cache');
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
return undefined;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* It runs bundler commands by setting the correct BUNDLE_USER_HOME env var.
|
|
393
|
+
*
|
|
394
|
+
* @param args - Arguments to pass to the bundle command.
|
|
395
|
+
* @param options - Options to pass to the exec function.
|
|
396
|
+
*/
|
|
397
|
+
async function runBundler(args, options) {
|
|
398
|
+
return exec(bundleExecutable(), args, { ...options, env: { ...options.env, BUNDLE_USER_HOME: bundleUserHome() } });
|
|
378
399
|
}
|
|
379
400
|
//# sourceMappingURL=ruby.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/public/node/ruby.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbortSignal} from './abort.js'\nimport {platformAndArch} from './os.js'\nimport {captureOutput, exec} from './system.js'\nimport * as file from './fs.js'\nimport {joinPath, dirname, cwd} from './path.js'\nimport {AbortError, AbortSilentError} from './error.js'\nimport {getEnvironmentVariables} from './environment.js'\nimport {isSpinEnvironment, spinFqdn} from './context/spin.js'\nimport {pathConstants} from '../../private/node/constants.js'\nimport {AdminSession} from '../../public/node/session.js'\nimport {outputContent, outputToken} from '../../public/node/output.js'\nimport {isTruthy} from '../../private/node/context/utilities.js'\nimport {coerceSemverVersion} from '../../private/node/semver.js'\nimport envPaths from 'env-paths'\nimport {Writable} from 'stream'\nimport {fileURLToPath} from 'url'\n\nexport const RubyCLIVersion = '2.35.0'\nconst ThemeCheckVersion = '1.14.0'\nconst MinBundlerVersion = '2.3.11'\nconst MinRubyVersion = '2.7.5'\nexport const MinWdmWindowsVersion = '0.1.0'\nconst shopifyGems = envPaths('shopify-gems')\n\ninterface ExecCLI2Options {\n // Contains token and store to pass to CLI 2.0, which will be set as environment variables\n adminSession?: AdminSession\n // Contains token for storefront access to pass to CLI 2.0 as environment variable\n storefrontToken?: string\n // Contains token for partners access to pass to CLI 2.0 as environment variable\n token?: string\n // Directory in which to execute the command. Otherwise the current directory will be used.\n directory?: string\n // A signal to stop the process execution.\n signal?: AbortSignal\n // Stream to pipe the command's stdout to.\n stdout?: Writable\n // Stream to pipe the command's stdout to.\n stderr?: Writable\n}\n/**\n * Execute CLI 2.0 commands.\n * Installs a version of RubyCLI as a vendor dependency in a hidden folder in the system.\n * User must have a valid ruby+bundler environment to run any command.\n *\n * @param args - List of argumets to execute. (ex: ['theme', 'pull']).\n * @param options - Options to customize the execution of cli2.\n */\nexport async function execCLI2(args: string[], options: ExecCLI2Options = {}): Promise<void> {\n const currentEnv = getEnvironmentVariables()\n const embedded = !isTruthy(currentEnv.SHOPIFY_CLI_BUNDLED_THEME_CLI) && !currentEnv.SHOPIFY_CLI_2_0_DIRECTORY\n\n await installCLIDependencies(options.stdout ?? process.stdout, embedded)\n const env: NodeJS.ProcessEnv = {\n ...currentEnv,\n SHOPIFY_CLI_STOREFRONT_RENDERER_AUTH_TOKEN: options.storefrontToken,\n SHOPIFY_CLI_ADMIN_AUTH_TOKEN: options.adminSession?.token,\n SHOPIFY_SHOP: options.adminSession?.storeFqdn,\n SHOPIFY_CLI_AUTH_TOKEN: options.token,\n SHOPIFY_CLI_RUN_AS_SUBPROCESS: 'true',\n SHOPIFY_CLI_RUBY_BIN: rubyExecutable(),\n // Bundler uses this Gemfile to understand which gems are available in the\n // environment. We use this to specify our own Gemfile for CLI2, which exists\n // outside the user's project directory.\n BUNDLE_GEMFILE: joinPath(await shopifyCLIDirectory(embedded), 'Gemfile'),\n ...(await getSpinEnvironmentVariables()),\n }\n\n try {\n const shopifyExecutable = embedded ? [rubyExecutable(), await embeddedCLIExecutable()] : ['shopify']\n await exec(bundleExecutable(), ['exec', ...shopifyExecutable, ...args], {\n ...(options.stdout === undefined && {stdio: 'inherit'}),\n cwd: options.directory ?? cwd(),\n env,\n ...(options.stdout !== undefined && {stdout: options.stdout, stderr: options.stderr}),\n signal: options.signal,\n })\n } catch (error) {\n // CLI2 will show it's own errors, we don't need to show an additional CLI3 error\n throw new AbortSilentError()\n }\n}\n\ninterface ExecThemeCheckCLIOptions {\n /** A list of directories in which theme-check should run. */\n directories: string[]\n /** Arguments to pass to the theme-check CLI. */\n args?: string[]\n /** Writable to send standard output content through. */\n stdout: Writable\n /** Writable to send standard error content through. */\n stderr: Writable\n}\n\n/**\n * A function that installs (if needed) and runs the theme-check CLI.\n *\n * @param options - Options to customize the execution of theme-check.\n * @returns A promise that resolves or rejects depending on the result of the underlying theme-check process.\n */\nexport async function execThemeCheckCLI(options: ExecThemeCheckCLIOptions): Promise<void[]> {\n await installThemeCheckCLIDependencies(options.stdout)\n\n const processes = options.directories.map(async (directory): Promise<void> => {\n // Check that there are files aside from the extension TOML config file,\n // otherwise theme-check will return a false failure.\n const files = await file.glob(joinPath(directory, '/**/*'))\n const fileCount = files.filter((file) => !file.match(/\\.toml$/)).length\n if (fileCount === 0) return\n\n const customStderr = new Writable({\n write(chunk, ...args) {\n // For some reason, theme-check reports this initial status line to stderr\n // See https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/diagnostics_engine.rb#L31\n // which leads to https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/io_messenger.rb#L65\n if (chunk.toString('ascii').match(/^Checking/)) {\n options.stdout.write(chunk, ...args)\n } else {\n options.stderr.write(chunk, ...args)\n }\n },\n })\n await exec(bundleExecutable(), ['exec', 'theme-check'].concat([directory, ...(options.args || [])]), {\n stdout: options.stdout,\n stderr: customStderr,\n cwd: themeCheckDirectory(),\n })\n })\n return Promise.all(processes)\n}\n\n/**\n * Validate Ruby Enviroment\n * Install Theme Check CLI and its dependencies\n * Shows a loading message if it's the first time installing dependencies\n * or if we are installing a new version of Theme Check CLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n */\nasync function installThemeCheckCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(themeCheckDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n await validateRubyEnv()\n await createThemeCheckCLIWorkingDirectory()\n await createThemeCheckGemfile()\n await bundleInstallThemeCheck()\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * Validate Ruby Enviroment\n * Install RubyCLI and its dependencies\n * Shows a loading spinner if it's the first time installing dependencies\n * or if we are installing a new version of RubyCLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n * @param embedded - True when embebbed codebase of CLI should be used.\n */\nasync function installCLIDependencies(stdout: Writable, embedded = false) {\n const localCLI = await shopifyCLIDirectory(embedded)\n const exists = await file.fileExists(localCLI)\n\n if (!exists) stdout.write('Installing theme dependencies...')\n const usingLocalCLI2 = embedded || isTruthy(getEnvironmentVariables().SHOPIFY_CLI_2_0_DIRECTORY)\n await validateRubyEnv()\n if (usingLocalCLI2) {\n await bundleInstallLocalShopifyCLI(localCLI)\n } else {\n await createShopifyCLIWorkingDirectory()\n await createShopifyCLIGemfile()\n await bundleInstallShopifyCLI()\n }\n\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby and Bundler.\n */\nasync function validateRubyEnv() {\n await validateRuby()\n await validateBundler()\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby.\n */\nasync function validateRuby() {\n let version\n try {\n const stdout = await captureOutput(rubyExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Ruby environment not found',\n `Make sure you have Ruby installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n\n const isValid = version?.compare(MinRubyVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Ruby version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `Make sure you have at least Ruby ${\n outputContent`${outputToken.yellow(MinRubyVersion)}`.value\n } installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Bundler.\n */\nasync function validateBundler() {\n let version\n try {\n const stdout = await captureOutput(bundleExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Bundler not found',\n `To install the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n\n const isValid = version?.compare(MinBundlerVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Bundler version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `To update to the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n}\n\n/**\n * It creates the directory where the Ruby CLI will be downloaded along its dependencies.\n */\nasync function createShopifyCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(await shopifyCLIDirectory())\n}\n\n/**\n * It creates the directory where the theme-check CLI will be downloaded along its dependencies.\n */\nasync function createThemeCheckCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(themeCheckDirectory())\n}\n\n/**\n * It creates the Gemfile to install The Ruby CLI and the dependencies.\n */\nasync function createShopifyCLIGemfile(): Promise<void> {\n const directory = await shopifyCLIDirectory()\n const gemfileContent = getBaseGemfileContent().concat(getWindowsDependencies())\n await addContentToGemfile(directory, gemfileContent)\n}\n\n/**\n * It creates the Gemfile to install theme-check and its dependencies.\n */\nasync function createThemeCheckGemfile(): Promise<void> {\n const gemPath = joinPath(themeCheckDirectory(), 'Gemfile')\n await file.writeFile(gemPath, `source 'https://rubygems.org'\\ngem 'theme-check', '${ThemeCheckVersion}'`)\n}\n\n/**\n * It runs bundle install for the dev-managed copy of the Ruby CLI.\n *\n * @param directory - Directory where CLI2 Gemfile is located.\n */\nasync function bundleInstallLocalShopifyCLI(directory: string): Promise<void> {\n await addContentToGemfile(directory, getWindowsDependencies())\n await shopifyBundleInstall(directory)\n}\n\n/**\n * Build the list of lines with the base content of the Gemfile.\n *\n * @returns List of lines with base content.\n */\nfunction getBaseGemfileContent() {\n return [\"source 'https://rubygems.org'\", `gem 'shopify-cli', '${RubyCLIVersion}'`]\n}\n\n/**\n * Build the list of Windows dependencies.\n *\n * @returns List of Windows dependencies.\n */\nfunction getWindowsDependencies() {\n if (platformAndArch().platform === 'windows') {\n // 'wdm' is required by 'listen', see https://github.com/Shopify/cli/issues/780\n // Because it's a Windows-only dependency, it's not included in the `.gemspec` or `Gemfile`.\n // Otherwise it would be installed in non-Windows environments too, where it is not needed.\n return [`gem 'wdm', '>= ${MinWdmWindowsVersion}'`]\n }\n return []\n}\n\n/**\n * Append contente to a Gemfile located in the given directory.\n *\n * @param gemfileDirectory - Directory where Gemfile is located.\n * @param content - Content to append to the Gemfile.\n */\nasync function addContentToGemfile(gemfileDirectory: string, content: string[]) {\n const gemfilePath = joinPath(gemfileDirectory, 'Gemfile')\n if (!(await file.fileExists(gemfilePath))) await file.touchFile(gemfilePath)\n const gemContent = await file.readFile(gemfilePath, {encoding: 'utf8'})\n const contentNoExisting = content.filter((line) => !gemContent.includes(line)).join('\\n')\n if (contentNoExisting) await file.appendFile(gemfilePath, contentNoExisting.concat('\\n'))\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of the Ruby CLI.\n */\nasync function bundleInstallShopifyCLI() {\n await shopifyBundleInstall(await shopifyCLIDirectory())\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of theme-check.\n */\nasync function bundleInstallThemeCheck() {\n await shopifyBundleInstall(themeCheckDirectory())\n}\n\n/**\n * It returns the directory where the Ruby CLI is located.\n *\n * @param embedded - True when embebbed codebase of CLI should be used.\n * @returns The absolute path to the directory.\n */\nasync function shopifyCLIDirectory(embedded = false): Promise<string> {\n const embeddedDirectory = (await file.findPathUp('assets/cli-ruby', {\n type: 'directory',\n cwd: dirname(fileURLToPath(import.meta.url)),\n })) as string\n const bundledDirectory = joinPath(pathConstants.directories.cache.vendor.path(), 'ruby-cli', RubyCLIVersion)\n\n return embedded ? embeddedDirectory : getEnvironmentVariables().SHOPIFY_CLI_2_0_DIRECTORY ?? bundledDirectory\n}\n\n/**\n * It returns the path to the directory containing the theme-check CLI.\n *\n * @returns The absolute path to the theme-check directory.\n */\nfunction themeCheckDirectory(): string {\n return joinPath(pathConstants.directories.cache.vendor.path(), 'theme-check', ThemeCheckVersion)\n}\n\n/**\n * It returns the Ruby version present in the envirronment.\n */\nexport async function version(): Promise<string | undefined> {\n const parseOutput = (version: string) => version.match(/ruby (\\d+\\.\\d+\\.\\d+)/)?.[1]\n return captureOutput(rubyExecutable(), ['-v'])\n .then(parseOutput)\n .catch(() => undefined)\n}\n\n/**\n * It returns the Ruby binary path set through the environment variable SHOPIFY_RUBY_BINDIR.\n * This is useful when the CLI is managed by an installer like a Homebrew where we need to\n * point the CLI to the Ruby installation managed by Homebrew.\n *\n * @returns The value of the environment variable.\n */\nfunction getRubyBinDir(): string | undefined {\n return getEnvironmentVariables().SHOPIFY_RUBY_BINDIR\n}\n\n/**\n * It returns the path to the \"ruby\" executable.\n *\n * @returns The path to the executable.\n */\nfunction rubyExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'ruby') : 'ruby'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nfunction bundleExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'bundle') : 'bundle'\n}\n\n/**\n * It returns the path to the \"gem\"\" executable.\n *\n * @returns The path to the executable.\n */\nfunction gemExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'gem') : 'gem'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nasync function embeddedCLIExecutable(): Promise<string> {\n const cliDirectory = await shopifyCLIDirectory(true)\n return joinPath(cliDirectory, 'bin', 'shopify')\n}\n\n/**\n * Get environment variables required by the CLI2 in case the CLI3 is running in a Spin environment.\n *\n * @returns The environment variables to set.\n */\nasync function getSpinEnvironmentVariables() {\n if (!isSpinEnvironment()) return {}\n\n return {\n SPIN_FQDN: await spinFqdn(),\n SPIN: '1',\n }\n}\n\n/**\n * It sets bundler's path to a directory dedicated to shopify gems and runs bundle install.\n * This is desirable because these gems will be isolated from the system gems.\n *\n * @param directory - Directory where the Gemfile is located.\n */\nasync function shopifyBundleInstall(directory: string): Promise<void> {\n const bundle = bundleExecutable()\n const shopifyGemsPath = shopifyGems.cache\n\n await exec(bundle, ['config', 'set', '--local', 'path', shopifyGemsPath], {\n cwd: directory,\n })\n\n await exec(bundle, ['config', 'set', '--local', 'without', 'development:test'], {\n cwd: directory,\n })\n await exec(bundle, ['install'], {cwd: directory})\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/public/node/ruby.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbortSignal} from './abort.js'\nimport {platformAndArch} from './os.js'\nimport {captureOutput, exec, ExecOptions} from './system.js'\nimport * as file from './fs.js'\nimport {joinPath, dirname, cwd} from './path.js'\nimport {AbortError, AbortSilentError} from './error.js'\nimport {getEnvironmentVariables} from './environment.js'\nimport {isSpinEnvironment, spinFqdn} from './context/spin.js'\nimport {pathConstants} from '../../private/node/constants.js'\nimport {AdminSession} from '../../public/node/session.js'\nimport {outputContent, outputToken} from '../../public/node/output.js'\nimport {isTruthy} from '../../private/node/context/utilities.js'\nimport {coerceSemverVersion} from '../../private/node/semver.js'\nimport envPaths from 'env-paths'\nimport {Writable} from 'stream'\nimport {fileURLToPath} from 'url'\n\nexport const RubyCLIVersion = '2.35.0'\nconst ThemeCheckVersion = '1.14.0'\nconst MinBundlerVersion = '2.3.11'\nconst MinRubyVersion = '2.7.5'\nexport const MinWdmWindowsVersion = '0.1.0'\nconst shopifyGems = envPaths('shopify-gems')\n\ninterface ExecCLI2Options {\n // Contains token and store to pass to CLI 2.0, which will be set as environment variables\n adminSession?: AdminSession\n // Contains token for storefront access to pass to CLI 2.0 as environment variable\n storefrontToken?: string\n // Contains token for partners access to pass to CLI 2.0 as environment variable\n token?: string\n // Directory in which to execute the command. Otherwise the current directory will be used.\n directory?: string\n // A signal to stop the process execution.\n signal?: AbortSignal\n // Stream to pipe the command's stdout to.\n stdout?: Writable\n // Stream to pipe the command's stdout to.\n stderr?: Writable\n}\n/**\n * Execute CLI 2.0 commands.\n * Installs a version of RubyCLI as a vendor dependency in a hidden folder in the system.\n * User must have a valid ruby+bundler environment to run any command.\n *\n * @param args - List of argumets to execute. (ex: ['theme', 'pull']).\n * @param options - Options to customize the execution of cli2.\n */\nexport async function execCLI2(args: string[], options: ExecCLI2Options = {}): Promise<void> {\n const currentEnv = getEnvironmentVariables()\n const embedded = !isTruthy(currentEnv.SHOPIFY_CLI_BUNDLED_THEME_CLI) && !currentEnv.SHOPIFY_CLI_2_0_DIRECTORY\n\n await installCLIDependencies(options.stdout ?? process.stdout, embedded)\n const env: NodeJS.ProcessEnv = {\n ...currentEnv,\n SHOPIFY_CLI_STOREFRONT_RENDERER_AUTH_TOKEN: options.storefrontToken,\n SHOPIFY_CLI_ADMIN_AUTH_TOKEN: options.adminSession?.token,\n SHOPIFY_SHOP: options.adminSession?.storeFqdn,\n SHOPIFY_CLI_AUTH_TOKEN: options.token,\n SHOPIFY_CLI_RUN_AS_SUBPROCESS: 'true',\n SHOPIFY_CLI_RUBY_BIN: rubyExecutable(),\n // Bundler uses this Gemfile to understand which gems are available in the\n // environment. We use this to specify our own Gemfile for CLI2, which exists\n // outside the user's project directory.\n BUNDLE_GEMFILE: joinPath(await shopifyCLIDirectory(embedded), 'Gemfile'),\n ...(await getSpinEnvironmentVariables()),\n }\n\n try {\n const shopifyExecutable = embedded ? [rubyExecutable(), await embeddedCLIExecutable()] : ['shopify']\n await runBundler(['exec', ...shopifyExecutable, ...args], {\n ...(options.stdout === undefined && {stdio: 'inherit'}),\n cwd: options.directory ?? cwd(),\n env,\n ...(options.stdout !== undefined && {stdout: options.stdout, stderr: options.stderr}),\n signal: options.signal,\n })\n } catch (error) {\n // CLI2 will show it's own errors, we don't need to show an additional CLI3 error\n throw new AbortSilentError()\n }\n}\n\ninterface ExecThemeCheckCLIOptions {\n /** A list of directories in which theme-check should run. */\n directories: string[]\n /** Arguments to pass to the theme-check CLI. */\n args?: string[]\n /** Writable to send standard output content through. */\n stdout: Writable\n /** Writable to send standard error content through. */\n stderr: Writable\n}\n\n/**\n * A function that installs (if needed) and runs the theme-check CLI.\n *\n * @param options - Options to customize the execution of theme-check.\n * @returns A promise that resolves or rejects depending on the result of the underlying theme-check process.\n */\nexport async function execThemeCheckCLI(options: ExecThemeCheckCLIOptions): Promise<void[]> {\n await installThemeCheckCLIDependencies(options.stdout)\n\n const processes = options.directories.map(async (directory): Promise<void> => {\n // Check that there are files aside from the extension TOML config file,\n // otherwise theme-check will return a false failure.\n const files = await file.glob(joinPath(directory, '/**/*'))\n const fileCount = files.filter((file) => !file.match(/\\.toml$/)).length\n if (fileCount === 0) return\n\n const customStderr = new Writable({\n write(chunk, ...args) {\n // For some reason, theme-check reports this initial status line to stderr\n // See https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/diagnostics_engine.rb#L31\n // which leads to https://github.com/Shopify/theme-check/blob/1092737cfb58a73ca397ffb1371665dc55df2976/lib/theme_check/language_server/io_messenger.rb#L65\n if (chunk.toString('ascii').match(/^Checking/)) {\n options.stdout.write(chunk, ...args)\n } else {\n options.stderr.write(chunk, ...args)\n }\n },\n })\n await runBundler(['exec', 'theme-check'].concat([directory, ...(options.args || [])]), {\n stdout: options.stdout,\n stderr: customStderr,\n cwd: themeCheckDirectory(),\n })\n })\n return Promise.all(processes)\n}\n\n/**\n * Validate Ruby Enviroment\n * Install Theme Check CLI and its dependencies\n * Shows a loading message if it's the first time installing dependencies\n * or if we are installing a new version of Theme Check CLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n */\nasync function installThemeCheckCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(themeCheckDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n await validateRubyEnv()\n await createThemeCheckCLIWorkingDirectory()\n await createThemeCheckGemfile()\n await bundleInstallThemeCheck()\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * Validate Ruby Enviroment\n * Install RubyCLI and its dependencies\n * Shows a loading spinner if it's the first time installing dependencies\n * or if we are installing a new version of RubyCLI.\n *\n * @param stdout - The Writable stream on which to write the standard output.\n * @param embedded - True when embebbed codebase of CLI should be used.\n */\nasync function installCLIDependencies(stdout: Writable, embedded = false) {\n const localCLI = await shopifyCLIDirectory(embedded)\n const exists = await file.fileExists(localCLI)\n\n if (!exists) stdout.write('Installing theme dependencies...')\n const usingLocalCLI2 = embedded || isTruthy(getEnvironmentVariables().SHOPIFY_CLI_2_0_DIRECTORY)\n await validateRubyEnv()\n if (usingLocalCLI2) {\n await bundleInstallLocalShopifyCLI(localCLI)\n } else {\n await createShopifyCLIWorkingDirectory()\n await createShopifyCLIGemfile()\n await bundleInstallShopifyCLI()\n }\n\n if (!exists) stdout.write('Installed theme dependencies!')\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby and Bundler.\n */\nasync function validateRubyEnv() {\n await validateRuby()\n await validateBundler()\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Ruby.\n */\nasync function validateRuby() {\n let version\n try {\n const stdout = await captureOutput(rubyExecutable(), ['-v'])\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Ruby environment not found',\n `Make sure you have Ruby installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n\n const isValid = version?.compare(MinRubyVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Ruby version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `Make sure you have at least Ruby ${\n outputContent`${outputToken.yellow(MinRubyVersion)}`.value\n } installed on your system. ${\n outputContent`${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`\n .value\n }`,\n )\n }\n}\n\n/**\n * A function that validates if the environment in which the CLI is running is set up with Bundler.\n */\nasync function validateBundler() {\n let version\n try {\n const stdout = await captureOutput(bundleExecutable(), ['-v'], {env: {BUNDLE_USER_HOME: bundleUserHome()}})\n version = coerceSemverVersion(stdout)\n } catch {\n throw new AbortError(\n 'Bundler not found',\n `To install the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n\n const isValid = version?.compare(MinBundlerVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Bundler version ${outputContent`${outputToken.yellow(version.raw)}`.value} is not supported`,\n `To update to the latest version of Bundler, run ${\n outputContent`${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value\n }`,\n )\n }\n}\n\n/**\n * It creates the directory where the Ruby CLI will be downloaded along its dependencies.\n */\nasync function createShopifyCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(await shopifyCLIDirectory())\n}\n\n/**\n * It creates the directory where the theme-check CLI will be downloaded along its dependencies.\n */\nasync function createThemeCheckCLIWorkingDirectory(): Promise<void> {\n return file.mkdir(themeCheckDirectory())\n}\n\n/**\n * It creates the Gemfile to install The Ruby CLI and the dependencies.\n */\nasync function createShopifyCLIGemfile(): Promise<void> {\n const directory = await shopifyCLIDirectory()\n const gemfileContent = getBaseGemfileContent().concat(getWindowsDependencies())\n await addContentToGemfile(directory, gemfileContent)\n}\n\n/**\n * It creates the Gemfile to install theme-check and its dependencies.\n */\nasync function createThemeCheckGemfile(): Promise<void> {\n const gemPath = joinPath(themeCheckDirectory(), 'Gemfile')\n await file.writeFile(gemPath, `source 'https://rubygems.org'\\ngem 'theme-check', '${ThemeCheckVersion}'`)\n}\n\n/**\n * It runs bundle install for the dev-managed copy of the Ruby CLI.\n *\n * @param directory - Directory where CLI2 Gemfile is located.\n */\nasync function bundleInstallLocalShopifyCLI(directory: string): Promise<void> {\n await addContentToGemfile(directory, getWindowsDependencies())\n await shopifyBundleInstall(directory)\n}\n\n/**\n * Build the list of lines with the base content of the Gemfile.\n *\n * @returns List of lines with base content.\n */\nfunction getBaseGemfileContent() {\n return [\"source 'https://rubygems.org'\", `gem 'shopify-cli', '${RubyCLIVersion}'`]\n}\n\n/**\n * Build the list of Windows dependencies.\n *\n * @returns List of Windows dependencies.\n */\nfunction getWindowsDependencies() {\n if (platformAndArch().platform === 'windows') {\n // 'wdm' is required by 'listen', see https://github.com/Shopify/cli/issues/780\n // Because it's a Windows-only dependency, it's not included in the `.gemspec` or `Gemfile`.\n // Otherwise it would be installed in non-Windows environments too, where it is not needed.\n return [`gem 'wdm', '>= ${MinWdmWindowsVersion}'`]\n }\n return []\n}\n\n/**\n * Append contente to a Gemfile located in the given directory.\n *\n * @param gemfileDirectory - Directory where Gemfile is located.\n * @param content - Content to append to the Gemfile.\n */\nasync function addContentToGemfile(gemfileDirectory: string, content: string[]) {\n const gemfilePath = joinPath(gemfileDirectory, 'Gemfile')\n if (!(await file.fileExists(gemfilePath))) await file.touchFile(gemfilePath)\n const gemContent = await file.readFile(gemfilePath, {encoding: 'utf8'})\n const contentNoExisting = content.filter((line) => !gemContent.includes(line)).join('\\n')\n if (contentNoExisting) await file.appendFile(gemfilePath, contentNoExisting.concat('\\n'))\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of the Ruby CLI.\n */\nasync function bundleInstallShopifyCLI() {\n await shopifyBundleInstall(await shopifyCLIDirectory())\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of theme-check.\n */\nasync function bundleInstallThemeCheck() {\n await shopifyBundleInstall(themeCheckDirectory())\n}\n\n/**\n * It returns the directory where the Ruby CLI is located.\n *\n * @param embedded - True when embebbed codebase of CLI should be used.\n * @returns The absolute path to the directory.\n */\nasync function shopifyCLIDirectory(embedded = false): Promise<string> {\n const embeddedDirectory = (await file.findPathUp('assets/cli-ruby', {\n type: 'directory',\n cwd: dirname(fileURLToPath(import.meta.url)),\n })) as string\n const bundledDirectory = joinPath(pathConstants.directories.cache.vendor.path(), 'ruby-cli', RubyCLIVersion)\n\n return embedded ? embeddedDirectory : getEnvironmentVariables().SHOPIFY_CLI_2_0_DIRECTORY ?? bundledDirectory\n}\n\n/**\n * It returns the path to the directory containing the theme-check CLI.\n *\n * @returns The absolute path to the theme-check directory.\n */\nfunction themeCheckDirectory(): string {\n return joinPath(pathConstants.directories.cache.vendor.path(), 'theme-check', ThemeCheckVersion)\n}\n\n/**\n * It returns the Ruby version present in the envirronment.\n */\nexport async function version(): Promise<string | undefined> {\n const parseOutput = (version: string) => version.match(/ruby (\\d+\\.\\d+\\.\\d+)/)?.[1]\n return captureOutput(rubyExecutable(), ['-v'])\n .then(parseOutput)\n .catch(() => undefined)\n}\n\n/**\n * It returns the Ruby binary path set through the environment variable SHOPIFY_RUBY_BINDIR.\n * This is useful when the CLI is managed by an installer like a Homebrew where we need to\n * point the CLI to the Ruby installation managed by Homebrew.\n *\n * @returns The value of the environment variable.\n */\nfunction getRubyBinDir(): string | undefined {\n return getEnvironmentVariables().SHOPIFY_RUBY_BINDIR\n}\n\n/**\n * It returns the path to the \"ruby\" executable.\n *\n * @returns The path to the executable.\n */\nfunction rubyExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'ruby') : 'ruby'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nfunction bundleExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'bundle') : 'bundle'\n}\n\n/**\n * It returns the path to the \"gem\"\" executable.\n *\n * @returns The path to the executable.\n */\nfunction gemExecutable(): string {\n const rubyBinDir = getRubyBinDir()\n return rubyBinDir ? joinPath(rubyBinDir, 'gem') : 'gem'\n}\n\n/**\n * It returns the path to the \"bundle\" executable.\n *\n * @returns The path to the executable.\n */\nasync function embeddedCLIExecutable(): Promise<string> {\n const cliDirectory = await shopifyCLIDirectory(true)\n return joinPath(cliDirectory, 'bin', 'shopify')\n}\n\n/**\n * Get environment variables required by the CLI2 in case the CLI3 is running in a Spin environment.\n *\n * @returns The environment variables to set.\n */\nasync function getSpinEnvironmentVariables() {\n if (!isSpinEnvironment()) return {}\n\n return {\n SPIN_FQDN: await spinFqdn(),\n SPIN: '1',\n }\n}\n\n/**\n * It sets bundler's path to a directory dedicated to shopify gems and runs bundle install.\n * This is desirable because these gems will be isolated from the system gems.\n *\n * @param directory - Directory where the Gemfile is located.\n */\nasync function shopifyBundleInstall(directory: string): Promise<void> {\n await runBundler(['config', 'set', '--local', 'path', shopifyGems.cache], {\n cwd: directory,\n })\n await runBundler(['config', 'set', '--local', 'without', 'development:test'], {\n cwd: directory,\n })\n await runBundler(['install'], {cwd: directory})\n}\n\n/**\n * It returns a custom BUNDLE_USER_HOME. This is required in Windows because\n * bundler will instead crash if the username contains UTF-8 characters.\n *\n * @returns The value of the environment variable.\n */\nexport function bundleUserHome(): string | undefined {\n if (platformAndArch().platform === 'windows' && process.env.PUBLIC) {\n return joinPath(process.env.PUBLIC, 'AppData', 'Local', 'shopify-bundler-nodejs', 'Cache')\n } else {\n return undefined\n }\n}\n\n/**\n * It runs bundler commands by setting the correct BUNDLE_USER_HOME env var.\n *\n * @param args - Arguments to pass to the bundle command.\n * @param options - Options to pass to the exec function.\n */\nasync function runBundler(args: string[], options: ExecOptions) {\n return exec(bundleExecutable(), args, {...options, env: {...options.env, BUNDLE_USER_HOME: bundleUserHome()}})\n}\n"]}
|
|
@@ -12,10 +12,10 @@ export interface AdminSession {
|
|
|
12
12
|
* If SHOPIFY_CLI_PARTNERS_TOKEN exists, scopes will be ignored.
|
|
13
13
|
*
|
|
14
14
|
* @param scopes - Optional array of extra scopes to authenticate with.
|
|
15
|
-
* @param
|
|
15
|
+
* @param _env - Optional environment variables to use.
|
|
16
16
|
* @returns The access token for the Partners API.
|
|
17
17
|
*/
|
|
18
|
-
export declare function ensureAuthenticatedPartners(scopes?: string[],
|
|
18
|
+
export declare function ensureAuthenticatedPartners(scopes?: string[], _env?: NodeJS.ProcessEnv): Promise<string>;
|
|
19
19
|
/**
|
|
20
20
|
* Ensure that we have a valid session to access the Storefront API.
|
|
21
21
|
*
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { normalizeStoreFqdn } from './context/fqdn.js';
|
|
2
2
|
import { BugError } from './error.js';
|
|
3
|
+
import { getPartnersToken } from './environment.js';
|
|
3
4
|
import * as secureStore from '../../private/node/session/store.js';
|
|
4
5
|
import { exchangeCustomPartnerToken } from '../../private/node/session/exchange.js';
|
|
5
6
|
import { outputContent, outputToken, outputDebug } from '../../public/node/output.js';
|
|
6
7
|
import { ensureAuthenticated } from '../../private/node/session.js';
|
|
7
|
-
import { environmentVariables } from '../../private/node/constants.js';
|
|
8
8
|
/**
|
|
9
9
|
* Ensure that we have a valid session to access the Partners API.
|
|
10
10
|
* If SHOPIFY_CLI_PARTNERS_TOKEN exists, that token will be used to obtain a valid Partners Token
|
|
11
11
|
* If SHOPIFY_CLI_PARTNERS_TOKEN exists, scopes will be ignored.
|
|
12
12
|
*
|
|
13
13
|
* @param scopes - Optional array of extra scopes to authenticate with.
|
|
14
|
-
* @param
|
|
14
|
+
* @param _env - Optional environment variables to use.
|
|
15
15
|
* @returns The access token for the Partners API.
|
|
16
16
|
*/
|
|
17
|
-
export async function ensureAuthenticatedPartners(scopes = [],
|
|
17
|
+
export async function ensureAuthenticatedPartners(scopes = [], _env = process.env) {
|
|
18
18
|
outputDebug(outputContent `Ensuring that the user is authenticated with the Partners API with the following scopes:
|
|
19
19
|
${outputToken.json(scopes)}
|
|
20
20
|
`);
|
|
21
|
-
const envToken =
|
|
21
|
+
const envToken = getPartnersToken();
|
|
22
22
|
if (envToken) {
|
|
23
23
|
return (await exchangeCustomPartnerToken(envToken)).accessToken;
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/public/node/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,WAAW,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAC,0BAA0B,EAAC,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAC,aAAa,EAAE,WAAW,EAAE,WAAW,EAAC,MAAM,6BAA6B,CAAA;AACnF,OAAO,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/public/node/session.ts"],"names":[],"mappings":"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","sourcesContent":["import {normalizeStoreFqdn} from './context/fqdn.js'\nimport {BugError} from './error.js'\nimport {getPartnersToken} from './environment.js'\nimport * as secureStore from '../../private/node/session/store.js'\nimport {exchangeCustomPartnerToken} from '../../private/node/session/exchange.js'\nimport {outputContent, outputToken, outputDebug} from '../../public/node/output.js'\nimport {ensureAuthenticated} from '../../private/node/session.js'\n\n/**\n * Session Object to access the Admin API, includes the token and the store FQDN.\n */\nexport interface AdminSession {\n token: string\n storeFqdn: string\n}\n\n/**\n * Ensure that we have a valid session to access the Partners API.\n * If SHOPIFY_CLI_PARTNERS_TOKEN exists, that token will be used to obtain a valid Partners Token\n * If SHOPIFY_CLI_PARTNERS_TOKEN exists, scopes will be ignored.\n *\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param _env - Optional environment variables to use.\n * @returns The access token for the Partners API.\n */\nexport async function ensureAuthenticatedPartners(scopes: string[] = [], _env = process.env): Promise<string> {\n outputDebug(outputContent`Ensuring that the user is authenticated with the Partners API with the following scopes:\n${outputToken.json(scopes)}\n`)\n const envToken = getPartnersToken()\n if (envToken) {\n return (await exchangeCustomPartnerToken(envToken)).accessToken\n }\n const tokens = await ensureAuthenticated({partnersApi: {scopes}})\n if (!tokens.partners) {\n throw new BugError('No partners token found after ensuring authenticated')\n }\n return tokens.partners\n}\n\n/**\n * Ensure that we have a valid session to access the Storefront API.\n *\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param password - Optional password to use.\n * @returns The access token for the Storefront API.\n */\nexport async function ensureAuthenticatedStorefront(\n scopes: string[] = [],\n password: string | undefined = undefined,\n): Promise<string> {\n if (password) return password\n\n outputDebug(outputContent`Ensuring that the user is authenticated with the Storefront API with the following scopes:\n${outputToken.json(scopes)}\n`)\n const tokens = await ensureAuthenticated({storefrontRendererApi: {scopes}})\n if (!tokens.storefront) {\n throw new BugError('No storefront token found after ensuring authenticated')\n }\n return tokens.storefront\n}\n\n/**\n * Ensure that we have a valid Admin session for the given store.\n *\n * @param store - Store fqdn to request auth for.\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param forceRefresh - Optional flag to force a refresh of the token.\n * @returns The access token for the Admin API.\n */\nexport async function ensureAuthenticatedAdmin(\n store: string,\n scopes: string[] = [],\n forceRefresh = false,\n): Promise<AdminSession> {\n outputDebug(outputContent`Ensuring that the user is authenticated with the Admin API with the following scopes for the store ${outputToken.raw(\n store,\n )}:\n${outputToken.json(scopes)}\n`)\n const tokens = await ensureAuthenticated({adminApi: {scopes, storeFqdn: store}}, process.env, forceRefresh)\n if (!tokens.admin) {\n throw new BugError('No admin token found after ensuring authenticated')\n }\n return tokens.admin\n}\n\n/**\n * Ensure that we have a valid session to access the Theme API.\n * If a password is provided, that token will be used against Theme Access API.\n * Otherwise, it will ensure that the user is authenticated with the Admin API.\n *\n * @param store - Store fqdn to request auth for.\n * @param password - Password generated from Theme Access app.\n * @param scopes - Optional array of extra scopes to authenticate with.\n * @param forceRefresh - Optional flag to force a refresh of the token.\n * @returns The access token and store.\n */\nexport async function ensureAuthenticatedThemes(\n store: string,\n password: string | undefined,\n scopes: string[] = [],\n forceRefresh = false,\n): Promise<AdminSession> {\n outputDebug(outputContent`Ensuring that the user is authenticated with the Theme API with the following scopes:\n${outputToken.json(scopes)}\n`)\n if (password) return {token: password, storeFqdn: await normalizeStoreFqdn(store)}\n return ensureAuthenticatedAdmin(store, scopes, forceRefresh)\n}\n\n/**\n * Logout from Shopify.\n *\n * @returns A promise that resolves when the logout is complete.\n */\nexport function logout(): Promise<void> {\n return secureStore.remove()\n}\n"]}
|
package/dist/public/node/ui.d.ts
CHANGED
|
@@ -204,6 +204,7 @@ export interface RenderConfirmationPromptOptions extends Pick<SelectPromptProps<
|
|
|
204
204
|
confirmationMessage?: string;
|
|
205
205
|
cancellationMessage?: string;
|
|
206
206
|
renderOptions?: RenderOptions;
|
|
207
|
+
defaultValue?: boolean;
|
|
207
208
|
}
|
|
208
209
|
/**
|
|
209
210
|
* Renders a confirmation prompt to the console.
|
|
@@ -219,7 +220,7 @@ export interface RenderConfirmationPromptOptions extends Pick<SelectPromptProps<
|
|
|
219
220
|
* Press ↑↓ arrows to select, enter or a shortcut to confirm
|
|
220
221
|
*
|
|
221
222
|
*/
|
|
222
|
-
export declare function renderConfirmationPrompt({ message, infoTable, confirmationMessage, cancellationMessage, renderOptions, }: RenderConfirmationPromptOptions): Promise<boolean>;
|
|
223
|
+
export declare function renderConfirmationPrompt({ message, infoTable, confirmationMessage, cancellationMessage, renderOptions, defaultValue, }: RenderConfirmationPromptOptions): Promise<boolean>;
|
|
223
224
|
export interface RenderAutocompleteOptions<T> extends PartialBy<Omit<AutocompletePromptProps<T>, 'onSubmit'>, 'search'> {
|
|
224
225
|
renderOptions?: RenderOptions;
|
|
225
226
|
}
|
package/dist/public/node/ui.js
CHANGED
|
@@ -230,7 +230,7 @@ export function renderSelectPrompt({ renderOptions, ...props }) {
|
|
|
230
230
|
* Press ↑↓ arrows to select, enter or a shortcut to confirm
|
|
231
231
|
*
|
|
232
232
|
*/
|
|
233
|
-
export function renderConfirmationPrompt({ message, infoTable, confirmationMessage = 'Yes, confirm', cancellationMessage = 'No, cancel', renderOptions, }) {
|
|
233
|
+
export function renderConfirmationPrompt({ message, infoTable, confirmationMessage = 'Yes, confirm', cancellationMessage = 'No, cancel', renderOptions, defaultValue = true, }) {
|
|
234
234
|
const choices = [
|
|
235
235
|
{
|
|
236
236
|
label: confirmationMessage,
|
|
@@ -249,6 +249,7 @@ export function renderConfirmationPrompt({ message, infoTable, confirmationMessa
|
|
|
249
249
|
infoTable,
|
|
250
250
|
submitWithShortcuts: true,
|
|
251
251
|
renderOptions,
|
|
252
|
+
defaultValue,
|
|
252
253
|
});
|
|
253
254
|
}
|
|
254
255
|
/**
|