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>"); } }
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); }