public static void GenerateTS(SwaggerDocument document, ApiClientDefinition definition)
        {
            var settings = new SwaggerToTypeScriptClientGeneratorSettings()
            {
                Template = TypeScriptTemplate.Fetch,
                OperationNameGenerator     = new CustomNameGenerator(),
                GenerateOptionalParameters = true,
                UseTransformOptionsMethod  = true,
                ClientBaseClass            = "ClientBase"
            };

            settings.TypeScriptGeneratorSettings.PropertyNameGenerator = new MyPropertyNameGenerator(c => ConversionUtilities.ConvertToLowerCamelCase(c, true));
            settings.TypeScriptGeneratorSettings.NullValue             = TypeScriptNullValue.Null;


            var generator = new SwaggerToTypeScriptClientGenerator(document, settings);
            var ts        = generator.GenerateFile();
            var baseClass = CreateBaseClass(definition);

            ts = WrapInNamespace(definition, ts, baseClass);
            File.WriteAllText(definition.TypescriptClient, ts);

            if (definition.CompileTypescript)
            {
                Process.Start("tsc", definition.TypescriptClient).WaitForExit();
            }
        }
Beispiel #2
0
        private static string CreateBaseClass(ApiClientDefinition definition)
        {
            return($@"class ClientBase {{
    public transformOptions(options: RequestInit) {{
        options.credentials = ""{definition.FetchOptions.Credentials}"";
        return Promise.resolve(options);
    }}
}}");
        }
Beispiel #3
0
        public static async Task RegenApiClient(ApiClientDefinition definition)
        {
            var document = await LoadDocument(definition.SwaggerFile);

            document.PopulateOperationIds();
            var(isSingleClient, typeName) = GenerateCSharp(document, definition);
            GenerateTS(document, definition);

            Console.WriteLine($"API clients generated. Place the following code snippet to your DotvvmStartup.cs: ");
            Console.WriteLine($"config.RegisterApi{(isSingleClient ? "Client" : "Group")}(typeof({definition.Namespace}.{(definition.GenerateWrapperClass || isSingleClient ? typeName : " ... your client wrapper class ...")}), \"{ document.BasePath ?? "... your api endpoint ..." }\", \"{(definition.CompileTypescript ? Path.ChangeExtension(definition.TypescriptClient, "js") : "... path to your compiled javascript")}\");");
        }
Beispiel #4
0
        public static void AddApiClient(Uri swaggerFile, string @namespace, string csharpoutput, string typescriptOutput, DotvvmProjectMetadata project)
        {
            var definition = new ApiClientDefinition {
                CSharpClient     = csharpoutput,
                TypescriptClient = typescriptOutput,
                SwaggerFile      = swaggerFile,
                Namespace        = @namespace
            };

            project.ApiClients.Add(definition);
            RegenApiClient(definition).Wait();
        }
Beispiel #5
0
        public static async Task RegenApiClient(ApiClientDefinition definition)
        {
            var document =
                !definition.SwaggerFile.IsAbsoluteUri ? await SwaggerDocument.FromFileAsync(definition.SwaggerFile.ToString()) :
                definition.SwaggerFile.Scheme == "file" ? await SwaggerDocument.FromFileAsync(definition.SwaggerFile.LocalPath) :
                await SwaggerDocument.FromUrlAsync(definition.SwaggerFile.ToString());

            PopulateOperationIds(document);
            var(isSingleClient, typeName) = GenerateCSharp(document, definition);
            GenerateTS(document, definition);

            Console.WriteLine($"Api clients generated. To register in dotvvm put following to your DotvvmStartup: ");
            Console.WriteLine($"config.RegisterApi{(isSingleClient ? "Client" : "Group")}(typeof({definition.Namespace}.{(definition.GenerateWrapperClass || isSingleClient ? typeName : " ... your client wrapper class ...")}), \"{ document.BasePath ?? "... you api endpoint ..." }\", \"{(definition.CompileTypescript ? Path.ChangeExtension(definition.TypescriptClient, "js") : "... path to your compiled javascript")}\");");
        }
Beispiel #6
0
        public static void GenerateTS(SwaggerDocument document, ApiClientDefinition definition, bool promptOnFileOverwrite)
        {
            var className = Path.GetFileNameWithoutExtension(definition.TypescriptClient);

            var settings = new SwaggerToTypeScriptClientGeneratorSettings()
            {
                Template = TypeScriptTemplate.Fetch,
                OperationNameGenerator      = new CustomOperationNameGenerator(),
                GenerateOptionalParameters  = true,
                UseTransformOptionsMethod   = true,
                ClientBaseClass             = "ClientBase",
                TypeScriptGeneratorSettings =
                {
                    PropertyNameGenerator = new CustomPropertyNameGenerator(c => c),
                    NullValue             = TypeScriptNullValue.Null
                }
            };

            if (definition.IsSingleClient)
            {
                // set the class name only when Swagger generates one client, otherwise all classes would have the same name
                settings.ClassName = className;
            }

            settings.TypeScriptGeneratorSettings.TemplateFactory = new DotvvmClientTemplateFactory(settings.CodeGeneratorSettings, new[] {
                typeof(TypeScriptGeneratorSettings).Assembly,
                typeof(SwaggerToTypeScriptClientGeneratorSettings).Assembly
            });

            var resolver  = new TypeScriptTypeResolver(settings.TypeScriptGeneratorSettings);
            var generator = new DotvvmSwaggerToTypeScriptClientGenerator(document, settings, resolver);
            var ts        = generator.GenerateFile();
            var baseClass = definition.CreateBaseClass();

            ts = definition.WrapInNamespace(ts, baseClass);
            FileSystemHelpers.WriteFile(definition.TypescriptClient, ts, promptOnFileOverwrite);

            if (definition.CompileTypescript)
            {
                Process.Start(new ProcessStartInfo()
                {
                    FileName        = "tsc",
                    Arguments       = definition.TypescriptClient,
                    UseShellExecute = true,
                    CreateNoWindow  = true,
                    WindowStyle     = ProcessWindowStyle.Hidden
                }).WaitForExit();
            }
        }
