public function getPreprocessedTemplate($force = false) { // Gather dependencies and create blueprint references $this->getStackName(); $this->getProfile(); $this->getParameters(); $this->getTags(); // convert templates paths to template objects $templates = []; foreach ($this->getTemplates() as $key => $templateFile) { $templateFile = $this->getBasePath() . '/' . $this->valueResolver->resolvePlaceholders($templateFile, $this, 'template'); $realTemplateFile = realpath($templateFile); if ($realTemplateFile === false || !is_file($realTemplateFile) || !is_readable($realTemplateFile)) { throw new \Exception('Could not find template file ' . $templateFile . ' referenced in blueprint ' . $this->name); } $templates[] = is_int($key) ? new Template($realTemplateFile) : new PrefixedTemplate($key, $realTemplateFile); } foreach ($this->getOptionalTemplates() as $key => $templateFile) { $templateFile = $this->getBasePath() . '/' . $this->valueResolver->resolvePlaceholders($templateFile, $this, 'optionalTemplates'); $realTemplateFiles = glob($templateFile); foreach ($realTemplateFiles as $realTemplateFile) { if ($realTemplateFile && is_file($realTemplateFile) && is_readable($realTemplateFile)) { $templates[] = is_int($key) ? new Template($realTemplateFile) : new PrefixedTemplate($key, $realTemplateFile); } } } if (count($templates) === 0) { throw new \Exception('No template(s) found'); } $additionalData = ['Metadata' => [Stack::METADATA_KEY => $this->getBlueprintReference()]]; if ($force) { $additionalData['Resources'] = ['Force' . time() => ['Type' => 'AWS::CloudFormation::WaitConditionHandle']]; } $description = null; if (!empty($this->blueprintConfig['description'])) { $description = $this->valueResolver->resolvePlaceholders($this->blueprintConfig['description'], $this, 'description'); } $templateMerger = new TemplateMerger(); return $templateMerger->merge($templates, $description, $additionalData); }