예제 #1
0
        private void btnGenerate_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(filePath))
            {
                ShowFileMissingErrorMessage();
                return;
            }

            try
            {
                // String which contains whole file contents
                string fileContent = FileContentUtil.GetFileContent(filePath);

                // Get option values for generator options
                JsGeneratorOptions options = GetOptions();

                // Create compiler and execute content of file
                Assembly asm = BuildAssemblyUtil.CompileCode(fileContent);

                // Get all types from assembly using reflection
                List <Type> rawTypes = BuildAssemblyUtil.GetExportedTypes(asm);

                // Filter types, and take only parent ones (the ones that are not referenced in parent, and standalone one)
                // If referenced children will be generated automatically, so no need to duplicate stuff.
                List <Type> types = BuildAssemblyUtil.FilterExportedTypes(rawTypes);

                // Finally generate
                StringBuilder sbFinal = new StringBuilder();
                foreach (Type type in types)
                {
                    switch (options.ConversionType)
                    {
                    case EGenerateOptions.Javascript:
                        sbFinal.AppendLine(JsGenerator.Generate(new[] { type }, options));
                        break;

                    case EGenerateOptions.Ecma6:
                        sbFinal.AppendLine(Ecma6Generator.Generate(new[] { type }, options));
                        break;

                    case EGenerateOptions.KnockoutEcma6:
                        sbFinal.AppendLine(Ecma6KnockoutGenerator.Generate(new[] { type }, options));
                        break;

                    default:
                        throw new Exception(
                                  "Somehow Conversion type is not set or is out of bounds. I have no idea what happened.");
                    }
                }

                codeTextEditor.Text = sbFinal.ToString();
            }
            catch (Exception exception)
            {
                // Since we presumably should know what we are doing here, we are just showing message from exception
                // Would be good idea to log this somewhere tho.
                ShowErrorMessage(exception.Message);
            }
        }
        public static string GetTypeScriptPocos(this IEnumerable <Type> types, JsGeneratorOptions options, bool addModelArray = false)
        {
            var poco = JsGenerator.Generate(types, options);

            if (addModelArray)
            {
                return(AddModels(poco));
            }
            return(poco);
        }
        public static string GetJavaScriptPoco(this Type type, JsGeneratorOptions options, bool addModelArray = false)
        {
            var poco = JsGenerator.Generate(new[] { type }, options);

            if (addModelArray)
            {
                return(AddModels(poco));
            }
            return(poco);
        }
예제 #4
0
        public static string Generate(IEnumerable <Type> typesToGenerate, JsGeneratorOptions generatorOptions = null)
        {
            var passedOptions = generatorOptions ?? Options;

            if (passedOptions == null)
            {
                throw new ArgumentNullException(nameof(passedOptions), "Options cannot be null.");
            }
            var propertyClassCollection = TypePropertyDictionaryGenerator.GetPropertyDictionaryForTypeGeneration(typesToGenerate, passedOptions);
            var js = GenerateJs(propertyClassCollection, passedOptions);

            return(js);
        }
예제 #5
0
 private static void BuildObjectProperty(StringBuilder sb, PropertyBag propEntry, JsGeneratorOptions options)
 {
     sb.AppendLine();
     sb.AppendLine($"\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = new {propEntry.PropertyType.Name}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)});");
 }
예제 #6
0
        private static void BuildPrimitiveProperty(PropertyBag propEntry, StringBuilder sb, JsGeneratorOptions options)
        {
            if (propEntry.TypeDefinition.IsEnum)
            {
                sb.AppendLine(
                    propEntry.PropertyType == typeof(string)
                        ? $"\t{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}: '{propEntry.DefaultValue}',"
                        : $"\t{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}: {propEntry.DefaultValue},");
            }
            else if (propEntry.HasDefaultValue)
            {
                // Todo: Check what to do with this part
                var writtenValue = propEntry.DefaultValue is bool
                                   ?propEntry.DefaultValue.ToString().ToLower()
                                       : propEntry.DefaultValue;

                sb.AppendLine(
                    $"\tif (!data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                sb.AppendLine(
                    propEntry.PropertyType == typeof(string)
                        ? $"\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = '{writtenValue}';"
                        : $"\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = {writtenValue};");
                sb.AppendLine("\t} else {");
                sb.AppendLine(
                    $"\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)};");
                sb.AppendLine("\t}");
            }
            else
            {
                sb.AppendLine(
                    $"\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = ko.observable(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)});");
            }
        }