Beispiel #7
0
        public static void GenerateTS(SwaggerDocument document, ApiClientDefinition definition)
        {
            var settings = new SwaggerToTypeScriptClientGeneratorSettings()
            {
                Template = TypeScriptTemplate.Fetch,
                OperationNameGenerator      = new CustomOperationNameGenerator(),
                GenerateOptionalParameters  = true,
                UseTransformOptionsMethod   = true,
                ClientBaseClass             = "ClientBase",
                TypeScriptGeneratorSettings =
                {
                    PropertyNameGenerator = new CustomPropertyNameGenerator(c => c),
                    NullValue             = TypeScriptNullValue.Null
                }
            };

            settings.TypeScriptGeneratorSettings.TemplateFactory = new DotvvmClientTemplateFactory(settings.CodeGeneratorSettings, new[] {
                typeof(TypeScriptGeneratorSettings).Assembly,
                typeof(SwaggerToTypeScriptClientGeneratorSettings).Assembly
            });

            var resolver  = new TypeScriptTypeResolver(settings.TypeScriptGeneratorSettings);
            var generator = new DotvvmSwaggerToTypeScriptClientGenerator(document, settings, resolver);
            var ts        = generator.GenerateFile();
            var baseClass = definition.CreateBaseClass();

            ts = definition.WrapInNamespace(ts, baseClass);
            File.WriteAllText(definition.TypescriptClient, ts);

            if (definition.CompileTypescript)
            {
                Process.Start(new ProcessStartInfo()
                {
                    FileName        = "tsc",
                    Arguments       = definition.TypescriptClient,
                    UseShellExecute = true,
                    CreateNoWindow  = true,
                    WindowStyle     = ProcessWindowStyle.Hidden
                }).WaitForExit();
            }
        }
Beispiel #8
0
        public static void GenerateTS(SwaggerDocument document, ApiClientDefinition definition)
        {
            var settings = new SwaggerToTypeScriptClientGeneratorSettings()
            {
                Template = TypeScriptTemplate.Fetch,
                OperationNameGenerator = new CustomNameGenerator()
            };

            settings.TypeScriptGeneratorSettings.PropertyNameGenerator = new MyPropertyNameGenerator(c => ConversionUtilities.ConvertToLowerCamelCase(c, true));
            settings.TypeScriptGeneratorSettings.NullValue             = TypeScriptNullValue.Null;


            var generator = new SwaggerToTypeScriptClientGenerator(document, settings);
            var ts        = generator.GenerateFile();

            ts = "namespace " + definition.Namespace + " {\n    " + ConversionUtilities.Tab(ts, 1).TrimEnd('\n') + "\n}\n";
            File.WriteAllText(definition.TypescriptClient, ts);

            if (definition.CompileTypescript)
            {
                Process.Start("tsc", definition.TypescriptClient).WaitForExit();
            }
        }
Beispiel #9
0
        public static (bool isSingleClient, string typeName) GenerateCSharp(SwaggerDocument document, ApiClientDefinition definition)
        {
            var settings = new SwaggerToCSharpClientGeneratorSettings()
            {
                GenerateSyncMethods        = true,
                OperationNameGenerator     = new CustomOperationNameGenerator(),
                GenerateOptionalParameters = true,
                CSharpGeneratorSettings    =
                {
                    ClassStyle            = CSharpClassStyle.Poco,
                    Namespace             = definition.Namespace,
                    ArrayType             = "System.Collections.Generic.List",
                    PropertyNameGenerator = new CustomPropertyNameGenerator(c => ConversionUtilities.ConvertToUpperCamelCase(c,true)),
                }
            };

            settings.CSharpGeneratorSettings.TypeNameGenerator =
                new DotvmmCSharpTypeNameGenerator(settings.CSharpGeneratorSettings, document);
            settings.CSharpGeneratorSettings.TemplateFactory = new DotvvmClientTemplateFactory(settings.CodeGeneratorSettings, new[] {
                typeof(CSharpGeneratorSettings).Assembly,
                typeof(SwaggerToCSharpGeneratorSettings).Assembly
            });

            var resolver  = SwaggerToCSharpTypeResolver.CreateWithDefinitions(settings.CSharpGeneratorSettings, document);
            var generator = new DotvvmSwaggerToCSharpClientGenerator(document, settings, resolver);
            var csharp    = generator.GenerateFile();

            var newClient = ApiClientUtils.InjectWrapperClass(csharp, Path.GetFileNameWithoutExtension(definition.CSharpClient),
                                                              document, settings.OperationNameGenerator, out var isSingleClient, out var wrapperTypeName);

            definition.IsSingleClient = isSingleClient;

            if (definition.GenerateWrapperClass)
            {
                csharp = newClient;
            }

            File.WriteAllText(definition.CSharpClient, csharp);

            return(isSingleClient, wrapperTypeName);
        }
