Files
js-generator-openstack/generators/app/lib/component/structure.js
Michael Krotscheck f8c932ea8d Created Structure Module
The structure module is a prompt-only module that determines and
sets structural attributes which inform the rest of the project.
With these values, we can automatically generate test configuration
files, sample project layouts, as well as toggle specific tooling
options (such as gulp, karma, and others).

Change-Id: I477f427da121aeda967fadbcbe73d0a75e9d6bed
2016-06-15 05:33:31 -07:00

140 lines
4.0 KiB
JavaScript

/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
/**
* This generator module handles questions regarding the project's structure,
* such as engine, common output directories, and language level. It informs
* other generators, such as test framework generation, packaging tools,
* and/or configuration files.
*/
(function () {
'use strict';
var Q = require('q');
var projectBuilder = require('../project_builder');
/**
* Initialize the component by setting configuration defaults. These, or previously set
* versions, will be accessible immediately, however it's good practice not to access them
* until after the prompting phase, as we cannot guarantee that they will be properly set.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function initialize (generator) {
// Set our defaults:
generator.config.defaults({
engine: 'browser',
language: 'es5',
srcDir: './src',
distDir: './dist',
testDir: './test'
});
return generator;
}
/**
* If applicable, prompt the user for a project type.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function prompt (generator) {
var deferred = Q.defer();
// We default to a node.js project.
if (!generator.options['non-interactive']) {
// Go through the prompts.
generator.prompt(
[{
type: 'list',
name: 'engine',
message: 'Structure- Runtime Engine:',
choices: [
{
name: 'Browser',
value: 'browser'
},
{
name: 'Node.js',
value: 'node'
}
],
default: generator.config.get('engine')
}, {
type: 'list',
name: 'language',
message: 'Structure- Language:',
choices: [
{
name: 'ECMAScript 5',
value: 'es5'
},
{
name: 'ECMAScript 6',
value: 'es6'
}
],
default: generator.config.get('language')
}, {
type: 'input',
name: 'srcDir',
message: 'Structure- Source Directory:',
default: generator.config.get('srcDir')
}, {
type: 'input',
name: 'testDir',
message: 'Structure- Test Directory:',
default: generator.config.get('testDir')
}, {
type: 'input',
name: 'distDir',
message: 'Structure- Dist Directory:',
default: generator.config.get('distDir'),
when: function (answers) {
return answers.engine === 'browser';
}
}],
function (answers) {
generator.config.set(answers);
deferred.resolve(generator);
});
} else {
deferred.resolve(generator);
}
return deferred.promise;
}
/**
* Add any output directories to the ignore files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
projectBuilder.ignoreFile(generator.config.get('distDir'));
return generator;
}
module.exports = {
init: initialize,
prompt: prompt,
configure: configure
};
})();