@shopify/cli-kit 3.37.0 → 3.38.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 (125) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.js +0 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/private/node/api/graphql.js +7 -7
  5. package/dist/private/node/api/graphql.js.map +1 -1
  6. package/dist/{network → private/node}/api.d.ts +0 -0
  7. package/dist/{network → private/node}/api.js +0 -0
  8. package/dist/private/node/api.js.map +1 -0
  9. package/dist/private/node/conf-store.js +4 -4
  10. package/dist/private/node/conf-store.js.map +1 -1
  11. package/dist/{content-tokens.d.ts → private/node/content-tokens.d.ts} +11 -11
  12. package/dist/{content-tokens.js → private/node/content-tokens.js} +3 -3
  13. package/dist/private/node/content-tokens.js.map +1 -0
  14. package/dist/private/node/secure-store.js +4 -4
  15. package/dist/private/node/secure-store.js.map +1 -1
  16. package/dist/private/node/session/authorize.js +3 -3
  17. package/dist/private/node/session/authorize.js.map +1 -1
  18. package/dist/private/node/session/device-authorization.js +6 -6
  19. package/dist/private/node/session/device-authorization.js.map +1 -1
  20. package/dist/private/node/session/exchange.js.map +1 -1
  21. package/dist/private/node/session/identity-token-validation.js +5 -5
  22. package/dist/private/node/session/identity-token-validation.js.map +1 -1
  23. package/dist/private/node/session/identity.d.ts +1 -1
  24. package/dist/private/node/session/identity.js.map +1 -1
  25. package/dist/private/node/session/redirect-listener.js +2 -2
  26. package/dist/private/node/session/redirect-listener.js.map +1 -1
  27. package/dist/private/node/session/scopes.d.ts +1 -1
  28. package/dist/private/node/session/scopes.js +1 -1
  29. package/dist/private/node/session/scopes.js.map +1 -1
  30. package/dist/private/node/session/store.js +4 -4
  31. package/dist/private/node/session/store.js.map +1 -1
  32. package/dist/private/node/session/validate.js +2 -2
  33. package/dist/private/node/session/validate.js.map +1 -1
  34. package/dist/private/node/session.js +19 -19
  35. package/dist/private/node/session.js.map +1 -1
  36. package/dist/private/node/ui/alert.js +1 -1
  37. package/dist/private/node/ui/alert.js.map +1 -1
  38. package/dist/private/node/ui/components/Alert.test.js +1 -1
  39. package/dist/private/node/ui/components/Alert.test.js.map +1 -1
  40. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +1 -1
  41. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  42. package/dist/private/node/ui/components/ConcurrentOutput.test.js +1 -1
  43. package/dist/private/node/ui/components/ConcurrentOutput.test.js.map +1 -1
  44. package/dist/private/node/ui/components/FatalError.test.js +1 -1
  45. package/dist/private/node/ui/components/FatalError.test.js.map +1 -1
  46. package/dist/private/node/ui/components/List.test.js +1 -1
  47. package/dist/private/node/ui/components/List.test.js.map +1 -1
  48. package/dist/private/node/ui/components/SelectPrompt.test.js +1 -1
  49. package/dist/private/node/ui/components/SelectPrompt.test.js.map +1 -1
  50. package/dist/private/node/ui/components/Tasks.test.js +1 -1
  51. package/dist/private/node/ui/components/Tasks.test.js.map +1 -1
  52. package/dist/private/node/ui/components/TextPrompt.test.js +1 -1
  53. package/dist/private/node/ui/components/TextPrompt.test.js.map +1 -1
  54. package/dist/private/node/ui/components/TokenizedText.test.js +1 -1
  55. package/dist/private/node/ui/components/TokenizedText.test.js.map +1 -1
  56. package/dist/private/node/ui.d.ts +1 -1
  57. package/dist/private/node/ui.js +1 -1
  58. package/dist/private/node/ui.js.map +1 -1
  59. package/dist/public/common/string.js +1 -1
  60. package/dist/public/common/string.js.map +1 -1
  61. package/dist/public/common/version.d.ts +1 -1
  62. package/dist/public/common/version.js +1 -1
  63. package/dist/public/common/version.js.map +1 -1
  64. package/dist/public/node/analytics.js +5 -5
  65. package/dist/public/node/analytics.js.map +1 -1
  66. package/dist/public/node/api/admin.js +2 -2
  67. package/dist/public/node/api/admin.js.map +1 -1
  68. package/dist/public/node/archiver.js +2 -2
  69. package/dist/public/node/archiver.js.map +1 -1
  70. package/dist/public/node/base-command.js +4 -4
  71. package/dist/public/node/base-command.js.map +1 -1
  72. package/dist/public/node/dot-env.js +2 -2
  73. package/dist/public/node/dot-env.js.map +1 -1
  74. package/dist/public/node/environment/spin.js +2 -2
  75. package/dist/public/node/environment/spin.js.map +1 -1
  76. package/dist/public/node/error-handler.js +3 -3
  77. package/dist/public/node/error-handler.js.map +1 -1
  78. package/dist/public/node/error.d.ts +5 -5
  79. package/dist/public/node/error.js +1 -1
  80. package/dist/public/node/error.js.map +1 -1
  81. package/dist/public/node/fs.js +19 -19
  82. package/dist/public/node/fs.js.map +1 -1
  83. package/dist/public/node/git.js +8 -8
  84. package/dist/public/node/git.js.map +1 -1
  85. package/dist/public/node/github.js +2 -2
  86. package/dist/public/node/github.js.map +1 -1
  87. package/dist/public/node/hooks/postrun.js +2 -2
  88. package/dist/public/node/hooks/postrun.js.map +1 -1
  89. package/dist/public/node/hooks/prerun.js +2 -2
  90. package/dist/public/node/hooks/prerun.js.map +1 -1
  91. package/dist/public/node/http.js +3 -3
  92. package/dist/public/node/http.js.map +1 -1
  93. package/dist/public/node/liquid.js +2 -2
  94. package/dist/public/node/liquid.js.map +1 -1
  95. package/dist/public/node/monorail.js +4 -4
  96. package/dist/public/node/monorail.js.map +1 -1
  97. package/dist/public/node/node-package-manager.js +9 -9
  98. package/dist/public/node/node-package-manager.js.map +1 -1
  99. package/dist/public/node/os.js +2 -2
  100. package/dist/public/node/os.js.map +1 -1
  101. package/dist/{output.d.ts → public/node/output.d.ts} +100 -41
  102. package/dist/{output.js → public/node/output.js} +129 -50
  103. package/dist/public/node/output.js.map +1 -0
  104. package/dist/public/node/ruby.js +7 -5
  105. package/dist/public/node/ruby.js.map +1 -1
  106. package/dist/public/node/session.js +9 -9
  107. package/dist/public/node/session.js.map +1 -1
  108. package/dist/public/node/system.js +2 -2
  109. package/dist/public/node/system.js.map +1 -1
  110. package/dist/public/node/tcp.js +4 -4
  111. package/dist/public/node/tcp.js.map +1 -1
  112. package/dist/public/node/testing/output.js +10 -9
  113. package/dist/public/node/testing/output.js.map +1 -1
  114. package/dist/public/node/ui.d.ts +1 -1
  115. package/dist/public/node/ui.js +1 -1
  116. package/dist/public/node/ui.js.map +1 -1
  117. package/dist/public/node/vscode.js +4 -4
  118. package/dist/public/node/vscode.js.map +1 -1
  119. package/dist/tsconfig.tsbuildinfo +1 -1
  120. package/dist/ui.js +9 -9
  121. package/dist/ui.js.map +1 -1
  122. package/package.json +1 -1
  123. package/dist/content-tokens.js.map +0 -1
  124. package/dist/network/api.js.map +0 -1
  125. package/dist/output.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable no-console */
