예제 #1
0
 public Task <SolutionComponent> InitializeAt(
     Components.ComponentTree tree,
     ComponentData data,
     ProjectSettings settings)
 {
     throw new System.NotImplementedException();
 }
예제 #2
0
        public async Task <ClientComponent> InitializeAt(
            Components.ComponentTree tree,
            ComponentData data,
            ProjectSettings settings)
        {
            var configFile = Path.Combine(tree.Path.FullName, ClientComponent.ConfigFileName);

            if (File.Exists(configFile))
            {
                throw new InvalidOperationException($"You can't create a client at \"{tree.Path.FullName}\". It already exists.");
            }

            var clientPort = data.Port ?? ProjectSettings.GetRandomUnusedPort();

            await TypeHandlers[data.ClientType](tree.Path, settings, data.Name);

            await Templates.Extract(
                ClientComponent.ConfigFileName,
                configFile,
                Templates.TemplateType.Infrastructure,
                ("NAME", TemplateData.SanitizeResourceName(data.Name)),
                ("PORT", clientPort.ToString()),
                ("TYPE", data.ClientType.ToString()),
                ("PATH", settings.GetRelativePath(
                     tree.Path.FullName,
                     tree.FindFirst <TerraformRootComponent>(Components.Direction.Out)?.FoundAt.Path.FullName)));

            return(await ClientComponent.Init(tree.Path, x => CreateBaseContainer(tree.Path, settings, x.Name), settings));
        }
        public async Task <ApiGatewayComponent> InitializeAt(
            Components.ComponentTree tree,
            ComponentData data,
            ProjectSettings settings)
        {
            var configPath = Path.Combine(tree.Path.FullName, ApiGatewayComponent.ConfigFileName);

            if (File.Exists(configPath))
            {
                throw new InvalidOperationException($"You can't add a new api at: \"{tree.Path.FullName}\". It already exists.");
            }

            var port = data.Port ?? ProjectSettings.GetRandomUnusedPort();

            await Templates.Extract(
                ApiGatewayComponent.ConfigFileName,
                configPath,
                Templates.TemplateType.Infrastructure,
                ("API_NAME", TemplateData.SanitizeResourceName(data.Name)),
                ("PORT", port.ToString()),
                ("DEFAULT_LANGUAGE", data.DefaultLanguage),
                ("BASE_URL", data.BaseUrl));

            return(await ApiGatewayComponent.Init(tree.Path, settings));
        }
예제 #4
0
        public async Task <TemplateData> GetCloudformationData(Components.ComponentTree components)
        {
            var template = (await components
                            .FindAll <ICloudformationComponent>(Components.Direction.In)
                            .Select(x => x.component?.GetCloudformationData(x.tree))
                            .WhenAll())
                           .Merge();

            var currentTemplate = new TemplateData();

            foreach (var configOverride in _configuration.Overrides)
            {
                var matchingResources = template
                                        .Resources
                                        .Where(x => x.Value.Type == configOverride.Type)
                                        .ToImmutableList();

                foreach (var resource in matchingResources)
                {
                    currentTemplate.Resources[resource.Key] = new TemplateData.ResourceData
                    {
                        Type       = resource.Value.Type,
                        Properties = configOverride.Properties
                    };
                }
            }

            return(currentTemplate);
        }
        public async Task <CloudformationStackComponent> InitializeAt(
            Components.ComponentTree tree,
            ComponentData data,
            ProjectSettings settings)
        {
            var configFilePath = Path.Combine(tree.Path.FullName, CloudformationStackComponent.ConfigFileName);

            if (File.Exists(configFilePath))
            {
                throw new InvalidCastException($"There is already a cloudformation stack configured at: \"{tree.Path.FullName}\"");
            }

            var serializer = new Serializer();

            var configuration = new CloudformationStackComponent.CloudformationStackConfiguration
            {
                Name     = data.Name,
                Settings = new CloudformationStackComponent.CloudformationStackConfiguration.CloudformationStackSettings
                {
                    Services             = data.Services.ToList(),
                    MainPort             = data.MainPort,
                    ServicesPort         = data.ServicesPort,
                    DeploymentBucketName = $"{settings.GetProjectName()}-{data.Name}-deployments",
                    DeploymentStackName  = $"{settings.GetProjectName()}-{data.Name}-deployments",
                    AwsRegion            = data.AwsRegion
                }
            };

            await File.WriteAllTextAsync(
                configFilePath,
                serializer.Serialize(configuration));

            return(await CloudformationStackComponent.Init(tree, settings));
        }
        public async Task <CloudflareWorkerComponent> InitializeAt(
            Components.ComponentTree tree,
            ComponentData data,
            ProjectSettings settings)
        {
            var configFilePath = Path.Combine(tree.Path.FullName, CloudflareWorkerComponent.ConfigFileName);

            if (File.Exists(configFilePath))
            {
                throw new InvalidOperationException($"There is already a cloudflare worker at {tree.Path.FullName}");
            }

            var configuration = new CloudflareWorkerComponent.CloudflareWorkerConfiguration
            {
                Name     = data.Name,
                Settings = new CloudflareWorkerComponent.CloudflareWorkerConfiguration.CloudflareWorkerSettings
                {
                    Port            = data.Port ?? ProjectSettings.GetRandomUnusedPort(),
                    DestinationPort = data.DestinationPort
                }
            };

            var serializer = new Serializer();

            await File.WriteAllTextAsync(configFilePath, serializer.Serialize(configuration));

            var executingAssembly = Assembly.GetExecutingAssembly();

            await Directories.Copy(
                Path.Combine(executingAssembly.GetPath(), "Source/CloudflareWorker"),
                tree.Path.FullName,
                ("WORKER_NAME", data.Name));

            return(await CloudflareWorkerComponent.Init(tree.Path, settings));
        }
