shopify-cli 2.6.6 → 2.7.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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer.json +5 -0
  3. data/.github/DESIGN.md +1 -1
  4. data/.github/ISSUE_TEMPLATE.md +7 -0
  5. data/.vscode/extensions.json +5 -0
  6. data/.vscode/settings.json +9 -0
  7. data/CHANGELOG.md +12 -3
  8. data/CONTRIBUTING.md +1 -29
  9. data/{Dockerfile → Codespace.dockerfile} +0 -0
  10. data/Gemfile.lock +4 -4
  11. data/README.md +20 -99
  12. data/Tests.dockerfile +35 -0
  13. data/assets/logo.png +0 -0
  14. data/dev.yml +0 -3
  15. data/docs/README.md +13 -0
  16. data/docs/contributors/testing.md +27 -0
  17. data/docs/users/installation.md +46 -0
  18. data/{THEMEKIT_MIGRATION.md → docs/users/migrate-from-themekit.md} +1 -1
  19. data/lib/project_types/extension/cli.rb +6 -3
  20. data/lib/project_types/extension/commands/create.rb +5 -6
  21. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  22. data/lib/project_types/extension/features/argo_serve.rb +9 -23
  23. data/lib/project_types/extension/forms/questions/ask_template.rb +1 -5
  24. data/lib/project_types/extension/models/development_server_requirements.rb +2 -3
  25. data/lib/project_types/extension/models/server_config/app.rb +13 -0
  26. data/lib/project_types/extension/models/server_config/development.rb +5 -4
  27. data/lib/project_types/extension/models/server_config/development_renderer.rb +1 -1
  28. data/lib/project_types/extension/models/server_config/development_resource.rb +13 -0
  29. data/lib/project_types/extension/models/server_config/extension.rb +3 -1
  30. data/lib/project_types/extension/models/server_config/root.rb +4 -1
  31. data/lib/project_types/extension/tasks/convert_server_config.rb +65 -0
  32. data/lib/project_types/extension/tasks/ensure_resource_url.rb +39 -0
  33. data/lib/project_types/extension/tasks/merge_server_config.rb +32 -0
  34. data/lib/project_types/extension/tasks/run_extension_command.rb +10 -9
  35. data/lib/project_types/node/cli.rb +0 -16
  36. data/lib/project_types/node/forms/create.rb +5 -5
  37. data/lib/project_types/node/messages/messages.rb +2 -144
  38. data/lib/project_types/php/cli.rb +0 -11
  39. data/lib/project_types/php/forms/create.rb +5 -6
  40. data/lib/project_types/php/messages/messages.rb +2 -161
  41. data/lib/project_types/rails/cli.rb +0 -16
  42. data/lib/project_types/rails/commands/create.rb +1 -1
  43. data/lib/project_types/rails/forms/create.rb +5 -6
  44. data/lib/project_types/rails/messages/messages.rb +6 -151
  45. data/lib/project_types/script/cli.rb +1 -1
  46. data/lib/project_types/script/commands/create.rb +1 -1
  47. data/lib/project_types/script/commands/push.rb +1 -1
  48. data/lib/project_types/theme/cli.rb +1 -1
  49. data/lib/project_types/theme/commands/check.rb +1 -1
  50. data/lib/project_types/theme/commands/delete.rb +1 -1
  51. data/lib/project_types/theme/commands/init.rb +1 -1
  52. data/lib/project_types/theme/commands/language_server.rb +1 -1
  53. data/lib/project_types/theme/commands/package.rb +1 -1
  54. data/lib/project_types/theme/commands/publish.rb +1 -1
  55. data/lib/project_types/theme/commands/pull.rb +1 -1
  56. data/lib/project_types/theme/commands/push.rb +1 -1
  57. data/lib/project_types/theme/commands/serve.rb +9 -3
  58. data/lib/project_types/theme/messages/messages.rb +5 -1
  59. data/lib/shopify_cli/admin_api/populate_resource_command.rb +1 -1
  60. data/lib/shopify_cli/api.rb +7 -2
  61. data/lib/shopify_cli/app_type_detector.rb +24 -20
  62. data/lib/shopify_cli/command/app_sub_command.rb +10 -0
  63. data/lib/shopify_cli/command/project_command.rb +18 -0
  64. data/lib/shopify_cli/command/sub_command.rb +19 -0
  65. data/lib/shopify_cli/command.rb +7 -2
  66. data/lib/shopify_cli/commands/app/connect.rb +22 -0
  67. data/lib/shopify_cli/commands/app/create/node.rb +38 -0
  68. data/lib/shopify_cli/commands/app/create/php.rb +36 -0
  69. data/lib/shopify_cli/commands/app/create/rails.rb +40 -0
  70. data/lib/shopify_cli/commands/app/create.rb +28 -0
  71. data/lib/shopify_cli/commands/app/deploy.rb +49 -0
  72. data/lib/shopify_cli/commands/app/open.rb +19 -0
  73. data/lib/shopify_cli/commands/app/serve.rb +49 -0
  74. data/lib/shopify_cli/commands/app/tunnel.rb +43 -0
  75. data/lib/shopify_cli/commands/app.rb +29 -0
  76. data/lib/shopify_cli/commands/config.rb +2 -2
  77. data/lib/shopify_cli/commands.rb +1 -0
  78. data/lib/shopify_cli/constants.rb +4 -0
  79. data/lib/shopify_cli/exception_reporter.rb +3 -4
  80. data/lib/shopify_cli/git.rb +12 -1
  81. data/lib/shopify_cli/github/issue_url_generator.rb +19 -0
  82. data/lib/shopify_cli/github.rb +5 -0
  83. data/lib/shopify_cli/messages/messages.rb +252 -8
  84. data/lib/shopify_cli/project.rb +5 -1
  85. data/lib/shopify_cli/project_commands.rb +1 -1
  86. data/lib/shopify_cli/services/app/connect_service.rb +25 -0
  87. data/lib/shopify_cli/services/app/create/node_service.rb +153 -0
  88. data/lib/shopify_cli/services/app/create/php_service.rb +152 -0
  89. data/lib/shopify_cli/services/app/create/rails_service.rb +213 -0
  90. data/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +101 -0
  91. data/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +135 -0
  92. data/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +120 -0
  93. data/lib/shopify_cli/services/app/open_service.rb +19 -0
  94. data/lib/shopify_cli/services/app/serve/node_service.rb +42 -0
  95. data/lib/shopify_cli/services/app/serve/php_service.rb +46 -0
  96. data/lib/shopify_cli/services/app/serve/rails_service.rb +48 -0
  97. data/lib/shopify_cli/services/app/tunnel/auth_service.rb +21 -0
  98. data/lib/shopify_cli/services/app/tunnel/start_service.rb +20 -0
  99. data/lib/shopify_cli/services/app/tunnel/stop_service.rb +20 -0
  100. data/lib/shopify_cli/services.rb +31 -0
  101. data/lib/shopify_cli/theme/dev_server/local_assets.rb +1 -1
  102. data/lib/shopify_cli/theme/dev_server.rb +8 -2
  103. data/lib/shopify_cli/version.rb +1 -1
  104. data/lib/shopify_cli.rb +1 -2
  105. data/shopify-cli.gemspec +1 -1
  106. data/shopify-dev +18 -0
  107. data/utilities/constants.rb +7 -0
  108. data/utilities/docker/container.rb +10 -3
  109. data/utilities/docker.rb +2 -2
  110. data/utilities/utilities.rb +1 -0
  111. metadata +49 -48
  112. data/docs/_config.yml +0 -2
  113. data/docs/app/node/commands/index.md +0 -4
  114. data/docs/app/node/index.md +0 -4
  115. data/docs/app/rails/commands/index.md +0 -4
  116. data/docs/app/rails/index.md +0 -4
  117. data/docs/core/index.md +0 -4
  118. data/docs/getting-started/index.md +0 -4
  119. data/docs/getting-started/install/index.md +0 -4
  120. data/docs/getting-started/migrate/index.md +0 -4
  121. data/docs/getting-started/uninstall/index.md +0 -4
  122. data/docs/getting-started/upgrade/index.md +0 -4
  123. data/docs/help/start-app/index.md +0 -4
  124. data/docs/index.md +0 -4
  125. data/install.sh +0 -7
  126. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +0 -30
  127. data/lib/project_types/extension/tasks/load_server_config.rb +0 -28
  128. data/lib/project_types/node/commands/connect.rb +0 -21
  129. data/lib/project_types/node/commands/create.rb +0 -125
  130. data/lib/project_types/node/commands/deploy/heroku.rb +0 -96
  131. data/lib/project_types/node/commands/deploy.rb +0 -32
  132. data/lib/project_types/node/commands/generate.rb +0 -22
  133. data/lib/project_types/node/commands/open.rb +0 -18
  134. data/lib/project_types/node/commands/serve.rb +0 -45
  135. data/lib/project_types/node/commands/tunnel.rb +0 -41
  136. data/lib/project_types/php/commands/connect.rb +0 -19
  137. data/lib/project_types/php/commands/create.rb +0 -143
  138. data/lib/project_types/php/commands/deploy/heroku.rb +0 -129
  139. data/lib/project_types/php/commands/deploy.rb +0 -32
  140. data/lib/project_types/php/commands/open.rb +0 -16
  141. data/lib/project_types/php/commands/serve.rb +0 -48
  142. data/lib/project_types/php/commands/tunnel.rb +0 -37
  143. data/lib/project_types/rails/commands/connect.rb +0 -21
  144. data/lib/project_types/rails/commands/deploy/heroku.rb +0 -115
  145. data/lib/project_types/rails/commands/deploy.rb +0 -32
  146. data/lib/project_types/rails/commands/generate/webhook.rb +0 -42
  147. data/lib/project_types/rails/commands/generate.rb +0 -60
  148. data/lib/project_types/rails/commands/open.rb +0 -18
  149. data/lib/project_types/rails/commands/serve.rb +0 -51
  150. data/lib/project_types/rails/commands/tunnel.rb +0 -41
  151. data/lib/shopify_cli/sub_command.rb +0 -17
  152. data/shopify.fish +0 -12
  153. data/shopify.sh +0 -11