2
- import { isUnitTest, isVerbose } from './public/node/environment/local.js';
3
- import colors from './public/node/colors.js';
4
- import { ColorContentToken, CommandContentToken, ErrorContentToken, HeadingContentToken, ItalicContentToken, JsonContentToken, LinesDiffContentToken, LinkContentToken, PathContentToken, RawContentToken, SubHeadingContentToken, } from './content-tokens.js';
2
+ import { isUnitTest, isVerbose } from './environment/local.js';
3
+ import colors from './colors.js';
4
+ import { ColorContentToken, CommandContentToken, ErrorContentToken, HeadingContentToken, ItalicContentToken, JsonContentToken, LinesDiffContentToken, LinkContentToken, PathContentToken, RawContentToken, SubHeadingContentToken, } from '../../private/node/content-tokens.js';
5
5
  import stripAnsi from 'strip-ansi';
6
6
  import { Writable } from 'stream';
7
7
  export { default as logUpdate } from 'log-update';
@@ -10,60 +10,67 @@ export class TokenizedString {
10
10
  this.value = value;
11
11
  }
12
12
  }
13
- export const token = {
14
- raw: (value) => {
13
+ export const outputToken = {
14
+ raw(value) {
15
15
  return new RawContentToken(value);
16
16
  },
17
- genericShellCommand: (value) => {
17
+ genericShellCommand(value) {
18
18
  return new CommandContentToken(value);
19
19
  },
20
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
- json: (value) => {
20
+ json(value) {
22
21
  return new JsonContentToken(value);
23
22
  },
24
- path: (value) => {
23
+ path(value) {
25
24
  return new PathContentToken(value);
26
25
  },
27
- link: (value, link) => {
26
+ link(value, link) {
28
27
  return new LinkContentToken(value, link);
29
28
  },
30
- heading: (value) => {
29
+ heading(value) {
31
30
  return new HeadingContentToken(value);
32
31
  },
33
- subheading: (value) => {
32
+ subheading(value) {
34
33
  return new SubHeadingContentToken(value);
35
34
  },
36
- italic: (value) => {
35
+ italic(value) {
37
36
  return new ItalicContentToken(value);
38
37
  },
39
- errorText: (value) => {
38
+ errorText(value) {
40
39
  return new ErrorContentToken(value);
41
40
  },
42
- cyan: (value) => {
41
+ cyan(value) {
43
42
  return new ColorContentToken(value, colors.cyan);
44
43
  },
45
- yellow: (value) => {
44
+ yellow(value) {
46
45
  return new ColorContentToken(value, colors.yellow);
47
46
  },
48
- magenta: (value) => {
47
+ magenta(value) {
49
48
  return new ColorContentToken(value, colors.magenta);
50
49
  },
51
- green: (value) => {
50
+ green(value) {
52
51
  return new ColorContentToken(value, colors.green);
53
52
  },
54
- packagejsonScript: (packageManager, scriptName, ...scriptArgs) => {
53
+ packagejsonScript(packageManager, scriptName, ...scriptArgs) {
55
54
  return new CommandContentToken(formatPackageManagerCommand(packageManager, scriptName, ...scriptArgs));
56
55
  },
57
- successIcon: () => {
56
+ successIcon() {
58
57
  return new ColorContentToken('✔', colors.green);
59
58
  },
60
- failIcon: () => {
59
+ failIcon() {
61
60
  return new ErrorContentToken('✖');
62
61
  },
63
- linesDiff: (value) => {
62
+ linesDiff(value) {
64
63
  return new LinesDiffContentToken(value);
65
64
  },
66
65
  };
66
+ /**
67
+ * Given a command and its arguments, it formats it depending on the package manager.
68
+ *
69
+ * @param packageManager - The package manager to use (pnpm, npm, yarn).
70
+ * @param scriptName - The name of the script to run.
71
+ * @param scriptArgs - The arguments to pass to the script.
72
+ * @returns The formatted command.
73
+ */
67
74
  export function formatPackageManagerCommand(packageManager, scriptName, ...scriptArgs) {
68
75
  switch (packageManager) {
69
76
  case 'pnpm':
@@ -81,7 +88,14 @@ export function formatPackageManagerCommand(packageManager, scriptName, ...scrip
81
88
  }
82
89
  }
83
90
  }
84
- export function content(strings, ...keys) {
91
+ /**
92
+ * Creates a tokenized string from an array of strings and tokens.
93
+ *
94
+ * @param strings - The strings to join.
95
+ * @param keys - Array of tokens or strings to join.
96
+ * @returns The tokenized string.
97
+ */
98
+ export function outputContent(strings, ...keys) {
85
99
  let output = ``;
86
100
  strings.forEach((string, i) => {
87
101
  output += string;
@@ -108,10 +122,11 @@ export function content(strings, ...keys) {
108
122
  }
109
123
  /**
110
124
  * It maps a level to a numeric value.
125
+ *
111
126
  * @param level - The level for which we'll return its numeric value.
112
127
  * @returns The numeric value of the level.
113
128
  */
114
- const logLevelValue = (level) => {
129
+ function logLevelValue(level) {
115
130
  switch (level) {
116
131
  case 'trace':
117
132
  return 10;
@@ -128,118 +143,139 @@ const logLevelValue = (level) => {
128
143
  default:
129
144
  return 30;
130
145
  }
131
- };
146
+ }
132
147
  /**
148
+ * It returns the current log level (debug or info).
133
149
  *
134
- * @returns It returns the log level set by the user.
150
+ * @returns The log level set by the user.
135
151
  */
136
- export const currentLogLevel = () => {
152
+ function currentLogLevel() {
137
153
  if (isVerbose()) {
138
154
  return 'debug';
139
155
  }
140
156
  else {
141
157
  return 'info';
142
158
  }
143
- };
144
- export const shouldOutput = (logLevel) => {
159
+ }
160
+ /**
161
+ * It checks if the message should be outputted or not.
162
+ *
163
+ * @param logLevel - The desired log level for the message.
164
+ * @returns True if the message should be outputted, false otherwise.
165
+ */
166
+ function shouldOutput(logLevel) {
145
167
  if (isUnitTest()) {
146
168
  return false;
147
169
  }
148
170
  const currentLogLevelValue = logLevelValue(currentLogLevel());
149
171
  const messageLogLevelValue = logLevelValue(logLevel);
150
172
  return messageLogLevelValue >= currentLogLevelValue;
151
- };
173
+ }
152
174
  // eslint-disable-next-line import/no-mutable-exports
153
175
  export let collectedLogs = {};
154
176
  /**
155
177
  * This is only used during UnitTesting.
156
178
  * If we are in a testing context, instead of printing the logs to the console,
157
179
  * we will store them in a variable that can be accessed from the tests.
180
+ *
158
181
  * @param key - The key of the log.
159
182
  * @param content - The content of the log.
160
183
  */
161
- export const collectLog = (key, content) => {
184
+ export function collectLog(key, content) {
162
185
  const output = collectedLogs.output ?? [];
163
186
  const data = collectedLogs[key] ?? [];
164
187
  data.push(stripAnsi(stringifyMessage(content) ?? ''));
165
188
  output.push(stripAnsi(stringifyMessage(content) ?? ''));
166
189
  collectedLogs[key] = data;
167
190
  collectedLogs.output = output;
168
- };
191
+ }
169
192
  export const clearCollectedLogs = () => {
193
+ // console.log('clearCollectLogs')
170
194
  collectedLogs = {};
195
+ // console.log(collectedLogs)
171
196
  };
172
197
  /**
173
198
  * Ouputs information to the user.
174
199
  * Info messages don't get additional formatting.
175
200
  * Note: Info messages are sent through the standard output.
201
+ *
176
202
  * @param content - The content to be output to the user.
177
203
  * @param logger - The logging function to use to output to the user.
178
204
  */
179
- export const info = (content, logger = consoleLog) => {
205
+ export function outputInfo(content, logger = consoleLog) {
180
206
  const message = stringifyMessage(content);
181
207
  if (isUnitTest())
182
208
  collectLog('info', content);
183
209
  outputWhereAppropriate('info', logger, message);
184
- };
210
+ }
185
211
  /**
186
212
  * Outputs a success message to the user.
187
213
  * Success messages receive a special formatting to make them stand out in the console.
188
214
  * Note: Success messages are sent through the standard output.
215
+ *
189
216
  * @param content - The content to be output to the user.
190
217
  * @param logger - The logging function to use to output to the user.
191
218
  */
192
- export const success = (content, logger = consoleLog) => {
219
+ export function outputSuccess(content, logger = consoleLog) {
193
220
  const message = colors.bold(`✅ Success! ${stringifyMessage(content)}.`);
194
221
  if (isUnitTest())
195
222
  collectLog('success', content);
196
223
  outputWhereAppropriate('info', logger, message);
197
- };
224
+ }
198
225
  /**
199
226
  * Outputs a completed message to the user.
200
227
  * Completed message receive a special formatting to make them stand out in the console.
201
228
  * Note: Completed messages are sent through the standard output.
229
+ *
202
230
  * @param content - The content to be output to the user.
203
231
  * @param logger - The logging function to use to output to the user.
204
232
  */
205
- export const completed = (content, logger = consoleLog) => {
233
+ export function outputCompleted(content, logger = consoleLog) {
206
234
  const message = `${colors.green('✔')} ${stringifyMessage(content)}`;
207
235
  if (isUnitTest())
208
236
  collectLog('completed', content);
209
237
  outputWhereAppropriate('info', logger, message);
210
- };
238
+ }
211
239
  /**
212
240
  * Ouputs debug information to the user. By default these output is hidden unless the user calls the CLI with --verbose.
213
241
  * Debug messages don't get additional formatting.
214
242
  * Note: Debug messages are sent through the standard output.
243
+ *
215
244
  * @param content - The content to be output to the user.
216
245
  * @param logger - The logging function to use to output to the user.
217
246
  */
218
- export const debug = (content, logger = consoleLog) => {
247
+ export function outputDebug(content, logger = consoleLog) {
219
248
  if (isUnitTest())
220
249
  collectLog('debug', content);
221
250
  const message = colors.gray(stringifyMessage(content));
222
251
  outputWhereAppropriate('debug', logger, `${new Date().toISOString()}: ${message}`);
223
- };
252
+ }
224
253
  /**
225
254
  * Outputs a warning message to the user.
226
255
  * Warning messages receive a special formatting to make them stand out in the console.
227
256
  * Note: Warning messages are sent through the standard output.
257
+ *
228
258
  * @param content - The content to be output to the user.
229
259
  * @param logger - The logging function to use to output to the user.
230
260
  */
231
- export const warn = (content, logger = consoleWarn) => {
261
+ export function outputWarn(content, logger = consoleWarn) {
232
262
  if (isUnitTest())
233
263
  collectLog('warn', content);
234
264
  const message = colors.yellow(stringifyMessage(content));
235
265
  outputWhereAppropriate('warn', logger, message);
236
- };
266
+ }
237
267
  /**
238
268
  * Prints a new line in the terminal.
239
269
  */
240
- export const newline = () => {
270
+ export function outputNewline() {
241
271
  console.log();
242
- };
272
+ }
273
+ /**
274
+ * Converts a Message to string.
275
+ *
276
+ * @param message - The message to convert to string.
277
+ * @returns The string representation of the message.
278
+ */
243
279
  export function stringifyMessage(message) {
244
280
  if (message instanceof TokenizedString) {
245
281
  return message.value;
@@ -248,15 +284,37 @@ export function stringifyMessage(message) {
248
284
  return message;
249
285
  }
250
286
  }
287
+ /**
288
+ * Prints a log message in the console.
289
+ *
290
+ * @param message - The message to print.
291
+ */
251
292
  export function consoleLog(message) {
252
293
  console.log(withOrWithoutStyle(message));
253
294
  }
295
+ /**
296
+ * Prints an error message in the console.
297
+ *
298
+ * @param message - The message to print.
299
+ */
254
300
  export function consoleError(message) {
255
301
  console.error(withOrWithoutStyle(message));
256
302
  }
303
+ /**
304
+ * Prints a warning message in the console.
305
+ *
306
+ * @param message - The message to print.
307
+ */
257
308
  export function consoleWarn(message) {
258
309
  console.warn(withOrWithoutStyle(message));
259
310
  }
311
+ /**
312
+ * Writes a message to the appropiated logger.
313
+ *
314
+ * @param logLevel - The log level to use to determine if the message should be output.
315
+ * @param logger - The logger to use to output the message.
316
+ * @param message - The message to output.
317
+ */
260
318
  export function outputWhereAppropriate(logLevel, logger, message) {
261
319
  if (shouldOutput(logLevel)) {
262
320
  if (logger instanceof Writable) {
@@ -267,6 +325,12 @@ export function outputWhereAppropriate(logLevel, logger, message) {
267
325
  }
268
326
  }
269
327
  }
328
+ /**
329
+ * Returns a colored or uncolored version of a message, depending on the environment.
330
+ *
331
+ * @param message - The message to color or not.
332
+ * @returns The message with or without colors.
333
+ */
270
334
  function withOrWithoutStyle(message) {
271
335
  if (shouldDisplayColors()) {
272
336
  return message;
@@ -275,32 +339,47 @@ function withOrWithoutStyle(message) {
275
339
  return unstyled(message);
276
340
  }
277
341
  }
342
+ /**
343
+ * Returns a message without styles (colors or any ANSI escape codes).
344
+ *
345
+ * @param message - The message to remove styles from.
346
+ * @returns The message without styles.
347
+ */
278
348
  export function unstyled(message) {
279
349
  return stripAnsi(message);
280
350
  }
351
+ /**
352
+ * Checks if the console outputs should display colors or not.
353
+ *
354
+ * @returns True if the console outputs should display colors, false otherwise.
355
+ */
281
356
  export function shouldDisplayColors() {
282
357
  return Boolean(process.stdout.isTTY || process.env.FORCE_COLOR);
283
358
  }
284
359
  /**
360
+ * Generates a message to remind the user to update the CLI.
361
+ *
285
362
  * @param packageManager - The package manager that is being used.
286
- * @param version - The version to update to
363
+ * @param version - The version to update to.
364
+ * @returns The message to remind the user to update the CLI.
287
365
  */
288
366
  export function getOutputUpdateCLIReminder(packageManager, version) {
289
367
  const versionMessage = `💡 Version ${version} available!`;
290
368
  if (!packageManager || packageManager === 'unknown')
291
369
  return versionMessage;
292
- const updateCommand = token.packagejsonScript(packageManager, 'shopify upgrade');
293
- return content `${versionMessage} Run ${updateCommand}`.value;
370
+ const updateCommand = outputToken.packagejsonScript(packageManager, 'shopify upgrade');
371
+ return outputContent `${versionMessage} Run ${updateCommand}`.value;
294
372
  }
295
373
  /**
296
- * Parse title and body to be a single formatted string
374
+ * Parse title and body to be a single formatted string.
375
+ *
297
376
  * @param title - The title of the message. Will be formatted as a heading.
298
377
  * @param body - The body of the message. Will respect the original formatting.
299
378
  * @returns The formatted message.
300
379
  */
301
- export function section(title, body) {
380
+ export function formatSection(title, body) {
302
381
  const formattedTitle = `${title.toUpperCase()}${' '.repeat(35 - title.length)}`;
303
- return content `${token.heading(formattedTitle)}\n${body}`.value;
382
+ return outputContent `${outputToken.heading(formattedTitle)}\n${body}`.value;
304
383
  }
305
384
  /* eslint-enable no-console */
306
385
  //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/public/node/output.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport {isUnitTest, isVerbose} from './environment/local.js'\nimport {PackageManager} from './node-package-manager.js'\nimport colors from './colors.js'\nimport {\n ColorContentToken,\n CommandContentToken,\n ContentToken,\n ErrorContentToken,\n HeadingContentToken,\n ItalicContentToken,\n JsonContentToken,\n LinesDiffContentToken,\n LinkContentToken,\n PathContentToken,\n RawContentToken,\n SubHeadingContentToken,\n} from '../../private/node/content-tokens.js'\nimport stripAnsi from 'strip-ansi'\nimport {AbortSignal} from '@shopify/cli-kit/node/abort'\nimport {Writable} from 'stream'\nimport type {Change} from 'diff'\n\nexport {default as logUpdate} from 'log-update'\n\nexport type Logger = Writable | ((message: string) => void)\n\nexport class TokenizedString {\n value: string\n constructor(value: string) {\n this.value = value\n }\n}\n\nexport type OutputMessage = string | TokenizedString\n\nexport const outputToken = {\n raw(value: string): RawContentToken {\n return new RawContentToken(value)\n },\n genericShellCommand(value: OutputMessage): CommandContentToken {\n return new CommandContentToken(value)\n },\n json(value: unknown): JsonContentToken {\n return new JsonContentToken(value)\n },\n path(value: OutputMessage): PathContentToken {\n return new PathContentToken(value)\n },\n link(value: OutputMessage, link: string): LinkContentToken {\n return new LinkContentToken(value, link)\n },\n heading(value: OutputMessage): HeadingContentToken {\n return new HeadingContentToken(value)\n },\n subheading(value: OutputMessage): SubHeadingContentToken {\n return new SubHeadingContentToken(value)\n },\n italic(value: OutputMessage): ItalicContentToken {\n return new ItalicContentToken(value)\n },\n errorText(value: OutputMessage): ErrorContentToken {\n return new ErrorContentToken(value)\n },\n cyan(value: OutputMessage): ColorContentToken {\n return new ColorContentToken(value, colors.cyan)\n },\n yellow(value: OutputMessage): ColorContentToken {\n return new ColorContentToken(value, colors.yellow)\n },\n magenta(value: OutputMessage): ColorContentToken {\n return new ColorContentToken(value, colors.magenta)\n },\n green(value: OutputMessage): ColorContentToken {\n return new ColorContentToken(value, colors.green)\n },\n packagejsonScript(packageManager: PackageManager, scriptName: string, ...scriptArgs: string[]): CommandContentToken {\n return new CommandContentToken(formatPackageManagerCommand(packageManager, scriptName, ...scriptArgs))\n },\n successIcon(): ColorContentToken {\n return new ColorContentToken('✔', colors.green)\n },\n failIcon(): ErrorContentToken {\n return new ErrorContentToken('✖')\n },\n linesDiff(value: Change[]): LinesDiffContentToken {\n return new LinesDiffContentToken(value)\n },\n}\n\n/**\n * Given a command and its arguments, it formats it depending on the package manager.\n *\n * @param packageManager - The package manager to use (pnpm, npm, yarn).\n * @param scriptName - The name of the script to run.\n * @param scriptArgs - The arguments to pass to the script.\n * @returns The formatted command.\n */\nexport function formatPackageManagerCommand(\n packageManager: PackageManager,\n scriptName: string,\n ...scriptArgs: string[]\n): string {\n switch (packageManager) {\n case 'pnpm':\n case 'yarn': {\n const pieces = [packageManager, scriptName, ...scriptArgs]\n return pieces.join(' ')\n }\n case 'npm': {\n const pieces = ['npm', 'run', scriptName]\n if (scriptArgs.length > 0) {\n pieces.push('--')\n pieces.push(...scriptArgs)\n }\n return pieces.join(' ')\n }\n }\n}\n\n/**\n * Creates a tokenized string from an array of strings and tokens.\n *\n * @param strings - The strings to join.\n * @param keys - Array of tokens or strings to join.\n * @returns The tokenized string.\n */\nexport function outputContent(\n strings: TemplateStringsArray,\n ...keys: (ContentToken<unknown> | string)[]\n): TokenizedString {\n let output = ``\n strings.forEach((string, i) => {\n output += string\n if (i >= keys.length) {\n return\n }\n const token = keys[i]!\n\n if (typeof token === 'string') {\n output += token\n } else {\n const enumTokenOutput = token.output()\n\n if (Array.isArray(enumTokenOutput)) {\n enumTokenOutput.forEach((line: string) => {\n output += line\n })\n } else {\n output += enumTokenOutput\n }\n }\n })\n return new TokenizedString(output)\n}\n\n/** Log levels. */\nexport type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent'\n\n/**\n * It maps a level to a numeric value.\n *\n * @param level - The level for which we'll return its numeric value.\n * @returns The numeric value of the level.\n */\nfunction logLevelValue(level: LogLevel): number {\n switch (level) {\n case 'trace':\n return 10\n case 'debug':\n return 20\n case 'info':\n return 30\n case 'warn':\n return 40\n case 'error':\n return 50\n case 'fatal':\n return 60\n default:\n return 30\n }\n}\n\n/**\n * It returns the current log level (debug or info).\n *\n * @returns The log level set by the user.\n */\nfunction currentLogLevel(): LogLevel {\n if (isVerbose()) {\n return 'debug'\n } else {\n return 'info'\n }\n}\n\n/**\n * It checks if the message should be outputted or not.\n *\n * @param logLevel - The desired log level for the message.\n * @returns True if the message should be outputted, false otherwise.\n */\nfunction shouldOutput(logLevel: LogLevel): boolean {\n if (isUnitTest()) {\n return false\n }\n const currentLogLevelValue = logLevelValue(currentLogLevel())\n const messageLogLevelValue = logLevelValue(logLevel)\n return messageLogLevelValue >= currentLogLevelValue\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let collectedLogs: {[key: string]: string[]} = {}\n\n/**\n * This is only used during UnitTesting.\n * If we are in a testing context, instead of printing the logs to the console,\n * we will store them in a variable that can be accessed from the tests.\n *\n * @param key - The key of the log.\n * @param content - The content of the log.\n */\nexport function collectLog(key: string, content: OutputMessage): void {\n const output = collectedLogs.output ?? []\n const data = collectedLogs[key] ?? []\n data.push(stripAnsi(stringifyMessage(content) ?? ''))\n output.push(stripAnsi(stringifyMessage(content) ?? ''))\n collectedLogs[key] = data\n collectedLogs.output = output\n}\n\nexport const clearCollectedLogs = (): void => {\n // console.log('clearCollectLogs')\n collectedLogs = {}\n // console.log(collectedLogs)\n}\n\n/**\n * Ouputs information to the user.\n * Info messages don't get additional formatting.\n * Note: Info messages are sent through the standard output.\n *\n * @param content - The content to be output to the user.\n * @param logger - The logging function to use to output to the user.\n */\nexport function outputInfo(content: OutputMessage, logger: Logger = consoleLog): void {\n const message = stringifyMessage(content)\n if (isUnitTest()) collectLog('info', content)\n outputWhereAppropriate('info', logger, message)\n}\n\n/**\n * Outputs a success message to the user.\n * Success messages receive a special formatting to make them stand out in the console.\n * Note: Success messages are sent through the standard output.\n *\n * @param content - The content to be output to the user.\n * @param logger - The logging function to use to output to the user.\n */\nexport function outputSuccess(content: OutputMessage, logger: Logger = consoleLog): void {\n const message = colors.bold(`✅ Success! ${stringifyMessage(content)}.`)\n if (isUnitTest()) collectLog('success', content)\n outputWhereAppropriate('info', logger, message)\n}\n\n/**\n * Outputs a completed message to the user.\n * Completed message receive a special formatting to make them stand out in the console.\n * Note: Completed messages are sent through the standard output.\n *\n * @param content - The content to be output to the user.\n * @param logger - The logging function to use to output to the user.\n */\nexport function outputCompleted(content: OutputMessage, logger: Logger = consoleLog): void {\n const message = `${colors.green('✔')} ${stringifyMessage(content)}`\n if (isUnitTest()) collectLog('completed', content)\n outputWhereAppropriate('info', logger, message)\n}\n\n/**\n * Ouputs debug information to the user. By default these output is hidden unless the user calls the CLI with --verbose.\n * Debug messages don't get additional formatting.\n * Note: Debug messages are sent through the standard output.\n *\n * @param content - The content to be output to the user.\n * @param logger - The logging function to use to output to the user.\n */\nexport function outputDebug(content: OutputMessage, logger: Logger = consoleLog): void {\n if (isUnitTest()) collectLog('debug', content)\n const message = colors.gray(stringifyMessage(content))\n outputWhereAppropriate('debug', logger, `${new Date().toISOString()}: ${message}`)\n}\n\n/**\n * Outputs a warning message to the user.\n * Warning messages receive a special formatting to make them stand out in the console.\n * Note: Warning messages are sent through the standard output.\n *\n * @param content - The content to be output to the user.\n * @param logger - The logging function to use to output to the user.\n */\nexport function outputWarn(content: OutputMessage, logger: Logger = consoleWarn): void {\n if (isUnitTest()) collectLog('warn', content)\n const message = colors.yellow(stringifyMessage(content))\n outputWhereAppropriate('warn', logger, message)\n}\n\n/**\n * Prints a new line in the terminal.\n */\nexport function outputNewline(): void {\n console.log()\n}\n\n/**\n * Converts a Message to string.\n *\n * @param message - The message to convert to string.\n * @returns The string representation of the message.\n */\nexport function stringifyMessage(message: OutputMessage): string {\n if (message instanceof TokenizedString) {\n return message.value\n } else {\n return message\n }\n}\n\nexport interface OutputProcess {\n /**\n * The prefix to include in the logs\n * [vite] Output coming from Vite.\n */\n prefix: string\n /**\n * A callback to invoke the process. Stdout and stderr should be used\n * to send standard output and error data that gets formatted with the\n * right prefix.\n */\n action: (stdout: Writable, stderr: Writable, signal: AbortSignal) => Promise<void>\n}\n\n/**\n * Prints a log message in the console.\n *\n * @param message - The message to print.\n */\nexport function consoleLog(message: string): void {\n console.log(withOrWithoutStyle(message))\n}\n\n/**\n * Prints an error message in the console.\n *\n * @param message - The message to print.\n */\nexport function consoleError(message: string): void {\n console.error(withOrWithoutStyle(message))\n}\n\n/**\n * Prints a warning message in the console.\n *\n * @param message - The message to print.\n */\nexport function consoleWarn(message: string): void {\n console.warn(withOrWithoutStyle(message))\n}\n\n/**\n * Writes a message to the appropiated logger.\n *\n * @param logLevel - The log level to use to determine if the message should be output.\n * @param logger - The logger to use to output the message.\n * @param message - The message to output.\n */\nexport function outputWhereAppropriate(logLevel: LogLevel, logger: Logger, message: string): void {\n if (shouldOutput(logLevel)) {\n if (logger instanceof Writable) {\n logger.write(message)\n } else {\n logger(message)\n }\n }\n}\n\n/**\n * Returns a colored or uncolored version of a message, depending on the environment.\n *\n * @param message - The message to color or not.\n * @returns The message with or without colors.\n */\nfunction withOrWithoutStyle(message: string): string {\n if (shouldDisplayColors()) {\n return message\n } else {\n return unstyled(message)\n }\n}\n\n/**\n * Returns a message without styles (colors or any ANSI escape codes).\n *\n * @param message - The message to remove styles from.\n * @returns The message without styles.\n */\nexport function unstyled(message: string): string {\n return stripAnsi(message)\n}\n\n/**\n * Checks if the console outputs should display colors or not.\n *\n * @returns True if the console outputs should display colors, false otherwise.\n */\nexport function shouldDisplayColors(): boolean {\n return Boolean(process.stdout.isTTY || process.env.FORCE_COLOR)\n}\n\n/**\n * Generates a message to remind the user to update the CLI.\n *\n * @param packageManager - The package manager that is being used.\n * @param version - The version to update to.\n * @returns The message to remind the user to update the CLI.\n */\nexport function getOutputUpdateCLIReminder(\n packageManager: PackageManager | 'unknown' | undefined,\n version: string,\n): string {\n const versionMessage = `💡 Version ${version} available!`\n if (!packageManager || packageManager === 'unknown') return versionMessage\n\n const updateCommand = outputToken.packagejsonScript(packageManager, 'shopify upgrade')\n return outputContent`${versionMessage} Run ${updateCommand}`.value\n}\n\n/**\n * Parse title and body to be a single formatted string.\n *\n * @param title - The title of the message. Will be formatted as a heading.\n * @param body - The body of the message. Will respect the original formatting.\n * @returns The formatted message.\n */\nexport function formatSection(title: string, body: string): string {\n const formattedTitle = `${title.toUpperCase()}${' '.repeat(35 - title.length)}`\n return outputContent`${outputToken.heading(formattedTitle)}\\n${body}`.value\n}\n\n/* eslint-enable no-console */\n"]}
@@ -5,7 +5,7 @@ import * as file from './fs.js';
5
5
  import { joinPath, cwd } from './path.js';
6
6
  import { AbortError, AbortSilentError } from './error.js';
7
7
  import { pathConstants } from '../../private/node/constants.js';
8
- import { content, token } from '../../output.js';
8
+ import { outputContent, outputToken } from '../../public/node/output.js';
9
9
  import { isTruthy } from '../../private/node/environment/utilities.js';
10
10
  import { Writable } from 'stream';
11
11
  const RubyCLIVersion = '2.34.0';
@@ -144,11 +144,13 @@ async function validateRuby() {
144
144
  version = coerceSemverVersion(stdout);
145
145
  }
146
146
  catch {
147
- throw new AbortError('Ruby environment not found', `Make sure you have Ruby installed on your system. ${content `${token.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`.value}`);
147
+ throw new AbortError('Ruby environment not found', `Make sure you have Ruby installed on your system. ${outputContent `${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`
148
+ .value}`);
148
149
  }
149
150
  const isValid = version?.compare(MinRubyVersion);
150
151
  if (isValid === -1 || isValid === undefined) {
151
- throw new AbortError(`Ruby version ${content `${token.yellow(version.raw)}`.value} is not supported`, `Make sure you have at least Ruby ${content `${token.yellow(MinRubyVersion)}`.value} installed on your system. ${content `${token.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`.value}`);
152
+ throw new AbortError(`Ruby version ${outputContent `${outputToken.yellow(version.raw)}`.value} is not supported`, `Make sure you have at least Ruby ${outputContent `${outputToken.yellow(MinRubyVersion)}`.value} installed on your system. ${outputContent `${outputToken.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`
153
+ .value}`);
152
154
  }
153
155
  }
154
156
  /**
@@ -161,11 +163,11 @@ async function validateBundler() {
161
163
  version = coerceSemverVersion(stdout);
162
164
  }
163
165
  catch {
164
- throw new AbortError('Bundler not found', `To install the latest version of Bundler, run ${content `${token.genericShellCommand(`${gemExecutable()} install bundler`)}`.value}`);
166
+ throw new AbortError('Bundler not found', `To install the latest version of Bundler, run ${outputContent `${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value}`);
165
167
  }
166
168
  const isValid = version?.compare(MinBundlerVersion);
167
169
  if (isValid === -1 || isValid === undefined) {
168
- throw new AbortError(`Bundler version ${content `${token.yellow(version.raw)}`.value} is not supported`, `To update to the latest version of Bundler, run ${content `${token.genericShellCommand(`${gemExecutable()} install bundler`)}`.value}`);
170
+ throw new AbortError(`Bundler version ${outputContent `${outputToken.yellow(version.raw)}`.value} is not supported`, `To update to the latest version of Bundler, run ${outputContent `${outputToken.genericShellCommand(`${gemExecutable()} install bundler`)}`.value}`);
169
171
  }
170
172
  }
171
173
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/public/node/ruby.ts"],"names":[],"mappings":"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","sourcesContent":["import {coerceSemverVersion} from './semver.js'\nimport {AbortSignal} from './abort.js'\nimport {platformAndArch} from './os.js'\nimport {captureOutput, exec} from './system.js'\nimport * as file from './fs.js'\nimport {joinPath, cwd} from './path.js'\nimport {AbortError, AbortSilentError} from './error.js'\nimport {pathConstants} from '../../private/node/constants.js'\nimport {AdminSession} from '../../public/node/session.js'\nimport {content, token} from '../../output.js'\nimport {isTruthy} from '../../private/node/environment/utilities.js'\nimport {Writable} from 'stream'\n\nconst RubyCLIVersion = '2.34.0'\nconst ThemeCheckVersion = '1.14.0'\nconst MinBundlerVersion = '2.3.8'\nconst MinRubyVersion = '2.7.5'\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}\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 await installCLIDependencies(options.stdout ?? process.stdout)\n const env: NodeJS.ProcessEnv = {\n ...process.env,\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 // 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(shopifyCLIDirectory(), 'Gemfile'),\n }\n\n try {\n await exec(bundleExecutable(), ['exec', 'shopify'].concat(args), {\n stdio: 'inherit',\n cwd: options.directory ?? cwd(),\n env,\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 */\nasync function installCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(shopifyCLIDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n const usingLocalCLI2 = isTruthy(process.env.SHOPIFY_CLI_2_0_DIRECTORY)\n await validateRubyEnv()\n if (usingLocalCLI2) {\n await bundleInstallLocalShopifyCLI()\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 content`${token.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`.value\n }`,\n )\n }\n\n const isValid = version?.compare(MinRubyVersion)\n if (isValid === -1 || isValid === undefined) {\n throw new AbortError(\n `Ruby version ${content`${token.yellow(version.raw)}`.value} is not supported`,\n `Make sure you have at least Ruby ${content`${token.yellow(MinRubyVersion)}`.value} installed on your system. ${\n content`${token.link('Documentation.', 'https://www.ruby-lang.org/en/documentation/installation/')}`.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 content`${token.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 ${content`${token.yellow(version.raw)}`.value} is not supported`,\n `To update to the latest version of Bundler, run ${\n content`${token.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(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 gemPath = joinPath(shopifyCLIDirectory(), 'Gemfile')\n const gemFileContent = [\"source 'https://rubygems.org'\", `gem 'shopify-cli', '${RubyCLIVersion}'`]\n const {platform} = platformAndArch()\n if (platform === 'windows') {\n // 'wdm' is required by 'listen', see https://github.com/Shopify/cli/issues/780\n gemFileContent.push(\"gem 'wdm', '>= 0.1.0'\")\n }\n await file.writeFile(gemPath, gemFileContent.join('\\n'))\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 */\nasync function bundleInstallLocalShopifyCLI(): Promise<void> {\n await exec(bundleExecutable(), ['install'], {cwd: shopifyCLIDirectory()})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of the Ruby CLI.\n */\nasync function bundleInstallShopifyCLI() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', shopifyCLIDirectory()], {\n cwd: shopifyCLIDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: shopifyCLIDirectory()})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of theme-check.\n */\nasync function bundleInstallThemeCheck() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', themeCheckDirectory()], {\n cwd: themeCheckDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: themeCheckDirectory()})\n}\n\n/**\n * It returns the directory where the Ruby CLI is located.\n *\n * @returns The absolute path to the directory.\n */\nfunction shopifyCLIDirectory(): string {\n return (\n process.env.SHOPIFY_CLI_2_0_DIRECTORY ??\n joinPath(pathConstants.directories.cache.vendor.path(), 'ruby-cli', RubyCLIVersion)\n )\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 process.env.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"]}
1
+ {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/public/node/ruby.ts"],"names":[],"mappings":"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","sourcesContent":["import {coerceSemverVersion} from './semver.js'\nimport {AbortSignal} from './abort.js'\nimport {platformAndArch} from './os.js'\nimport {captureOutput, exec} from './system.js'\nimport * as file from './fs.js'\nimport {joinPath, cwd} from './path.js'\nimport {AbortError, AbortSilentError} from './error.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/environment/utilities.js'\nimport {Writable} from 'stream'\n\nconst RubyCLIVersion = '2.34.0'\nconst ThemeCheckVersion = '1.14.0'\nconst MinBundlerVersion = '2.3.8'\nconst MinRubyVersion = '2.7.5'\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}\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 await installCLIDependencies(options.stdout ?? process.stdout)\n const env: NodeJS.ProcessEnv = {\n ...process.env,\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 // 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(shopifyCLIDirectory(), 'Gemfile'),\n }\n\n try {\n await exec(bundleExecutable(), ['exec', 'shopify'].concat(args), {\n stdio: 'inherit',\n cwd: options.directory ?? cwd(),\n env,\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 */\nasync function installCLIDependencies(stdout: Writable) {\n const exists = await file.fileExists(shopifyCLIDirectory())\n\n if (!exists) stdout.write('Installing theme dependencies...')\n const usingLocalCLI2 = isTruthy(process.env.SHOPIFY_CLI_2_0_DIRECTORY)\n await validateRubyEnv()\n if (usingLocalCLI2) {\n await bundleInstallLocalShopifyCLI()\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(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 gemPath = joinPath(shopifyCLIDirectory(), 'Gemfile')\n const gemFileContent = [\"source 'https://rubygems.org'\", `gem 'shopify-cli', '${RubyCLIVersion}'`]\n const {platform} = platformAndArch()\n if (platform === 'windows') {\n // 'wdm' is required by 'listen', see https://github.com/Shopify/cli/issues/780\n gemFileContent.push(\"gem 'wdm', '>= 0.1.0'\")\n }\n await file.writeFile(gemPath, gemFileContent.join('\\n'))\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 */\nasync function bundleInstallLocalShopifyCLI(): Promise<void> {\n await exec(bundleExecutable(), ['install'], {cwd: shopifyCLIDirectory()})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of the Ruby CLI.\n */\nasync function bundleInstallShopifyCLI() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', shopifyCLIDirectory()], {\n cwd: shopifyCLIDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: shopifyCLIDirectory()})\n}\n\n/**\n * It runs bundle install for the CLI-managed copy of theme-check.\n */\nasync function bundleInstallThemeCheck() {\n await exec(bundleExecutable(), ['config', 'set', '--local', 'path', themeCheckDirectory()], {\n cwd: themeCheckDirectory(),\n })\n await exec(bundleExecutable(), ['install'], {cwd: themeCheckDirectory()})\n}\n\n/**\n * It returns the directory where the Ruby CLI is located.\n *\n * @returns The absolute path to the directory.\n */\nfunction shopifyCLIDirectory(): string {\n return (\n process.env.SHOPIFY_CLI_2_0_DIRECTORY ??\n joinPath(pathConstants.directories.cache.vendor.path(), 'ruby-cli', RubyCLIVersion)\n )\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 process.env.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"]}
@@ -2,7 +2,7 @@ import { normalizeStoreFqdn } from './environment/fqdn.js';
2
2
  import { BugError } from './error.js';
3
3
  import * as secureStore from '../../private/node/session/store.js';
4
4
  import { exchangeCustomPartnerToken } from '../../private/node/session/exchange.js';
5
- import { content, token, debug } from '../../output.js';
5
+ import { outputContent, outputToken, outputDebug } from '../../public/node/output.js';
6
6
  import { ensureAuthenticated } from '../../private/node/session.js';
7
7
  import { environmentVariables } from '../../private/node/constants.js';
8
8
  /**
@@ -15,8 +15,8 @@ import { environmentVariables } from '../../private/node/constants.js';
15
15
  * @returns The access token for the Partners API.
16
16
  */
17
17
  export async function ensureAuthenticatedPartners(scopes = [], env = process.env) {
18
- debug(content `Ensuring that the user is authenticated with the Partners API with the following scopes:
19
- ${token.json(scopes)}
18
+ outputDebug(outputContent `Ensuring that the user is authenticated with the Partners API with the following scopes:
19
+ ${outputToken.json(scopes)}
20
20
  `);
21
21
  const envToken = env[environmentVariables.partnersToken];
22
22
  if (envToken) {
@@ -38,8 +38,8 @@ ${token.json(scopes)}
38
38
  export async function ensureAuthenticatedStorefront(scopes = [], password = undefined) {
39
39
  if (password)
40
40
  return password;
41
- debug(content `Ensuring that the user is authenticated with the Storefront API with the following scopes:
42
- ${token.json(scopes)}
41
+ outputDebug(outputContent `Ensuring that the user is authenticated with the Storefront API with the following scopes:
42
+ ${outputToken.json(scopes)}
43
43
  `);
44
44
  const tokens = await ensureAuthenticated({ storefrontRendererApi: { scopes } });
45
45
  if (!tokens.storefront) {
@@ -56,8 +56,8 @@ ${token.json(scopes)}
56
56
  * @returns The access token for the Admin API.
57
57
  */
58
58
  export async function ensureAuthenticatedAdmin(store, scopes = [], forceRefresh = false) {
59
- debug(content `Ensuring that the user is authenticated with the Admin API with the following scopes for the store ${token.raw(store)}:
60
- ${token.json(scopes)}
59
+ outputDebug(outputContent `Ensuring that the user is authenticated with the Admin API with the following scopes for the store ${outputToken.raw(store)}:
60
+ ${outputToken.json(scopes)}
61
61
  `);
62
62
  const tokens = await ensureAuthenticated({ adminApi: { scopes, storeFqdn: store } }, process.env, forceRefresh);
63
63
  if (!tokens.admin) {
@@ -77,8 +77,8 @@ ${token.json(scopes)}
77
77
  * @returns The access token and store.
78
78
  */
79
79
  export async function ensureAuthenticatedThemes(store, password, scopes = [], forceRefresh = false) {
80
- debug(content `Ensuring that the user is authenticated with the Theme API with the following scopes:
81
- ${token.json(scopes)}
80
+ outputDebug(outputContent `Ensuring that the user is authenticated with the Theme API with the following scopes:
81
+ ${outputToken.json(scopes)}
82
82
  `);
83
83
  if (password)
84
84
  return { token: password, storeFqdn: await normalizeStoreFqdn(store) };