create-react-native-library 0.55.1 → 0.55.2

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/lib/input.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"input.js","names":["_fsExtra","_interopRequireDefault","require","_githubUsername","_path","_validateNpmPackageName","_package","_constants","_spawn","_configureTools","e","__esModule","default","LANGUAGE_CHOICES","title","value","types","EXAMPLE_CHOICES","description","disabled","process","env","CRNL_ENABLE_TEST_APP","filter","choice","TYPE_CHOICES","acceptedArgs","exports","type","choices","map","SUPPORTED_REACT_NATIVE_VERSION","Object","keys","AVAILABLE_TOOLS","createQuestions","name","local","fullname","email","spawn","validateDirectory","input","targetPath","path","join","cwd","fs","pathExistsSync","stat","statSync","isDirectory","files","readdirSync","isEmpty","length","questions","pathExists","message","initial","_","answers","includes","sep","validate","basename","directory","validateNpmPackage","validForNewPackages","test","Boolean","authorEmail","username","githubUsername","authorUrl","slug","replace","values","entries","key","tool","selected","createMetadata","ignoredAnswers","libraryMetadata","fromEntries","answer","version"],"sources":["../src/input.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport githubUsername from 'github-username';\nimport path from 'path';\nimport validateNpmPackage from 'validate-npm-package-name';\nimport type * as yargs from 'yargs';\nimport { version } from '../package.json';\nimport { SUPPORTED_REACT_NATIVE_VERSION } from './constants';\nimport type { Question } from './utils/prompt';\nimport { spawn } from './utils/spawn';\nimport { AVAILABLE_TOOLS } from './utils/configureTools';\n\nexport type ProjectLanguages = 'kotlin-objc' | 'kotlin-swift' | 'js';\n\nexport type ProjectType =\n | 'turbo-module'\n | 'fabric-view'\n | 'nitro-module'\n | 'nitro-view'\n | 'library';\n\nconst LANGUAGE_CHOICES: {\n title: string;\n value: ProjectLanguages;\n types: ProjectType[];\n}[] = [\n {\n title: 'Kotlin & Swift',\n value: 'kotlin-swift',\n types: ['nitro-module', 'nitro-view'],\n },\n {\n title: 'Kotlin & Objective-C',\n value: 'kotlin-objc',\n types: ['turbo-module', 'fabric-view'],\n },\n {\n title: 'JavaScript for Android, iOS & Web',\n value: 'js',\n types: ['library'],\n },\n];\n\nconst EXAMPLE_CHOICES = (\n [\n {\n title: 'App with Community CLI',\n value: 'vanilla',\n description: \"provides access to app's native code\",\n disabled: false,\n },\n {\n title: 'Test App by Microsoft',\n value: 'test-app',\n description: \"app's native code is abstracted away\",\n // Test App currently doesn't work with React Native 0.79.2\n // due to missing `Gemfile` in the template\n disabled: !process.env.CRNL_ENABLE_TEST_APP,\n },\n {\n title: 'App with Expo CLI',\n value: 'expo',\n description: 'managed expo app with web support',\n disabled: false,\n },\n ] as const\n).filter((choice) => !choice.disabled);\n\nconst TYPE_CHOICES: {\n title: string;\n value: ProjectType;\n description: string;\n}[] = [\n {\n title: 'Turbo module',\n value: 'turbo-module',\n description: 'integration for native APIs to JS',\n },\n {\n title: 'Fabric view',\n value: 'fabric-view',\n description: 'integration for native views to JS',\n },\n {\n title: 'Nitro module',\n value: 'nitro-module',\n description:\n 'type-safe, fast integration for native APIs to JS (experimental)',\n },\n {\n title: 'Nitro view',\n value: 'nitro-view',\n description:\n 'integration for native views to JS using nitro for prop parsing (experimental)',\n },\n {\n title: 'JavaScript library',\n value: 'library',\n description: 'supports Expo Go and Web',\n },\n];\n\nexport const acceptedArgs = {\n 'slug': {\n description: 'Name of the npm package',\n type: 'string',\n },\n 'description': {\n description: 'Description of the npm package',\n type: 'string',\n },\n 'author-name': {\n description: 'Name of the package author',\n type: 'string',\n },\n 'author-email': {\n description: 'Email address of the package author',\n type: 'string',\n },\n 'author-url': {\n description: 'URL for the package author',\n type: 'string',\n },\n 'repo-url': {\n description: 'URL for the repository',\n type: 'string',\n },\n 'languages': {\n description: 'Languages you want to use',\n choices: LANGUAGE_CHOICES.map(({ value }) => value),\n },\n 'type': {\n description: 'Type of library you want to develop',\n choices: TYPE_CHOICES.map(({ value }) => value),\n },\n 'react-native-version': {\n description: 'Version of React Native to use',\n type: 'string',\n default: SUPPORTED_REACT_NATIVE_VERSION,\n },\n 'local': {\n description: 'Whether to create a local library',\n type: 'boolean',\n },\n 'example': {\n description: 'Type of the example app to create',\n type: 'string',\n choices: EXAMPLE_CHOICES.map(({ value }) => value),\n },\n 'tools': {\n description: 'Tools to configure',\n type: 'array',\n choices: Object.keys(AVAILABLE_TOOLS),\n },\n 'interactive': {\n description: 'Whether to run in interactive mode',\n type: 'boolean',\n },\n} as const satisfies Record<string, yargs.Options>;\n\nexport type ExampleApp = 'none' | 'test-app' | 'expo' | 'vanilla';\n\ntype PromptAnswers = {\n directory: string;\n slug: string;\n description: string;\n authorName: string;\n authorEmail: string;\n authorUrl: string;\n repoUrl: string;\n languages: ProjectLanguages;\n type: ProjectType;\n example: ExampleApp;\n tools: string[];\n local: boolean;\n};\n\nexport type Answers = PromptAnswers & {\n name?: string;\n reactNativeVersion?: string;\n interactive?: boolean;\n};\n\nexport async function createQuestions({\n name,\n local,\n}: {\n name?: string;\n local?: boolean;\n}) {\n let fullname, email;\n\n try {\n fullname = await spawn('git', ['config', '--get', 'user.name']);\n email = await spawn('git', ['config', '--get', 'user.email']);\n } catch (e) {\n // Ignore error\n }\n\n const validateDirectory = (input: string) => {\n if (!input) {\n return 'Cannot be empty';\n }\n\n const targetPath = path.join(process.cwd(), input);\n\n if (fs.pathExistsSync(targetPath)) {\n const stat = fs.statSync(targetPath);\n\n if (!stat.isDirectory()) {\n return 'Path exists and is not a directory';\n }\n\n const files = fs.readdirSync(targetPath);\n\n const isEmpty =\n files.length === 0 || (files.length === 1 && files[0] === '.git');\n\n if (!isEmpty) {\n return 'Directory already exists';\n }\n }\n\n return true;\n };\n\n const questions: Question<keyof PromptAnswers>[] = [\n {\n type:\n local == null &&\n (await fs.pathExists(path.join(process.cwd(), 'package.json')))\n ? 'confirm'\n : null,\n name: 'local',\n message: `Looks like you're under a project folder. Do you want to create a local library?`,\n initial: local,\n default: false,\n },\n {\n type: (_, answers) => {\n if (\n name &&\n !(answers.local ?? local) &&\n validateDirectory(name) === true\n ) {\n return null;\n }\n\n return 'text';\n },\n name: 'directory',\n message: `Where do you want to create the library?`,\n initial: (_, answers) => {\n if ((answers.local ?? local) && name && !name?.includes(path.sep)) {\n return path.join('modules', name);\n }\n\n return name ?? '';\n },\n validate: validateDirectory,\n default: name,\n },\n {\n type: 'text',\n name: 'slug',\n message: 'What is the name of the npm package?',\n initial: (_, answers) => {\n const basename = path.basename(\n typeof answers.directory === 'string'\n ? answers.directory\n : (name ?? '')\n );\n\n if (validateNpmPackage(basename).validForNewPackages) {\n if (/^(@|react-native)/.test(basename)) {\n return basename;\n }\n\n return `react-native-${basename}`;\n }\n\n return '';\n },\n validate: (input) =>\n validateNpmPackage(input).validForNewPackages ||\n 'Must be a valid npm package name',\n },\n {\n type: 'text',\n name: 'description',\n message: 'What is the description for the package?',\n validate: (input) => Boolean(input) || 'Cannot be empty',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorName',\n message: 'What is the name of package author?',\n initial: fullname,\n validate: (input) => Boolean(input) || 'Cannot be empty',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorEmail',\n message: 'What is the email address for the package author?',\n initial: email,\n validate: (input) =>\n /^\\S+@\\S+$/.test(input) || 'Must be a valid email address',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'authorUrl',\n message: 'What is the URL for the package author?',\n initial: async (_, answers) => {\n if (typeof answers.authorEmail !== 'string') {\n return '';\n }\n\n try {\n const username = await githubUsername(answers.authorEmail);\n\n if (username) {\n return `https://github.com/${username}`;\n }\n } catch (e) {\n // Ignore error\n }\n\n return '';\n },\n validate: (input) => /^https?:\\/\\//.test(input) || 'Must be a valid URL',\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'text'),\n name: 'repoUrl',\n message: 'What is the URL for the repository?',\n initial: (_, answers) => {\n if (\n typeof answers.authorUrl === 'string' &&\n typeof answers.slug === 'string' &&\n /^https?:\\/\\/github.com\\/[^/]+/.test(answers.authorUrl)\n ) {\n return `${answers.authorUrl}/${answers.slug\n .replace(/^@/, '')\n .replace(/\\//g, '-')}`;\n }\n\n return '';\n },\n validate: (input) => /^https?:\\/\\//.test(input) || 'Must be a valid URL',\n },\n {\n type: 'select',\n name: 'type',\n message: 'What type of library do you want to develop?',\n choices: TYPE_CHOICES,\n },\n {\n type: 'select',\n name: 'languages',\n message: 'Which languages do you want to use?',\n choices: (_, values) => {\n return LANGUAGE_CHOICES.filter((choice) => {\n if (choice.types && typeof values.type === 'string') {\n // @ts-expect-error `includes doesn't support checking arbitrary types\n return choice.types.includes(values.type);\n }\n\n return true;\n });\n },\n },\n {\n type: 'select',\n name: 'example',\n message: 'What type of example app do you want to create?',\n choices: (_, values) => {\n if (local) {\n return [\n {\n title: 'None',\n value: 'none',\n },\n ];\n }\n\n return EXAMPLE_CHOICES.filter((choice) => {\n if (values.type) {\n return values.type === 'library'\n ? choice.value === 'expo'\n : choice.value !== 'expo';\n }\n\n return true;\n });\n },\n },\n {\n type: (_, answers) => ((answers.local ?? local) ? null : 'multiselect'),\n name: 'tools',\n message: 'Which tools do you want to configure?',\n choices: Object.entries(AVAILABLE_TOOLS).map(([key, tool]) => ({\n value: key,\n title: tool.name,\n description: tool.description,\n selected: true,\n })),\n },\n ];\n\n return questions;\n}\n\nexport function createMetadata(answers: Partial<PromptAnswers>) {\n // Some of the passed args can already be derived from the generated package.json file.\n const ignoredAnswers: (keyof Answers)[] = [\n 'name',\n 'directory',\n 'slug',\n 'description',\n 'authorName',\n 'authorEmail',\n 'authorUrl',\n 'repoUrl',\n 'example',\n 'reactNativeVersion',\n 'local',\n 'interactive',\n ];\n\n type AnswerEntries<T extends keyof PromptAnswers = keyof PromptAnswers> = [\n T,\n PromptAnswers[T],\n ][];\n\n const libraryMetadata = Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n (Object.entries(answers) as AnswerEntries).filter(\n ([answer]) => !ignoredAnswers.includes(answer)\n )\n );\n\n libraryMetadata.version = version;\n\n return libraryMetadata;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,182 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.prompt = prompt;
7
- var _kleur = _interopRequireDefault(require("kleur"));
8
- var _prompts = _interopRequireDefault(require("prompts"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
- /**
11
- * Wrapper around `prompts` with additional features:
12
- *
13
- * - Improved type-safety
14
- * - Read answers from passed arguments
15
- * - Skip questions with a single choice
16
- * - Validate answers
17
- * - Exit on canceling the prompt
18
- * - Handle non-interactive mode
19
- */
20
- async function prompt(questions, argv, options) {
21
- const interactive = options?.interactive ?? (process.stdout.isTTY && process.env.TERM !== 'dumb' && !process.env.CI);
22
- const onCancel = () => {
23
- // Exit the CLI on Ctrl+C
24
- process.exit(1);
25
- };
26
- const onError = message => {
27
- console.log(message);
28
- process.exit(1);
29
- };
30
- if (argv) {
31
- validate(argv, questions, onError);
32
- }
33
- const defaultAnswers = {};
34
- const promptQuestions = [];
35
- if (Array.isArray(questions)) {
36
- for (const question of questions) {
37
- let promptQuestion = question;
38
-
39
- // Skip questions which are passed as parameter and pass validation
40
- const argValue = argv?.[question.name];
41
- if (argValue && question.validate?.(String(argValue)) !== false) {
42
- continue;
43
- }
44
- const {
45
- type,
46
- choices
47
- } = question;
48
-
49
- // Track default value from questions
50
- if (type && question.default != null) {
51
- // @ts-expect-error assume the passed value is correct
52
- defaultAnswers[question.name] = question.default;
53
-
54
- // Don't prompt questions with a valid default value when not interactive
55
- if (!interactive && question.validate?.(String(question.default)) !== false) {
56
- continue;
57
- }
58
- }
59
-
60
- // Don't prompt questions with a single choice
61
- if (type === 'select' && Array.isArray(question.choices) && question.choices.length === 1) {
62
- const onlyChoice = question.choices[0];
63
- if (onlyChoice?.value) {
64
- // @ts-expect-error assume the passed value is correct
65
- defaultAnswers[question.name] = onlyChoice.value;
66
- }
67
- continue;
68
- }
69
-
70
- // Don't prompt dynamic questions with a single choice
71
- if (type === 'select' && typeof choices === 'function') {
72
- promptQuestion = {
73
- ...question,
74
- type: (prev, values) => {
75
- const dynamicChoices = choices(prev, {
76
- ...argv,
77
- ...values
78
- });
79
- if (dynamicChoices && dynamicChoices.length === 1) {
80
- const onlyChoice = dynamicChoices[0];
81
- if (onlyChoice?.value) {
82
- // @ts-expect-error assume the passed value is correct
83
- defaultAnswers[question.name] = onlyChoice.value;
84
- }
85
- return null;
86
- }
87
- return type;
88
- }
89
- };
90
- }
91
- promptQuestions.push(promptQuestion);
92
- }
93
- } else {
94
- promptQuestions.push(questions);
95
- }
96
- let promptAnswers;
97
- if (interactive) {
98
- promptAnswers = await (0, _prompts.default)(promptQuestions, {
99
- ...options,
100
- onCancel
101
- });
102
- } else {
103
- const missingQuestions = promptQuestions.reduce((acc, question) => {
104
- let type = question.type;
105
- if (typeof question.type === 'function') {
106
- // @ts-expect-error assume the passed value is correct
107
- type = question.type(null, argv, null);
108
- }
109
- if (type != null) {
110
- acc.push(question.name.replace(/([A-Z]+)/g, '-$1').replace(/^-/, '').toLowerCase());
111
- }
112
- return acc;
113
- }, []);
114
- if (missingQuestions.length) {
115
- onError(`Missing values for options: ${missingQuestions.map(q => _kleur.default.blue(q)).join(', ')}`);
116
- }
117
- }
118
- const result = {
119
- ...argv,
120
- ...defaultAnswers,
121
- ...promptAnswers
122
- };
123
- validate(result, questions, onError);
124
-
125
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
126
- return result;
127
- }
128
- function validate(argv, questions, onError) {
129
- for (const [key, value] of Object.entries(argv)) {
130
- if (value == null) {
131
- continue;
132
- }
133
- const question = Array.isArray(questions) ? questions.find(q => q.name === key) : questions.name === key ? questions : null;
134
- if (question == null) {
135
- continue;
136
- }
137
- let validation;
138
-
139
- // We also need to guard against invalid choices
140
- // If we don't already have a validation message to provide a better error
141
- if ('choices' in question) {
142
- const choices = typeof question.choices === 'function' ? question.choices(undefined, argv) : question.choices;
143
- if (choices) {
144
- let type = question.type;
145
- if (typeof question.type === 'function') {
146
- type = question.type(null, argv);
147
- }
148
- if (type === 'multiselect') {
149
- if (Array.isArray(value)) {
150
- const invalidChoices = value.filter(val => choices.every(choice => choice.value !== val));
151
- if (invalidChoices.length > 0) {
152
- validation = `Must be an array of ${choices.map(choice => _kleur.default.green(choice.value)).join(', ')}`;
153
- }
154
- } else {
155
- validation = 'Must be an array';
156
- }
157
- } else {
158
- if (choices.every(choice => choice.value !== value)) {
159
- if (choices.length > 1) {
160
- validation = `Must be one of ${choices.map(choice => _kleur.default.green(choice.value)).join(', ')}`;
161
- } else if (choices[0]) {
162
- validation = `Must be '${_kleur.default.green(choices[0].value)}'`;
163
- } else {
164
- validation = false;
165
- }
166
- }
167
- }
168
- }
169
- }
170
- if (validation == null && question.validate) {
171
- validation = question.validate(String(value));
172
- }
173
- if (validation != null && validation !== true) {
174
- let message = `Invalid value ${_kleur.default.red(String(value))} passed for ${_kleur.default.blue(key)}`;
175
- if (typeof validation === 'string') {
176
- message += `: ${validation}`;
177
- }
178
- onError(message);
179
- }
180
- }
181
- }
182
- //# sourceMappingURL=prompt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.js","names":["_kleur","_interopRequireDefault","require","_prompts","e","__esModule","default","prompt","questions","argv","options","interactive","process","stdout","isTTY","env","TERM","CI","onCancel","exit","onError","message","console","log","validate","defaultAnswers","promptQuestions","Array","isArray","question","promptQuestion","argValue","name","String","type","choices","length","onlyChoice","value","prev","values","dynamicChoices","push","promptAnswers","prompts","missingQuestions","reduce","acc","replace","toLowerCase","map","q","kleur","blue","join","result","key","Object","entries","find","validation","undefined","invalidChoices","filter","val","every","choice","green","red"],"sources":["../../src/utils/prompt.ts"],"sourcesContent":["import kleur from 'kleur';\nimport prompts, {\n type Answers,\n type InitialReturnValue,\n type PromptType,\n} from 'prompts';\n\ntype Choice = {\n title: string;\n value: string;\n description?: string;\n};\n\nexport type Question<T extends string> = {\n name: T;\n type:\n | PromptType\n | null\n | ((\n prev: unknown,\n values: Partial<Record<T, unknown>>\n ) => PromptType | null);\n message: string;\n validate?: (value: string) => boolean | string;\n choices?:\n | Choice[]\n | ((prev: unknown, values: Partial<Record<T, unknown>>) => Choice[]);\n initial?:\n | InitialReturnValue\n | ((\n prev: unknown,\n values: Partial<Record<T, unknown>>\n ) => InitialReturnValue | Promise<InitialReturnValue>);\n default?: InitialReturnValue;\n};\n\n/**\n * Wrapper around `prompts` with additional features:\n *\n * - Improved type-safety\n * - Read answers from passed arguments\n * - Skip questions with a single choice\n * - Validate answers\n * - Exit on canceling the prompt\n * - Handle non-interactive mode\n */\nexport async function prompt<\n PromptAnswers extends Record<string, unknown>,\n Argv extends Record<string, unknown> | undefined,\n>(\n questions:\n | Question<Extract<keyof PromptAnswers, string>>[]\n | Question<Extract<keyof PromptAnswers, string>>,\n argv: Argv,\n options: prompts.Options & {\n interactive: boolean | undefined;\n }\n): Promise<PromptAnswers & Argv> {\n const interactive =\n options?.interactive ??\n (process.stdout.isTTY && process.env.TERM !== 'dumb' && !process.env.CI);\n\n const onCancel = () => {\n // Exit the CLI on Ctrl+C\n process.exit(1);\n };\n\n const onError = (message: string) => {\n console.log(message);\n process.exit(1);\n };\n\n if (argv) {\n validate(argv, questions, onError);\n }\n\n const defaultAnswers = {};\n const promptQuestions: Question<Extract<keyof PromptAnswers, string>>[] = [];\n\n if (Array.isArray(questions)) {\n for (const question of questions) {\n let promptQuestion = question;\n\n // Skip questions which are passed as parameter and pass validation\n const argValue = argv?.[question.name];\n\n if (argValue && question.validate?.(String(argValue)) !== false) {\n continue;\n }\n\n const { type, choices } = question;\n\n // Track default value from questions\n if (type && question.default != null) {\n // @ts-expect-error assume the passed value is correct\n defaultAnswers[question.name] = question.default;\n\n // Don't prompt questions with a valid default value when not interactive\n if (\n !interactive &&\n question.validate?.(String(question.default)) !== false\n ) {\n continue;\n }\n }\n\n // Don't prompt questions with a single choice\n if (\n type === 'select' &&\n Array.isArray(question.choices) &&\n question.choices.length === 1\n ) {\n const onlyChoice = question.choices[0];\n\n if (onlyChoice?.value) {\n // @ts-expect-error assume the passed value is correct\n defaultAnswers[question.name] = onlyChoice.value;\n }\n\n continue;\n }\n\n // Don't prompt dynamic questions with a single choice\n if (type === 'select' && typeof choices === 'function') {\n promptQuestion = {\n ...question,\n type: (prev, values) => {\n const dynamicChoices = choices(prev, { ...argv, ...values });\n\n if (dynamicChoices && dynamicChoices.length === 1) {\n const onlyChoice = dynamicChoices[0];\n\n if (onlyChoice?.value) {\n // @ts-expect-error assume the passed value is correct\n defaultAnswers[question.name] = onlyChoice.value;\n }\n\n return null;\n }\n\n return type;\n },\n };\n }\n\n promptQuestions.push(promptQuestion);\n }\n } else {\n promptQuestions.push(questions);\n }\n\n let promptAnswers;\n\n if (interactive) {\n promptAnswers = await prompts(promptQuestions, {\n ...options,\n onCancel,\n });\n } else {\n const missingQuestions = promptQuestions.reduce<string[]>(\n (acc, question) => {\n let type = question.type;\n\n if (typeof question.type === 'function') {\n // @ts-expect-error assume the passed value is correct\n type = question.type(null, argv, null);\n }\n\n if (type != null) {\n acc.push(\n question.name\n .replace(/([A-Z]+)/g, '-$1')\n .replace(/^-/, '')\n .toLowerCase()\n );\n }\n\n return acc;\n },\n []\n );\n\n if (missingQuestions.length) {\n onError(\n `Missing values for options: ${missingQuestions\n .map((q) => kleur.blue(q))\n .join(', ')}`\n );\n }\n }\n\n const result = {\n ...argv,\n ...defaultAnswers,\n ...promptAnswers,\n };\n\n validate(result, questions, onError);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n return result as PromptAnswers & Argv;\n}\n\nfunction validate<T extends string>(\n argv: Partial<Answers<T>>,\n questions: Question<T>[] | Question<T>,\n onError: (message: string) => void\n) {\n for (const [key, value] of Object.entries(argv)) {\n if (value == null) {\n continue;\n }\n\n const question = Array.isArray(questions)\n ? questions.find((q) => q.name === key)\n : questions.name === key\n ? questions\n : null;\n\n if (question == null) {\n continue;\n }\n\n let validation;\n\n // We also need to guard against invalid choices\n // If we don't already have a validation message to provide a better error\n if ('choices' in question) {\n const choices =\n typeof question.choices === 'function'\n ? question.choices(undefined, argv)\n : question.choices;\n\n if (choices) {\n let type = question.type;\n\n if (typeof question.type === 'function') {\n type = question.type(null, argv);\n }\n\n if (type === 'multiselect') {\n if (Array.isArray(value)) {\n const invalidChoices = value.filter((val) =>\n choices.every((choice) => choice.value !== val)\n );\n\n if (invalidChoices.length > 0) {\n validation = `Must be an array of ${choices\n .map((choice) => kleur.green(choice.value))\n .join(', ')}`;\n }\n } else {\n validation = 'Must be an array';\n }\n } else {\n if (choices.every((choice) => choice.value !== value)) {\n if (choices.length > 1) {\n validation = `Must be one of ${choices\n .map((choice) => kleur.green(choice.value))\n .join(', ')}`;\n } else if (choices[0]) {\n validation = `Must be '${kleur.green(choices[0].value)}'`;\n } else {\n validation = false;\n }\n }\n }\n }\n }\n\n if (validation == null && question.validate) {\n validation = question.validate(String(value));\n }\n\n if (validation != null && validation !== true) {\n let message = `Invalid value ${kleur.red(\n String(value)\n )} passed for ${kleur.blue(key)}`;\n\n if (typeof validation === 'string') {\n message += `: ${validation}`;\n }\n\n onError(message);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}