예제 #7
0
        static string GenerateJs(IEnumerable <PropertyBag> propertyCollection, JsGeneratorOptions generationOptions)
        {
            var options = generationOptions;
            var sbOut   = new StringBuilder();

            foreach (var type in propertyCollection.GroupBy(r => r.TypeName))
            {
                var typeDefinition = type.First().TypeDefinition;

                var sb = new StringBuilder();
                if (options.IncludeHeaders)
                {
                    BuildClassHeaders(sb);
                }

                BuildClassConstructor(type, sb, options);

                var propList = type.GroupBy(t => t.PropertyName).Select(t => t.First()).ToList();
                foreach (var propEntry in propList)
                {
                    switch (propEntry.TransformablePropertyType)
                    {
                    case PropertyBag.TransformablePropertyTypeEnum.CollectionType:
                        BuildArrayProperty(sb, propEntry, options);
                        break;

                    case PropertyBag.TransformablePropertyTypeEnum.DictionaryType:
                        BuildDictionaryProperty(sb, propEntry, options);
                        break;

                    case PropertyBag.TransformablePropertyTypeEnum.ReferenceType:
                        BuildObjectProperty(sb, propEntry, options);
                        break;

                    case PropertyBag.TransformablePropertyTypeEnum.Primitive:
                        BuildPrimitiveProperty(propEntry, sb, options);
                        break;
                    }
                }

                if (options.IncludeIsLoadingVar)
                {
                    BuildLoadingVar(sb);
                }

                sb.AppendLine("\t}"); // first close constructor parenthesis

                if (options.IncludeUnmapFunctions)
                {
                    BuildUnmapFunction(sb, propList, generationOptions);
                }

                if (options.IncludeMergeFunction && !typeDefinition.IsEnum)
                {
                    sb.AppendLine();
                    BuildMergeFunctionForClass(sb, propList, options);
                }

                if (options.IncludeEqualsFunction && !typeDefinition.IsEnum)
                {
                    sb.AppendLine();
                    BuildEqualsFunctionForClass(sb, propList, options);
                }

                if (options.CustomFunctionProcessors?.Any() == true)
                {
                    foreach (var customProcessor in options.CustomFunctionProcessors)
                    {
                        sb.AppendLine();
                        customProcessor(sb, propList, options);
                    }
                }

                BuildClassClosure(sb);

                sbOut.AppendLine(sb.ToString());
                sbOut.AppendLine();
            }

            return(sbOut.ToString());
        }
