@shopify/cli-kit 3.0.27 → 3.3.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 (56) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/analytics.d.ts +3 -1
  3. package/dist/analytics.js +19 -4
  4. package/dist/analytics.js.map +1 -1
  5. package/dist/api/graphql/find_store_by_domain.d.ts +21 -0
  6. package/dist/api/graphql/find_store_by_domain.js +24 -0
  7. package/dist/api/graphql/find_store_by_domain.js.map +1 -0
  8. package/dist/api/graphql/index.d.ts +1 -0
  9. package/dist/api/graphql/index.js +1 -0
  10. package/dist/api/graphql/index.js.map +1 -1
  11. package/dist/error.js +4 -0
  12. package/dist/error.js.map +1 -1
  13. package/dist/index.d.ts +0 -1
  14. package/dist/index.js +0 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/node/base-command.d.ts +6 -0
  17. package/dist/node/base-command.js +9 -0
  18. package/dist/node/base-command.js.map +1 -0
  19. package/dist/node/cli.js +5 -45
  20. package/dist/node/cli.js.map +1 -1
  21. package/dist/{colors.d.ts → node/colors.d.ts} +0 -0
  22. package/dist/{colors.js → node/colors.js} +0 -0
  23. package/dist/node/colors.js.map +1 -0
  24. package/dist/node/error-handler.d.ts +3 -0
  25. package/dist/node/error-handler.js +79 -0
  26. package/dist/node/error-handler.js.map +1 -0
  27. package/dist/node/hooks/postrun.d.ts +2 -0
  28. package/dist/node/hooks/postrun.js +6 -0
  29. package/dist/node/hooks/postrun.js.map +1 -0
  30. package/dist/node/hooks/prerun.d.ts +2 -0
  31. package/dist/node/hooks/prerun.js +9 -0
  32. package/dist/node/hooks/prerun.js.map +1 -0
  33. package/dist/{dependency.d.ts → node/node-package-manager.d.ts} +92 -23
  34. package/dist/{dependency.js → node/node-package-manager.js} +56 -49
  35. package/dist/node/node-package-manager.js.map +1 -0
  36. package/dist/node/ruby.js +1 -1
  37. package/dist/node/ruby.js.map +1 -1
  38. package/dist/output.d.ts +9 -2
  39. package/dist/output.js +17 -7
  40. package/dist/output.js.map +1 -1
  41. package/dist/port.js +23 -1
  42. package/dist/port.js.map +1 -1
  43. package/dist/tsconfig.tsbuildinfo +1 -1
  44. package/dist/ui/autocomplete.js +1 -1
  45. package/dist/ui/autocomplete.js.map +1 -1
  46. package/dist/ui/input.js +1 -1
  47. package/dist/ui/input.js.map +1 -1
  48. package/dist/ui/select.js +1 -1
  49. package/dist/ui/select.js.map +1 -1
  50. package/dist/ui.js +3 -3
  51. package/dist/ui.js.map +1 -1
  52. package/dist/version.js +1 -1
  53. package/dist/version.js.map +1 -1
  54. package/package.json +8 -4
  55. package/dist/colors.js.map +0 -1
  56. package/dist/dependency.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  // Enquirer types are totally broken so we need to disable typescript checks for this file
2
2
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
3
  // @ts-nocheck
4
- import { colors } from '../colors.js';
4
+ import { colors } from '../node/colors.js';
5
5
  import enquirer from 'enquirer';
