@shopify/cli-kit 3.1.0 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAA;AACnC,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAC,eAAe,EAAE,KAAK,EAAC,MAAM,YAAY,CAAA;AACjD,OAAO,EAAC,MAAM,EAAE,MAAM,EAAC,MAAM,WAAW,CAAA;AACxC,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAA;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAC,QAAQ,EAAC,MAAM,4BAA4B,CAAA;AACnD,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,KAAK,IAAI,aAAa,EAAyB,cAAc,EAAC,MAAM,QAAQ,CAAA;AAEpF,MAAM,UAAU,QAAQ,CAAC,KAAkB,EAAE,OAAgB;IAC3D,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC/C,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,mBAAmB,GAAa,EAAE,CAAA;QACxC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAiB,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC5D,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;aAC9B;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE;YAC9B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtB,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;oBACtD,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAuB,CAAC,CAAA;gBACrG,CAAC,CAAC,CAAA;gBACF,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACjC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBACjE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;wBACvC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;qBACjC;gBACH,CAAC,CAAC,CAAA;aACH;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAsCD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAIzB,SAAyC,EACzC,kBAAkB,GAAG,KAAK,EACP,EAAE;IACrB,IAAI,CAAC,qBAAqB,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QACtD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAA;;EAEzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;KAClB,CAAC,CAAA;KACH;IAED,IAAI,kBAAkB,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;QACpE,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,IAAI,QAAQ,CAAC,OAAO,EAAE;gBACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;aACvB;YAED,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAA;YAClC,4CAA4C;YAC5C,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;SACrC;QAED,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAa,CAAA;KAC/C;SAAM;QACL,8DAA8D;QAC9D,MAAM,eAAe,GAAU,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,EAAc,CAAA;QAC5B,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE;YACtC,IAAI,QAAQ,CAAC,OAAO,EAAE;gBACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;aACvB;YACD,4CAA4C;YAC5C,KAAK,CAAC,QAAQ,CAAC,IAAsB,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAA;SAC9D;QACD,OAAO,KAAK,CAAA;KACb;AACH,CAAC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IAC7D,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE;QAC3B,MAAM,OAAO,GAAG;YACd,EAAC,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAC;YACpD,EAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAC;SACpD,CAAA;QAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAA;QAE5D,MAAM,SAAS,GAAsB;YACnC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,GAAG,iBAAiB,oFAAoF;YACjH,OAAO,EAAE,OAAO;SACjB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;QAExC,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE;YAC5B,MAAM,IAAI,eAAe,EAAE,CAAA;SAC5B;QAED,MAAM,CAAC,SAAS,CAAC,CAAA;KAClB;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IACjC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CACnC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC/B,OAAO,EAAE,CAAA;IACX,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAED,SAAS,0BAA0B,CAGjC,QAAyB;IACzB,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACrB,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,QAAQ,CAAA;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,cAAc;YACjB,OAAO;gBACL,GAAG,QAAQ;gBACX,IAAI,EAAE,MAAM;aACb,CAAA;KACJ;AACH,CAAC;AAED,SAAS,MAAM,CAAC,QAAkB;IAChC,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACrB,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC5B,KAAK,QAAQ;YACX,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC7B,KAAK,cAAc;YACjB,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAA;QACnC;YACE,OAAO,SAAS,CAAA;KACnB;AACH,CAAC","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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli-kit",
3
- "version": "3.1.0",
3
+ "version": "3.3.1",
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": [
@@ -65,7 +65,7 @@
65
65
  "dependencies": {
66
66
  "@oclif/core": "^1.0",
67
67
  "envfile": "^6.17.0",
68
- "fastify": "^4.0.0-rc.4",
68
+ "fastify": "^4.2.1",
69
69
  "inquirer": "^8.2.4",
70
70
  "keytar": "^7.9.0",
71
71
  "open": "^8.4.0",