UNPKG

generator-code

Version:

Yeoman generator for Visual Studio Code extensions.

207 lines (186 loc) 6.12 kB
/*--------------------------------------------------------- * Copyright (C) Microsoft Corporation. All rights reserved. *--------------------------------------------------------*/ import Generator from 'yeoman-generator'; import * as validator from './validator.js'; import * as path from 'path'; /** * @typedef {import('./index.js').ExtensionConfig} ExtensionConfig */ /** * @param {Generator} generator * @param {ExtensionConfig} extensionConfig */ export function askForExtensionDisplayName(generator, extensionConfig) { let extensionDisplayName = generator.options['extensionDisplayName']; if (extensionDisplayName) { extensionConfig.displayName = extensionDisplayName; return Promise.resolve(); } const nameFromFolder = generator.options['destination'] ? path.basename(generator.destinationPath()) : ''; if (generator.options['quick'] && nameFromFolder) { extensionConfig.displayName = nameFromFolder; return Promise.resolve(); } return generator.prompt({ type: 'input', name: 'displayName', message: 'What\'s the name of your extension?', default: nameFromFolder }).then(displayNameAnswer => { extensionConfig.displayName = displayNameAnswer.displayName; }); } /** * Ask for extension id ("name" in package.json) * @param {Generator} generator * @param {ExtensionConfig} extensionConfig */ export function askForExtensionId(generator, extensionConfig) { const extensionName = generator.options['extensionId']; if (extensionName) { extensionConfig.name = extensionName; return Promise.resolve(); } let def = extensionConfig.name; if (!def && extensionConfig.displayName) { def = extensionConfig.displayName.toLowerCase().replace(/[^a-z0-9]/g, '-'); } if (def && generator.options['quick']) { extensionConfig.name = def; return Promise.resolve(); } return generator.prompt({ type: 'input', name: 'name', message: 'What\'s the identifier of your extension?', default: def || '', validate: validator.validateExtensionId }).then(nameAnswer => { extensionConfig.name = nameAnswer.name; }); } /** * Ask for extension description * @param {Generator} generator * @param {ExtensionConfig} extensionConfig */ export function askForExtensionDescription(generator, extensionConfig) { const extensionDescription = generator.options['extensionDescription']; if (extensionDescription) { extensionConfig.description = extensionDescription; return Promise.resolve(); } if (generator.options['quick']) { extensionConfig.description = ''; return Promise.resolve(); } return generator.prompt({ type: 'input', name: 'description', message: 'What\'s the description of your extension?', default: '' }).then(descriptionAnswer => { extensionConfig.description = descriptionAnswer.description; }); } /** * @param {Generator} generator * @param {ExtensionConfig} extensionConfig */ export function askForGit(generator, extensionConfig) { const gitInit = generator.options['gitInit']; if (typeof gitInit === 'boolean') { extensionConfig.gitInit = Boolean(gitInit); return Promise.resolve(); } if (generator.options['quick']) { extensionConfig.gitInit = true; return Promise.resolve(); } return generator.prompt({ type: 'confirm', name: 'gitInit', message: 'Initialize a git repository?', default: true }).then(gitAnswer => { extensionConfig.gitInit = gitAnswer.gitInit; }); } /** * @param {Generator} generator * @param {ExtensionConfig} extensionConfig */ export function askForPackageManager(generator, extensionConfig) { const pkgManager = generator.options['pkgManager']; if (pkgManager === 'npm' || pkgManager === 'yarn' || pkgManager === 'pnpm') { extensionConfig.pkgManager = pkgManager; return Promise.resolve(); } extensionConfig.pkgManager = 'npm'; if (generator.options['quick']) { return Promise.resolve(); } return generator.prompt({ type: 'list', name: 'pkgManager', message: 'Which package manager to use?', choices: [ { name: 'npm', value: 'npm' }, { name: 'yarn', value: 'yarn' }, { name: 'pnpm', value: 'pnpm' } ] }).then(pckgManagerAnswer => { extensionConfig.pkgManager = pckgManagerAnswer.pkgManager; }); } /** * @param {Generator} generator * @param {ExtensionConfig} extensionConfig * @param {'webpack' | 'esbuild' | 'unbundled'} defaultBundler */ export function askForBundler(generator, extensionConfig, allowNone = true, defaultBundler = 'unbundled') { const bundler = generator.options['bundler']; if (bundler === 'webpack' || bundler === 'esbuild') { extensionConfig.bundler = bundler; return Promise.resolve(); } const webpack = generator.options['webpack']; // backwards compatibility if (typeof webpack === 'boolean' && webpack) { extensionConfig.bundler = 'webpack'; return Promise.resolve(); } if (generator.options['quick']) { extensionConfig.bundler = defaultBundler; return Promise.resolve(); } const choices = allowNone ? [{ name: 'unbundled', value: 'unbundled' }] : []; return generator.prompt({ type: 'list', default: defaultBundler, name: 'bundler', message: 'Which bundler to use?', choices: [ ...choices, { name: 'webpack', value: 'webpack' }, { name: 'esbuild', value: 'esbuild' } ] }).then(bundlerAnswer => { extensionConfig.bundler = bundlerAnswer.bundler; }); }