generator-code
Version:
Yeoman generator for Visual Studio Code Extensions
109 lines (95 loc) • 5.01 kB
JavaScript
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
const prompts = require("./prompts");
module.exports = {
id: 'ext-notebook-renderer',
name: 'New Notebook Renderer (TypeScript)',
insiders: true,
/**
* @param {import('yeoman-generator')} generator
* @param {Object} extensionConfig
*/
prompting: async (generator, extensionConfig) => {
await prompts.askForExtensionDisplayName(generator, extensionConfig);
await prompts.askForExtensionId(generator, extensionConfig);
await prompts.askForExtensionDescription(generator, extensionConfig);
await askForNotebookRendererInfo(generator, extensionConfig);
await prompts.askForGit(generator, extensionConfig);
await prompts.askForPackageManager(generator, extensionConfig);
},
/**
* @param {import('yeoman-generator')} generator
* @param {Object} extensionConfig
*/
writing: (generator, extensionConfig) => {
generator.fs.copy(generator.sourceRoot() + '/src', extensionConfig.name + '/src');
generator.fs.copy(generator.sourceRoot() + '/vscode', extensionConfig.name + '/.vscode');
generator.fs.copy(generator.sourceRoot() + '/tsconfig.json', extensionConfig.name + '/tsconfig.json');
generator.fs.copy(generator.sourceRoot() + '/.vscodeignore', extensionConfig.name + '/.vscodeignore');
generator.fs.copy(generator.sourceRoot() + '/webpack.config.js', extensionConfig.name + '/webpack.config.js');
generator.fs.copy(generator.sourceRoot() + '/.eslintrc.json', extensionConfig.name + '/.eslintrc.json');
generator.fs.copy(generator.sourceRoot() + '/src/extension/types/.gitkeep', extensionConfig.name + '/src/extension/types/.gitkeep');
generator.fs.copy(generator.sourceRoot() + '/src/extension/types/.gitkeep', extensionConfig.name + '/src/test/types/.gitkeep');
generator.fs.copyTpl(generator.sourceRoot() + '/package.json', extensionConfig.name + '/package.json', extensionConfig);
generator.fs.copyTpl(generator.sourceRoot() + '/README.md', extensionConfig.name + '/README.md', extensionConfig);
generator.fs.copyTpl(generator.sourceRoot() + '/src/client/index.ts', extensionConfig.name + '/src/client/index.ts', extensionConfig);
generator.fs.copyTpl(generator.sourceRoot() + '/src/extension/extension.ts', extensionConfig.name + '/src/extension/extension.ts', extensionConfig);
if (!extensionConfig.includeContentProvider) {
generator.fs.delete(extensionConfig.name + '/src/extension/testProvider.ts');
} else {
generator.fs.copyTpl(generator.sourceRoot() + '/src/extension/testProvider.ts', extensionConfig.name + '/src/extension/testProvider.ts', extensionConfig);
}
if (extensionConfig.gitInit) {
generator.fs.copy(generator.sourceRoot() + '/gitignore', extensionConfig.name + '/.gitignore');
generator.fs.copy(generator.sourceRoot() + '/gitattributes', extensionConfig.name + '/.gitattributes');
}
if (extensionConfig.pkgManager === 'yarn') {
generator.fs.copyTpl(generator.sourceRoot() + '/.yarnrc', extensionConfig.name + '/.yarnrc', extensionConfig);
}
extensionConfig.installDependencies = true;
}
}
/**
* @param {import('yeoman-generator')} generator
* @param {Object} extensionConfig
*/
async function askForNotebookRendererInfo(generator, extensionConfig) {
const answers = await generator.prompt([
{
type: 'input',
name: 'rendererId',
message: 'What\'s the ID for your renderer?',
default: extensionConfig.name
},
{
type: 'input',
name: 'rendererDisplayName',
message: 'What\'s your renderer display name?',
default: extensionConfig.displayName
},
{
type: 'input',
name: 'rendererMimeTypes',
message: 'What mime types will your renderer handle? (separate multiple by commas)',
default: 'application/json',
},
{
type: 'confirm',
name: 'includeContentProvider',
message: 'Should we generate a test notebook content provider and kernel?',
default: false,
},
{
type: 'input',
name: 'contentProviderFileType',
message: 'What the file extension should the content provider handle?',
default: '.sample-json-notebook',
// @ts-ignore
when: answers => answers.includeContentProvider,
validate: answer => answer.startsWith('.') ? true : 'Extension should be given in the form ".ext"',
},
]);
answers.rendererMimeTypes = answers.rendererMimeTypes.split(/,\s*/g);
Object.assign(extensionConfig, answers);
}