UNPKG

generator-code

Version:

Yeoman generator for Visual Studio Code Extensions

194 lines (166 loc) 7.2 kB
/*--------------------------------------------------------- * Copyright (C) Microsoft Corporation. All rights reserved. *--------------------------------------------------------*/ 'use strict'; const Generator = require('yeoman-generator'); const yosay = require('yosay'); const path = require('path'); const env = require('./env'); const colortheme = require('./generate-colortheme'); const commandjs = require('./generate-command-js'); const commandts = require('./generate-command-ts '); const commandweb = require('./generate-command-web'); const extensionpack = require('./generate-extensionpack'); const keymap = require('./generate-keymap'); const language = require('./generate-language'); const localization = require('./generate-localization'); const notebook = require('./generate-notebook-renderer'); const snippets = require('./generate-snippets'); const webupdate = require('./generate-web-update'); module.exports = class extends Generator { constructor(args, opts) { super(args, opts); this.option('extensionType', { type: String }); this.option('extensionName', { type: String }); this.option('extensionDescription', { type: String }); this.option('extensionDisplayName', { type: String }); this.option('extensionParam', { type: String }); this.option('extensionParam2', { type: String }); this.option('insiders', { type: Boolean, alias: 'i' }); this.extensionConfig = Object.create(null); this.extensionConfig.installDependencies = false; this.extensionGenerator = undefined; this.abort = false; this.insiders = false; } async initializing() { const cliArgs = this.options['_']; this.insiders = Array.isArray(cliArgs) && cliArgs.indexOf('insiders') !== -1 || !!this.options['insiders']; // Welcome if (!this.insiders) { this.log(yosay('Welcome to the Visual Studio Code Extension generator!')); } else { this.log(yosay('Welcome to the Visual Studio Code Insiders Extension generator!')); } // evaluateEngineVersion const dependencyVersions = await env.getDependencyVersions(); this.extensionConfig.dependencyVersions = dependencyVersions; this.extensionConfig.dep = function (name) { const version = dependencyVersions[name]; if (typeof version === 'undefined') { throw new Error(`Module ${name} is not listed in env.js`); } return `${JSON.stringify(name)}: ${JSON.stringify(version)}`; }; this.extensionConfig.vsCodeEngine = await env.getLatestVSCodeVersion(); } async prompting() { const extensionGenerators = [ commandts, commandjs, colortheme, language, snippets, keymap, extensionpack, localization, commandweb, notebook, webupdate ] // Ask for extension type const extensionType = this.options['extensionType']; if (extensionType) { const extensionTypeId = 'ext-' + extensionType; if (extensionGenerators.find(g => g.id === extensionTypeId)) { this.extensionConfig.type = extensionTypeId; } else { this.log("Invalid extension type: " + extensionType + '\nPossible types are: ' + extensionGenerators.map(g => g.id.substr(4)).join(', ')); this.abort = true; } } else { const choices = extensionGenerators.filter(g => !!g.insiders === this.insiders).map(g => ({ name: g.name, value: g.id })); this.extensionConfig.type = (await this.prompt({ type: 'list', name: 'type', message: 'What type of extension do you want to create?', pageSize: choices.length, choices, })).type; } this.extensionGenerator = extensionGenerators.find(g => g.id === this.extensionConfig.type); try { await this.extensionGenerator.prompting(this, this.extensionConfig); } catch (e) { this.abort = true; } } // Write files writing() { if (this.abort) { return; } this.sourceRoot(path.join(__dirname, './templates/' + this.extensionConfig.type)); return this.extensionGenerator.writing(this, this.extensionConfig); } // Installation install() { if (this.abort) { return; } if (!this.extensionGenerator.update) { process.chdir(this.extensionConfig.name); } if (this.extensionConfig.installDependencies) { this.installDependencies({ yarn: this.extensionConfig.pkgManager === 'yarn', npm: this.extensionConfig.pkgManager === 'npm', bower: false }); } } // End end() { if (this.abort) { return; } if (this.extensionGenerator.update) { this.log(''); this.log('Your extension has been updated!'); this.log(''); this.log('To start editing with Visual Studio Code, use the following commands:'); this.log(''); if (!this.insiders) { this.log(' code .'); } else { this.log(' code-insiders .'); } this.log(` ${this.extensionConfig.pkgManager} run compile-web`); this.log(''); return; } // Git init if (this.extensionConfig.gitInit) { this.spawnCommand('git', ['init', '--quiet']); } this.log(''); if (!this.insiders) { this.log('Your extension ' + this.extensionConfig.name + ' has been created!'); this.log(''); this.log('To start editing with Visual Studio Code, use the following commands:'); this.log(''); this.log(' cd ' + this.extensionConfig.name); this.log(' code .'); this.log(''); this.log('Open vsc-extension-quickstart.md inside the new extension for further instructions'); this.log('on how to modify, test and publish your extension.'); } else { this.log('Your extension ' + this.extensionConfig.name + ' has been created!'); this.log(''); this.log('To start editing with Visual Studio Code, use the following commands:'); this.log(''); this.log(' cd ' + this.extensionConfig.name); this.log(' code-insiders .'); this.log(''); this.log('Open vsc-extension-quickstart.md inside the new extension for further instructions'); this.log('on how to modify and test your extension.'); } this.log(''); if (this.extensionGenerator.endMessage) { this.extensionGenerator.endMessage(this, this.extensionConfig); } this.log('For more information, also visit http://code.visualstudio.com and follow us @code.'); this.log('\r\n'); } }