Skip to content

Commit 99ac6ac

Browse files
author
Sean Sundberg
authored
Inckudes module readmes in output files (#5)
Signed-off-by: Sean Sundberg <[email protected]>
1 parent ddb063d commit 99ac6ac

File tree

7 files changed

+90
-30
lines changed

7 files changed

+90
-30
lines changed

src/commands/iascable-build.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {Container} from 'typescript-ioc';
22
import {Arguments, Argv} from 'yargs';
33
import {promises} from 'fs';
44
import {default as jsYaml} from 'js-yaml';
5-
import {join} from 'path';
5+
import {join, dirname} from 'path';
66

77
import {IascableInput} from './inputs/iascable.input';
88
import {CommandLineInput} from './inputs/command-line.input';
@@ -11,7 +11,7 @@ import {
1111
BillOfMaterialModel,
1212
isBillOfMaterialModel,
1313
isTileConfig,
14-
OutputFile,
14+
OutputFile, OutputFileType,
1515
TerraformComponent,
1616
Tile
1717
} from '../models';
@@ -124,10 +124,13 @@ async function outputBillOfMaterial(rootPath: string, billOfMaterial: BillOfMate
124124
}
125125

126126
async function outputTerraform(rootPath: string, terraformComponent: TerraformComponent) {
127-
await promises.mkdir(rootPath, {recursive: true})
127+
return Promise.all(terraformComponent.files.map(async (file: OutputFile) => {
128+
const path = join(rootPath, file.name);
129+
await promises.mkdir(dirname(path), {recursive: true})
130+
131+
const fileContents = await file.contents;
128132

129-
return Promise.all(terraformComponent.files.map((file: OutputFile) => {
130-
return promises.writeFile(join(rootPath, file.name), file.contents);
133+
return promises.writeFile(path, fileContents);
131134
}));
132135
}
133136

@@ -138,7 +141,7 @@ async function outputTile(rootPath: string, tile: Tile | undefined) {
138141

139142
await promises.mkdir(rootPath, {recursive: true})
140143

141-
return promises.writeFile(join(rootPath, tile.file.name), tile.file.contents);
144+
return promises.writeFile(join(rootPath, tile.file.name), await tile.file.contents);
142145
}
143146

144147
async function outputResult(rootPath: string, result: IascableResult): Promise<void> {

src/models/file.model.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
1+
import * as superagent from 'superagent';
2+
3+
export enum OutputFileType {
4+
terraform = 'terraform',
5+
tileConfig = 'tile-config',
6+
documentation = 'documentation'
7+
}
18

29
export interface OutputFile {
310
name: string;
4-
readonly contents: string;
11+
type?: OutputFileType;
12+
readonly contents: string | Promise<string>;
13+
}
14+
15+
export class UrlFile implements OutputFile {
16+
name: string;
17+
url: string;
18+
type?: OutputFileType;
19+
20+
constructor({name, url, type}: {name: string, url: string, type?: OutputFileType}) {
21+
this.name = name;
22+
this.url = url;
23+
this.type = type;
24+
}
25+
26+
get contents() {
27+
return new Promise<string>(async (resolve) => {
28+
const req: superagent.Response = await superagent.get(this.url);
29+
30+
resolve(req.text);
31+
});
32+
}
533
}

src/models/module.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export interface ModuleTemplate {
2222
tags?: string[];
2323
ibmCatalogId?: string;
2424
fsReady?: string;
25+
documentation?: string;
2526
}
2627

2728
export interface Module extends ModuleTemplate {

src/models/stages.model.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import {
33
fromBaseVariable,
44
IBaseVariable,
55
StagePrinter,
6-
TerraformVariable, TerraformVariableImpl
6+
TerraformVariable,
7+
TerraformVariableImpl
78
} from './variables.model';
8-
import {OutputFile} from './file.model';
9+
import {OutputFile, OutputFileType, UrlFile} from './file.model';
910
import {SingleModuleVersion} from './module.model';
1011

1112
export * from './module.model';
@@ -23,6 +24,7 @@ export interface Stage extends IStage, StagePrinter {
2324
export interface TerraformComponentModel {
2425
stages: { [source: string]: Stage };
2526
baseVariables: IBaseVariable[];
27+
modules?: SingleModuleVersion[];
2628
files: OutputFile[];
2729
}
2830

@@ -31,6 +33,7 @@ export class TerraformStageFile implements OutputFile {
3133
}
3234

3335
name = 'stages.tf';
36+
type = OutputFileType.terraform;
3437

3538
get contents(): string {
3639
const buffer: Buffer = Object.values(this.stages).reduce((previousBuffer: Buffer, stage: Stage) => {
@@ -53,6 +56,7 @@ export class TerraformVariablesFile implements OutputFile {
5356
}
5457

5558
name = 'variables.tf';
59+
type = OutputFileType.terraform;
5660

5761
get contents(): string {
5862
const buffer: Buffer = this.variables.reduce((previousBuffer: Buffer, variable: TerraformVariable) => {
@@ -73,6 +77,7 @@ export class TerraformVariablesFile implements OutputFile {
7377
export class TerraformComponent implements TerraformComponentModel {
7478
stages: { [source: string]: Stage } = {};
7579
baseVariables: TerraformVariable[] = [];
80+
modules?: SingleModuleVersion[];
7681

7782
constructor(model: TerraformComponentModel) {
7883
Object.assign(this, model);
@@ -83,13 +88,40 @@ export class TerraformComponent implements TerraformComponentModel {
8388
}
8489

8590
get files(): OutputFile[] {
86-
return [
91+
const files: OutputFile[] = [
8792
new TerraformStageFile(this.stages),
8893
new TerraformVariablesFile(this.baseVariables),
94+
...buildModuleReadmes(this.modules),
8995
];
96+
97+
return files;
9098
}
9199
}
92100

101+
function buildModuleReadmes(modules: SingleModuleVersion[] = []): OutputFile[] {
102+
return modules.map(module => {
103+
const url = getModuleDocumentationUrl(module);
104+
105+
return new UrlFile({
106+
name: `docs/${module.name}.md`,
107+
type: OutputFileType.documentation,
108+
url
109+
});
110+
});
111+
}
112+
113+
function getModuleDocumentationUrl(module: SingleModuleVersion): string {
114+
if (module.documentation) {
115+
return module.documentation;
116+
}
117+
118+
const regex = new RegExp('[^/]+/(.*)')
119+
const gitSlug = module.id.replace(regex, '$1');
120+
const branch = 'main';
121+
122+
return `https://raw.githubusercontent.com/${gitSlug}/${branch}/README.md`;
123+
}
124+
93125
export class StageImpl implements Stage, StagePrinter {
94126
name: string;
95127
source: string;

src/models/tile.model.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {OutputFile} from './file.model';
1+
import {OutputFile, OutputFileType} from './file.model';
22
import {omit} from '../util/object-util';
33

44
export interface TileVariable {
@@ -83,6 +83,7 @@ export class Tile implements TileModel {
8383
get file(): OutputFile {
8484
return {
8585
name: `offering-${this.name}.json`,
86+
type: OutputFileType.tileConfig,
8687
contents: JSON.stringify(omit(this, 'file')),
8788
}
8889
}

src/services/catalog-loader/catalog-loader.impl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {promises} from 'fs';
33
import {default as superagent, Response} from 'superagent';
44
import {JSON_SCHEMA, load} from 'js-yaml';
55

6-
import {Catalog, CatalogLoaderApi} from './catalog-loader.api';
6+
import {Catalog, CatalogLoaderApi, CatalogModel} from './catalog-loader.api';
77
import {LoggerApi} from '../../util/logger';
88

99
export class CatalogLoader implements CatalogLoaderApi {

src/services/terraform-builder/terraform-builder.impl.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
1+
import {Inject} from 'typescript-ioc';
12
import {TerraformBuilderApi} from './terraform-builder.api';
23
import {
4+
BaseVariable,
5+
GlobalRefVariable,
6+
IBaseVariable,
7+
isPlaceholderVariable,
38
ModuleDependency,
49
ModuleOutputRef,
10+
ModuleRefVariable,
511
ModuleVariable,
612
ModuleVersion,
7-
SingleModuleVersion
8-
} from '../../models/module.model';
9-
import {
13+
PlaceholderVariable,
14+
SingleModuleVersion,
1015
Stage,
1116
StageImpl,
12-
TerraformComponent,
13-
TerraformComponentModel
14-
} from '../../models/stages.model';
15-
import {Inject} from 'typescript-ioc';
17+
TerraformComponent
18+
} from '../../models';
1619
import {ModuleSelectorApi} from '../module-selector';
17-
import {
18-
BaseVariable, GlobalRefVariable,
19-
IBaseVariable, isPlaceholderVariable,
20-
ModuleRefVariable,
21-
PlaceholderVariable
22-
} from '../../models/variables.model';
23-
import {of as arrayOf} from '../../util/array-util';
24-
import {isUndefined, isUndefinedOrNull} from '../../util/object-util';
25-
import {CatalogModel} from '../../models/catalog.model';
26-
import {BillOfMaterialModel} from '../../models/bill-of-material.model';
2720
import {ModuleNotFound} from '../../errors';
21+
import {of as arrayOf} from '../../util/array-util';
22+
import {isUndefined} from '../../util/object-util';
2823

2924
export class TerraformBuilder implements TerraformBuilderApi {
3025
constructor(@Inject private selector: ModuleSelectorApi) {
@@ -43,7 +38,7 @@ export class TerraformBuilder implements TerraformBuilderApi {
4338
stages[stageSources[i]] = await processStageVariables(stages[stageSources[i]], baseVariables);
4439
}
4540

46-
return new TerraformComponent({stages, baseVariables, files: []});
41+
return new TerraformComponent({stages, baseVariables, modules: selectedModules, files: []});
4742
}
4843
}
4944

0 commit comments

Comments
 (0)