Beispiel #10
0
        public static (bool isSinlgeClient, string typeName) GenerateCSharp(SwaggerDocument document, ApiClientDefinition definition)
        {
            var nameGenerator = new CustomNameGenerator();
            var settings      = new SwaggerToCSharpClientGeneratorSettings()
            {
                GenerateSyncMethods        = true,
                OperationNameGenerator     = nameGenerator,
                GenerateOptionalParameters = true,
            };

            settings.CSharpGeneratorSettings.ClassStyle            = CSharpClassStyle.Poco;
            settings.CSharpGeneratorSettings.Namespace             = definition.Namespace;
            settings.CSharpGeneratorSettings.ArrayType             = "System.Collections.Generic.List";
            settings.CSharpGeneratorSettings.PropertyNameGenerator =
                new MyPropertyNameGenerator(c => ConversionUtilities.ConvertToUpperCamelCase(c, true));


            var generator = new SwaggerToCSharpClientGenerator(document, settings);
            var csharp    = generator.GenerateFile();

            var newClient = InjectWrapperClass(csharp, Path.GetFileNameWithoutExtension(definition.CSharpClient), document, settings.OperationNameGenerator, out var isSinlgeClient, out var wrapperTypeName);

            definition.IsSingleClient = isSinlgeClient;

            if (definition.GenerateWrapperClass)
            {
                csharp = newClient;
            }

            File.WriteAllText(definition.CSharpClient, csharp);

            return(isSinlgeClient, wrapperTypeName);
        }
Beispiel #11
0
 private static string WrapInNamespace(ApiClientDefinition definition, string typescript, string baseClass)
 {
     return("namespace " + definition.Namespace + " {\n    " + ConversionUtilities.Tab(baseClass, 1).TrimEnd('\n') + "\n    " + ConversionUtilities.Tab(typescript, 1).TrimEnd('\n') + "\n}\n");
 }
Beispiel #12
0
        public static (bool isSingleClient, string typeName) GenerateCSharp(SwaggerDocument document, ApiClientDefinition definition, bool promptOnFileOverwrite)
        {
            var className = Path.GetFileNameWithoutExtension(definition.CSharpClient);

            var settings = new SwaggerToCSharpClientGeneratorSettings()
            {
                GenerateSyncMethods        = true,
                OperationNameGenerator     = new CustomOperationNameGenerator(),
                GenerateOptionalParameters = true,
                CSharpGeneratorSettings    =
                {
                    ClassStyle            = CSharpClassStyle.Poco,
                    Namespace             = definition.Namespace,
                    ArrayType             = "System.Collections.Generic.List",
                    PropertyNameGenerator = new CustomPropertyNameGenerator(c => ConversionUtilities.ConvertToUpperCamelCase(c,true)),
                }
            };

            // detect whether there will be multiple clients or just one
            var clientNames = document.Operations
                              .Select(o => settings.OperationNameGenerator.GetClientName(document, o.Path, o.Method, o.Operation))
                              .Distinct()
                              .ToArray();

            definition.IsSingleClient = clientNames.Length == 1;

            if (definition.IsSingleClient)
            {
                // set the class name only when Swagger generates one client, otherwise all classes would have the same name
                settings.ClassName = className;
            }

            settings.CSharpGeneratorSettings.TypeNameGenerator =
                new DotvmmCSharpTypeNameGenerator(settings.CSharpGeneratorSettings, document);
            settings.CSharpGeneratorSettings.TemplateFactory = new DotvvmClientTemplateFactory(settings.CodeGeneratorSettings, new[] {
                typeof(CSharpGeneratorSettings).Assembly,
                typeof(SwaggerToCSharpGeneratorSettings).Assembly
            });

            var resolver  = SwaggerToCSharpTypeResolver.CreateWithDefinitions(settings.CSharpGeneratorSettings, document);
            var generator = new DotvvmSwaggerToCSharpClientGenerator(document, settings, resolver);
            var csharp    = generator.GenerateFile();

            if (definition.GenerateWrapperClass && !definition.IsSingleClient)
            {
                csharp = ApiClientUtils.InjectWrapperClass(csharp, className, clientNames);
            }

            FileSystemHelpers.WriteFile(definition.CSharpClient, csharp, promptOnFileOverwrite);

            return(definition.IsSingleClient, className);
        }