public TypeScriptOutputTypeMetadataGenerator(CodeTranslatorOptions options, IOutputTypeProvider provider)
            : base(new MapCollection(), provider)
        {
            Collection
            .AddMap <Dictionary>(metadata => metadata.IsDictionary, GetDictionaryMetadata)
            .AddMap <Class>(metadata => metadata.ClrType.IsClass && !metadata.IsDictionary && metadata.ClrType != typeof(string), GetClassMetadata)
            .AddMap <Array>(metadata => metadata.IsEnumerable && !metadata.IsDictionary && metadata.ClrType != typeof(string), GetArrayMetadata)
            .AddMap <Enum>(metadata => metadata.IsEnum, GetEnumMetadata)
            .AddMap <int, Number>()
            .AddMap <decimal, Number>()
            .AddMap <double, Number>()
            .AddMap <long, Number>()
            .AddMap <short, Number>()
            .AddMap <float, Number>()
            .AddMap <string, String>()
            .AddMap <bool, Boolean>()
            .AddMap <Guid, String>()
            .AddMap <DateTime, Date>()
            .AddMap <DateTimeOffset, Date>()
            .AddMap <Uri, String>()
            .AddMap <JObject, Any>()
            .AddMap <JToken, Any>();

            options.ConfigureTypeMap?.Invoke(Collection);
        }
        /// <summary>
        /// Creates <see cref="CodeTranslator"/> with default dependencies for TypeScript.
        /// </summary>
        /// <param name="options"></param>
        /// <param name="configureServices"></param>
        /// <returns></returns>
        public static ICodeTranslator Create(CodeTranslatorOptions options, Action <CodeTranslatorBuilder> configureServices = null)
        {
            var builder = new CodeTranslatorBuilder();

            builder
            .AddDependency(options)
            .AddDependency <ICodeTranslator, CodeTranslator>()
            .AddDependency <ICodeGenerator, TypeScriptCodeGenerator>()
            .AddDependency <ITypePartsCodeGenerator, TypeScriptTypePartsGenerator>()
            .AddDependency <IMetadataGenerator, MetadataGenerator>()
            .AddDependency <IPropertyInfoResolver, PropertyInfoResolver>()
            .AddDependency <IOutputTypeProvider, TypeScriptOutputTypeProvider>()
            .AddDependency <IDependenciesGraph, DependenciesGraph>()
            .AddDependency <IOutputTypeMetadataGenerator, TypeScriptOutputTypeMetadataGenerator>()
            .AddDependency <IIndentedStringBuilder, IndentedStringBuilder>();

            configureServices?.Invoke(builder);

            return(builder.Build());
        }
 public TypeScriptCodeGenerator(ITypePartsCodeGenerator generator, CodeTranslatorOptions options)
 {
     _generator = generator ?? throw new ArgumentNullException(nameof(generator));
     _options   = options ?? throw new ArgumentNullException(nameof(options));
 }
 public TypeScriptTypePartsGenerator(CodeTranslatorOptions options)
 {
     _options = options;
 }