6
6
  export class AutoComplete extends enquirer.AutoComplete {
7
7
  constructor(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/ui/autocomplete.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,6DAA6D;AAC7D,cAAc;AACd,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AACnC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,OAAO,YAAa,SAAQ,QAAQ,CAAC,YAAY;IACrD,YAAY,OAAO;QACjB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAA;QACrC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAA;YAE/D,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;aAC9B;YAED,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,CAAS;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;QACjC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;QAClE,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACvC,CAAC;IAED,MAAM,CAAC,MAAe;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAA;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpE,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACpC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAC7E;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;YAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;YAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;SAC9C;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF","sourcesContent":["// Enquirer types are totally broken so we need to disable typescript checks for this file\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport {colors} from '../colors.js'\nimport enquirer from 'enquirer'\n\nexport class AutoComplete extends enquirer.AutoComplete {\n constructor(options) {\n const originalResult = options.result\n options.result = (value) => {\n const answer = this.focused.value || this.focused.name || value\n\n if (originalResult) {\n return originalResult(answer)\n }\n\n return answer\n }\n super(options)\n this.styles.primary = colors.magenta\n this.styles.em = colors.magenta\n }\n\n pointer(_choice: unknown, i: number) {\n const color = this.styles.primary\n const showPointer = !this.state.multiple && this.state.index === i\n return showPointer ? color('>') : ' '\n }\n\n prefix(_state: unknown) {\n const color = this.styles.primary.bold\n return this.state.status === 'submitted' ? color('✔') : color('?')\n }\n\n format() {\n if (!this.focused) return this.input\n if (this.options.multiple && this.state.submitted) {\n return this.selected.map((ch) => this.styles.primary(ch.message)).join(', ')\n }\n if (this.state.submitted) {\n this.value = this.focused.value\n this.input = this.focused.value\n return this.styles.primary(this.focused.name)\n }\n return this.input\n }\n}\n"]}
1
+ {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/ui/autocomplete.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,6DAA6D;AAC7D,cAAc;AACd,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,OAAO,YAAa,SAAQ,QAAQ,CAAC,YAAY;IACrD,YAAY,OAAO;QACjB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAA;QACrC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAA;YAE/D,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;aAC9B;YAED,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,CAAS;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;QACjC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;QAClE,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACvC,CAAC;IAED,MAAM,CAAC,MAAe;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAA;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpE,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACpC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAC7E;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;YAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;YAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;SAC9C;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF","sourcesContent":["// Enquirer types are totally broken so we need to disable typescript checks for this file\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport {colors} from '../node/colors.js'\nimport enquirer from 'enquirer'\n\nexport class AutoComplete extends enquirer.AutoComplete {\n constructor(options) {\n const originalResult = options.result\n options.result = (value) => {\n const answer = this.focused.value || this.focused.name || value\n\n if (originalResult) {\n return originalResult(answer)\n }\n\n return answer\n }\n super(options)\n this.styles.primary = colors.magenta\n this.styles.em = colors.magenta\n }\n\n pointer(_choice: unknown, i: number) {\n const color = this.styles.primary\n const showPointer = !this.state.multiple && this.state.index === i\n return showPointer ? color('>') : ' '\n }\n\n prefix(_state: unknown) {\n const color = this.styles.primary.bold\n return this.state.status === 'submitted' ? color('✔') : color('?')\n }\n\n format() {\n if (!this.focused) return this.input\n if (this.options.multiple && this.state.submitted) {\n return this.selected.map((ch) => this.styles.primary(ch.message)).join(', ')\n }\n if (this.state.submitted) {\n this.value = this.focused.value\n this.input = this.focused.value\n return this.styles.primary(this.focused.name)\n }\n return this.input\n }\n}\n"]}
package/dist/ui/input.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Enquirer types are totally broken so we need to disable typescript checks for this file
2
2
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
3
  // @ts-nocheck
4
- import { colors } from '../colors.js';
4
+ import { colors } from '../node/colors.js';
5
5
  import enquirer from 'enquirer';
6
6
  export class Input extends enquirer.StringPrompt {
7
7
  constructor(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/ui/input.ts"],"names":[],"mappings":"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","sourcesContent":["// Enquirer types are totally broken so we need to disable typescript checks for this file\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport {colors} from '../colors.js'\nimport enquirer from 'enquirer'\n\nexport class Input extends enquirer.StringPrompt {\n constructor(options) {\n super(options)\n this.styles.primary = colors.magenta\n this.styles.submitted = colors.magenta\n this.styles.danger = colors.red\n this.symbols.pointer = '!'\n }\n\n prefix(_state: unknown) {\n const color = this.styles.primary.bold\n return this.state.status === 'submitted' ? color('✔') : color('?')\n }\n\n async render() {\n const size = this.state.size\n const prefix = await this.prefix()\n const separator = await this.separator()\n const message = await this.message()\n const color = this.styles.primary\n\n let prompt = [prefix, message].filter(Boolean).join(' ')\n this.state.prompt = prompt\n\n const output = this.type === 'password' ? await this.formatPassword() : await this.format()\n const help = (await this.error()) || (await this.hint())\n\n const underline = '▔'.repeat(Math.max(color.unstyle(output).length - 10, 30))\n if (this.state.submitted) {\n prompt += ` ${separator} ${output}`\n } else {\n prompt += `\\n${color('>')} ${output}\\n ${color(underline)}`\n if (help && !prompt.includes(help)) prompt += ` ${help}`\n }\n\n this.clear(size)\n this.write([prompt].filter(Boolean).join('\\n'))\n this.restore()\n }\n\n formatPassword() {\n if (!this.keypressed) return ''\n const color = this.state.submitted ? this.styles.primary : this.styles.muted\n return color(this.symbols.asterisk.repeat(this.input.length))\n }\n}\n"]}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/ui/input.ts"],"names":[],"mappings":"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","sourcesContent":["// Enquirer types are totally broken so we need to disable typescript checks for this file\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport {colors} from '../node/colors.js'\nimport enquirer from 'enquirer'\n\nexport class Input extends enquirer.StringPrompt {\n constructor(options) {\n super(options)\n this.styles.primary = colors.magenta\n this.styles.submitted = colors.magenta\n this.styles.danger = colors.red\n this.symbols.pointer = '!'\n }\n\n prefix(_state: unknown) {\n const color = this.styles.primary.bold\n return this.state.status === 'submitted' ? color('✔') : color('?')\n }\n\n async render() {\n const size = this.state.size\n const prefix = await this.prefix()\n const separator = await this.separator()\n const message = await this.message()\n const color = this.styles.primary\n\n let prompt = [prefix, message].filter(Boolean).join(' ')\n this.state.prompt = prompt\n\n const output = this.type === 'password' ? await this.formatPassword() : await this.format()\n const help = (await this.error()) || (await this.hint())\n\n const underline = '▔'.repeat(Math.max(color.unstyle(output).length - 10, 30))\n if (this.state.submitted) {\n prompt += ` ${separator} ${output}`\n } else {\n prompt += `\\n${color('>')} ${output}\\n ${color(underline)}`\n if (help && !prompt.includes(help)) prompt += ` ${help}`\n }\n\n this.clear(size)\n this.write([prompt].filter(Boolean).join('\\n'))\n this.restore()\n }\n\n formatPassword() {\n if (!this.keypressed) return ''\n const color = this.state.submitted ? this.styles.primary : this.styles.muted\n return color(this.symbols.asterisk.repeat(this.input.length))\n }\n}\n"]}
package/dist/ui/select.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Enquirer types are totally broken so we need to disable typescript checks for this file
2
2
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
3
  // @ts-nocheck
4
- import { colors } from '../colors.js';
4
+ import { colors } from '../node/colors.js';
5
5
  import enquirer from 'enquirer';
6
6
  export class Select extends enquirer.Select {
7
7
  constructor(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/ui/select.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,6DAA6D;AAC7D,cAAc;AACd,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AACnC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,OAAO,MAAO,SAAQ,QAAQ,CAAC,MAAM;IACzC,YAAY,OAAO;QACjB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAA;QACrC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAA;YAE/D,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;aAC9B;YAED,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,CAAS;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;QACjC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;QAClE,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACvC,CAAC;IAED,MAAM,CAAC,MAAe;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAA;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpE,CAAC;CACF","sourcesContent":["// Enquirer types are totally broken so we need to disable typescript checks for this file\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport {colors} from '../colors.js'\nimport enquirer from 'enquirer'\n\nexport class Select extends enquirer.Select {\n constructor(options) {\n const originalResult = options.result\n options.result = (value) => {\n const answer = this.focused.value || this.focused.name || value\n\n if (originalResult) {\n return originalResult(answer)\n }\n\n return answer\n }\n super(options)\n this.styles.primary = colors.magenta\n this.styles.em = colors.magenta\n }\n\n pointer(_choice: unknown, i: number) {\n const color = this.styles.primary\n const showPointer = !this.state.multiple && this.state.index === i\n return showPointer ? color('>') : ' '\n }\n\n prefix(_state: unknown) {\n const color = this.styles.primary.bold\n return this.state.status === 'submitted' ? color('✔') : color('?')\n }\n}\n"]}
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/ui/select.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,6DAA6D;AAC7D,cAAc;AACd,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,OAAO,MAAO,SAAQ,QAAQ,CAAC,MAAM;IACzC,YAAY,OAAO;QACjB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAA;QACrC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAA;YAE/D,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;aAC9B;YAED,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,CAAS;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;QACjC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;QAClE,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACvC,CAAC;IAED,MAAM,CAAC,MAAe;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAA;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpE,CAAC;CACF","sourcesContent":["// Enquirer types are totally broken so we need to disable typescript checks for this file\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport {colors} from '../node/colors.js'\nimport enquirer from 'enquirer'\n\nexport class Select extends enquirer.Select {\n constructor(options) {\n const originalResult = options.result\n options.result = (value) => {\n const answer = this.focused.value || this.focused.name || value\n\n if (originalResult) {\n return originalResult(answer)\n }\n\n return answer\n }\n super(options)\n this.styles.primary = colors.magenta\n this.styles.em = colors.magenta\n }\n\n pointer(_choice: unknown, i: number) {\n const color = this.styles.primary\n const showPointer = !this.state.multiple && this.state.index === i\n return showPointer ? color('>') : ' '\n }\n\n prefix(_state: unknown) {\n const color = this.styles.primary.bold\n return this.state.status === 'submitted' ? color('✔') : color('?')\n }\n}\n"]}
package/dist/ui.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AutoComplete } from './ui/autocomplete.js';
2
2
  import { Input } from './ui/input.js';
3
3
  import { Select } from './ui/select.js';
4
- import { Bug, AbortSilent } from './error.js';
4
+ import { CancelExecution, Abort } from './error.js';
5
5
  import { remove, exists } from './file.js';
6
6
  import { info, content, token, logToFile } from './output.js';
7
7
  import { relative } from './path.js';
@@ -36,7 +36,7 @@ export function newListr(tasks, options) {
36
36
  }
37
37
  export const prompt = async (questions, debugForceInquirer = false) => {
38
38
  if (!isTerminalInteractive() && questions.length !== 0) {
39
- throw new Bug(content `
39
+ throw new Abort(content `
40
40
  The CLI prompted in a non-interactive terminal with the following questions:
41
41
  ${token.json(questions)}
42
42
  `);
@@ -83,7 +83,7 @@ export async function nonEmptyDirectoryPrompt(directory) {
83
83
  };
84
84
  const choice = await prompt([questions]);
85
85
  if (choice.value === 'abort') {
86
- throw new AbortSilent();
86
+ throw new CancelExecution();
87
87
  }
88
88
  remove(directory);
89
89
  }
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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","sourcesContent":["import {AutoComplete} from './ui/autocomplete.js'\nimport {Input} from './ui/input.js'\nimport {Select} from './ui/select.js'\nimport {Bug, AbortSilent} from './error.js'\nimport {remove, exists} from './file.js'\nimport {info, content, token, logToFile} from './output.js'\nimport {relative} from './path.js'\nimport {isTerminalInteractive} from './environment/local.js'\nimport {isTruthy} from './environment/utilities.js'\nimport inquirer from 'inquirer'\nimport {Listr as OriginalListr, ListrTask, ListrEvent, ListrTaskState} from 'listr2'\n\nexport function newListr(tasks: ListrTask[], options?: object) {\n const listr = new OriginalListr(tasks, options)\n listr.tasks.forEach((task) => {\n const loggedSubtaskTitles: string[] = []\n task.subscribe((event: ListrEvent) => {\n if (event.type === 'TITLE' && typeof event.data === 'string') {\n logToFile(event.data, 'INFO')\n }\n })\n task.renderHook$.subscribe(() => {\n if (task.hasSubtasks()) {\n const activeSubtasks = task.subtasks.filter((subtask) => {\n return [ListrTaskState.PENDING, ListrTaskState.COMPLETED].includes(subtask.state as ListrTaskState)\n })\n activeSubtasks.forEach((subtask) => {\n if (subtask.title && !loggedSubtaskTitles.includes(subtask.title)) {\n loggedSubtaskTitles.push(subtask.title)\n logToFile(subtask.title, 'INFO')\n }\n })\n }\n })\n })\n return listr\n}\n\nexport type ListrTasks = ConstructorParameters<typeof OriginalListr>[0]\nexport type {ListrTaskWrapper, ListrDefaultRenderer, ListrTask} from 'listr2'\n\ninterface BaseQuestion<TName extends string> {\n name: TName\n message: string\n preface?: string\n validate?: (value: string) => string | true\n default?: string\n result?: (value: string) => string | boolean\n}\n\nexport type InputQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'input'\n}\n\nexport type SelectQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'select'\n choices: string[] | {name: string; value: string}[]\n}\n\nexport type AutocompleteQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'autocomplete'\n choices: string[] | {name: string; value: string}[]\n}\n\nexport type PasswordQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'password'\n}\n\nexport type Question<TName extends string = string> =\n | InputQuestion<TName>\n | SelectQuestion<TName>\n | AutocompleteQuestion<TName>\n | PasswordQuestion<TName>\n\nexport const prompt = async <\n TName extends string & keyof TAnswers,\n TAnswers extends {[key in TName]: string} = {[key in TName]: string},\n>(\n questions: ReadonlyArray<Question<TName>>,\n debugForceInquirer = false,\n): Promise<TAnswers> => {\n if (!isTerminalInteractive() && questions.length !== 0) {\n throw new Bug(content`\nThe CLI prompted in a non-interactive terminal with the following questions:\n${token.json(questions)}\n `)\n }\n\n if (debugForceInquirer || isTruthy(process.env.SHOPIFY_USE_INQUIRER)) {\n const results = []\n for (const question of questions) {\n if (question.preface) {\n info(question.preface)\n }\n\n const questionName = question.name\n // eslint-disable-next-line no-await-in-loop\n const answer = (await inquirer.prompt([convertQuestionForInquirer(question)]))[questionName]\n results.push([questionName, answer])\n }\n\n return Object.fromEntries(results) as TAnswers\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mappedQuestions: any[] = questions.map(mapper)\n const value = {} as TAnswers\n for (const question of mappedQuestions) {\n if (question.preface) {\n info(question.preface)\n }\n // eslint-disable-next-line no-await-in-loop\n value[question.name as keyof TAnswers] = await question.run()\n }\n return value\n }\n}\n\nexport async function nonEmptyDirectoryPrompt(directory: string) {\n if (await exists(directory)) {\n const options = [\n {name: 'No, don’t delete the files', value: 'abort'},\n {name: 'Yes, delete the files', value: 'overwrite'},\n ]\n\n const relativeDirectory = relative(process.cwd(), directory)\n\n const questions: Question<'value'> = {\n type: 'select',\n name: 'value',\n message: `${relativeDirectory} is not an empty directory. Do you want to delete the existing files and continue?`,\n choices: options,\n }\n\n const choice = await prompt([questions])\n\n if (choice.value === 'abort') {\n throw new AbortSilent()\n }\n\n remove(directory)\n }\n}\n\nexport const keypress = async () => {\n process.stdin.setRawMode(true)\n return new Promise<void>((resolve) =>\n process.stdin.once('data', () => {\n process.stdin.setRawMode(false)\n resolve()\n }),\n )\n}\n\nfunction convertQuestionForInquirer<\n TName extends string & keyof TAnswers,\n TAnswers extends {[key in TName]: string} = {[key in TName]: string},\n>(question: Question<TName>): inquirer.DistinctQuestion<TAnswers> {\n switch (question.type) {\n case 'input':\n case 'password':\n return question\n case 'select':\n case 'autocomplete':\n return {\n ...question,\n type: 'list',\n }\n }\n}\n\nfunction mapper(question: Question): unknown {\n switch (question.type) {\n case 'input':\n case 'password':\n return new Input(question)\n case 'select':\n return new Select(question)\n case 'autocomplete':\n return new AutoComplete(question)\n default:\n return undefined\n }\n}\n"]}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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","sourcesContent":["import {AutoComplete} from './ui/autocomplete.js'\nimport {Input} from './ui/input.js'\nimport {Select} from './ui/select.js'\nimport {CancelExecution, Abort} from './error.js'\nimport {remove, exists} from './file.js'\nimport {info, content, token, logToFile} from './output.js'\nimport {relative} from './path.js'\nimport {isTerminalInteractive} from './environment/local.js'\nimport {isTruthy} from './environment/utilities.js'\nimport inquirer from 'inquirer'\nimport {Listr as OriginalListr, ListrTask, ListrEvent, ListrTaskState} from 'listr2'\n\nexport function newListr(tasks: ListrTask[], options?: object) {\n const listr = new OriginalListr(tasks, options)\n listr.tasks.forEach((task) => {\n const loggedSubtaskTitles: string[] = []\n task.subscribe((event: ListrEvent) => {\n if (event.type === 'TITLE' && typeof event.data === 'string') {\n logToFile(event.data, 'INFO')\n }\n })\n task.renderHook$.subscribe(() => {\n if (task.hasSubtasks()) {\n const activeSubtasks = task.subtasks.filter((subtask) => {\n return [ListrTaskState.PENDING, ListrTaskState.COMPLETED].includes(subtask.state as ListrTaskState)\n })\n activeSubtasks.forEach((subtask) => {\n if (subtask.title && !loggedSubtaskTitles.includes(subtask.title)) {\n loggedSubtaskTitles.push(subtask.title)\n logToFile(subtask.title, 'INFO')\n }\n })\n }\n })\n })\n return listr\n}\n\nexport type ListrTasks = ConstructorParameters<typeof OriginalListr>[0]\nexport type {ListrTaskWrapper, ListrDefaultRenderer, ListrTask} from 'listr2'\n\ninterface BaseQuestion<TName extends string> {\n name: TName\n message: string\n preface?: string\n validate?: (value: string) => string | true\n default?: string\n result?: (value: string) => string | boolean\n}\n\nexport type InputQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'input'\n}\n\nexport type SelectQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'select'\n choices: string[] | {name: string; value: string}[]\n}\n\nexport type AutocompleteQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'autocomplete'\n choices: string[] | {name: string; value: string}[]\n}\n\nexport type PasswordQuestion<TName extends string> = BaseQuestion<TName> & {\n type: 'password'\n}\n\nexport type Question<TName extends string = string> =\n | InputQuestion<TName>\n | SelectQuestion<TName>\n | AutocompleteQuestion<TName>\n | PasswordQuestion<TName>\n\nexport const prompt = async <\n TName extends string & keyof TAnswers,\n TAnswers extends {[key in TName]: string} = {[key in TName]: string},\n>(\n questions: ReadonlyArray<Question<TName>>,\n debugForceInquirer = false,\n): Promise<TAnswers> => {\n if (!isTerminalInteractive() && questions.length !== 0) {\n throw new Abort(content`\nThe CLI prompted in a non-interactive terminal with the following questions:\n${token.json(questions)}\n `)\n }\n\n if (debugForceInquirer || isTruthy(process.env.SHOPIFY_USE_INQUIRER)) {\n const results = []\n for (const question of questions) {\n if (question.preface) {\n info(question.preface)\n }\n\n const questionName = question.name\n // eslint-disable-next-line no-await-in-loop\n const answer = (await inquirer.prompt([convertQuestionForInquirer(question)]))[questionName]\n results.push([questionName, answer])\n }\n\n return Object.fromEntries(results) as TAnswers\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mappedQuestions: any[] = questions.map(mapper)\n const value = {} as TAnswers\n for (const question of mappedQuestions) {\n if (question.preface) {\n info(question.preface)\n }\n // eslint-disable-next-line no-await-in-loop\n value[question.name as keyof TAnswers] = await question.run()\n }\n return value\n }\n}\n\nexport async function nonEmptyDirectoryPrompt(directory: string) {\n if (await exists(directory)) {\n const options = [\n {name: 'No, don’t delete the files', value: 'abort'},\n {name: 'Yes, delete the files', value: 'overwrite'},\n ]\n\n const relativeDirectory = relative(process.cwd(), directory)\n\n const questions: Question<'value'> = {\n type: 'select',\n name: 'value',\n message: `${relativeDirectory} is not an empty directory. Do you want to delete the existing files and continue?`,\n choices: options,\n }\n\n const choice = await prompt([questions])\n\n if (choice.value === 'abort') {\n throw new CancelExecution()\n }\n\n remove(directory)\n }\n}\n\nexport const keypress = async () => {\n process.stdin.setRawMode(true)\n return new Promise<void>((resolve) =>\n process.stdin.once('data', () => {\n process.stdin.setRawMode(false)\n resolve()\n }),\n )\n}\n\nfunction convertQuestionForInquirer<\n TName extends string & keyof TAnswers,\n TAnswers extends {[key in TName]: string} = {[key in TName]: string},\n>(question: Question<TName>): inquirer.DistinctQuestion<TAnswers> {\n switch (question.type) {\n case 'input':\n case 'password':\n return question\n case 'select':\n case 'autocomplete':\n return {\n ...question,\n type: 'list',\n }\n }\n}\n\nfunction mapper(question: Question): unknown {\n switch (question.type) {\n case 'input':\n case 'password':\n return new Input(question)\n case 'select':\n return new Select(question)\n case 'autocomplete':\n return new AutoComplete(question)\n default:\n return undefined\n }\n}\n"]}
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { content, token, debug } from './output.js';
2
2
  import { moduleDirectory } from './path.js';
3
3
  import { Bug } from './error.js';
4
- import { findUpAndReadPackageJson } from './dependency.js';
4
+ import { findUpAndReadPackageJson } from './node/node-package-manager.js';
5
5
  import latestVersion from 'latest-version';
6
6
  export const PackageJsonVersionNotFoundError = (packageJsonPath) => {
7
7
  return new Bug(content `The package.json at path ${token.path(packageJsonPath)} doesn't contain a version`);
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AACjD,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAA;AACzC,OAAO,EAAC,GAAG,EAAC,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAC,wBAAwB,EAAC,MAAM,iBAAiB,CAAA;AACxD,OAAO,aAAa,MAAM,gBAAgB,CAAA;AAE1C,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,eAAuB,EAAE,EAAE;IACzE,OAAO,IAAI,GAAG,CAAC,OAAO,CAAA,4BAA4B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAA;AAC5G,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,KAAK,CAAC,OAAO,CAAA,8CAA8C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC7E,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC;AAMD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAoC;IAC7E,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC5D,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAA;IACjE,8DAA8D;IAC9D,MAAM,OAAO,GAAI,WAAW,CAAC,OAAe,CAAC,OAAO,CAAA;IACpD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,+BAA+B,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;KACxD;IACD,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["import {content, token, debug} from './output.js'\nimport {moduleDirectory} from './path.js'\nimport {Bug} from './error.js'\nimport {findUpAndReadPackageJson} from './dependency.js'\nimport latestVersion from 'latest-version'\n\nexport const PackageJsonVersionNotFoundError = (packageJsonPath: string) => {\n return new Bug(content`The package.json at path ${token.path(packageJsonPath)} doesn't contain a version`)\n}\n\n/**\n * Returns the latest available version of an NPM package.\n * @param name {string} The name of the NPM package.\n * @returns A promise to get the latest available version of a package.\n */\nexport async function latestNpmPackageVersion(name: string) {\n debug(content`Getting the latest version of NPM package: ${token.raw(name)}`)\n return latestVersion(name)\n}\n\ninterface FindPackageVersionUpOptions {\n fromModuleURL: URL | string\n}\n\n/**\n * Given a module URL, it traverses the directory hierarchy up until it finds a package.json\n * and then it returns the version in it.\n * @param options {FindPackageVersionUpOptions} Options\n * @returns {Promise<string>} The version if it can find the package.json and it exists. An error otherwise.\n */\nexport async function findPackageVersionUp(options: FindPackageVersionUpOptions): Promise<string> {\n const fromDirectory = moduleDirectory(options.fromModuleURL)\n const packageJson = await findUpAndReadPackageJson(fromDirectory)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const version = (packageJson.content as any).version\n if (!version) {\n throw PackageJsonVersionNotFoundError(packageJson.path)\n }\n return version\n}\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AACjD,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAA;AACzC,OAAO,EAAC,GAAG,EAAC,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAC,wBAAwB,EAAC,MAAM,gCAAgC,CAAA;AACvE,OAAO,aAAa,MAAM,gBAAgB,CAAA;AAE1C,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,eAAuB,EAAE,EAAE;IACzE,OAAO,IAAI,GAAG,CAAC,OAAO,CAAA,4BAA4B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAA;AAC5G,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,KAAK,CAAC,OAAO,CAAA,8CAA8C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC7E,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC;AAMD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAoC;IAC7E,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC5D,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAA;IACjE,8DAA8D;IAC9D,MAAM,OAAO,GAAI,WAAW,CAAC,OAAe,CAAC,OAAO,CAAA;IACpD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,+BAA+B,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;KACxD;IACD,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["import {content, token, debug} from './output.js'\nimport {moduleDirectory} from './path.js'\nimport {Bug} from './error.js'\nimport {findUpAndReadPackageJson} from './node/node-package-manager.js'\nimport latestVersion from 'latest-version'\n\nexport const PackageJsonVersionNotFoundError = (packageJsonPath: string) => {\n return new Bug(content`The package.json at path ${token.path(packageJsonPath)} doesn't contain a version`)\n}\n\n/**\n * Returns the latest available version of an NPM package.\n * @param name {string} The name of the NPM package.\n * @returns A promise to get the latest available version of a package.\n */\nexport async function latestNpmPackageVersion(name: string) {\n debug(content`Getting the latest version of NPM package: ${token.raw(name)}`)\n return latestVersion(name)\n}\n\ninterface FindPackageVersionUpOptions {\n fromModuleURL: URL | string\n}\n\n/**\n * Given a module URL, it traverses the directory hierarchy up until it finds a package.json\n * and then it returns the version in it.\n * @param options {FindPackageVersionUpOptions} Options\n * @returns {Promise<string>} The version if it can find the package.json and it exists. An error otherwise.\n */\nexport async function findPackageVersionUp(options: FindPackageVersionUpOptions): Promise<string> {\n const fromDirectory = moduleDirectory(options.fromModuleURL)\n const packageJson = await findUpAndReadPackageJson(fromDirectory)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const version = (packageJson.content as any).version\n if (!version) {\n throw PackageJsonVersionNotFoundError(packageJson.path)\n }\n return version\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli-kit",
3
- "version": "3.0.27",
3
+ "version": "3.3.0",
4
4
  "private": false,
5
5
  "description": "A set of utilities, interfaces, and models that are common across all the platform features",
6
6
  "keywords": [
@@ -21,6 +21,10 @@
21
21
  "node": "./dist/node/*.js",
22
22
  "types": "./dist/node/*.d.ts"
23
23
  },
24
+ "./common/*": {
25
+ "node": "./dist/common/*.js",
26
+ "types": "./dist/common/*.d.ts"
27
+ },
24
28
  "./testing/*": {
25
29
  "node": "./dist/testing/*.js",
26
30
  "types": "./dist/testing/*.d.ts"
@@ -51,7 +55,7 @@
51
55
  },
52
56
  "engine-strict": true,
53
57
  "engines": {
54
- "node": "^14.13.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
58
+ "node": ">=14.13.1"
55
59
  },
56
60
  "os": [
57
61
  "darwin",
@@ -61,7 +65,7 @@
61
65
  "dependencies": {
62
66
  "@oclif/core": "^1.0",
63
67
  "envfile": "^6.17.0",
64
- "fastify": "^4.0.0-rc.4",
68
+ "fastify": "^4.2.1",
65
69
  "inquirer": "^8.2.4",
66
70
  "keytar": "^7.9.0",
67
71
  "open": "^8.4.0",
@@ -113,6 +117,6 @@
113
117
  "@types/inquirer": "^8.2.1",
114
118
  "@types/js-yaml": "^4.0.5",
115
119
  "@types/semver": "^7.3.9",
116
- "vitest": "^0.15.1"
120
+ "vitest": "^0.17.1"
117
121
  }
118
122
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,QAAQ,CAAA;AAEpC;;;GAGG;AACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA","sourcesContent":["import {createRequire} from 'module'\n\n/**\n * ansi-colors is a commonjs dependency that can be imported as a module.\n * This file is a wrapper to require and export ansi-colors.\n */\nconst require = createRequire(import.meta.url)\nexport const colors = require('ansi-colors')\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../src/dependency.ts"],"names":[],"mappings":"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","sourcesContent":["import {exec} from './system.js'\nimport {exists as fileExists, read as readFile} from './file.js'\nimport {glob, dirname, join as pathJoin, findUp} from './path.js'\nimport {Abort, Bug} from './error.js'\nimport {latestNpmPackageVersion} from './version.js'\nimport {Version} from './semver.js'\nimport {content, token, debug} from './output.js'\nimport {AbortController, AbortSignal} from 'abort-controller'\nimport type {Writable} from 'node:stream'\nimport type {ExecOptions} from './system.js'\n\nexport const genericConfigurationFileNames = {\n yarn: {\n lockfile: 'yarn.lock',\n },\n pnpm: {\n lockfile: 'pnpm-lock.yaml',\n },\n} as const\n\nexport const dependencyManager = ['yarn', 'npm', 'pnpm'] as const\nexport type DependencyManager = typeof dependencyManager[number]\n\nexport const PackageJsonNotFoundError = (directory: string) => {\n return new Abort(`The directory ${directory} doesn't have a package.json.`)\n}\n\nexport const FindUpAndReadPackageJsonNotFoundError = (directory: string) => {\n return new Bug(content`Couldn't find a a package.json traversing directories from ${token.path(directory)}`)\n}\n\n/**\n * Returns the dependency manager used to run the create workflow.\n * @param env {Object} The environment variables of the process in which the CLI runs.\n * @returns The dependency manager\n */\nexport function dependencyManagerUsedForCreating(env = process.env): DependencyManager {\n if (env.npm_config_user_agent?.includes('yarn')) {\n return 'yarn'\n } else if (env.npm_config_user_agent?.includes('pnpm')) {\n return 'pnpm'\n } else {\n return 'npm'\n }\n}\n\n/**\n * Returns the dependency manager used by an existing project.\n * @param directory {string} The root directory of the project.\n * @returns The dependency manager\n */\nexport async function getDependencyManager(directory: string): Promise<DependencyManager> {\n debug(content`Obtaining the dependency manager in directory ${token.path(directory)}...`)\n const yarnLockPath = pathJoin(directory, genericConfigurationFileNames.yarn.lockfile)\n const pnpmLockPath = pathJoin(directory, genericConfigurationFileNames.pnpm.lockfile)\n if (await fileExists(yarnLockPath)) {\n return 'yarn'\n } else if (await fileExists(pnpmLockPath)) {\n return 'pnpm'\n } else {\n return 'npm'\n }\n}\n\ninterface InstallNPMDependenciesRecursivelyOptions {\n /**\n * The dependency manager to use to install the dependencies.\n */\n dependencyManager: DependencyManager\n /**\n * The directory from where we'll find package.json's recursively\n */\n directory: string\n\n /**\n * Specifies the maximum depth of the glob search.\n */\n deep?: number\n}\n\n/**\n * This function traverses down a directory tree to find directories containing a package.json\n * and installs the dependencies if needed. To know if it's needed, it uses the \"check\" command\n * provided by dependency managers.\n * @param options {InstallNPMDependenciesRecursivelyOptions} Options to install dependencies recursively.\n */\nexport async function installNPMDependenciesRecursively(options: InstallNPMDependenciesRecursivelyOptions) {\n const packageJsons = await glob(pathJoin(options.directory, '**/package.json'), {\n ignore: [pathJoin(options.directory, 'node_modules/**/package.json')],\n cwd: options.directory,\n onlyFiles: true,\n deep: options.deep,\n })\n const abortController = new AbortController()\n try {\n await Promise.all(\n packageJsons.map(async (packageJsonPath) => {\n const directory = dirname(packageJsonPath)\n await install(directory, options.dependencyManager, undefined, undefined, abortController.signal)\n }),\n )\n } catch (error) {\n abortController.abort()\n throw error\n }\n}\n\n/**\n * Installs the dependencies in the given directory.\n * @param directory {string} The directory that contains the package.json\n * @param dependencyManager {DependencyManager} The dependency manager to use to install the dependencies.\n * @param stdout {Writable} Standard output stream.\n * @param stderr {Writable} Standard error stream.\n * @param signal {AbortSignal} Abort signal.\n * @returns stderr {Writable} Standard error stream.\n */\nexport async function install(\n directory: string,\n dependencyManager: DependencyManager,\n stdout?: Writable,\n stderr?: Writable,\n signal?: AbortSignal,\n) {\n const options: ExecOptions = {cwd: directory, stdin: undefined, stdout, stderr, signal}\n await exec(dependencyManager, ['install'], options)\n}\n\n/**\n * Returns the name of the package configured in its package.json\n * @param packageJsonPath {string} Path to the package.json file\n * @returns A promise that resolves with the name.\n */\nexport async function getPackageName(packageJsonPath: string): Promise<string> {\n const packageJsonContent = await packageJSONContents(packageJsonPath)\n return packageJsonContent.name\n}\n\n/**\n * Returns the list of production and dev dependencies of a package.json\n * @param packageJsonPath {string} Path to the package.json file\n * @returns A promise that resolves with the list of dependencies.\n */\nexport async function getDependencies(packageJsonPath: string): Promise<{[key: string]: string}> {\n const packageJsonContent = await packageJSONContents(packageJsonPath)\n const dependencies: {[key: string]: string} = packageJsonContent.dependencies ?? {}\n const devDependencies: {[key: string]: string} = packageJsonContent.devDependencies ?? {}\n\n return {...dependencies, ...devDependencies}\n}\n\nexport async function checkForNewVersion(dependency: string, currentVersion: string): Promise<string | undefined> {\n debug(content`Checking if there's a version of ${dependency} newer than ${currentVersion}`)\n try {\n const lastVersion = await latestNpmPackageVersion(dependency)\n if (lastVersion && new Version(currentVersion).compare(lastVersion) < 0) {\n return lastVersion\n } else {\n return undefined\n }\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error) {\n return undefined\n }\n}\n\nexport function getOutputUpdateCLIReminder(dependencyManager: DependencyManager, version: string): string {\n const updateCommand = token.packagejsonScript(dependencyManager, 'shopify', 'upgrade')\n return content`💡 Version ${version} available! Run ${updateCommand}`.value\n}\n\ninterface PackageJSONContents {\n name: string\n version?: string\n dependencies?: {[key: string]: string}\n devDependencies?: {[key: string]: string}\n}\n\nexport async function packageJSONContents(packageJsonPath: string): Promise<PackageJSONContents> {\n if (!(await fileExists(packageJsonPath))) {\n throw PackageJsonNotFoundError(dirname(packageJsonPath))\n }\n return JSON.parse(await readFile(packageJsonPath))\n}\n\nexport type DependencyType = 'dev' | 'prod' | 'peer'\n\ninterface AddNPMDependenciesIfNeededOptions {\n /** How dependencies should be added */\n type: DependencyType\n\n /** The dependency manager to use to add dependencies */\n dependencyManager: DependencyManager\n\n /** The directory that contains the package.json where dependencies will be added */\n directory: string\n\n /** Standard output coming from the underlying installation process */\n stdout?: Writable\n\n /** Standard error coming from the underlying installation process */\n stderr?: Writable\n\n /** Abort signal to stop the process */\n signal?: AbortSignal\n}\n\nexport interface DependencyVersion {\n name: string\n version: string | undefined\n}\n\n/**\n * Adds dependencies to a Node project (i.e. a project that has a package.json)\n * @param dependencies {string[]} List of dependencies to be added.\n * @param options {AddNPMDependenciesIfNeededOptions} Options for adding dependencies.\n */\nexport async function addNPMDependenciesIfNeeded(\n dependencies: DependencyVersion[],\n options: AddNPMDependenciesIfNeededOptions,\n force = false,\n) {\n debug(content`Adding the following dependencies if needed:\n${token.json(dependencies)}\nWith options:\n${token.json(options)}\n `)\n const packageJsonPath = pathJoin(options.directory, 'package.json')\n if (!(await fileExists(packageJsonPath))) {\n throw PackageJsonNotFoundError(options.directory)\n }\n const existingDependencies = Object.keys(await getDependencies(packageJsonPath))\n let dependenciesToAdd = dependencies\n if (!force) {\n dependenciesToAdd = dependencies.filter((dep) => {\n return !existingDependencies.includes(dep.name)\n })\n }\n if (dependenciesToAdd.length === 0) {\n return\n }\n let args: string[]\n const depedenciesWithVersion = dependenciesToAdd.map((dep) => {\n return dep.version ? `${dep.name}@${dep.version}` : dep.name\n })\n switch (options.dependencyManager) {\n case 'npm':\n args = argumentsToAddDependenciesWithNPM(depedenciesWithVersion, options.type)\n break\n case 'yarn':\n args = argumentsToAddDependenciesWithYarn(depedenciesWithVersion, options.type)\n break\n case 'pnpm':\n args = argumentsToAddDependenciesWithPNPM(depedenciesWithVersion, options.type)\n break\n }\n options.stdout?.write(`Executing...${args.join(' ')}`)\n await exec(options.dependencyManager, args, {\n cwd: options.directory,\n stdout: options.stdout,\n stderr: options.stderr,\n signal: options.signal,\n })\n}\n\nexport async function addNPMDependenciesWithoutVersionIfNeeded(\n dependencies: string[],\n options: AddNPMDependenciesIfNeededOptions,\n) {\n await addNPMDependenciesIfNeeded(\n dependencies.map((dependency) => {\n return {name: dependency, version: undefined}\n }),\n options,\n )\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Switch it around so add-if-needed depends on this, rather than calling\n// if-needed with force: true which is counterintuitive.\nexport async function addLatestNPMDependencies(dependencies: string[], options: AddNPMDependenciesIfNeededOptions) {\n await addNPMDependenciesIfNeeded(\n dependencies.map((dependency) => {\n return {name: dependency, version: 'latest'}\n }),\n options,\n true,\n )\n}\n\n/**\n * Returns the arguments to add dependencies using NPM.\n * @param dependencies {string[]} The list of dependencies to add\n * @param type {DependencyType} The dependency type.\n * @returns {string[]} An array with the arguments.\n */\nfunction argumentsToAddDependenciesWithNPM(dependencies: string[], type: DependencyType): string[] {\n let command = ['install']\n command = command.concat(dependencies)\n switch (type) {\n case 'dev':\n command.push('--save-dev')\n break\n case 'peer':\n command.push('--save-peer')\n break\n case 'prod':\n command.push('--save-prod')\n break\n }\n return command\n}\n\n/**\n * Returns the arguments to add dependencies using Yarn.\n * @param dependencies {string[]} The list of dependencies to add\n * @param type {DependencyType} The dependency type.\n * @returns {string[]} An array with the arguments.\n */\nfunction argumentsToAddDependenciesWithYarn(dependencies: string[], type: DependencyType): string[] {\n let command = ['add']\n command = command.concat(dependencies)\n switch (type) {\n case 'dev':\n command.push('--dev')\n break\n case 'peer':\n command.push('--peer')\n break\n case 'prod':\n command.push('--prod')\n break\n }\n return command\n}\n\n/**\n * Returns the arguments to add dependencies using PNPM.\n * @param dependencies {string[]} The list of dependencies to add\n * @param type {DependencyType} The dependency type.\n * @returns {string[]} An array with the arguments.\n */\nfunction argumentsToAddDependenciesWithPNPM(dependencies: string[], type: DependencyType): string[] {\n let command = ['add']\n command = command.concat(dependencies)\n switch (type) {\n case 'dev':\n command.push('--save-dev')\n break\n case 'peer':\n command.push('--save-peer')\n break\n case 'prod':\n command.push('--save-prod')\n break\n }\n return command\n}\n\nexport type ProjectType = 'node' | 'php' | 'ruby' | undefined\n\nexport async function getProjectType(directory: string): Promise<ProjectType> {\n const nodeConfigFile = pathJoin(directory, 'package.json')\n const rubyConfigFile = pathJoin(directory, 'Gemfile')\n const phpConfigFile = pathJoin(directory, 'composer.json')\n\n if (await fileExists(nodeConfigFile)) {\n return 'node'\n } else if (await fileExists(rubyConfigFile)) {\n return 'ruby'\n } else if (await fileExists(phpConfigFile)) {\n return 'php'\n }\n return undefined\n}\n\n/**\n * Given a directory it traverses the directory up looking for a package.json and if found, it reads it\n * decodes the JSON, and returns its content as a Javascript object.\n * @param options {string} The directory from which traverse up.\n * @returns {Promise<{path: string; content: unknown}>} If found, the promise resolves with the path to the\n * package.json and its content. If not found, it throws a FindUpAndReadPackageJsonNotFoundError error.\n */\nexport async function findUpAndReadPackageJson(fromDirectory: string): Promise<{path: string; content: unknown}> {\n const packageJsonPath = await findUp('package.json', {cwd: fromDirectory, type: 'file'})\n if (packageJsonPath) {\n const packageJson = JSON.parse(await readFile(packageJsonPath))\n return {path: packageJsonPath, content: packageJson}\n } else {\n throw FindUpAndReadPackageJsonNotFoundError(fromDirectory)\n }\n}\n"]}