예제 #7
0
        public Task <IImmutableList <PackageResource> > GetPackageResources(
            Components.ComponentTree components,
            string version)
        {
            async Task <IImmutableList <PackageResource> > GetFrom(DirectoryInfo directory)
            {
                var result = new List <PackageResource>();

                foreach (var file in directory.GetFiles())
                {
                    result.Add(new PackageResource(
                                   _settings.GetRelativePath(file.FullName, components.Path.FullName),
                                   await File.ReadAllBytesAsync(file.FullName)));
                }

                foreach (var subDirectory in directory.GetDirectories())
                {
                    result.AddRange(await GetFrom(subDirectory));
                }

                return(result.ToImmutableList());
            }

            return(GetFrom(_directory));
        }
예제 #8
0
        public async Task <TemplateData> GetCloudformationData(Components.ComponentTree components)
        {
            var deserializer = new Deserializer();

            return(deserializer.Deserialize <TemplateData>(
                       await File.ReadAllTextAsync(Path.Combine(_path.FullName, _fileName))));
        }
예제 #9
0
        public Task <IImmutableList <IComponent> > FindAt(Components.ComponentTree components, ProjectSettings settings)
        {
            var result = from file in components.Path.EnumerateFiles()
                         where file.Name.EndsWith(".sln")
                         select new SolutionComponent(file, settings);

            return(Task.FromResult <IImmutableList <IComponent> >(result.OfType <IComponent>().ToImmutableList()));
        }
예제 #10
0
        public Task <IImmutableList <IComponent> > FindAt(Components.ComponentTree components, ProjectSettings settings)
        {
            var result = from directory in components.Path.EnumerateDirectories()
                         where directory.Name.EndsWith(".include")
                         select new PackageDirectoryComponent(directory, settings);

            return(Task.FromResult <IImmutableList <IComponent> >(result.OfType <IComponent>().ToImmutableList()));
        }
예제 #11
0
 GetRequiredConfigurations(Components.ComponentTree components)
 {
     return(Task.FromResult <IEnumerable <(string key, string question, INeedConfiguration.ConfigurationType configurationType)> >(
                new List <(string key, string question, INeedConfiguration.ConfigurationType configurationType)>
     {
         ("localstackApiKey", "Enter your localstack api key if you have any:",
          INeedConfiguration.ConfigurationType.User)
     }));
 }
예제 #12
0
        public Task <TemplateData> GetCloudformationData(Components.ComponentTree components)
        {
            var template = _configuration.Settings.Template;

            var functionPath    = _settings.GetRelativePath(_path.FullName);
            var languageVersion = _configuration.GetLanguage();

            return(Task.FromResult(template.SetCodeUris(languageVersion.GetFunctionOutputPath(functionPath))));
        }
예제 #13
0
        public async Task <IImmutableList <PackageResource> > GetPackageResources(
            Components.ComponentTree components,
            string version)
        {
            var tempDir = new DirectoryInfo(Path.Combine(_path.FullName, ".tmp"));

            if (tempDir.Exists)
            {
                tempDir.Delete(true);
            }

            tempDir.Create();

            var distFolder = new DirectoryInfo(Path.Combine(_sourcePath.FullName, "dist"));

            async Task AddFilesFrom(DirectoryInfo directory, ZipOutputStream zipStream)
            {
                if (directory.FullName == tempDir.FullName)
                {
                    return;
                }

                foreach (var file in directory.GetFiles())
                {
                    zipStream.PutNextEntry(new ZipEntry(_settings.GetRelativePath(file.FullName, distFolder.FullName)));

                    await zipStream.WriteAsync(await File.ReadAllBytesAsync(file.FullName));

                    zipStream.CloseEntry();
                }

                foreach (var childDirectory in directory.GetDirectories())
                {
                    await AddFilesFrom(childDirectory, zipStream);
                }
            }

            var appFilePath = Path.Combine(tempDir.FullName, "amplify-app.zip");

            await using var zipFile   = File.Create(appFilePath);
            await using var outStream = new ZipOutputStream(zipFile);

            await AddFilesFrom(distFolder, outStream);

            await outStream.FlushAsync();

            outStream.Close();

            var result = ImmutableList.Create(new PackageResource(
                                                  _settings.GetRelativePath(Path.Combine(_path.FullName, "amplify-app.zip"), components.Path.FullName),
                                                  await File.ReadAllBytesAsync(appFilePath)));

            tempDir.Delete(true);

            return(result);
        }
