@shopify/cli-kit 3.6.2 → 3.9.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 (146) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +61 -0
  3. package/dist/analytics.d.ts +11 -1
  4. package/dist/analytics.js +33 -23
  5. package/dist/analytics.js.map +1 -1
  6. package/dist/api/admin.js.map +1 -1
  7. package/dist/api/common.d.ts +1 -1
  8. package/dist/api/common.js +1 -1
  9. package/dist/api/common.js.map +1 -1
  10. package/dist/api/graphql/extension_specifications.js.map +1 -1
  11. package/dist/api/graphql/functions/app_function_set.d.ts +9 -23
  12. package/dist/api/graphql/functions/app_function_set.js +18 -27
  13. package/dist/api/graphql/functions/app_function_set.js.map +1 -1
  14. package/dist/api/graphql/functions/upload_url_generate.d.ts +12 -0
  15. package/dist/api/graphql/functions/upload_url_generate.js +11 -0
  16. package/dist/api/graphql/functions/upload_url_generate.js.map +1 -0
  17. package/dist/api/graphql/get_urls.d.ts +10 -0
  18. package/dist/api/graphql/get_urls.js +10 -0
  19. package/dist/api/graphql/get_urls.js.map +1 -0
  20. package/dist/api/graphql/index.d.ts +19 -14
  21. package/dist/api/graphql/index.js +19 -14
  22. package/dist/api/graphql/index.js.map +1 -1
  23. package/dist/api/graphql/update_draft.js.map +1 -1
  24. package/dist/api/graphql/update_urls.d.ts +2 -2
  25. package/dist/api/graphql/update_urls.js +2 -2
  26. package/dist/api/graphql/update_urls.js.map +1 -1
  27. package/dist/array.d.ts +1 -1
  28. package/dist/constants.d.ts +3 -1
  29. package/dist/constants.js +3 -1
  30. package/dist/constants.js.map +1 -1
  31. package/dist/content-tokens.d.ts +44 -0
  32. package/dist/content-tokens.js +103 -0
  33. package/dist/content-tokens.js.map +1 -0
  34. package/dist/environment/local.d.ts +19 -2
  35. package/dist/environment/local.js +45 -5
  36. package/dist/environment/local.js.map +1 -1
  37. package/dist/environment/utilities.d.ts +4 -0
  38. package/dist/environment/utilities.js +9 -0
  39. package/dist/environment/utilities.js.map +1 -1
  40. package/dist/error.d.ts +4 -4
  41. package/dist/error.js +16 -4
  42. package/dist/error.js.map +1 -1
  43. package/dist/file.d.ts +9 -1
  44. package/dist/file.js +15 -2
  45. package/dist/file.js.map +1 -1
  46. package/dist/git.js.map +1 -1
  47. package/dist/github.js.map +1 -1
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.js +1 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/metadata.d.ts +180 -12
  52. package/dist/metadata.js +39 -6
  53. package/dist/metadata.js.map +1 -1
  54. package/dist/monorail.d.ts +48 -1
  55. package/dist/monorail.js +2 -1
  56. package/dist/monorail.js.map +1 -1
  57. package/dist/node/archiver.js +1 -0
  58. package/dist/node/archiver.js.map +1 -1
  59. package/dist/node/base-command.d.ts +11 -1
  60. package/dist/node/base-command.js +19 -4
  61. package/dist/node/base-command.js.map +1 -1
  62. package/dist/node/checksum.js.map +1 -1
  63. package/dist/node/cli.js +2 -2
  64. package/dist/node/cli.js.map +1 -1
  65. package/dist/node/dot-env.d.ts +9 -0
  66. package/dist/node/dot-env.js +31 -0
  67. package/dist/node/dot-env.js.map +1 -1
  68. package/dist/node/error-handler.d.ts +14 -2
  69. package/dist/node/error-handler.js +58 -13
  70. package/dist/node/error-handler.js.map +1 -1
  71. package/dist/node/hooks/prerun.js +1 -1
  72. package/dist/node/hooks/prerun.js.map +1 -1
  73. package/dist/node/node-package-manager.d.ts +12 -18
  74. package/dist/node/node-package-manager.js +23 -14
  75. package/dist/node/node-package-manager.js.map +1 -1
  76. package/dist/node/ruby.js +2 -1
  77. package/dist/node/ruby.js.map +1 -1
  78. package/dist/output.d.ts +22 -43
  79. package/dist/output.js +31 -91
  80. package/dist/output.js.map +1 -1
  81. package/dist/path.d.ts +1 -0
  82. package/dist/plugins/tunnel.d.ts +40 -0
  83. package/dist/plugins/tunnel.js +11 -0
  84. package/dist/plugins/tunnel.js.map +1 -0
  85. package/dist/plugins.d.ts +11 -13
  86. package/dist/plugins.js +0 -1
  87. package/dist/plugins.js.map +1 -1
  88. package/dist/session/authorize.js +1 -1
  89. package/dist/session/authorize.js.map +1 -1
  90. package/dist/session/exchange.js +1 -2
  91. package/dist/session/exchange.js.map +1 -1
  92. package/dist/session/post-auth.js +7 -1
  93. package/dist/session/post-auth.js.map +1 -1
  94. package/dist/session/redirect-listener.js +6 -5
  95. package/dist/session/redirect-listener.js.map +1 -1
  96. package/dist/session/validate.js.map +1 -1
  97. package/dist/session.js +1 -1
  98. package/dist/session.js.map +1 -1
  99. package/dist/store.d.ts +4 -2
  100. package/dist/store.js +3 -4
  101. package/dist/store.js.map +1 -1
  102. package/dist/string.d.ts +1 -0
  103. package/dist/string.js +3 -0
  104. package/dist/string.js.map +1 -1
  105. package/dist/system.d.ts +2 -2
  106. package/dist/testing/output.js +6 -6
  107. package/dist/testing/output.js.map +1 -1
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/dist/typing/deep-required.d.ts +12 -0
  110. package/dist/typing/deep-required.js +2 -0
  111. package/dist/typing/deep-required.js.map +1 -0
  112. package/dist/typing/pick-by-prefix.d.ts +12 -0
  113. package/dist/typing/pick-by-prefix.js +2 -0
  114. package/dist/typing/pick-by-prefix.js.map +1 -0
  115. package/dist/ui/executor.d.ts +14 -0
  116. package/dist/ui/executor.js +88 -0
  117. package/dist/ui/executor.js.map +1 -0
  118. package/dist/ui/inquirer/autocomplete.d.ts +11 -0
  119. package/dist/ui/inquirer/autocomplete.js +105 -0
  120. package/dist/ui/inquirer/autocomplete.js.map +1 -0
  121. package/dist/ui/inquirer/input.d.ts +16 -0
  122. package/dist/ui/inquirer/input.js +46 -0
  123. package/dist/ui/inquirer/input.js.map +1 -0
  124. package/dist/ui/inquirer/password.d.ts +7 -0
  125. package/dist/ui/inquirer/password.js +8 -0
  126. package/dist/ui/inquirer/password.js.map +1 -0
  127. package/dist/ui/inquirer/select.d.ts +14 -0
  128. package/dist/ui/inquirer/select.js +27 -0
  129. package/dist/ui/inquirer/select.js.map +1 -0
  130. package/dist/ui.d.ts +12 -23
  131. package/dist/ui.js +14 -61
  132. package/dist/ui.js.map +1 -1
  133. package/dist/version.d.ts +1 -0
  134. package/package.json +23 -13
  135. package/dist/api/graphql/functions/module_upload_url_generate.d.ts +0 -18
  136. package/dist/api/graphql/functions/module_upload_url_generate.js +0 -17
  137. package/dist/api/graphql/functions/module_upload_url_generate.js.map +0 -1
  138. package/dist/ui/autocomplete.d.ts +0 -7
  139. package/dist/ui/autocomplete.js +0 -43
  140. package/dist/ui/autocomplete.js.map +0 -1
  141. package/dist/ui/input.d.ts +0 -7
  142. package/dist/ui/input.js +0 -48
  143. package/dist/ui/input.js.map +0 -1
  144. package/dist/ui/select.d.ts +0 -6
  145. package/dist/ui/select.js +0 -30
  146. package/dist/ui/select.js.map +0 -1
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 {CancelExecution, Abort} from './error.js'\nimport {remove, exists} from './file.js'\nimport {info, completed, content, token, logUpdate, logToFile, Message, Logger, stringifyMessage} from './output.js'\nimport {colors} from './node/colors.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'\nimport findProcess from 'find-process'\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\nconst started = (content: Message, logger: Logger) => {\n const message = `${colors.yellow('❯')} ${stringifyMessage(content)}`\n info(message, logger)\n}\n\nconst failed = (content: Message, logger: Logger) => {\n const message = `${colors.red('✖')} ${stringifyMessage(content)}`\n info(message, logger)\n}\n\n/**\n * Performs a task with the title kept up to date and stdout available to the\n * task while it runs (there is no re-writing stdout while the task runs).\n */\nexport interface TaskOptions {\n title: string\n task: () => Promise<void | {successMessage: string}>\n}\nexport const task = async ({title, task}: TaskOptions) => {\n let success\n started(title, logUpdate)\n try {\n const result = await task()\n success = result?.successMessage || title\n } catch (err) {\n failed(title, logUpdate)\n logUpdate.done()\n throw err\n }\n completed(success, logUpdate)\n logUpdate.done()\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 logPromptResults(question.message, answer)\n results.push([questionName, answer])\n }\n\n return Object.fromEntries(results) as TAnswers\n } else {\n const value = {} as TAnswers\n for (const question of questions) {\n if (question.preface) {\n info(question.preface)\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mappedQuestion: any = mapper(question)\n // eslint-disable-next-line no-await-in-loop\n const answer = await mappedQuestion.run()\n value[question.name as keyof TAnswers] = answer\n logPromptResults(question.message, answer)\n }\n return value\n }\n}\n\nfunction logPromptResults(questionName: string, answer: string) {\n logToFile([questionName, answer].join(' '), 'INFO')\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 async function terminateBlockingPortProcessPrompt(port: number, stepDescription?: string): Promise<boolean> {\n const stepDescriptionContent = stepDescription ?? 'current step'\n\n const processInfo = await findProcess('port', port)\n const formattedProcessName =\n processInfo && processInfo.length > 0 && processInfo[0].name\n ? ` ${content`${token.italic(`(${processInfo[0].name})`)}`.value}`\n : ''\n\n const options = [\n {name: 'Yes, terminate process in order to log in now', value: 'finish'},\n {name: `No, cancel command and try later`, value: 'cancel'},\n ]\n\n const choice = await prompt([\n {\n type: 'select',\n name: 'value',\n message: `${stepDescriptionContent} requires a port ${port} that's unavailable because it's running another process${formattedProcessName}. Terminate that process? `,\n choices: options,\n },\n ])\n return choice.value === 'finish'\n}\n\nexport const keypress = async () => {\n process.stdin.setRawMode(true)\n process.stdin.resume()\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 {CancelExecution, Abort} from './error.js'\nimport {remove, exists} from './file.js'\nimport {info, completed, content, token, logUpdate, logToFile, Message, Logger, stringifyMessage} from './output.js'\nimport {colors} from './node/colors.js'\nimport {relative} from './path.js'\nimport {isTerminalInteractive} from './environment/local.js'\nimport {mapper as mapperUI, run as executorUI} from './ui/executor.js'\nimport {Listr as OriginalListr, ListrTask, ListrEvent, ListrTaskState} from 'listr2'\nimport findProcess from 'find-process'\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\nexport interface Question<TName extends string = 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 type: 'input' | 'select' | 'autocomplete' | 'password'\n choices?: QuestionChoiceType[]\n}\n\nexport interface QuestionChoiceType {\n name: string\n value: string\n group?: {name: string; order: number}\n}\n\nconst started = (content: Message, logger: Logger) => {\n const message = `${colors.yellow('❯')} ${stringifyMessage(content)}`\n info(message, logger)\n}\n\nconst failed = (content: Message, logger: Logger) => {\n const message = `${colors.red('✖')} ${stringifyMessage(content)}`\n info(message, logger)\n}\n\n/**\n * Performs a task with the title kept up to date and stdout available to the\n * task while it runs (there is no re-writing stdout while the task runs).\n */\nexport interface TaskOptions {\n title: string\n task: () => Promise<void | {successMessage: string}>\n}\nexport const task = async ({title, task}: TaskOptions) => {\n let success\n started(title, logUpdate)\n try {\n const result = await task()\n success = result?.successMessage || title\n } catch (err) {\n failed(title, logUpdate)\n logUpdate.done()\n throw err\n }\n completed(success, logUpdate)\n logUpdate.done()\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): 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mappedQuestions: any[] = questions.map(mapperUI)\n const value = {} as TAnswers\n for (const question of mappedQuestions) {\n if (question.preface) {\n info(question.preface)\n }\n\n // eslint-disable-next-line no-await-in-loop\n value[question.name as TName] = await executorUI(question)\n\n logPromptResults(question.message, value[question.name as TName])\n }\n return value\n}\n\nfunction logPromptResults(questionName: string, answer: string) {\n logToFile([questionName, answer].join(' '), 'INFO')\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 await remove(directory)\n }\n}\n\nexport async function terminateBlockingPortProcessPrompt(port: number, stepDescription?: string): Promise<boolean> {\n const stepDescriptionContent = stepDescription ?? 'current step'\n\n const processInfo = await findProcess('port', port)\n const formattedProcessName =\n processInfo && processInfo.length > 0 && processInfo[0]?.name\n ? ` ${content`${token.italic(`(${processInfo[0].name})`)}`.value}`\n : ''\n\n const options = [\n {name: 'Yes, terminate process in order to log in now', value: 'finish'},\n {name: `No, cancel command and try later`, value: 'cancel'},\n ]\n\n const choice = await prompt([\n {\n type: 'select',\n name: 'value',\n message: `${stepDescriptionContent} requires a port ${port} that's unavailable because it's running another process${formattedProcessName}. Terminate that process? `,\n choices: options,\n },\n ])\n return choice.value === 'finish'\n}\n\nexport const keypress = async () => {\n process.stdin.setRawMode(true)\n process.stdin.resume()\n return new Promise<void>((resolve) =>\n process.stdin.once('data', () => {\n process.stdin.setRawMode(false)\n resolve()\n }),\n )\n}\n"]}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import { Bug } from './error.js';
2
3
  export declare const PackageJsonVersionNotFoundError: (packageJsonPath: string) => Bug;
3
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli-kit",
3
- "version": "3.6.2",
3
+ "version": "3.9.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
+ "./plugins/*": {
25
+ "node": "./dist/plugins/*.js",
26
+ "types": "./dist/plugins/*.d.ts"
27
+ },
24
28
  "./common/*": {
25
29
  "node": "./dist/common/*.js",
26
30
  "types": "./dist/common/*.d.ts"
@@ -28,6 +32,10 @@
28
32
  "./testing/*": {
29
33
  "node": "./dist/testing/*.js",
30
34
  "types": "./dist/testing/*.d.ts"
35
+ },
36
+ "./typing/*": {
37
+ "node": "./dist/typing/*.js",
38
+ "types": "./dist/typing/*.d.ts"
31
39
  }
32
40
  },
33
41
  "files": [
@@ -39,14 +47,14 @@
39
47
  "@shopify:registry": "https://registry.npmjs.org"
40
48
  },
41
49
  "scripts": {
42
- "clean": "shx rm -rf dist",
43
- "build": "rimraf dist/ && tsc -b ./tsconfig.build.json",
44
- "prepack": "cross-env NODE_ENV=production yarn run build",
45
- "lint": "eslint \"src/**/*.ts\"",
46
- "lint:fix": "eslint 'src/**/*.ts' --fix",
47
- "test": "vitest run",
48
- "test:watch": "vitest watch",
49
- "tsc": "tsc --noEmit"
50
+ "prepack": "cross-env NODE_ENV=production yarn nx build && cp ../../README.md README.md",
51
+ "build": "nx build",
52
+ "clean": "nx clean",
53
+ "lint": "nx lint",
54
+ "lint:fix": "nx lint:fix",
55
+ "test": "nx test",
56
+ "test:watch": "nx test:watch",
57
+ "type-check": "nx type-check"
50
58
  },
51
59
  "eslintConfig": {
52
60
  "extends": [
@@ -65,7 +73,7 @@
65
73
  "dependencies": {
66
74
  "@bugsnag/js": "^7.16.7",
67
75
  "@iarna/toml": "^2.2.5",
68
- "@oclif/core": "^1.0",
76
+ "@oclif/core": "1.9.2",
69
77
  "@types/archiver": "^5.3.1",
70
78
  "abort-controller": "^3.0.0",
71
79
  "ansi-colors": "^4.1.1",
@@ -76,7 +84,6 @@
76
84
  "conf": "^10.1.2",
77
85
  "cross-zip": "^4.0.0",
78
86
  "del": "^6.0.0",
79
- "enquirer": "^2.3.6",
80
87
  "env-paths": "^3.0.0",
81
88
  "envfile": "^6.17.0",
82
89
  "execa": "^6.0.0",
@@ -87,10 +94,12 @@
87
94
  "find-versions": "^5.0.0",
88
95
  "form-data": "^4.0.0",
89
96
  "fs-extra": "^10.0.0",
97
+ "fuzzy": "^0.1.3",
90
98
  "get-port-please": "^2.5.0",
91
99
  "graphql": "^16.4.0",
92
100
  "graphql-request": "^4.3.0",
93
101
  "inquirer": "^8.2.4",
102
+ "inquirer-autocomplete-prompt": "^2.0.0",
94
103
  "is-interactive": "^2.0.0",
95
104
  "js-yaml": "^4.1.0",
96
105
  "keytar": "^7.9.0",
@@ -103,7 +112,7 @@
103
112
  "node-fetch": "^3.2.4",
104
113
  "open": "^8.4.0",
105
114
  "pathe": "0.2.0",
106
- "prettier": "^2.6.2",
115
+ "prettier": "^2.7.1",
107
116
  "semver": "^7.3.6",
108
117
  "simple-git": "^3.5.0",
109
118
  "source-map-support": "^0.5.21",
@@ -119,10 +128,11 @@
119
128
  "devDependencies": {
120
129
  "@types/commondir": "^1.0.0",
121
130
  "@types/cross-zip": "^4.0.0",
131
+ "@types/diff": "^5.0.2",
122
132
  "@types/inquirer": "^8.2.1",
123
133
  "@types/js-yaml": "^4.0.5",
124
134
  "@types/semver": "^7.3.9",
125
135
  "node-stream-zip": "^1.15.0",
126
- "vitest": "^0.17.1"
136
+ "vitest": "^0.22.1"
127
137
  }
128
138
  }
@@ -1,18 +0,0 @@
1
- export declare const ModuleUploadUrlGenerateMutation: string;
2
- export interface ModuleUploadUrlGenerateMutationSchema {
3
- data: {
4
- moduleUploadUrlGenerate: {
5
- details: {
6
- url: string;
7
- headers: {
8
- [key: string]: string;
9
- };
10
- humanizedMaxSize: string;
11
- };
12
- userErrors: {
13
- field: string;
14
- message: string;
15
- }[];
16
- };
17
- };
18
- }
@@ -1,17 +0,0 @@
1
- import { gql } from 'graphql-request';
2
- export const ModuleUploadUrlGenerateMutation = gql `
3
- mutation moduleUploadUrlGenerate {
4
- moduleUploadUrlGenerate {
5
- details {
6
- url
7
- headers
8
- humanizedMaxSize
9
- }
10
- userErrors {
11
- field
12
- message
13
- }
14
- }
15
- }
16
- `;
17
- //# sourceMappingURL=module_upload_url_generate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"module_upload_url_generate.js","sourceRoot":"","sources":["../../../../src/api/graphql/functions/module_upload_url_generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAA;AAEnC,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAA;;;;;;;;;;;;;;CAcjD,CAAA","sourcesContent":["import {gql} from 'graphql-request'\n\nexport const ModuleUploadUrlGenerateMutation = gql`\n mutation moduleUploadUrlGenerate {\n moduleUploadUrlGenerate {\n details {\n url\n headers\n humanizedMaxSize\n }\n userErrors {\n field\n message\n }\n }\n }\n`\n\nexport interface ModuleUploadUrlGenerateMutationSchema {\n data: {\n moduleUploadUrlGenerate: {\n details: {\n url: string\n headers: {[key: string]: string}\n humanizedMaxSize: string\n }\n userErrors: {\n field: string\n message: string\n }[]\n }\n }\n}\n"]}
@@ -1,7 +0,0 @@
1
- import enquirer from 'enquirer';
2
- export declare class AutoComplete extends enquirer.AutoComplete {
3
- constructor(options: any);
4
- pointer(_choice: unknown, i: number): any;
5
- prefix(_state: unknown): any;
6
- format(): any;
7
- }
@@ -1,43 +0,0 @@
1
- // Enquirer types are totally broken so we need to disable typescript checks for this file
2
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
- // @ts-nocheck
4
- import { colors } from '../node/colors.js';
5
- import enquirer from 'enquirer';
6
- export class AutoComplete extends enquirer.AutoComplete {
7
- constructor(options) {
8
- const originalResult = options.result;
9
- options.result = (value) => {
10
- const answer = this.focused.value || this.focused.name || value;
11
- if (originalResult) {
12
- return originalResult(answer);
13
- }
14
- return answer;
15
- };
16
- super(options);
17
- this.styles.primary = colors.magenta;
18
- this.styles.em = colors.magenta;
19
- }
20
- pointer(_choice, i) {
21
- const color = this.styles.primary;
22
- const showPointer = !this.state.multiple && this.state.index === i;
23
- return showPointer ? color('>') : ' ';
24
- }
25
- prefix(_state) {
26
- const color = this.styles.primary.bold;
27
- return this.state.status === 'submitted' ? color('✔') : color('?');
28
- }
29
- format() {
30
- if (!this.focused)
31
- return this.input;
32
- if (this.options.multiple && this.state.submitted) {
33
- return this.selected.map((ch) => this.styles.primary(ch.message)).join(', ');
34
- }
35
- if (this.state.submitted) {
36
- this.value = this.focused.value;
37
- this.input = this.focused.value;
38
- return this.styles.primary(this.focused.name);
39
- }
40
- return this.input;
41
- }
42
- }
43
- //# sourceMappingURL=autocomplete.js.map
@@ -1 +0,0 @@
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"]}
@@ -1,7 +0,0 @@
1
- import enquirer from 'enquirer';
2
- export declare class Input extends enquirer.StringPrompt {
3
- constructor(options: any);
4
- prefix(_state: unknown): any;
5
- render(): Promise<void>;
6
- formatPassword(): any;
7
- }
package/dist/ui/input.js DELETED
@@ -1,48 +0,0 @@
1
- // Enquirer types are totally broken so we need to disable typescript checks for this file
2
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
- // @ts-nocheck
4
- import { colors } from '../node/colors.js';
5
- import enquirer from 'enquirer';
6
- export class Input extends enquirer.StringPrompt {
7
- constructor(options) {
8
- super(options);
9
- this.styles.primary = colors.magenta;
10
- this.styles.submitted = colors.magenta;
11
- this.styles.danger = colors.red;
12
- this.symbols.pointer = '!';
13
- }
14
- prefix(_state) {
15
- const color = this.styles.primary.bold;
16
- return this.state.status === 'submitted' ? color('✔') : color('?');
17
- }
18
- async render() {
19
- const size = this.state.size;
20
- const prefix = await this.prefix();
21
- const separator = await this.separator();
22
- const message = await this.message();
23
- const color = this.styles.primary;
24
- let prompt = [prefix, message].filter(Boolean).join(' ');
25
- this.state.prompt = prompt;
26
- const output = this.type === 'password' ? await this.formatPassword() : await this.format();
27
- const help = (await this.error()) || (await this.hint());
28
- const underline = '▔'.repeat(Math.max(color.unstyle(output).length - 10, 30));
29
- if (this.state.submitted) {
30
- prompt += ` ${separator} ${output}`;
31
- }
32
- else {
33
- prompt += `\n${color('>')} ${output}\n ${color(underline)}`;
34
- if (help && !prompt.includes(help))
35
- prompt += ` ${help}`;
36
- }
37
- this.clear(size);
38
- this.write([prompt].filter(Boolean).join('\n'));
39
- this.restore();
40
- }
41
- formatPassword() {
42
- if (!this.keypressed)
43
- return '';
44
- const color = this.state.submitted ? this.styles.primary : this.styles.muted;
45
- return color(this.symbols.asterisk.repeat(this.input.length));
46
- }
47
- }
48
- //# sourceMappingURL=input.js.map
@@ -1 +0,0 @@
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"]}
@@ -1,6 +0,0 @@
1
- import enquirer from 'enquirer';
2
- export declare class Select extends enquirer.Select {
3
- constructor(options: any);
4
- pointer(_choice: unknown, i: number): any;
5
- prefix(_state: unknown): any;
6
- }
package/dist/ui/select.js DELETED
@@ -1,30 +0,0 @@
1
- // Enquirer types are totally broken so we need to disable typescript checks for this file
2
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
- // @ts-nocheck
4
- import { colors } from '../node/colors.js';
5
- import enquirer from 'enquirer';
6
- export class Select extends enquirer.Select {
7
- constructor(options) {
8
- const originalResult = options.result;
9
- options.result = (value) => {
10
- const answer = this.focused.value || this.focused.name || value;
11
- if (originalResult) {
12
- return originalResult(answer);
13
- }
14
- return answer;
15
- };
16
- super(options);
17
- this.styles.primary = colors.magenta;
18
- this.styles.em = colors.magenta;
19
- }
20
- pointer(_choice, i) {
21
- const color = this.styles.primary;
22
- const showPointer = !this.state.multiple && this.state.index === i;
23
- return showPointer ? color('>') : ' ';
24
- }
25
- prefix(_state) {
26
- const color = this.styles.primary.bold;
27
- return this.state.status === 'submitted' ? color('✔') : color('?');
28
- }
29
- }
30
- //# sourceMappingURL=select.js.map
@@ -1 +0,0 @@
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"]}