"use strict";
/*
 * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
 * This code may only be used under the BSD style license found at
 * http://polymer.github.io/LICENSE.txt
 * The complete set of authors may be found at
 * http://polymer.github.io/AUTHORS.txt
 * The complete set of contributors may be found at
 * http://polymer.github.io/CONTRIBUTORS.txt
 * Code distributed by Google as part of the polymer project is also
 * subject to an additional IP rights grant found at
 * http://polymer.github.io/PATENTS.txt
 */
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const chalk = require("chalk");
const path = require("path");
const logging = require("plylog");
const Generator = require("yeoman-generator");
const validateElementName = require("validate-element-name");
const logger = logging.getLogger('init');
/**
 * Returns a Yeoman Generator constructor that can be passed to yeoman to be
 * run. A "template name" argument is required to choose the correct
 * `/templates` directory name to generate from.
 * (Ex: "polymer-2.x" to generate the `templates/polymer-2x` template directory)
 */
function createElementGenerator(templateName) {
    return class ElementGenerator extends Generator {
        constructor(args, options) {
            super(args, options);
            this.sourceRoot(path.join(__dirname, 'templates', templateName));
        }
        // This is necessary to prevent an exception in Yeoman when creating
        // storage for generators registered as a stub and used in a folder
        // with a package.json but with no name property.
        // https://github.com/Polymer/polymer-cli/issues/186
        rootGeneratorName() {
            return 'ElementGenerator';
        }
        initializing() {
            // Yeoman replaces dashes with spaces. We want dashes.
            this.appname = this.appname.replace(/\s+/g, '-');
        }
        prompting() {
            return __awaiter(this, void 0, void 0, function* () {
                const prompts = [
                    {
                        name: 'name',
                        type: 'input',
                        message: `Element name`,
                        default: this.appname + (this.appname.includes('-') ? '' : '-element'),
                        validate: (name) => {
                            const nameValidation = validateElementName(name);
                            if (!nameValidation.isValid) {
                                this.log(`\n${nameValidation.message}\nPlease try again.`);
                            }
                            else if (nameValidation.message) {
                                this.log(''); // 'empty' log inserts a line break
                                logger.warn(nameValidation.message);
                            }
                            return nameValidation.isValid;
                        },
                    },
                    {
                        type: 'input',
                        name: 'description',
                        message: 'Brief description of the element',
                    },
                ];
                this.props = yield this.prompt(prompts);
                this.props.elementClassName = this.props.name.replace(/(^|-)(\w)/g, (_match, _p0, p1) => p1.toUpperCase());
            });
        }
        writing() {
            const name = this.props.name;
            this.fs.copyTpl(`${this.templatePath()}/**/?(.)!(_)*`, this.destinationPath(), this.props);
            this.fs.copyTpl(this.templatePath('_element.html'), `${name}.html`, this.props);
            this.fs.copyTpl(this.templatePath('test/_element_test.html'), `test/${name}_test.html`, this.props);
            this.fs.copyTpl(this.templatePath('test/index.html'), `test/index.html`, this.props);
            this.fs.copyTpl(this.templatePath('.gitignore'), '.gitignore', this.props);
        }
        install() {
            this.log(chalk.bold('\nProject generated!'));
            this.log('Installing dependencies...');
            this.installDependencies({
                npm: false,
            });
        }
        end() {
            this.log(chalk.bold('\nSetup Complete!'));
            this.log('Check out your new project README for information about what to do next.\n');
        }
    };
}
exports.createElementGenerator = createElementGenerator;
