Skip to content
This repository has been archived by the owner on Apr 16, 2022. It is now read-only.

Typescript #72

Merged
merged 4 commits into from
Nov 13, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 0 additions & 3 deletions .babelrc

This file was deleted.

24 changes: 0 additions & 24 deletions gulpfile.js

This file was deleted.

24 changes: 13 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,27 @@
"cloudformation-js-yaml-schema": "0.3.0",
"colors": "latest",
"commander": "latest",
"fs": "0.0.2",
"js-yaml": "^3.7.0",
"opn": "latest",
"winston": "latest"
},
"devDependencies": {
"gulp": "latest",
"babel-polyfill": "latest",
"gulp-babel": "latest",
"gulp-sourcemaps": "latest",
"babel-preset-es2015": "latest",
"babel-register": "latest",
"babel-cli": "latest",
"@types/chai": "^4.0.4",
"@types/colors": "^1.1.3",
"@types/commander": "^2.11.0",
"@types/js-yaml": "^3.9.1",
"@types/mocha": "^2.2.44",
"@types/node": "^8.0.50",
"@types/opn": "^3.0.28",
"@types/winston": "^2.3.7",
"chai": "latest",
"mocha": "latest",
"chai": "latest"
"typescript": "^2.6.1"
},
"scripts": {
"build": "babel src --presets babel-preset-es2015 --out-dir lib",
"test": "mocha --compilers js:babel-register --require babel-polyfill",
"build": "tsc",
"test": "mocha lib/test",
"watch": "tsc -w",
"prepublish": "npm run build",
"deploy": "npm publish"
},
Expand Down
123 changes: 123 additions & 0 deletions src/awsData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
type AWSExtraDocs = {[k: string]: string}

export const awsExtraDocs = require('../data/aws_extra_docs.json') as AWSExtraDocs;

export type AWSPrimitiveType = 'String' | 'Integer' | 'Boolean' | 'Json';

interface PropertyBase {
Required: boolean,
Documentation: string,
UpdateType: 'Mutable' | 'Immutable' | 'Conditional',
}

interface PrimitiveProperty extends PropertyBase {
PrimitiveType: AWSPrimitiveType,

Type: undefined
ItemType: undefined
PrimitiveItemType: undefined
}

interface ComplexProperty extends PropertyBase {
Type: string,

PrimitiveType: undefined
ItemType: undefined
PrimitiveItemType: undefined
}

interface ListPropertyBase extends PropertyBase {
Type: 'List',
DuplicatesAllowed: boolean,

PrimitiveType: undefined
}

interface PrimitiveItemType {
PrimitiveItemType: AWSPrimitiveType,

ItemType: undefined
}

interface ItemType {
ItemType: string,

PrimitiveItemType: undefined
}

type ListProperty = ListPropertyBase & (PrimitiveItemType | ItemType)

interface MapPropertyBase extends PropertyBase {
Type: 'Map',
DuplicatesAllowed: boolean,

PrimitiveType: undefined
ItemType: undefined
}

type MapProperty = MapPropertyBase & (PrimitiveItemType | ItemType)

export type Property = PrimitiveProperty | ComplexProperty | ListProperty | MapProperty

export interface ResourcePropertyType {
Documentation: string,
Properties: {[propertyName: string]: Property}
}

export interface ResourceType {
Documentation: string,
Properties: {[propertyName: string]: Property},
Attributes?: {[attributeName: string]: Attribute},
AdditionalProperties?: boolean
}

interface PrimitiveAttribute {
ItemType: AWSPrimitiveType
}

interface ListAttribute {
Type: 'List',
PrimitiveItemType: AWSPrimitiveType
}

type Attribute = PrimitiveAttribute | ListAttribute;

interface AWSResourcesSpecification {
PropertyTypes: {[propertyName: string]: ResourcePropertyType}
ResourceTypes: {[resourceName: string]: ResourceType}
}

export const awsResources = require('../data/aws_resources_specification.json') as AWSResourcesSpecification;

type ResourceRefTypes = {[resourceName: string]: string};

export const awsResourceRefTypes = require('../data/aws_resource_ref_types.json') as ResourceRefTypes;

type ParameterTypes = {[parameterName: string]: 'string' | 'array'};

export const awsParameterTypes = require('../data/aws_parameter_types.json') as ParameterTypes;

type IntrinsicFunctions = {
[functionName: string]: {
supportedFunctions: string[]
}
}

export const awsIntrinsicFunctions = require('../data/aws_intrinsic_functions.json') as IntrinsicFunctions;

// avoid "does this exist" checks everywhere
for (let functionName in awsIntrinsicFunctions) {
awsIntrinsicFunctions[functionName].supportedFunctions = awsIntrinsicFunctions[functionName].supportedFunctions || [];
}