예제 #14
0
        public Task <IImmutableList <IComponent> > FindAt(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            var result = from file in components.Path.EnumerateFiles()
                         where file.Name.Contains(".include.")
                         select new PackageFileComponent(Path.GetFileNameWithoutExtension(file.Name), file, settings);

            return(Task.FromResult <IImmutableList <IComponent> >(result.OfType <IComponent>().ToImmutableList()));
        }
        public Task <IImmutableList <IComponent> > FindAt(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            var result = from file in components.Path.EnumerateFiles()
                         where file.Name.EndsWith(".tf") && !file.Name.EndsWith(".main.tf")
                         select new TerraformResourceComponent(Path.GetFileNameWithoutExtension(file.Name), file, settings);

            return(Task.FromResult <IImmutableList <IComponent> >(result.OfType <IComponent>().ToImmutableList()));
        }
예제 #16
0
        public async Task <bool> Start(Components.ComponentTree components)
        {
            var buildResult = await Build();

            if (!buildResult)
            {
                return(false);
            }

            return(await _configuration.GetLanguage().StartWatch(_path.FullName));
        }
        public Task <IImmutableList <IComponent> > FindAt(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            var result = (from file in components.Path.EnumerateFiles()
                          where file.Name.EndsWith(".cf.yml")
                          select new CloudformationComponent(components.Path, file.Name))
                         .Cast <IComponent>()
                         .ToImmutableList();

            return(Task.FromResult <IImmutableList <IComponent> >(result));
        }
        public async Task <IImmutableList <IComponent> > FindAt(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            var apiGateway = await ApiGatewayComponent.Init(components.Path, settings);

            return(apiGateway != null
                ? new List <IComponent>
            {
                apiGateway
            }.ToImmutableList()
                : ImmutableList <IComponent> .Empty);
        }
예제 #19
0
        public async Task <IImmutableList <IComponent> > FindAt(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            var component = await ClientComponent.Init(components.Path, x => CreateBaseContainer(components.Path, settings, x.Name), settings);

            return(component != null
                ? new List <IComponent>
            {
                component
            }.ToImmutableList()
                : ImmutableList <IComponent> .Empty);
        }
        public async Task <IImmutableList <PackageResource> > GetPackageResources(
            Components.ComponentTree components,
            string version)
        {
            var resource = new PackageResource(
                _settings.GetRelativePath(_file.FullName, components.Path.FullName),
                await File.ReadAllBytesAsync(_file.FullName));

            return(new List <PackageResource>
            {
                resource
            }.ToImmutableList());
        }
        public async Task <IImmutableList <IComponent> > FindAt(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            var component = await CloudflareWorkerComponent.Init(components.Path, settings);

            return(component != null
                ? new List <IComponent>
            {
                component
            }.ToImmutableList()
                : ImmutableList <IComponent> .Empty);
        }
예제 #22
0
        public async Task <IImmutableList <IComponent> > FindAt(Components.ComponentTree components, ProjectSettings settings)
        {
            var foundComponents = new List <IComponent>();

            foreach (var file in components.Path.EnumerateFiles().Where(x => x.Name.EndsWith(".childconfig.yml")))
            {
                var component = await ChildConfigComponent.Init(file);

                if (component != null)
                {
                    foundComponents.Add(component);
                }
            }

            return(foundComponents.ToImmutableList());
        }
예제 #23
0
        public async Task <TerraformRootComponent> InitializeAt(
            Components.ComponentTree tree,
            ComponentData data,
            ProjectSettings settings)
        {
            var filePath = Path.Combine(tree.Path.FullName, $"{data.Name}.main.tf");

            if (File.Exists(filePath))
            {
                throw new InvalidOperationException(
                          $"There is already a terraform root module named {data.Name} at {tree.Path.FullName}");
            }

            await File.WriteAllTextAsync(filePath, "");

            return(new TerraformRootComponent(data.Name, new FileInfo(filePath)));
        }
