public virtual async ValueTask RenderTypeDeclarationAsync(
            RenderingTypeScriptDefinitions notification,
            ActivityType activityType,
            ActivityDescriptor activityDescriptor,
            ActivityDefinition activityDefinition,
            StringBuilder writer,
            CancellationToken cancellationToken = default)
        {
            var typeName             = activityDefinition.Name;
            var inputProperties      = activityDescriptor.InputProperties;
            var outputProperties     = activityDescriptor.OutputProperties;
            var interfaceDeclaration = $"declare interface {typeName}";

            writer.AppendLine($"{interfaceDeclaration} {{");

            foreach (var property in inputProperties)
            {
                await RenderActivityPropertyAsync(notification, writer, property.Name, property.Type, activityType, activityDescriptor, activityDefinition, cancellationToken);
            }

            foreach (var property in outputProperties)
            {
                await RenderActivityPropertyAsync(notification, writer, property.Name, property.Type, activityType, activityDescriptor, activityDefinition, cancellationToken);
            }

            writer.AppendLine("}");
        }
        public async Task <StringBuilder> GenerateTypeScriptDefinitionsAsync(
            StringBuilder builder,
            ICollection <string> declaredTypes,
            WorkflowDefinition?workflowDefinition = default,
            IntellisenseContext?context           = default,
            CancellationToken cancellationToken   = default)
        {
            var providerContext = new TypeDefinitionContext(workflowDefinition, context);
            var types           = await CollectTypesAsync(providerContext, cancellationToken);

            providerContext.GetTypeScriptType = ((provider, type) => GetTypeScriptType(providerContext, type, types, provider));

            // Render type declarations for anything except those listed in TypeConverters.
            foreach (var type in types)
            {
                var shouldRenderDeclaration = ShouldRenderTypeDeclaration(providerContext, type);
                if (shouldRenderDeclaration)
                {
                    RenderTypeDeclaration(providerContext, type, types, builder);
                }
            }

            string GetTypeScriptTypeInternal(Type type) => GetTypeScriptType(providerContext, type, types);

            var renderingTypeScriptDefinitions = new RenderingTypeScriptDefinitions(workflowDefinition, GetTypeScriptTypeInternal, context, declaredTypes, builder);
            await _mediator.Publish(renderingTypeScriptDefinitions, cancellationToken);

            return(builder);
        }
        private Task AddDeclaredTypes(RenderingTypeScriptDefinitions notification, ActivityDefinition activity, ICollection <string> declaredTypes, CancellationToken cancellationToken)
        {
            var typeName   = activity.Type;
            var schema     = GetActivitySchema(activity);
            var targetType = GetActivityTargetType(activity);

            if (!string.IsNullOrWhiteSpace(schema))
            {
                declaredTypes.Add($"{activity.Name}: {typeName}<{schema}>");
            }
            else if (!string.IsNullOrWhiteSpace(targetType))
            {
                declaredTypes.Add($"{activity.Name}: {typeName}<{targetType}>");
            }
            declaredTypes.Add($"declare interface {typeName}<T>");

            var activityType     = _activityTypeService.GetActivityTypeAsync(typeName, cancellationToken).Result;
            var descriptor       = activityType.DescribeAsync().Result;
            var inputProperties  = descriptor.InputProperties;
            var outputProperties = descriptor.OutputProperties;

            foreach (var property in inputProperties)
            {
                RenderActivityProperty(notification, declaredTypes, typeName, property.Name, property.Type);
            }

            foreach (var property in outputProperties)
            {
                RenderActivityProperty(notification, declaredTypes, typeName, property.Name, property.Type);
            }

            return(Task.CompletedTask);
        }
        public override async ValueTask RenderTypeDeclarationAsync(
            RenderingTypeScriptDefinitions notification,
            ActivityType activityType,
            ActivityDescriptor activityDescriptor,
            ActivityDefinition activityDefinition,
            StringBuilder writer,
            CancellationToken cancellationToken = default)
        {
            var targetTypeSchema = activityDefinition.Properties.FirstOrDefault(x => x.Name == nameof(HttpEndpoint.Schema))?.Expressions.Values.FirstOrDefault();

            if (!string.IsNullOrWhiteSpace(targetTypeSchema))
            {
                var jsonSchema = await JsonSchema.FromJsonAsync(targetTypeSchema, cancellationToken);

                var generator = new TypeScriptGenerator(jsonSchema, new TypeScriptGeneratorSettings
                {
                    TypeStyle         = TypeScriptTypeStyle.Interface,
                    TypeScriptVersion = 4
                });

                var typeScriptType = $"{activityDefinition.Name}Output";

                var jsonSchemaTypes = generator.GenerateFile(typeScriptType)
                                      .Replace("\r\n", "\n")
                                      .Replace("export interface", "declare class");

                writer.AppendLine(jsonSchemaTypes);
            }

            await base.RenderTypeDeclarationAsync(notification, activityType, activityDescriptor, activityDefinition, writer, cancellationToken);
        }
        private void RenderActivityProperty(RenderingTypeScriptDefinitions notification, ICollection <string> declaredTypes, string typeName, string propertyName, Type propertyType)
        {
            var typeScriptType = notification.GetTypeScriptType(propertyType);

            if (propertyName == "Output")
            {
                declaredTypes.Add($"{propertyName}(): {typeScriptType}<T>");
            }
        }