type RefOverrides = {
"AWS::AccountId": string,
"AWS::NotificationARNs": string[],
"AWS::NoValue": "",
"AWS::Region": string,
"AWS::StackId": string,
"AWS::StackName": string,
[refOverride: string]: any
};

export const awsRefOverrides = require('../data/aws_ref_override.json') as RefOverrides;
15 changes: 7 additions & 8 deletions src/docs.es6 → src/docs.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
let awsResources = require('../data/aws_resources_specification.json');
let awsExtraDocs = require('../data/aws_extra_docs.json');
let opn = require('opn');
import {awsResources, awsExtraDocs} from './awsData';
import opn = require('opn');


exports.getDoc = function getDoc(search, browse = true){
export function getDoc(search: string | null, browse: boolean = true){

let formattedSearch = search;

Expand All @@ -22,7 +21,7 @@ exports.getDoc = function getDoc(search, browse = true){

};

exports.getUrls = function getUrls(search = ''){
export function getUrls(search: string | null = ''){

if(search == null) search = '';

Expand All @@ -41,7 +40,7 @@ exports.getUrls = function getUrls(search = ''){
return docs;
};

function searchInResources(search){
function searchInResources(search: string): string[] {
let dotCount = (search.match(/\./g) || []).length;


Expand All @@ -54,7 +53,7 @@ function searchInResources(search){

}else if(dotCount == 1){

let urls = new Array();
let urls: string[] = new Array();

// Check PropertyTypes
if(awsResources['PropertyTypes'].hasOwnProperty(search)){
Expand Down Expand Up @@ -90,7 +89,7 @@ function searchInResources(search){
return [];
}

function searchExtraDocs(search){
function searchExtraDocs(search: string) {
if(awsExtraDocs.hasOwnProperty(search)){
return [ awsExtraDocs[search] ];
}else{
Expand Down
7 changes: 7 additions & 0 deletions src/fixes.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import yaml = require('js-yaml')

declare module 'js-yaml' {
export interface LoadOptions {
onWarning?: (warning: string) => void;
}
}
19 changes: 11 additions & 8 deletions src/index.es6 → src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
* Module dependencies.
*/

let program = require('commander');
let colors = require('colors');
import program = require('commander');
require('colors');
let version = require('../package').version;
let firstArg, secondArg, params = null;
let firstArg: string | undefined = undefined
let secondArg: string = undefined!;

function list(val) {
function list(val: string) {
return val.split(',');
}

Expand All @@ -31,8 +32,12 @@ if (typeof firstArg === 'undefined') {
process.exit(1);
}

import validatorBaseImport = require('./validator');
import docsBaseImport = require('./docs');

if(firstArg == "validate"){
const validator = require('./validator');

const validator = require('./validator') as typeof validatorBaseImport;

if(program.parameters){
for(let param of program.parameters){
Expand All @@ -51,7 +56,6 @@ if(firstArg == "validate"){
}

let result = validator.validateFile(secondArg);

// Show the errors
console.log((result['errors']['info'].length + " infos").grey);
for(let info of result['errors']['info']){
Expand Down Expand Up @@ -82,8 +86,7 @@ if(firstArg == "validate"){
process.exit(0)
}


}else if(firstArg == "docs"){
const docs = require('./docs');
const docs = require('./docs') as typeof docsBaseImport;
console.log(docs.getDoc(secondArg))
}
4 changes: 2 additions & 2 deletions src/logger.es6 → src/logger.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
let winston = require('winston');
import winston = require('winston');

let logger = new (winston.Logger)({
transports: [
Expand All @@ -10,4 +10,4 @@ let logger = new (winston.Logger)({
exitOnError: false
});

module.exports = logger;
export = logger;
15 changes: 7 additions & 8 deletions src/parser.es6 → src/parser.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import yaml from 'js-yaml';
import { CLOUDFORMATION_SCHEMA} from 'cloudformation-js-yaml-schema';
import fs from 'fs';
import yaml = require('js-yaml');
const { CLOUDFORMATION_SCHEMA } = require('cloudformation-js-yaml-schema');
import fs = require('fs');


exports.openFile = function openFile(path){
export function openFile(path: string){

// Check the file path is valid
if (!fs.existsSync(path)) {
Expand All @@ -26,7 +25,7 @@ exports.openFile = function openFile(path){

};

function openYaml(path){
function openYaml(path: string){

// Try and load the Yaml
let yamlParse = yaml.safeLoad(fs.readFileSync(path, 'utf8'), {
Expand All @@ -49,15 +48,15 @@ function openYaml(path){

}

function openJson(path){
function openJson(path: string){

return JSON.parse(fs.readFileSync(path, 'utf8'));

}

let lastPlaceInTemplate = null;
let lastKeyInTemplate = null;
function cleanupYaml(ref){
function cleanupYaml(ref: any){

// Step into next attribute
for(let i=0; i < Object.keys(ref).length; i++){
Expand Down