예제 #24
0
        public async Task <ChildConfigComponent> InitializeAt(Components.ComponentTree tree, ComponentData data, ProjectSettings settings)
        {
            var configPath = new FileInfo(Path.Combine(tree.Path.FullName, $"{data.Name}.childconfig.yml"));

            if (configPath.Exists)
            {
                throw new InvalidOperationException($"You can't add child config {data.Name} at \"{tree.Path.FullName}\". It already exists.");
            }

            await Templates.Extract(
                "childconfig.yml",
                configPath.FullName,
                Templates.TemplateType.Infrastructure,
                ("NAME", TemplateData.SanitizeResourceName(data.Name)));

            return(await ChildConfigComponent.Init(configPath));
        }
예제 #25
0
        public Task <PackageDirectoryComponent> InitializeAt(
            Components.ComponentTree tree,
            PackageDirectoryComponent.ComponentData data,
            ProjectSettings settings)
        {
            var directory = new DirectoryInfo(Path.Combine(tree.Path.FullName, $"{data.Name}.include"));

            if (directory.Exists)
            {
                throw new InvalidOperationException(
                          $"There is already a directory named {data.Name} at {tree.Path.FullName}");
            }

            directory.Create();

            return(Task.FromResult(new PackageDirectoryComponent(directory, settings)));
        }
예제 #26
0
        public async Task <PackageFileComponent> InitializeAt(
            Components.ComponentTree tree,
            ComponentData data,
            ProjectSettings settings)
        {
            var filePath = Path.Combine(tree.Path.FullName, data.Name);

            if (File.Exists(filePath))
            {
                throw new InvalidOperationException(
                          $"There is already a file named {data.Name} at {tree.Path.FullName}");
            }

            await File.WriteAllTextAsync(filePath, "");

            return(new PackageFileComponent(data.Name, new FileInfo(filePath), settings));
        }
예제 #27
0
        public async Task <IImmutableList <PackageResource> > GetPackageResources(
            Components.ComponentTree components,
            string version)
        {
            var result = new List <PackageResource>();

            var distDirectory = new DirectoryInfo(Path.Combine(_path.FullName, "dist"));

            foreach (var file in distDirectory.EnumerateFiles())
            {
                result.Add(new PackageResource(
                               _settings.GetRelativePath(file.FullName, components.Path.FullName),
                               await File.ReadAllBytesAsync(file.FullName)));
            }

            return(result.ToImmutableList());
        }
예제 #28
0
        public async Task <bool> Start(Components.ComponentTree components)
        {
            var watchResponse = await _watchContainer
                                .Detached()
                                .Run("watch");

            if (!watchResponse)
            {
                return(false);
            }

            var startResponse = await _dockerContainer
                                .Port(_configuration.Settings.Port, 3000)
                                .Detached()
                                .Run("start");

            return(startResponse);
        }
예제 #29
0
        public static async Task <CloudformationStackComponent> Init(
            Components.ComponentTree components,
            ProjectSettings settings)
        {
            if (!File.Exists(Path.Combine(components.Path.FullName, ConfigFileName)))
            {
                return(null);
            }

            var deserializer = new Deserializer();

            return(new CloudformationStackComponent(
                       deserializer.Deserialize <CloudformationStackConfiguration>(
                           await File.ReadAllTextAsync(Path.Combine(components.Path.FullName, ConfigFileName))),
                       settings,
                       components.Path,
                       settings,
                       components));
        }
예제 #30
0
        public async Task <bool> Start(Components.ComponentTree components)
        {
            var restoreSuccess = await Restore();

            if (!restoreSuccess)
            {
                return(false);
            }

            var parsers = components
                          .FindAll <IParseCloudformationValues>(Components.Direction.Out)
                          .Select(x => x.component)
                          .ToImmutableList();

            var result = new Dictionary <string, string>();

            var amplifyApp =
                _configuration.Settings.Template.Resources.Values.FirstOrDefault(x => x.Type == "AWS::Amplify::App");

            if (amplifyApp != null && amplifyApp.Properties.ContainsKey("EnvironmentVariables"))
            {
                var environmentVariables = (amplifyApp.Properties["EnvironmentVariables"] as IEnumerable <object> ?? new List <object>()).OfType <IDictionary <object, object> >();

                foreach (var item in environmentVariables)
                {
                    if (item.ContainsKey("Name") && item.ContainsKey("Value"))
                    {
                        result[item["Name"].ToString() ?? string.Empty] =
                            (await parsers.Parse(item["Value"])) as string;
                    }
                }
            }

            var container = result.Aggregate(
                _dockerContainer,
                (current, variable) =>
                current.EnvironmentVariable(variable.Key, variable.Value));

            return(await container
                   .Detached()
                   .Port(_configuration.Settings.Port, 3000)
                   .Run("dev --hostname 0.0.0.0"));
        }