Esempio n. 6
0
        public Task Handle(RenderingTypeScriptDefinitions notification, CancellationToken cancellationToken)
        {
            var output = notification.Output;

            output.AppendLine("declare function queryString(name: string): string;");
            output.AppendLine("declare function absoluteUrl(url: string): string;");
            output.AppendLine("declare function signalUrl(signal: string): string;");

            return(Task.CompletedTask);
        }
        protected virtual ValueTask RenderActivityPropertyAsync(
            RenderingTypeScriptDefinitions notification,
            StringBuilder writer,
            string propertyName,
            Type propertyType,
            ActivityType activityType,
            ActivityDescriptor activityDescriptor,
            ActivityDefinition activityDefinition,
            CancellationToken cancellationToken = default)
        {
            var typeScriptType = notification.GetTypeScriptType(propertyType);

            writer.AppendLine($"{propertyName}(): {typeScriptType};");
            return(new ValueTask());
        }
        public async Task <string> GenerateTypeScriptDefinitionsAsync(WorkflowDefinition?workflowDefinition = default, string?context = default, CancellationToken cancellationToken = default)
        {
            var builder = new StringBuilder();
            var types   = await CollectTypesAsync(workflowDefinition, cancellationToken);

            // Render type declarations for anything except those listed in TypeConverters.
            foreach (var type in types)
            {
                var shouldRenderDeclaration = ShouldRenderTypeDeclaration(type);

                if (shouldRenderDeclaration)
                {
                    RenderTypeDeclaration(type, types, builder);
                }
            }

            string GetTypeScriptTypeInternal(Type type) => GetTypeScriptType(type, types);

            if (workflowDefinition != null)
            {
                var contextType = workflowDefinition.ContextOptions?.ContextType;

                if (contextType != null)
                {
                    var typeScriptType = GetTypeScriptTypeInternal(contextType);
                    builder.AppendLine($"declare const workflowContext: {typeScriptType}");
                }

                foreach (var variable in workflowDefinition.Variables !.Data)
                {
                    var variableType   = variable.Value?.GetType() ?? typeof(object);
                    var typeScriptType = GetTypeScriptTypeInternal(variableType);
                    builder.AppendLine($"declare const {variable.Key}: {typeScriptType}");
                }
            }

            var renderingTypeScriptDefinitions = new RenderingTypeScriptDefinitions(workflowDefinition, GetTypeScriptTypeInternal, context, builder);
            await _mediator.Publish(renderingTypeScriptDefinitions, cancellationToken);

            return(builder.ToString());
        }
        public Task Handle(RenderingTypeScriptDefinitions notification, CancellationToken cancellationToken)
        {
            var output = notification.Output;

            output.AppendLine("declare function queryString(name: string): string;");
            output.AppendLine("declare function absoluteUrl(url: string): string;");
            output.AppendLine("declare function signalUrl(signal: string): string;");

            if (notification.WorkflowDefinition != null)
            {
                var namedActivities = notification.WorkflowDefinition.Activities.Where(x => !string.IsNullOrWhiteSpace(x.Name)).ToList();

                foreach (var activity in namedActivities)
                {
                    AddDeclaredClasses(activity, output);
                    AddDeclaredTypes(notification, activity, notification.DeclaredTypes, cancellationToken);
                }
            }

            return(Task.CompletedTask);
        }
        protected override async ValueTask RenderActivityPropertyAsync(
            RenderingTypeScriptDefinitions notification,
            StringBuilder writer,
            string propertyName,
            Type propertyType,
            ActivityType activityType,
            ActivityDescriptor activityDescriptor,
            ActivityDefinition activityDefinition,
            CancellationToken cancellationToken = default)
        {
            if (propertyName != nameof(HttpEndpoint.Output))
            {
                await base.RenderActivityPropertyAsync(notification, writer, propertyName, propertyType, activityType, activityDescriptor, activityDefinition, cancellationToken);

                return;
            }

            var targetTypeName   = activityDefinition.Properties.First(x => x.Name == nameof(HttpEndpoint.TargetType)).Expressions.Values.FirstOrDefault();
            var targetTypeSchema = activityDefinition.Properties.First(x => x.Name == nameof(HttpEndpoint.Schema)).Expressions.Values.FirstOrDefault();
            var typeScriptType   = notification.GetTypeScriptType(propertyType);

            if (!string.IsNullOrWhiteSpace(targetTypeName))
            {
                var type = Type.GetType(targetTypeName);

                if (type != null)
                {
                    typeScriptType = notification.GetTypeScriptType(type);
                }
            }
            else if (!string.IsNullOrWhiteSpace(targetTypeSchema))
            {
                typeScriptType = $"{activityDefinition.Name}Output";
            }

            writer.AppendLine($"{propertyName}(): {typeScriptType}");
        }
 public Task Handle(RenderingTypeScriptDefinitions notification, CancellationToken cancellationToken)
 {
     notification.Output.AppendLine("declare function formatE164PhoneNumber(number: string, defaultRegion: string): string;");
     return(Task.CompletedTask);
 }