예제 #8
0
        // TODO: Remove this function. Reason: I really need to think about this method more, in terms of "BindValues" as I am used to.
        private static void BuildMergeFunctionForClass(StringBuilder sb, IEnumerable <PropertyBag> propList,
                                                       JsGeneratorOptions options)
        {
            //Generate a merge function to merge two objects
            sb.AppendLine("\tthis.$merge = function (mergeObj) {");
            sb.AppendLine("\t\tif (!mergeObj) { mergeObj = { }; }");
            foreach (var propEntry in propList)
            {
                switch (propEntry.TransformablePropertyType)
                {
                case PropertyBag.TransformablePropertyTypeEnum.CollectionType:
                    sb.AppendLine(
                        $"\t\tif (!mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = [];");
                    sb.AppendLine("\t\t}");
                    sb.AppendLine(
                        $"\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} != null) {{");
                    sb.AppendLine(string.Format("\t\t\tthis.{0}.splice(0, this.{0}.length);", Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)));
                    sb.AppendLine("\t\t}");
                    sb.AppendLine(
                        $"\t\tif (mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine(
                        $"\t\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} === null) {{");
                    sb.AppendLine($"\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = [];");
                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine(
                        $"\t\t\tfor (i = 0; i < mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.length; i++) {{");
                    sb.AppendLine(string.Format("\t\t\t\tthis.{0}.push(mergeObj.{0}[i]);", Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)));
                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");
                    break;

                case PropertyBag.TransformablePropertyTypeEnum.DictionaryType:
                    sb.AppendLine(
                        $"\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} != null) {{");
                    sb.AppendLine(
                        $"\t\t\tfor (var key in this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine(
                        $"\t\t\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.hasOwnProperty(key)) {{");
                    sb.AppendLine(
                        $"\t\t\t\t\tdelete this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key];");
                    sb.AppendLine("\t\t\t\t}");
                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");
                    sb.AppendLine(
                        $"\t\tif (mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine(
                        $"\t\t\tfor (var key in mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine(
                        $"\t\t\t\tif (mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.hasOwnProperty(key)) {{");
                    sb.AppendLine(
                        $"\t\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key] = mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key];");
                    sb.AppendLine("\t\t\t\t}");
                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");
                    break;

                case PropertyBag.TransformablePropertyTypeEnum.ReferenceType:
                    sb.AppendLine(
                        $"\t\tif (mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} == null) {{");
                    sb.AppendLine($"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = null;");
                    sb.AppendLine(
                        $"\t\t}} else if (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} != null) {{");
                    sb.AppendLine(
                        $"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.$merge(mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)});");
                    sb.AppendLine("\t\t} else {");
                    sb.AppendLine(
                        $"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)};");
                    sb.AppendLine("\t\t}");
                    break;

                case PropertyBag.TransformablePropertyTypeEnum.Primitive:
                    sb.AppendLine(
                        $"\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = mergeObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)};");
                    break;
                }
            }
            sb.AppendLine("\t}");
        }