@@ -8,28 +8,272 @@ module ShopifyCLI
8
8
  info: {
9
9
  created: "{{v}} {{green:%s}} was created in the organization's Partner Dashboard {{underline:%s}}",
10
10
  serve: "{{*}} Change directories to your new project folder {{green:%s}} and run "\
11
- "{{command:%s %s serve}} to start a local server",
11
+ "{{command:%s app serve}} to start a local server",
12
12
  install: "{{*}} Then, visit {{underline:%s/test}} to install {{green:%s}} on your Dev Store",
13
13
  },
14
14
  },
15
15
  },
16
16
  core: {
17
17
  app: {
18
+ help: <<~HELP,
19
+ Suite of commands for developing apps. See {{command:%1$s app <command> --help}} for usage of each command.
20
+ Usage: {{command:%1$s app [ %2$s ]}}
21
+ HELP
22
+ error: {
23
+ type_not_found: <<~MESSAGE,
24
+ Couldn't detect the app type in directory %s. We currently support Rails, PHP, and NodeJS apps.
25
+ MESSAGE
26
+ missing_shopify_cli_yml: <<~MESSAGE,
27
+ Couldn't find a #{Constants::Files::SHOPIFY_CLI_YML} file in the directory %s to determine the app type.
28
+ MESSAGE
29
+ invalid_project_type: <<~MESSAGE,
30
+ The project type %s doesn't represent an app.
31
+ MESSAGE
32
+ },
33
+ create: {
34
+ type_required_error: "",
35
+ invalid_type: "The type %s is not supported. The only supported types are"\
36
+ " {{command:[ rails | node | php ]}}",
37
+ help: <<~HELP,
38
+ {{command:%s app create}}: Creates a ruby on rails app.
39
+ Usage: {{command:%s app create [ rails | node | php ]}}
40
+ HELP
41
+ rails: {
42
+ help: <<~HELP,
43
+ {{command:%s app create rails}}: Creates a ruby on rails app.
44
+ Usage: {{command:%s app create rails}}
45
+ Options:
46
+ {{command:--name=NAME}} App name. Any string.
47
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
48
+ {{command:--store-domain=MYSHOPIFYDOMAIN }} Development store URL. Must be an existing development store.
49
+ {{command:--db=DB}} Database type. Must be one of: mysql, postgresql, sqlite3, oracle, frontbase, ibm_db, sqlserver, jdbcmysql, jdbcsqlite3, jdbcpostgresql, jdbc.
50
+ {{command:--rails-opts=RAILSOPTS}} Additional options. Must be string containing one or more valid Rails options, separated by spaces.
51
+ HELP
52
+
53
+ error: {
54
+ invalid_ruby_version: "This project requires a Ruby version ~> 2.5 or Ruby 3.0.",
55
+ dir_exists: "Project directory %s already exists. Please use a different name.",
56
+ install_failure: "Error installing %s gem",
57
+ node_required: "node is required to create a rails project. Download at https://nodejs.org/en/download.",
58
+ node_version_failure: "Failed to get the current node version. Please make sure it is installed as " \
59
+ "per the instructions at https://nodejs.org/en.",
60
+ yarn_required: "yarn is required to create a rails project. Download at " \
61
+ "https://classic.yarnpkg.com/en/docs/install.",
62
+ yarn_version_failure: "Failed to get the current yarn version. Please make sure it is " \
63
+ "installed as per the instructions at https://classic.yarnpkg.com/en/docs/install.",
64
+ },
65
+
66
+ info: {
67
+ open_new_shell: "{{*}} {{yellow:After installing %s, please open a new Command Prompt or PowerShell " \
68
+ "window to continue.}}",
69
+ },
70
+ installing_bundler: "Installing bundler…",
71
+ generating_app: "Generating new rails app project in %s…",
72
+ adding_shopify_gem: "{{v}} Adding shopify_app gem…",
73
+ node_version: "node %s",
74
+ yarn_version: "yarn %s",
75
+ running_bundle_install: "Running bundle install…",
76
+ running_generator: "Running shopify_app generator…",
77
+ running_migrations: "Running migrations…",
78
+ running_webpacker_install: "Running webpacker:install…",
79
+ },
80
+ node: {
81
+ help: <<~HELP,
82
+ {{command:%s app create node}}: Creates an embedded nodejs app.
83
+ Usage: {{command:%s app create node}}
84
+ Options:
85
+ {{command:--name=NAME}} App name. Any string.
86
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
87
+ {{command:--store-domain=MYSHOPIFYDOMAIN }} Development store URL. Must be an existing development store.
88
+ HELP
89
+ error: {
90
+ node_required: "node is required to create an app project. Download at https://nodejs.org/en/download.",
91
+ node_version_failure: "Failed to get the current node version. Please make sure it is installed as " \
92
+ "per the instructions at https://nodejs.org/en.",
93
+ npm_required: "npm is required to create an app project. Download at https://www.npmjs.com/get-npm.",
94
+ npm_version_failure: "Failed to get the current npm version. Please make sure it is installed as per " \
95
+ "the instructions at https://www.npmjs.com/get-npm.",
96
+ },
97
+ node_version: "node %s",
98
+ npm_version: "npm %s",
99
+ },
100
+ php: {
101
+ help: <<~HELP,
102
+ {{command:%s app create php}}: Creates an embedded PHP app.
103
+ Usage: {{command:%s app create php}}
104
+ Options:
105
+ {{command:--name=NAME}} App name. Any string.
106
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
107
+ {{command:--store-domain=MYSHOPIFYDOMAIN}} Development store URL. Must be an existing development store.
108
+ {{command:--type=APPTYPE}} Whether this app is public or custom.
109
+ {{command:--verbose}} Output verbose information when installing dependencies.
110
+ HELP
111
+
112
+ error: {
113
+ php_required: <<~VERSION,
114
+ PHP is required to create an app project. For installation instructions, visit:
115
+ {{underline:https://www.php.net/manual/en/install.php}}
116
+ VERSION
117
+ php_version_failure: <<~VERSION,
118
+ Failed to get the current PHP version. Please make sure it is installed as per the instructions at:
119
+ {{underline:https://www.php.net/manual/en/install.php.}}
120
+ VERSION
121
+ php_version_too_low: "Your PHP version is too low. Please use version %s or higher.",
122
+ composer_required: <<~COMPOSER,
123
+ Composer is required to create an app project. Download at:
124
+ {{underline:https://getcomposer.org/download/}}
125
+ COMPOSER
126
+ npm_required: "npm is required to create an app project. Download at https://www.npmjs.com/get-npm.",
127
+ npm_version_failure: "Failed to get the current npm version. Please make sure it is installed as per " \
128
+ "the instructions at https://www.npmjs.com/get-npm.",
129
+ app_setup: "Failed to set up the app",
130
+ },
131
+
132
+ php_version: "PHP %s",
133
+ npm_version: "npm %s",
134
+ app_setting_up: "Setting up app…",
135
+ app_set_up: "App is now set up",
136
+ },
137
+ },
138
+ deploy: {
139
+ help: <<~HELP,
140
+ Deploy the current app to a hosting service. Heroku ({{underline:https://www.heroku.com}}) is currently the only option, but more will be added in the future.
141
+ Usage: {{command:%s app deploy [ heroku ]}}
142
+ HELP
143
+ extended_help: <<~HELP,
144
+ {{bold:Subcommands:}}
145
+ {{cyan:heroku}}: Deploys the current app to Heroku.
146
+ Usage: {{command:%s app deploy heroku}}
147
+ HELP
148
+ error: {
149
+ missing_platform: <<~MESSAGE,
150
+ The platform argument is missing.
151
+ Usage: {{command:%s app deploy [ heroku ]}}
152
+ MESSAGE
153
+ invalid_platform: <<~MESSAGE,
154
+ The platform argument passed {{command:%s}} is not supported.
155
+ Usage: {{command:%s app deploy [ heroku ]}}
156
+ MESSAGE
157
+ },
158
+ heroku: {
159
+ downloading: "Downloading Heroku CLI…",
160
+ downloaded: "Downloaded Heroku CLI",
161
+ installing: "Installing Heroku CLI…",
162
+ installing_windows: "Running Heroku CLI install wizard…",
163
+ installed: "Installed Heroku CLI",
164
+ authenticated_with_account: "{{v}} Authenticated with Heroku as {{green:%s}}",
165
+ authenticating: "Authenticating with Heroku…",
166
+ authenticated: "{{v}} Authenticated with Heroku",
167
+ deploying: "Deploying to Heroku…",
168
+ deployed: "{{v}} Deployed to Heroku",
169
+ php: {
170
+ post_deploy: <<~DEPLOYED,
171
+ {{v}} Deployed to Heroku, you can access your app at {{green:%s}}
172
+
173
+ If you're deploying this app for the first time, make sure to set up your database and your app's environment at {{bold:App dashboard -> Settings -> Config Vars}}.
174
+
175
+ When setting your config vars, don't forget to set up your database and the appropriate Laravel values for it, particularly {{bold:DB_CONNECTION and DB_DATABASE}}.
176
+ DEPLOYED
177
+ error: {
178
+ generate_app_key: "Failed to generate Laravel APP_KEY",
179
+ },
180
+ },
181
+ rails: {
182
+ db_check: {
183
+ validating: "Validating application…",
184
+ checking: "Checking database type…",
185
+ validated: "Database type \"%s\" validated for platform \"Heroku\"",
186
+ problem: "A problem was encountered while checking your database type.",
187
+ sqlite: <<~SQLITE,
188
+ Heroku does not support deployment using the SQLite database system.
189
+ Change the database type using {{command:rails db:system:change --to=[new_db_type]}}. For more info:
190
+ {{underline:https://gorails.com/episodes/rails-6-db-system-change-command}}
191
+ SQLITE
192
+ },
193
+ },
194
+ git: {
195
+ checking: "Checking git repo…",
196
+ initialized: "Git repo initialized",
197
+ what_branch: "What branch would you like to deploy?",
198
+ branch_selected: "{{v}} Git branch {{green:%s}} selected for deploy",
199
+ },
200
+ app: {
201
+ no_apps_found: "No existing Heroku app found. What would you like to do?",
202
+ name: "What is your Heroku app’s name?",
203
+ select: "Specify an existing Heroku app",
204
+ selecting: "Selecting Heroku app %s…",
205
+ selected: "{{v}} Heroku app {{green:%s}} selected",
206
+ create: "Create a new Heroku app",
207
+ creating: "Creating new Heroku app…",
208
+ created: "{{v}} New Heroku app created",
209
+ setting_configs: "Setting Shopify app configs…",
210
+ configs_set: "{{v}} Shopify app configs set",
211
+ },
212
+ },
213
+ },
214
+ connect: {
215
+ help: <<~HELP,
216
+ {{command:%s app connect}}: Connects an existing app to Shopify CLI. Creates a config file.
217
+ Usage: {{command:%s app connect}}
218
+ HELP
219
+ connected: "Project now connected to {{green:%s}}",
220
+ production_warning: <<~MESSAGE,
221
+ {{yellow:! Warning: if you have connected to an {{bold:app in production}}, running {{command:serve}} may update the app URL and cause an outage.
222
+ MESSAGE
223
+ },
224
+ tunnel: {
225
+ help: <<~HELP,
226
+ Start or stop an http tunnel to your local development app using ngrok.
227
+ Usage: {{command:%s app tunnel [ auth | start | stop ]}}
228
+ HELP
229
+ extended_help: <<~HELP,
230
+ {{bold:Subcommands:}}
231
+
232
+ {{cyan:auth}}: Writes an ngrok auth token to ~/.ngrok2/ngrok.yml to connect with an ngrok account. Visit https://dashboard.ngrok.com/signup to sign up.
233
+ Usage: {{command:%1$s app tunnel auth <token>}}
234
+
235
+ {{cyan:start}}: Starts an ngrok tunnel, will print the URL for an existing tunnel if already running.
236
+ Usage: {{command:%1$s app tunnel start}}
237
+
238
+ {{cyan:stop}}: Stops the ngrok tunnel.
239
+ Usage: {{command:%1$s app tunnel stop}}
240
+
241
+ HELP
242
+ error: {
243
+ token_argument_missing: "{{x}} {{red:auth requires a token argument}}\n\n",
244
+ },
245
+ },
18
246
  serve: {
247
+ help: <<~HELP,
248
+ Start a local development server for your project, as well as a public ngrok tunnel to your localhost.
249
+ Usage: {{command:%s app serve}}
250
+ HELP
251
+ extended_help: <<~HELP,
252
+ {{bold:Options:}}
253
+ {{cyan:--host=HOST}}: Bypass running tunnel and use custom host. HOST must be HTTPS url.
254
+ {{cyan:--port=PORT}}: Use custom port.
255
+ HELP
256
+ open_info: <<~MESSAGE,
257
+ {{*}} To install and start using your app, open this URL in your browser:
258
+ {{green:%s}}
259
+ MESSAGE
260
+ running_server: "Running server…",
19
261
  error: {
20
- invalid_port: "%s is not a valid port.",
21
262
  host_must_be_https: "HOST must be a HTTPS url.",
263
+ invalid_port: "%s is not a valid port.",
22
264
  },
23
265
  },
24
- help: <<~HELP,
25
- Create and manage embedded apps
26
- Usage: {{command:%s app [ rails | node | php ] }}
27
- HELP
266
+ open: {
267
+ help: <<~HELP,
268
+ Open your local development app in the default browser.
269
+ Usage: {{command:%s app open}}
270
+ HELP
271
+ },
28
272
  },
29
273
  error_reporting: {
30
274
  unhandled_error: {
31
275
  message: "{{x}} {{red:An unexpected error occured.}}",
32
- issue_message: "{{red:\tTo \e]8;;#{ShopifyCLI::Constants::Links::NEW_ISSUE}\e\\submit an issue\e]8;;\e\\"\
276
+ issue_message: "{{red:\tTo \e]8;;%s\e\\submit an issue\e]8;;\e\\"\
33
277
  " include the stack trace.}}",
34
278
  stacktrace_message: "{{red:\tTo print the stack trace, add the environment variable %s.}}",
35
279
  },
@@ -328,7 +572,7 @@ module ShopifyCLI
328
572
  error: {
329
573
  not_in_project: <<~MESSAGE,
330
574
  {{x}} You are not in a Shopify app project
331
- {{yellow:{{*}}}}{{reset: Run}}{{cyan: shopify rails create}}{{reset: or}}{{cyan: shopify node create}}{{reset: to create your app}}
575
+ {{yellow:{{*}}}}{{reset: Run}}{{cyan: shopify app create}}{{reset: to create your app}}
332
576
  MESSAGE
333
577
  },
334
578
  },
@@ -81,7 +81,11 @@ module ShopifyCLI
81
81
  #
82
82
  # #### Example
83
83
  #
84
- # type = ShopifyCLI::Project.current_project_type
84
+ # ShopifyCLI::Project.write(
85
+ # @ctx,
86
+ # project_type: "node",
87
+ # organization_id: form_data.organization_id,
88
+ # )
85
89
  #
86
90
  def write(ctx, project_type:, organization_id:, **identifiers)
87
91
  require "yaml" # takes 20ms, so deferred as late as possible.
@@ -1,5 +1,5 @@
1
1
  module ShopifyCLI
2
- class ProjectCommands < Command
2
+ class ProjectCommand < Command
3
3
  def call(*)
4
4
  @ctx.puts(self.class.help)
5
5
  end
@@ -0,0 +1,25 @@
1
+ module ShopifyCLI
2
+ module Services
3
+ module App
4
+ class ConnectService < BaseService
5
+ attr_reader :app_type, :project, :context
6
+
7
+ def initialize(app_type:, project:, context:)
8
+ @app_type = app_type
9
+ @project = project
10
+ @context = context
11
+ super()
12
+ end
13
+
14
+ def call
15
+ unless project&.env.nil?
16
+ context.puts(context.message("core.app.connect.production_warning"))
17
+ end
18
+
19
+ app = ShopifyCLI::Connect.new(context).default_connect(app_type.to_s)
20
+ context.done(context.message("core.app.connect.connected", app))
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,153 @@
1
+ require "semantic/semantic"
2
+
3
+ module ShopifyCLI
4
+ module Services
5
+ module App
6
+ module Create
7
+ class NodeService < BaseService
8
+ attr_reader :context, :name, :organization_id, :store_domain, :type, :verbose
9
+
10
+ def initialize(name:, organization_id:, store_domain:, type:, verbose:, context:)
11
+ @name = name
12
+ @organization_id = organization_id
13
+ @store_domain = store_domain
14
+ @type = type
15
+ @verbose = verbose
16
+ @context = context
17
+ super()
18
+ end
19
+
20
+ def call
21
+ form = form_data({
22
+ name: name,
23
+ organization_id: organization_id,
24
+ shop_domain: store_domain,
25
+ type: type,
26
+ verbose: verbose,
27
+ })
28
+
29
+ check_node
30
+ check_npm
31
+ build(form.name)
32
+
33
+ ShopifyCLI::Project.write(
34
+ context,
35
+ project_type: "node",
36
+ organization_id: form.organization_id,
37
+ )
38
+
39
+ api_client = if ShopifyCLI::Environment.acceptance_test?
40
+ {
41
+ "apiKey" => "public_api_key",
42
+ "apiSecretKeys" => [
43
+ {
44
+ "secret" => "api_secret_key",
45
+ },
46
+ ],
47
+ }
48
+ else
49
+ ShopifyCLI::Tasks::CreateApiClient.call(
50
+ context,
51
+ org_id: form.organization_id,
52
+ title: form.name,
53
+ type: form.type,
54
+ )
55
+ end
56
+
57
+ ShopifyCLI::Resources::EnvFile.new(
58
+ api_key: api_client["apiKey"],
59
+ secret: api_client["apiSecretKeys"].first["secret"],
60
+ shop: form.shop_domain,
61
+ scopes: "write_products,write_customers,write_draft_orders",
62
+ ).write(context)
63
+
64
+ partners_url = ShopifyCLI::PartnersAPI.partners_url_for(form.organization_id, api_client["id"])
65
+
66
+ context.puts(context.message("apps.create.info.created", form.name, partners_url))
67
+ context.puts(context.message("apps.create.info.serve", form.name, ShopifyCLI::TOOL_NAME))
68
+ unless ShopifyCLI::Shopifolk.acting_as_shopify_organization?
69
+ context.puts(context.message("apps.create.info.install", partners_url, form.name))
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def form_data(form_options)
76
+ if ShopifyCLI::Environment.acceptance_test?
77
+ Struct.new(:name, :organization_id, :type, :shop_domain, keyword_init: true).new(
78
+ name: form_options[:name],
79
+ organization_id: form_options[:organization_id] || "123",
80
+ shop_domain: form_options[:shop_domain] || "test.shopify.io",
81
+ type: form_options[:type] || "public",
82
+ )
83
+ else
84
+ Node::Forms::Create.ask(context, [], form_options)
85
+ end
86
+ end
87
+
88
+ def check_node
89
+ cmd_path = context.which("node")
90
+ context.abort(context.message("core.app.create.node.error.node_required")) if cmd_path.nil?
91
+
92
+ version, stat = context.capture2e("node", "-v")
93
+ unless stat.success?
94
+ context.abort(context.message("core.app.create.node.error.node_version_failure"))
95
+ end
96
+
97
+ context.done(context.message("core.app.create.node.node_version", version))
98
+ end
99
+
100
+ def check_npm
101
+ cmd_path = context.which("npm")
102
+ context.abort(context.message("core.app.create.node.error.npm_required")) if cmd_path.nil?
103
+
104
+ version, stat = context.capture2e("npm", "-v")
105
+ context.abort(context.message("core.app.create.node.error.npm_version_failure")) unless stat.success?
106
+
107
+ context.done(context.message("core.app.create.node.npm_version", version))
108
+ end
109
+
110
+ def set_npm_config
111
+ # check available npmrc (either user or system) for production registry
112
+ registry, _ = context.capture2("npm config get @shopify:registry")
113
+ return if registry.include?("https://registry.yarnpkg.com")
114
+
115
+ # available npmrc doesn't have production registry =>
116
+ # set a project-based .npmrc
117
+ context.system(
118
+ "npm",
119
+ "--userconfig",
120
+ "./.npmrc",
121
+ "config",
122
+ "set",
123
+ "@shopify:registry",
124
+ "https://registry.yarnpkg.com",
125
+ chdir: context.root
126
+ )
127
+ end
128
+
129
+ def build(name)
130
+ ShopifyCLI::Git.clone("https://github.com/Shopify/shopify-app-node.git", name)
131
+
132
+ context.root = File.join(context.root, name)
133
+
134
+ set_npm_config
135
+ ShopifyCLI::JsDeps.install(context, verbose)
136
+
137
+ begin
138
+ context.rm_r(".git")
139
+ context.rm_r(".github")
140
+ context.rm(File.join("server", "handlers", "client.js"))
141
+ context.rename(
142
+ File.join("server", "handlers", "client.cli.js"),
143
+ File.join("server", "handlers", "client.js")
144
+ )
145
+ rescue Errno::ENOENT => e
146
+ context.debug(e)
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,152 @@
1
+ require "semantic/semantic"
2
+
3
+ module ShopifyCLI
4
+ module Services
5
+ module App
6
+ module Create
7
+ class PHPService < BaseService
8
+ attr_reader :name, :organization_id, :store_domain, :type, :verbose, :context
9
+
10
+ def initialize(name:, organization_id:, store_domain:, type:, verbose:, context:)
11
+ @name = name
12
+ @organization_id = organization_id
13
+ @store_domain = store_domain
14
+ @type = type
15
+ @verbose = verbose
16
+ @context = context
17
+ super()
18
+ end
19
+
20
+ def call
21
+ form = PHP::Forms::Create.ask(context, [], {
22
+ name: name,
23
+ organization_id: organization_id,
24
+ shop_domain: store_domain,
25
+ type: type,
26
+ verbose: verbose,
27
+ })
28
+ return context.puts(self.class.help) if form.nil?
29
+
30
+ check_php
31
+ check_composer
32
+ check_npm
33
+ app_id = build(form)
34
+
35
+ ShopifyCLI::Project.write(
36
+ context,
37
+ project_type: "php",
38
+ organization_id: form.organization_id,
39
+ )
40
+
41
+ partners_url = ShopifyCLI::PartnersAPI.partners_url_for(form.organization_id, app_id)
42
+
43
+ context.puts(context.message("apps.create.info.created", form.name, partners_url))
44
+ context.puts(context.message("apps.create.info.serve", form.name, ShopifyCLI::TOOL_NAME))
45
+ unless ShopifyCLI::Shopifolk.acting_as_shopify_organization?
46
+ context.puts(context.message("apps.create.info.install", partners_url, form.name))
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def check_php
53
+ cmd_path = context.which("php")
54
+ context.abort(context.message("core.app.create.php.error.php_required")) if cmd_path.nil?
55
+
56
+ version, stat = context.capture2e("php", "-r", "echo phpversion();")
57
+ context.abort(context.message("core.app.create.php.error.php_version_failure")) unless stat.success?
58
+
59
+ if ::Semantic::Version.new(version) < ::Semantic::Version.new("7.3.0")
60
+ context.abort(context.message("core.app.create.php.error.php_version_too_low", "7.3"))
61
+ end
62
+
63
+ context.done(context.message("core.app.create.php.php_version", version))
64
+ end
65
+
66
+ def check_composer
67
+ cmd_path = context.which("composer")
68
+ context.abort(context.message("core.app.create.php.error.composer_required")) if cmd_path.nil?
69
+ end
70
+
71
+ def check_npm
72
+ cmd_path = context.which("npm")
73
+ context.abort(context.message("core.app.create.php.error.npm_required")) if cmd_path.nil?
74
+
75
+ version, stat = context.capture2e("npm", "-v")
76
+ context.abort(context.message("core.app.create.php.error.npm_version_failure")) unless stat.success?
77
+
78
+ context.done(context.message("core.app.create.php.npm_version", version))
79
+ end
80
+
81
+ def build(form)
82
+ ShopifyCLI::Git.clone("https://github.com/Shopify/shopify-app-php.git", form.name)
83
+
84
+ context.root = File.join(context.root, form.name)
85
+ context.chdir(context.root)
86
+
87
+ api_client = ShopifyCLI::Tasks::CreateApiClient.call(
88
+ context,
89
+ org_id: form.organization_id,
90
+ title: form.name,
91
+ type: form.type,
92
+ )
93
+
94
+ # Override the example settings with our own
95
+ context.cp(".env.example", ".env")
96
+
97
+ env_file = ShopifyCLI::Resources::EnvFile.read
98
+ env_file.api_key = api_client["apiKey"]
99
+ env_file.secret = api_client["apiSecretKeys"].first["secret"]
100
+ env_file.shop = form.shop_domain
101
+ env_file.host = "localhost"
102
+ env_file.scopes = "write_products,write_draft_orders,write_customers"
103
+ env_file.extra["DB_DATABASE"] = File.join(context.root, env_file.extra["DB_DATABASE"])
104
+ env_file.write(context)
105
+
106
+ ShopifyCLI::PHPDeps.install(context, verbose)
107
+
108
+ set_npm_config
109
+ ShopifyCLI::JsDeps.install(context, verbose)
110
+
111
+ title = context.message("core.app.create.php.app_setting_up")
112
+ success = context.message("core.app.create.php.app_set_up")
113
+ failure = context.message("core.app.create.php.error.app_setup")
114
+ CLI::UI::Frame.open(title, success_text: success, failure_text: failure) do
115
+ FileUtils.touch(env_file.extra["DB_DATABASE"])
116
+ context.system("php", "artisan", "key:generate")
117
+ context.system("php", "artisan", "migrate")
118
+ end
119
+
120
+ begin
121
+ context.rm_r(".git")
122
+ context.rm_r(".github")
123
+ rescue Errno::ENOENT => e
124
+ context.debug(e)
125
+ end
126
+
127
+ api_client["id"]
128
+ end
129
+
130
+ def set_npm_config
131
+ # check available npmrc (either user or system) for production registry
132
+ registry, _ = context.capture2("npm config get @shopify:registry")
133
+ return if registry.include?("https://registry.yarnpkg.com")
134
+
135
+ # available npmrc doesn't have production registry =>
136
+ # set a project-based .npmrc
137
+ context.system(
138
+ "npm",
139
+ "--userconfig",
140
+ "./.npmrc",
141
+ "config",
142
+ "set",
143
+ "@shopify:registry",
144
+ "https://registry.yarnpkg.com",
145
+ chdir: context.root
146
+ )
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end