all files / generators/spec/ spec.js

100% Statements 40/40
100% Branches 0/0
100% Functions 13/13
100% Lines 40/40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162                                                                                                                                                                                                                                                   
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("../../commons/utils/utils");
var config_1 = require("../../configs/config");
/**
 * Class which holds the logic for generating raml spec.
 *
 * @export
 * @class SpecGenerator
 */
var SpecGenerator = (function () {
    function SpecGenerator() {
    }
    /**
     * Generates the api spec for the whole schema.
     *
     * @param {Schema} schema - entire collection of tables
     * @param {RAMLApplicationInfo} options - holds the title of the app, the version and the base url
     * @return {string} - returns the api spec
     */
    SpecGenerator.prototype.generateContent = function (schema, options) {
        var _this = this;
        var spec = this.addHeaderContent(options) + this.addDataTypes(schema);
        schema.forEach(function (entity) {
            spec += _this.addSpecForEntity(entity);
        });
        return spec;
    };
    /**
     * Generates the header content
     *
     * @param {RAMLApplicationInfo} options - holds the title of the app, the version and the base url
     * @return {string} returns the formatted header
     */
    SpecGenerator.prototype.addHeaderContent = function (options) {
        return utils_1.default.formatLine('', config_1.default.TABS.LEVEL_0, '#%RAML 1.0') +
            utils_1.default.formatLine('', config_1.default.TABS.LEVEL_0, "title: " + options.name) +
            utils_1.default.formatLine('', config_1.default.TABS.LEVEL_0, "version: " + options.version) +
            utils_1.default.formatLine('', config_1.default.TABS.LEVEL_0, "baseUri: " + options.url + "{version}") +
            utils_1.default.formatLine('', config_1.default.TABS.LEVEL_0, 'protocols: [HTTP, HTTPS]');
    };
    /**
     * Adds the data types based on schema
     *
     * @param {Schema} schema - entire collection of tables
     * @return {string} returns the formatted data types
     */
    SpecGenerator.prototype.addDataTypes = function (schema) {
        var types = "types:" + config_1.default.END_OF_LINE;
        schema.forEach(function (entity) {
            types += utils_1.default.formatLine(config_1.default.DEFAULT_INDENTATION, 0, utils_1.default.toTitleCase(entity.name) + ": !include types/" + utils_1.default.toTitleCase(entity.name) + ".raml");
        });
        return types;
    };
    /**
     * Generates the get all spec
     *
     * @param {Table} entity - holds the entity definition
     * @return {string} - returns the formatted spec for the entity
     */
    SpecGenerator.prototype.addSpecForEntity = function (entity) {
        var spec = "/" + entity.name + ":" + config_1.default.END_OF_LINE;
        spec += this.addGetAllSpec(config_1.default.DEFAULT_INDENTATION, entity);
        spec += this.addCreateSpec(config_1.default.DEFAULT_INDENTATION, entity);
        spec += utils_1.default.formatLine(config_1.default.DEFAULT_INDENTATION, config_1.default.TABS.LEVEL_0, "/{" + utils_1.default.singular(entity.name) + "Id}:");
        spec += this.addGetOneSpec(config_1.default.DEFAULT_INDENTATION, entity);
        spec += this.addUpdateSpec(config_1.default.DEFAULT_INDENTATION, entity);
        spec += this.addDeleteSpec(config_1.default.DEFAULT_INDENTATION, entity);
        return spec;
    };
    /**
     * Generates the get all spec
     *
     * @param {string} initialIndentation - holds the initial indentation
     * @param {Table} entity - holds the entity definition
     * @return {string} - returns the formatted get all spec
     */
    SpecGenerator.prototype.addGetAllSpec = function (initialIndentation, entity) {
        return utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_0, 'get:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, "description: Get a list of all " + entity.name) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, 'responses:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, '200:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, 'body:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_4, 'application/json:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_5, "type: " + utils_1.default.toTitleCase(entity.name) + "[]") +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_5, "example: !include examples/" + utils_1.default.pluralize(utils_1.default.toTitleCase(entity.name)) + ".json");
    };
    /**
     * Generates the create spec
     *
     * @param {string} initialIndentation - holds the initial indentation
     * @param {Table} entity - holds the entity definition
     * @return {string} - returns the formatted create spec
     */
    SpecGenerator.prototype.addCreateSpec = function (initialIndentation, entity) {
        return utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_0, 'post:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, "description: Create a " + utils_1.default.singular(entity.name)) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, 'body:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, 'application/json:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, "type: " + utils_1.default.toTitleCase(entity.name)) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, 'responses:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, '201:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, 'body:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_4, 'application/json:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_5, "type: " + utils_1.default.toTitleCase(entity.name)) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_5, "example: !include examples/" + utils_1.default.toTitleCase(entity.name) + ".json");
    };
    /**
     * Generates the get one spec
     *
     * @param {string} initialIndentation - holds the initial indentation
     * @param {Table} entity - holds the entity definition
     * @return {string} - returns the formatted get one spec
     */
    SpecGenerator.prototype.addGetOneSpec = function (initialIndentation, entity) {
        return utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, 'get:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, "description: Get an instance of " + utils_1.default.singular(entity.name) + " based on it's id.") +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, 'responses:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, '200:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_4, 'body:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_5, 'application/json:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_6, "type: " + utils_1.default.toTitleCase(entity.name)) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_6, "example: !include examples/" + utils_1.default.toTitleCase(entity.name) + ".json");
    };
    /**
     * Generates the update spec
     *
     * @param {string} initialIndentation - holds the initial indentation
     * @param {Table} entity - holds the entity definition
     * @return {string} - returns the formatted update spec
     */
    SpecGenerator.prototype.addUpdateSpec = function (initialIndentation, entity) {
        return utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, 'put:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, "description: Update an instance of " + utils_1.default.singular(entity.name) + ".") +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, 'body:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, 'application/json:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_4, "type: " + utils_1.default.toTitleCase(entity.name)) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, 'responses:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, '200:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_4, 'body:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_5, 'application/json:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_6, "type: " + utils_1.default.toTitleCase(entity.name)) +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_6, "example: !include examples/" + utils_1.default.toTitleCase(entity.name) + ".json");
    };
    /**
     * Generates the delete spec
     *
     * @param {string} initialIndentation - holds the initial indentation
     * @param {Table} entity - holds the entity definition
     * @return {string} - returns the formatted delete spec
     */
    SpecGenerator.prototype.addDeleteSpec = function (initialIndentation, entity) {
        return utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_1, 'delete:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, "description: Delete an instance of " + utils_1.default.singular(entity.name) + " based on it's id.") +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_2, 'responses:') +
            utils_1.default.formatLine(initialIndentation, config_1.default.TABS.LEVEL_3, '204:');
    };
    return SpecGenerator;
}());
exports.SpecGenerator = SpecGenerator;
exports.default = new SpecGenerator();