예제 #9
0
        // TODO: Remove this function. Reason: I don't need copy constructor and can't find a scenario where I will use it.
        private static void BuildEqualsFunctionForClass(StringBuilder sb, IEnumerable <PropertyBag> propList,
                                                        JsGeneratorOptions options)
        {
            // Generate an equals function for two objects
            sb.AppendLine("\tthis.$equals = function (compareObj) {");
            sb.AppendLine("\t\tif (!compareObj) { return false; }");
            foreach (var propEntry in propList)
            {
                switch (propEntry.TransformablePropertyType)
                {
                case PropertyBag.TransformablePropertyTypeEnum.CollectionType:
                    sb.AppendLine(
                        $"\t\tif (compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} !== this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\tif (!compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine($"\t\t\tif (!this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine($"\t\t\tif (compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.length != this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.length) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine(
                        $"\t\t\tfor (i = 0; i < this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.length; i++) {{");
                    var collectionType = propEntry.CollectionInnerTypes.First();

                    if (!collectionType.IsPrimitiveType)
                    {
                        sb.AppendLine(
                            $"\t\t\t\tif (!this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i].$equals(compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i])) {{ return false; }};");
                    }
                    else
                    {
                        sb.AppendLine(
                            $"\t\t\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i] !== compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i]) {{ return false; }};");
                    }
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine($"\t\t}}");

                    break;

                case PropertyBag.TransformablePropertyTypeEnum.DictionaryType:
                    sb.AppendLine(
                        $"\t\tif (compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} !== this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\tif (!compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine($"\t\t\tif (!this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");

                    /*sb.AppendLine(
                     *  $"\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} != null) {{");*/
                    sb.AppendLine(
                        $"\t\t\tfor (var key in this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine(
                        $"\t\t\t\tif (!compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.hasOwnProperty(key)) {{");
                    sb.AppendLine(
                        $"\t\t\t\t\treturn false;");
                    sb.AppendLine("\t\t\t\t}");
                    var valueType = propEntry.CollectionInnerTypes.First(p => !p.IsDictionaryKey);

                    if (!valueType.IsPrimitiveType)
                    {
                        sb.AppendLine(
                            $"\t\t\t\tif (!this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key].$equals(compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key])) {{ return false; }};");
                    }
                    else
                    {
                        sb.AppendLine(
                            $"\t\t\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key] !== compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key]) {{ return false; }};");
                    }
                    sb.AppendLine("\t\t\t}");
                    sb.AppendLine("\t\t}");
                    break;

                case PropertyBag.TransformablePropertyTypeEnum.ReferenceType:
                    sb.AppendLine(
                        $"\t\tif (compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} !== this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\tif (!compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine($"\t\t\tif (!this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
                    sb.AppendLine($"\t\t\t\treturn false;");
                    sb.AppendLine($"\t\t\t}}");
                    sb.AppendLine(
                        $"\t\t\tif (!this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.$equals(compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)})) {{ return false; }};");
                    sb.AppendLine("\t\t}");
                    break;

                case PropertyBag.TransformablePropertyTypeEnum.Primitive:
                    sb.AppendLine(
                        $"\t\tif (this.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} !== compareObj.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{ return false; }};");
                    break;
                }
            }
            sb.AppendLine("\treturn true;");
            sb.AppendLine("\t}");
        }
예제 #10
0
        private static string GenerateJs(IEnumerable <PropertyBag> propertyCollection, JsGeneratorOptions generationOptions)
        {
            var options = generationOptions;

            var sbOut = new StringBuilder();

            foreach (var type in propertyCollection.GroupBy(r => r.TypeName))
            {
                var typeDefinition = type.First().TypeDefinition;

                var sb = new StringBuilder();

                BuildClassConstructor(type, sb, options);

                // initialize array variables if any are present in this type
                if (
                    type.Any(
                        p =>
                        p.TransformablePropertyType == PropertyBag.TransformablePropertyTypeEnum.CollectionType ||
                        p.TransformablePropertyType == PropertyBag.TransformablePropertyTypeEnum.DictionaryType))
                {
                    sb.AppendLine("\tvar i, length;");
                }

                sb.AppendLine();

                var propList = type.GroupBy(t => t.PropertyName).Select(t => t.First()).ToList();
                foreach (var propEntry in propList)
                {
                    switch (propEntry.TransformablePropertyType)
                    {
                    case PropertyBag.TransformablePropertyTypeEnum.CollectionType:
                        BuildArrayProperty(sb, propEntry, options);
                        break;

                    case PropertyBag.TransformablePropertyTypeEnum.DictionaryType:
                        BuildDictionaryProperty(sb, propEntry, options);
                        break;

                    case PropertyBag.TransformablePropertyTypeEnum.ReferenceType:
                        BuildObjectProperty(sb, propEntry, options);
                        break;

                    case PropertyBag.TransformablePropertyTypeEnum.Primitive:
                        BuildPrimitiveProperty(propEntry, sb, options);
                        break;
                    }
                }

                if (options.IncludeMergeFunction && !typeDefinition.IsEnum)
                {
                    sb.AppendLine();
                    BuildMergeFunctionForClass(sb, propList, options);
                }

                if (options.IncludeEqualsFunction && !typeDefinition.IsEnum)
                {
                    sb.AppendLine();
                    BuildEqualsFunctionForClass(sb, propList, options);
                }

                if (options.CustomFunctionProcessors?.Any() == true)
                {
                    foreach (var customProcessor in options.CustomFunctionProcessors)
                    {
                        sb.AppendLine();
                        customProcessor(sb, propList, options);
                    }
                }

                BuildClassClosure(sb);

                sbOut.AppendLine(sb.ToString());
                sbOut.AppendLine();
            }

            return(sbOut.ToString());
        }
예제 #11
0
 private static void BuildUnmapFunction(StringBuilder sb, List <PropertyBag> properties, JsGeneratorOptions options)
 {
     sb.AppendLine($"\tunmap() {{");
     sb.AppendLine($"\t\t return {{");
     foreach (var fileProperty in properties)
     {
         // Note: I don't see point in creating unmap for anything beside primitive types, so I will leave others out
         if (fileProperty.TransformablePropertyType == PropertyBag.TransformablePropertyTypeEnum.Primitive)
         {
             sb.AppendLine($"\t\t\t {Helpers.ToCamelCase(fileProperty.PropertyName, options.CamelCase)}: this.{Helpers.ToCamelCase(fileProperty.PropertyName, options.CamelCase)}()");
         }
     }
     sb.AppendLine($"\t\t}}");
 }
예제 #12
0
        private static void BuildArrayProperty(StringBuilder sb, PropertyBag propEntry, JsGeneratorOptions options)
        {
            sb.AppendLine(string.Format("\tthis.{0} = new Array(data.{0} == null ? 0 : data.{1}.length );", Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase), Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)));
            sb.AppendLine($"\tif(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} != null) {{");
            sb.AppendLine(
                $"\t\tfor (i = 0, length = data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.length; i < length; i++) {{");

            var collectionType = propEntry.CollectionInnerTypes.First();

            if (!collectionType.IsPrimitiveType)
            {
                sb.AppendLine(
                    $"\t\t\tif (!overrideObj.{Helpers.GetName(collectionType.Type.Name, options.ClassNameConstantsToRemove)}) {{");
                sb.AppendLine(
                    $"\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i] = new {options.OutputNamespace}.{Helpers.GetName(collectionType.Type.Name, options.ClassNameConstantsToRemove)}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i]);");
                sb.AppendLine("\t\t\t} else {");
                sb.AppendLine(
                    $"\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i] = new overrideObj.{Helpers.GetName(collectionType.Type.Name, options.ClassNameConstantsToRemove)}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i], overrideObj);");

                sb.AppendLine("\t\t\t}");
            }
            else
            {
                sb.AppendLine(
                    $"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i] = data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[i];");
            }
            sb.AppendLine("\t\t}");
            sb.AppendLine("\t}");
        }
예제 #13
0
        private static void BuildObjectProperty(StringBuilder sb, PropertyBag propEntry, JsGeneratorOptions options)
        {
            sb.AppendLine($"\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = null;");
            sb.AppendLine($"\tif (data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
            sb.AppendLine(
                $"\t\tif (!overrideObj.{Helpers.GetName(propEntry.PropertyType.Name, options.ClassNameConstantsToRemove)}) {{");
            sb.AppendLine(
                $"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = new {options.OutputNamespace}.{Helpers.GetName(propEntry.PropertyType.Name, options.ClassNameConstantsToRemove)}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)});");
            sb.AppendLine("\t\t} else {");
            sb.AppendLine(
                $"\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = new overrideObj.{Helpers.GetName(propEntry.PropertyType.Name, options.ClassNameConstantsToRemove)}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}, overrideObj);");

            sb.AppendLine("\t\t}");
            sb.AppendLine("\t}");
        }
예제 #14
0
        private static void BuildArrayProperty(StringBuilder sb, PropertyBag propEntry, JsGeneratorOptions options)
        {
            sb.AppendLine();
            var collectionType = propEntry.CollectionInnerTypes.First();

            if (!collectionType.IsPrimitiveType)
            {
                sb.AppendLine(
                    $"\tconst mapped{propEntry.PropertyName} = data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.map(s => new { Helpers.GetName(propEntry.PropertyType.GetGenericArguments().Single().Name, options.ClassNameConstantsToRemove)}(s));");

                sb.AppendLine(
                    $"\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = ko.observableArray(mapped{propEntry.PropertyName})");
            }
            else
            {
                sb.AppendLine(
                    $"\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = ko.observableArray(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)})");
            }
        }
예제 #15
0
        private static void BuildClassConstructor(IGrouping <string, PropertyBag> type, StringBuilder sb, JsGeneratorOptions options)
        {
            if (
                type.Any(
                    p =>
                    (p.CollectionInnerTypes != null && p.CollectionInnerTypes.Any(q => !q.IsPrimitiveType)) ||
                    p.TransformablePropertyType == PropertyBag.TransformablePropertyTypeEnum.ReferenceType))
            {
                sb.AppendLine(
                    $"export default {options.OutputNamespace} {Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} {{");
                sb.AppendLine($"\tconstructor (data) {{");
            }
            else if (type.First().TypeDefinition.IsEnum)
            {
                // WE have 2 options:
                #region Option 1
                //export default class Enum
                //{
                //    static enumerate()
                //    {
                //        return Object.values(this).map((value) => ({
                //            id: value,
                //        name: this.display(value)
                //        }));
                //    }
                //}

                //import Enum from 'common/enum';
                //export class EStoreFilters extends Enum
                //    {
                //    static all = 0
                //    static withoutProduct = 1
                //    static display(value)
                //    {
                //        if (value === EStoreFilters.all)
                //            return 'Show all';
                //        if (value === EStoreFilters.withoutProduct)
                //            return 'Without this product';
                //        throw new Error(`EStoreFilters Enum does not contain value '${value}'`);
                //    }
                //}
                #endregion
                #region Option 2
                //export const EImageType = {
                //    front: 0,
                //    back: 1,
                //    detailOne: 2,
                //    detailTwo: 3,
                //    detailThree: 4
                //};
                #endregion

                // Option 2
                sb.AppendLine(
                    $"export const {options.OutputNamespace} {Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} = {{");
            }
            else
            {
                sb.AppendLine(
                    $"export default {options.OutputNamespace} {Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} {{");

                sb.AppendLine($"\tconstructor (data) {{");
            }
        }
예제 #16
0
        // Implementation of Dictionary will be left same as in Vanilla javascript for now, because of unknown behaviour of observableArrays with this type of variables
        private static void BuildDictionaryProperty(StringBuilder sb, PropertyBag propEntry, JsGeneratorOptions options)
        {
            sb.AppendLine($"\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} = {{}};");
            sb.AppendLine($"\tif(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)} != null) {{");
            sb.AppendLine(
                $"\t\tfor (var key in data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}) {{");
            sb.AppendLine(
                $"\t\t\tif (data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}.hasOwnProperty(key)) {{");

            var keyType = propEntry.CollectionInnerTypes.First(p => p.IsDictionaryKey);

            if (!AllowedDictionaryKeyTypes.Contains(keyType.Type))
            {
                throw new Exception(
                          $"Dictionaries must have strings, enums, or integers as keys, error found in type: {propEntry.TypeName}");
            }
            var valueType = propEntry.CollectionInnerTypes.First(p => !p.IsDictionaryKey);

            if (!valueType.IsPrimitiveType)
            {
                sb.AppendLine(
                    $"\t\t\t\tif (!overrideObj.{Helpers.GetName(valueType.Type.Name, options.ClassNameConstantsToRemove)}) {{");
                sb.AppendLine(
                    $"\t\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key] = new {options.OutputNamespace}.{Helpers.GetName(valueType.Type.Name, options.ClassNameConstantsToRemove)}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key]);");
                sb.AppendLine("\t\t\t\t} else {");
                sb.AppendLine(
                    $"\t\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key] = new overrideObj.{Helpers.GetName(valueType.Type.Name, options.ClassNameConstantsToRemove)}(data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key], overrideObj);");

                sb.AppendLine("\t\t\t\t}");
            }
            else
            {
                sb.AppendLine(
                    $"\t\t\t\tthis.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key] = data.{Helpers.ToCamelCase(propEntry.PropertyName, options.CamelCase)}[key];");
            }
            sb.AppendLine("\t\t\t}");
            sb.AppendLine("\t\t}");
            sb.AppendLine("\t}");
        }
예제 #17
0
        private static void BuildClassConstructor(IGrouping <string, PropertyBag> type, StringBuilder sb, JsGeneratorOptions options)
        {
            if (
                type.Any(
                    p =>
                    (p.CollectionInnerTypes != null && p.CollectionInnerTypes.Any(q => !q.IsPrimitiveType)) ||
                    p.TransformablePropertyType == PropertyBag.TransformablePropertyTypeEnum.ReferenceType))
            {
                if (String.IsNullOrEmpty(options.OutputNamespace))
                {
                    sb.AppendLine(
                        $"function {Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} = function (data, overrideObj) {{");
                }
                else
                {
                    sb.AppendLine(
                        $"{options.OutputNamespace}.{Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} = function (data, overrideObj) {{");
                }

                sb.AppendLine("\tif (!overrideObj) { overrideObj = { }; }");
                sb.AppendLine("\tif (!data) { data = { }; }");
            }
            else if (type.First().TypeDefinition.IsEnum)
            {
                sb.AppendLine(
                    $"{options.OutputNamespace}.{Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} = {{");
            }
            else
            {
                sb.AppendLine(
                    $"{options.OutputNamespace}.{Helpers.GetName(type.First().TypeName, options.ClassNameConstantsToRemove)} = function (data) {{");

                sb.AppendLine("\tif (!data) { data = { }; }");
            }
        }