@goldstack/utils-terraform 0.3.40 → 0.3.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- import { CloudProvider } from './cloudProvider';
2
- import { TerraformDeployment } from './utilsTerraform';
3
- export default class MockCloudProvider implements CloudProvider {
4
- getTfStateVariables(_: TerraformDeployment): [string, string][];
5
- generateEnvVariableString(): string;
6
- setEnvVariables(): void;
7
- }
1
+ import { CloudProvider } from './cloudProvider';
2
+ import { TerraformDeployment } from './utilsTerraform';
3
+ export default class MockCloudProvider implements CloudProvider {
4
+ getTfStateVariables(_: TerraformDeployment): [string, string][];
5
+ generateEnvVariableString(): string;
6
+ setEnvVariables(): void;
7
+ }
8
8
  //# sourceMappingURL=MockCloudProvider.d.ts.map
@@ -1,16 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class MockCloudProvider {
4
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
5
- getTfStateVariables(_) {
6
- return [];
7
- }
8
- generateEnvVariableString() {
9
- return '';
10
- }
11
- setEnvVariables() {
12
- // do nothing
13
- }
14
- }
15
- exports.default = MockCloudProvider;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class MockCloudProvider {
4
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
5
+ getTfStateVariables(_) {
6
+ return [];
7
+ }
8
+ generateEnvVariableString() {
9
+ return '';
10
+ }
11
+ setEnvVariables() {
12
+ // do nothing
13
+ }
14
+ }
15
+ exports.default = MockCloudProvider;
16
16
  //# sourceMappingURL=MockCloudProvider.js.map
@@ -1,7 +1,7 @@
1
- import { TerraformDeployment } from './types/utilsTerraformConfig';
2
- export interface CloudProvider {
3
- generateEnvVariableString: () => string;
4
- setEnvVariables: () => void;
5
- getTfStateVariables: (deployment: TerraformDeployment) => [string, string][];
6
- }
1
+ import { TerraformDeployment } from './types/utilsTerraformConfig';
2
+ export interface CloudProvider {
3
+ generateEnvVariableString: () => string;
4
+ setEnvVariables: () => void;
5
+ getTfStateVariables: (deployment: TerraformDeployment) => [string, string][];
6
+ }
7
7
  //# sourceMappingURL=cloudProvider.d.ts.map
@@ -1,3 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  //# sourceMappingURL=cloudProvider.js.map
@@ -1,21 +1,18 @@
1
- import { TerraformDeployment, TerraformVariables } from './types/utilsTerraformConfig';
2
- import { CloudProvider } from './cloudProvider';
3
- import { Variables } from './terraformCli';
4
- export declare const convertToPythonVariable: (variableName: string) => string;
5
- export declare const convertFromPythonVariable: (variableName: string) => string;
6
- export declare const getVariablesFromProperties: (properties: object, terraformVariables?: TerraformVariables | undefined) => Variables;
7
- export declare const parseVariables: (hcl: string) => string[];
8
- export declare const getVariablesFromHCL: (properties: object) => Variables;
9
- export declare class TerraformBuild {
10
- provider: CloudProvider;
11
- getTfStateVariables: (deployment: TerraformDeployment) => [
12
- string,
13
- string
14
- ][];
15
- init: (args: string[]) => void;
16
- plan: (args: string[]) => void;
17
- apply: (args: string[]) => void;
18
- destroy: (args: string[]) => void;
19
- constructor(provider: CloudProvider);
20
- }
1
+ import { TerraformDeployment, TerraformVariables } from './types/utilsTerraformConfig';
2
+ import { CloudProvider } from './cloudProvider';
3
+ import { Variables } from './terraformCli';
4
+ export declare const convertToPythonVariable: (variableName: string) => string;
5
+ export declare const convertFromPythonVariable: (variableName: string) => string;
6
+ export declare const getVariablesFromProperties: (properties: object, terraformVariables?: TerraformVariables | undefined) => Variables;
7
+ export declare const parseVariables: (hcl: string) => string[];
8
+ export declare const getVariablesFromHCL: (properties: object) => Variables;
9
+ export declare class TerraformBuild {
10
+ provider: CloudProvider;
11
+ getTfStateVariables: (deployment: TerraformDeployment) => [string, string][];
12
+ init: (args: string[]) => void;
13
+ plan: (args: string[]) => void;
14
+ apply: (args: string[]) => void;
15
+ destroy: (args: string[]) => void;
16
+ constructor(provider: CloudProvider);
17
+ }
21
18
  //# sourceMappingURL=terraformBuild.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terraformBuild.d.ts","sourceRoot":"","sources":["../../src/terraformBuild.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAU3C,eAAO,MAAM,uBAAuB,iBAAkB,MAAM,KAAG,MAY9D,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAAkB,MAAM,KAAG,MAWhE,CAAC;AAEF,eAAO,MAAM,0BAA0B,eACzB,MAAM,mEAwBnB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,MAAM,EAQlD,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAAgB,MAAM,cAkErD,CAAC;AAsBF,qBAAa,cAAc;IACzB,QAAQ,EAAE,aAAa,CAAC;IAExB,mBAAmB,eACL,mBAAmB,KAC9B;QAAC,MAAM;QAAE,MAAM;KAAC,EAAE,CAsBnB;IACF,IAAI,SAAU,MAAM,EAAE,KAAG,IAAI,CAwB3B;IAEF,IAAI,SAAU,MAAM,EAAE,KAAG,IAAI,CAwB3B;IAEF,KAAK,SAAU,MAAM,EAAE,KAAG,IAAI,CA2B5B;IAEF,OAAO,SAAU,MAAM,EAAE,KAAG,IAAI,CAiC9B;gBAEU,QAAQ,EAAE,aAAa;CAIpC"}
1
+ {"version":3,"file":"terraformBuild.d.ts","sourceRoot":"","sources":["../../src/terraformBuild.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAU3C,eAAO,MAAM,uBAAuB,iBAAkB,MAAM,KAAG,MAY9D,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAAkB,MAAM,KAAG,MAWhE,CAAC;AAEF,eAAO,MAAM,0BAA0B,eACzB,MAAM,mEAwBnB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,MAAM,EAQlD,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAAgB,MAAM,cAkErD,CAAC;AAsBF,qBAAa,cAAc;IACzB,QAAQ,EAAE,aAAa,CAAC;IAExB,mBAAmB,eACL,mBAAmB,KAC9B,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAsBnB;IACF,IAAI,SAAU,MAAM,EAAE,KAAG,IAAI,CAwB3B;IAEF,IAAI,SAAU,MAAM,EAAE,KAAG,IAAI,CAwB3B;IAEF,KAAK,SAAU,MAAM,EAAE,KAAG,IAAI,CA2B5B;IAEF,OAAO,SAAU,MAAM,EAAE,KAAG,IAAI,CAiC9B;gBAEU,QAAQ,EAAE,aAAa;CAIpC"}
@@ -1,271 +1,271 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TerraformBuild = exports.getVariablesFromHCL = exports.parseVariables = exports.getVariablesFromProperties = exports.convertFromPythonVariable = exports.convertToPythonVariable = void 0;
7
- const prompt_sync_1 = __importDefault(require("prompt-sync"));
8
- const utils_log_1 = require("@goldstack/utils-log");
9
- const terraformCli_1 = require("./terraformCli");
10
- const utils_sh_1 = require("@goldstack/utils-sh");
11
- const utils_package_1 = require("@goldstack/utils-package");
12
- const assert_1 = __importDefault(require("assert"));
13
- const fs_1 = __importDefault(require("fs"));
14
- const crypto_1 = __importDefault(require("crypto"));
15
- const infra_1 = require("@goldstack/infra");
16
- const convertToPythonVariable = (variableName) => {
17
- let res = '';
18
- for (const char of variableName) {
19
- if (char.toLowerCase() === char) {
20
- res += char;
21
- }
22
- else {
23
- res += '_' + char.toLowerCase();
24
- }
25
- }
26
- return res;
27
- };
28
- exports.convertToPythonVariable = convertToPythonVariable;
29
- const convertFromPythonVariable = (variableName) => {
30
- let res = '';
31
- for (let i = 0; i < variableName.length; i++) {
32
- const char = variableName.charAt(i);
33
- if (i > 0 && variableName.charAt(i - 1) === '_') {
34
- res += variableName.charAt(i).toUpperCase();
35
- }
36
- else if (variableName.charAt(i) !== '_') {
37
- res += char;
38
- }
39
- }
40
- return res;
41
- };
42
- exports.convertFromPythonVariable = convertFromPythonVariable;
43
- const getVariablesFromProperties = (properties, terraformVariables) => {
44
- const vars = [];
45
- if (!terraformVariables) {
46
- return vars;
47
- }
48
- for (const key in properties) {
49
- if (terraformVariables.find((varName) => varName === key)) {
50
- const variableName = (0, exports.convertToPythonVariable)(key);
51
- const variableValue = properties[key];
52
- if (variableValue !== '') {
53
- vars.push([variableName, variableValue]);
54
- }
55
- else {
56
- console.log('using ', variableName.toLocaleUpperCase());
57
- vars.push([
58
- variableName,
59
- process.env[variableName.toLocaleUpperCase()] || '',
60
- ]);
61
- }
62
- }
63
- }
64
- return vars;
65
- };
66
- exports.getVariablesFromProperties = getVariablesFromProperties;
67
- const parseVariables = (hcl) => {
68
- const reg = /variable[^"]*"([^"]*)"[^{]*{/gm;
69
- let result;
70
- const variableNames = [];
71
- while ((result = reg.exec(hcl)) !== null) {
72
- variableNames.push(result[1]);
73
- }
74
- return variableNames;
75
- };
76
- exports.parseVariables = parseVariables;
77
- const getVariablesFromHCL = (properties) => {
78
- if (!fs_1.default.existsSync('./variables.tf')) {
79
- console.warn(`No variables.tf file exists in ${(0, utils_sh_1.pwd)()}. Goldstack only supports declaring variables in a variables.tf file.`);
80
- return [];
81
- }
82
- const variablesHCL = (0, utils_sh_1.read)('./variables.tf');
83
- const hclVariableNames = (0, exports.parseVariables)(variablesHCL);
84
- const jsVariableNames = hclVariableNames.map((hclVarName) => (0, exports.convertFromPythonVariable)(hclVarName));
85
- jsVariableNames.forEach((key) => {
86
- if (!properties.hasOwnProperty(key)) {
87
- console.warn(`Cannot find property "${key}" in Goldstack configuration. Therefore terraform variable ${(0, exports.convertToPythonVariable)(key)} will not be provided by Goldstack.`);
88
- }
89
- });
90
- const vars = [];
91
- for (const key in properties) {
92
- if (key.indexOf('_') !== -1) {
93
- console.warn('Property in Goldstack configuration contains "_". This is not recommended. Property: ' +
94
- key +
95
- ' Please use valid JavaScript variable names. For instance, use "myVar" instead of "my_var". ' +
96
- ' Goldstack will automatically convert these to Terraform variables ("myVar" -> "my_var") when required.');
97
- }
98
- if (jsVariableNames.find((varName) => varName === key)) {
99
- const variableName = (0, exports.convertToPythonVariable)(key);
100
- const variableValue = properties[key];
101
- if (variableValue !== '') {
102
- if (typeof variableValue === 'string') {
103
- vars.push([variableName, variableValue]);
104
- }
105
- else if (typeof variableValue === 'number') {
106
- vars.push([variableName, `${variableValue}`]);
107
- }
108
- else if (typeof variableValue === 'object') {
109
- vars.push([
110
- variableName,
111
- `${JSON.stringify(variableValue).replace(/"/g, '\\"')}`,
112
- ]);
113
- }
114
- else {
115
- throw new Error(`Not supported type for variable ${variableName}: ${typeof variableValue}`);
116
- }
117
- }
118
- else {
119
- const environmentVarialbeName = variableName.toLocaleUpperCase();
120
- if (process.env[environmentVarialbeName] ||
121
- process.env[environmentVarialbeName] === '') {
122
- console.log('Setting terraform variable from environment variable');
123
- vars.push([variableName, process.env[environmentVarialbeName] || '']);
124
- }
125
- else {
126
- console.log('Terraform variable will not be defined', variableName);
127
- }
128
- }
129
- }
130
- }
131
- return vars;
132
- };
133
- exports.getVariablesFromHCL = getVariablesFromHCL;
134
- const getDeployment = (args) => {
135
- if (args.length < 1) {
136
- throw new Error('Please specify the name of the deployment.');
137
- }
138
- const name = args[0];
139
- const packageConfig = (0, utils_package_1.readPackageConfig)();
140
- const deployment = packageConfig.deployments.find((deployment) => deployment.name === name);
141
- if (!deployment) {
142
- (0, utils_log_1.fatal)(`Cannot find configuration for deployment '${name}''`);
143
- throw new Error('Cannot parse configuration.');
144
- }
145
- return deployment;
146
- };
147
- class TerraformBuild {
148
- constructor(provider) {
149
- this.getTfStateVariables = (deployment) => {
150
- const packageConfig = (0, utils_package_1.readPackageConfig)();
151
- const deployments = packageConfig.deployments.filter((d) => d.name === deployment.name);
152
- if (deployments.length !== 1) {
153
- throw new Error(`Cannot find deployment ${deployment.name}`);
154
- }
155
- const deploymentConfig = deployments[0];
156
- // initialise id for key if required
157
- if (!deploymentConfig.tfStateKey) {
158
- const stateHash = crypto_1.default.randomBytes(10).toString('hex');
159
- const stateKey = `${packageConfig.name}-${deployment.name}-${stateHash}.tfstate`;
160
- console.log(`Intialising Terraform State key for ${deployment.name} to ${stateKey}`);
161
- deploymentConfig.tfStateKey = stateKey;
162
- (0, utils_package_1.writePackageConfig)(packageConfig);
163
- }
164
- return this.provider.getTfStateVariables(deploymentConfig);
165
- };
166
- this.init = (args) => {
167
- const deployment = getDeployment(args);
168
- const backendConfig = this.getTfStateVariables(deployment);
169
- (0, utils_sh_1.cd)('./infra/aws');
170
- const provider = this.provider;
171
- (0, terraformCli_1.tf)('init', {
172
- provider,
173
- backendConfig,
174
- options: ['-force-copy', '-reconfigure'],
175
- });
176
- const workspaces = (0, terraformCli_1.tf)('workspace list', { provider });
177
- const deploymentName = args[0];
178
- const workspaceExists = workspaces.split('\n').find((line) => {
179
- return line.indexOf(deploymentName) >= 0;
180
- });
181
- if (!workspaceExists) {
182
- (0, terraformCli_1.tf)(`workspace new ${deploymentName}`, {
183
- provider,
184
- });
185
- (0, terraformCli_1.tf)(`workspace select ${deploymentName}`, { provider });
186
- }
187
- (0, utils_sh_1.cd)('../..');
188
- };
189
- this.plan = (args) => {
190
- const deployment = getDeployment(args);
191
- const backendConfig = this.getTfStateVariables(deployment);
192
- (0, utils_sh_1.cd)('./infra/aws');
193
- const provider = this.provider;
194
- const variables = [
195
- ...(0, exports.getVariablesFromHCL)({ ...deployment, ...deployment.configuration }),
196
- ];
197
- const currentWorkspace = (0, terraformCli_1.tf)('workspace show', { provider }).trim();
198
- if (currentWorkspace !== args[0]) {
199
- // init with reconfigure required here in case we are switching to a different
200
- // s3 bucket in a different environment for a different deployment
201
- (0, terraformCli_1.tf)('init', { provider, backendConfig, options: ['-reconfigure'] });
202
- (0, terraformCli_1.tf)(`workspace select ${args[0]}`, { provider });
203
- }
204
- (0, terraformCli_1.tf)('plan', {
205
- provider,
206
- variables,
207
- options: ['-input=false', '-out tfplan'],
208
- });
209
- (0, utils_sh_1.cd)('../..');
210
- };
211
- this.apply = (args) => {
212
- const deployment = getDeployment(args);
213
- const backendConfig = this.getTfStateVariables(deployment);
214
- (0, utils_sh_1.cd)('./infra/aws');
215
- const provider = this.provider;
216
- const deploymentName = args[0];
217
- const currentWorkspace = (0, terraformCli_1.tf)('workspace show', { provider }).trim();
218
- if (currentWorkspace !== deploymentName) {
219
- // init with reconfigure required here in case we are switching to a different
220
- // s3 bucket in a different environment for a different deployment
221
- (0, terraformCli_1.tf)('init', { provider, backendConfig, options: ['-reconfigure'] });
222
- (0, terraformCli_1.tf)(`workspace select ${deploymentName}`, { provider });
223
- }
224
- (0, terraformCli_1.tf)('apply', {
225
- provider,
226
- options: ['-input=false', 'tfplan'],
227
- });
228
- const res = (0, terraformCli_1.tf)('output', { provider, options: ['-json'] }).trim();
229
- const deploymentState = (0, infra_1.readDeploymentState)('./../../', deploymentName, {
230
- createIfNotExist: true,
231
- });
232
- deploymentState.terraform = JSON.parse(res);
233
- (0, infra_1.writeDeploymentState)('./../../', deploymentState);
234
- (0, utils_sh_1.cd)('../..');
235
- };
236
- this.destroy = (args) => {
237
- const deployment = getDeployment(args);
238
- const backendConfig = this.getTfStateVariables(deployment);
239
- (0, utils_sh_1.cd)('./infra/aws');
240
- const ciConfirmed = args.find((str) => str === '-y');
241
- if (!ciConfirmed) {
242
- const value = (0, prompt_sync_1.default)()('Are you sure to destroy your deployed resources? If yes, please type `y` and enter.\n' +
243
- 'Otherwise, press enter.\nYour Input: ');
244
- if (value !== 'y') {
245
- (0, utils_log_1.fatal)('Prompt not confirmed with `y`');
246
- }
247
- }
248
- const provider = this.provider;
249
- const variables = [
250
- ...(0, exports.getVariablesFromHCL)({ ...deployment, ...deployment.configuration }),
251
- ];
252
- (0, terraformCli_1.tf)('init', { provider, backendConfig, options: ['-reconfigure'] });
253
- (0, terraformCli_1.tf)(`workspace select ${args[0]}`, { provider });
254
- (0, terraformCli_1.tf)('plan', {
255
- provider,
256
- variables,
257
- options: ['-input=false', '-out tfplan'],
258
- });
259
- (0, terraformCli_1.tf)('destroy', {
260
- provider,
261
- variables,
262
- options: ['-input=false', '-auto-approve'],
263
- });
264
- (0, utils_sh_1.cd)('../..');
265
- };
266
- (0, assert_1.default)(provider);
267
- this.provider = provider;
268
- }
269
- }
270
- exports.TerraformBuild = TerraformBuild;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TerraformBuild = exports.getVariablesFromHCL = exports.parseVariables = exports.getVariablesFromProperties = exports.convertFromPythonVariable = exports.convertToPythonVariable = void 0;
7
+ const prompt_sync_1 = __importDefault(require("prompt-sync"));
8
+ const utils_log_1 = require("@goldstack/utils-log");
9
+ const terraformCli_1 = require("./terraformCli");
10
+ const utils_sh_1 = require("@goldstack/utils-sh");
11
+ const utils_package_1 = require("@goldstack/utils-package");
12
+ const assert_1 = __importDefault(require("assert"));
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const crypto_1 = __importDefault(require("crypto"));
15
+ const infra_1 = require("@goldstack/infra");
16
+ const convertToPythonVariable = (variableName) => {
17
+ let res = '';
18
+ for (const char of variableName) {
19
+ if (char.toLowerCase() === char) {
20
+ res += char;
21
+ }
22
+ else {
23
+ res += '_' + char.toLowerCase();
24
+ }
25
+ }
26
+ return res;
27
+ };
28
+ exports.convertToPythonVariable = convertToPythonVariable;
29
+ const convertFromPythonVariable = (variableName) => {
30
+ let res = '';
31
+ for (let i = 0; i < variableName.length; i++) {
32
+ const char = variableName.charAt(i);
33
+ if (i > 0 && variableName.charAt(i - 1) === '_') {
34
+ res += variableName.charAt(i).toUpperCase();
35
+ }
36
+ else if (variableName.charAt(i) !== '_') {
37
+ res += char;
38
+ }
39
+ }
40
+ return res;
41
+ };
42
+ exports.convertFromPythonVariable = convertFromPythonVariable;
43
+ const getVariablesFromProperties = (properties, terraformVariables) => {
44
+ const vars = [];
45
+ if (!terraformVariables) {
46
+ return vars;
47
+ }
48
+ for (const key in properties) {
49
+ if (terraformVariables.find((varName) => varName === key)) {
50
+ const variableName = (0, exports.convertToPythonVariable)(key);
51
+ const variableValue = properties[key];
52
+ if (variableValue !== '') {
53
+ vars.push([variableName, variableValue]);
54
+ }
55
+ else {
56
+ console.log('using ', variableName.toLocaleUpperCase());
57
+ vars.push([
58
+ variableName,
59
+ process.env[variableName.toLocaleUpperCase()] || '',
60
+ ]);
61
+ }
62
+ }
63
+ }
64
+ return vars;
65
+ };
66
+ exports.getVariablesFromProperties = getVariablesFromProperties;
67
+ const parseVariables = (hcl) => {
68
+ const reg = /variable[^"]*"([^"]*)"[^{]*{/gm;
69
+ let result;
70
+ const variableNames = [];
71
+ while ((result = reg.exec(hcl)) !== null) {
72
+ variableNames.push(result[1]);
73
+ }
74
+ return variableNames;
75
+ };
76
+ exports.parseVariables = parseVariables;
77
+ const getVariablesFromHCL = (properties) => {
78
+ if (!fs_1.default.existsSync('./variables.tf')) {
79
+ console.warn(`No variables.tf file exists in ${(0, utils_sh_1.pwd)()}. Goldstack only supports declaring variables in a variables.tf file.`);
80
+ return [];
81
+ }
82
+ const variablesHCL = (0, utils_sh_1.read)('./variables.tf');
83
+ const hclVariableNames = (0, exports.parseVariables)(variablesHCL);
84
+ const jsVariableNames = hclVariableNames.map((hclVarName) => (0, exports.convertFromPythonVariable)(hclVarName));
85
+ jsVariableNames.forEach((key) => {
86
+ if (!properties.hasOwnProperty(key)) {
87
+ console.warn(`Cannot find property "${key}" in Goldstack configuration. Therefore terraform variable ${(0, exports.convertToPythonVariable)(key)} will not be provided by Goldstack.`);
88
+ }
89
+ });
90
+ const vars = [];
91
+ for (const key in properties) {
92
+ if (key.indexOf('_') !== -1) {
93
+ console.warn('Property in Goldstack configuration contains "_". This is not recommended. Property: ' +
94
+ key +
95
+ ' Please use valid JavaScript variable names. For instance, use "myVar" instead of "my_var". ' +
96
+ ' Goldstack will automatically convert these to Terraform variables ("myVar" -> "my_var") when required.');
97
+ }
98
+ if (jsVariableNames.find((varName) => varName === key)) {
99
+ const variableName = (0, exports.convertToPythonVariable)(key);
100
+ const variableValue = properties[key];
101
+ if (variableValue !== '') {
102
+ if (typeof variableValue === 'string') {
103
+ vars.push([variableName, variableValue]);
104
+ }
105
+ else if (typeof variableValue === 'number') {
106
+ vars.push([variableName, `${variableValue}`]);
107
+ }
108
+ else if (typeof variableValue === 'object') {
109
+ vars.push([
110
+ variableName,
111
+ `${JSON.stringify(variableValue).replace(/"/g, '\\"')}`,
112
+ ]);
113
+ }
114
+ else {
115
+ throw new Error(`Not supported type for variable ${variableName}: ${typeof variableValue}`);
116
+ }
117
+ }
118
+ else {
119
+ const environmentVarialbeName = variableName.toLocaleUpperCase();
120
+ if (process.env[environmentVarialbeName] ||
121
+ process.env[environmentVarialbeName] === '') {
122
+ console.log('Setting terraform variable from environment variable');
123
+ vars.push([variableName, process.env[environmentVarialbeName] || '']);
124
+ }
125
+ else {
126
+ console.log('Terraform variable will not be defined', variableName);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return vars;
132
+ };
133
+ exports.getVariablesFromHCL = getVariablesFromHCL;
134
+ const getDeployment = (args) => {
135
+ if (args.length < 1) {
136
+ throw new Error('Please specify the name of the deployment.');
137
+ }
138
+ const name = args[0];
139
+ const packageConfig = (0, utils_package_1.readPackageConfig)();
140
+ const deployment = packageConfig.deployments.find((deployment) => deployment.name === name);
141
+ if (!deployment) {
142
+ (0, utils_log_1.fatal)(`Cannot find configuration for deployment '${name}''`);
143
+ throw new Error('Cannot parse configuration.');
144
+ }
145
+ return deployment;
146
+ };
147
+ class TerraformBuild {
148
+ constructor(provider) {
149
+ this.getTfStateVariables = (deployment) => {
150
+ const packageConfig = (0, utils_package_1.readPackageConfig)();
151
+ const deployments = packageConfig.deployments.filter((d) => d.name === deployment.name);
152
+ if (deployments.length !== 1) {
153
+ throw new Error(`Cannot find deployment ${deployment.name}`);
154
+ }
155
+ const deploymentConfig = deployments[0];
156
+ // initialise id for key if required
157
+ if (!deploymentConfig.tfStateKey) {
158
+ const stateHash = crypto_1.default.randomBytes(10).toString('hex');
159
+ const stateKey = `${packageConfig.name}-${deployment.name}-${stateHash}.tfstate`;
160
+ console.log(`Intialising Terraform State key for ${deployment.name} to ${stateKey}`);
161
+ deploymentConfig.tfStateKey = stateKey;
162
+ (0, utils_package_1.writePackageConfig)(packageConfig);
163
+ }
164
+ return this.provider.getTfStateVariables(deploymentConfig);
165
+ };
166
+ this.init = (args) => {
167
+ const deployment = getDeployment(args);
168
+ const backendConfig = this.getTfStateVariables(deployment);
169
+ (0, utils_sh_1.cd)('./infra/aws');
170
+ const provider = this.provider;
171
+ (0, terraformCli_1.tf)('init', {
172
+ provider,
173
+ backendConfig,
174
+ options: ['-force-copy', '-reconfigure'],
175
+ });
176
+ const workspaces = (0, terraformCli_1.tf)('workspace list', { provider });
177
+ const deploymentName = args[0];
178
+ const workspaceExists = workspaces.split('\n').find((line) => {
179
+ return line.indexOf(deploymentName) >= 0;
180
+ });
181
+ if (!workspaceExists) {
182
+ (0, terraformCli_1.tf)(`workspace new ${deploymentName}`, {
183
+ provider,
184
+ });
185
+ (0, terraformCli_1.tf)(`workspace select ${deploymentName}`, { provider });
186
+ }
187
+ (0, utils_sh_1.cd)('../..');
188
+ };
189
+ this.plan = (args) => {
190
+ const deployment = getDeployment(args);
191
+ const backendConfig = this.getTfStateVariables(deployment);
192
+ (0, utils_sh_1.cd)('./infra/aws');
193
+ const provider = this.provider;
194
+ const variables = [
195
+ ...(0, exports.getVariablesFromHCL)({ ...deployment, ...deployment.configuration }),
196
+ ];
197
+ const currentWorkspace = (0, terraformCli_1.tf)('workspace show', { provider }).trim();
198
+ if (currentWorkspace !== args[0]) {
199
+ // init with reconfigure required here in case we are switching to a different
200
+ // s3 bucket in a different environment for a different deployment
201
+ (0, terraformCli_1.tf)('init', { provider, backendConfig, options: ['-reconfigure'] });
202
+ (0, terraformCli_1.tf)(`workspace select ${args[0]}`, { provider });
203
+ }
204
+ (0, terraformCli_1.tf)('plan', {
205
+ provider,
206
+ variables,
207
+ options: ['-input=false', '-out tfplan'],
208
+ });
209
+ (0, utils_sh_1.cd)('../..');
210
+ };
211
+ this.apply = (args) => {
212
+ const deployment = getDeployment(args);
213
+ const backendConfig = this.getTfStateVariables(deployment);
214
+ (0, utils_sh_1.cd)('./infra/aws');
215
+ const provider = this.provider;
216
+ const deploymentName = args[0];
217
+ const currentWorkspace = (0, terraformCli_1.tf)('workspace show', { provider }).trim();
218
+ if (currentWorkspace !== deploymentName) {
219
+ // init with reconfigure required here in case we are switching to a different
220
+ // s3 bucket in a different environment for a different deployment
221
+ (0, terraformCli_1.tf)('init', { provider, backendConfig, options: ['-reconfigure'] });
222
+ (0, terraformCli_1.tf)(`workspace select ${deploymentName}`, { provider });
223
+ }
224
+ (0, terraformCli_1.tf)('apply', {
225
+ provider,
226
+ options: ['-input=false', 'tfplan'],
227
+ });
228
+ const res = (0, terraformCli_1.tf)('output', { provider, options: ['-json'] }).trim();
229
+ const deploymentState = (0, infra_1.readDeploymentState)('./../../', deploymentName, {
230
+ createIfNotExist: true,
231
+ });
232
+ deploymentState.terraform = JSON.parse(res);
233
+ (0, infra_1.writeDeploymentState)('./../../', deploymentState);
234
+ (0, utils_sh_1.cd)('../..');
235
+ };
236
+ this.destroy = (args) => {
237
+ const deployment = getDeployment(args);
238
+ const backendConfig = this.getTfStateVariables(deployment);
239
+ (0, utils_sh_1.cd)('./infra/aws');
240
+ const ciConfirmed = args.find((str) => str === '-y');
241
+ if (!ciConfirmed) {
242
+ const value = (0, prompt_sync_1.default)()('Are you sure to destroy your deployed resources? If yes, please type `y` and enter.\n' +
243
+ 'Otherwise, press enter.\nYour Input: ');
244
+ if (value !== 'y') {
245
+ (0, utils_log_1.fatal)('Prompt not confirmed with `y`');
246
+ }
247
+ }
248
+ const provider = this.provider;
249
+ const variables = [
250
+ ...(0, exports.getVariablesFromHCL)({ ...deployment, ...deployment.configuration }),
251
+ ];
252
+ (0, terraformCli_1.tf)('init', { provider, backendConfig, options: ['-reconfigure'] });
253
+ (0, terraformCli_1.tf)(`workspace select ${args[0]}`, { provider });
254
+ (0, terraformCli_1.tf)('plan', {
255
+ provider,
256
+ variables,
257
+ options: ['-input=false', '-out tfplan'],
258
+ });
259
+ (0, terraformCli_1.tf)('destroy', {
260
+ provider,
261
+ variables,
262
+ options: ['-input=false', '-auto-approve'],
263
+ });
264
+ (0, utils_sh_1.cd)('../..');
265
+ };
266
+ (0, assert_1.default)(provider);
267
+ this.provider = provider;
268
+ }
269
+ }
270
+ exports.TerraformBuild = TerraformBuild;
271
271
  //# sourceMappingURL=terraformBuild.js.map
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=terraformBuild.spec.d.ts.map
@@ -1,25 +1,25 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const utils_sh_1 = require("@goldstack/utils-sh");
4
- const terraformBuild_1 = require("./terraformBuild");
5
- describe('Terraform Utils', () => {
6
- it('Should convert variable names to Python variable Names', () => {
7
- expect((0, terraformBuild_1.convertToPythonVariable)('myVarName')).toEqual('my_var_name');
8
- expect((0, terraformBuild_1.convertToPythonVariable)('awsRegion')).toEqual('aws_region');
9
- expect((0, terraformBuild_1.convertToPythonVariable)('hostedZoneDomain')).toEqual('hosted_zone_domain');
10
- expect((0, terraformBuild_1.convertToPythonVariable)('websiteDomain')).toEqual('website_domain');
11
- expect((0, terraformBuild_1.convertToPythonVariable)('websiteDomainRedirect')).toEqual('website_domain_redirect');
12
- expect((0, terraformBuild_1.convertToPythonVariable)('defaultCacheDuration')).toEqual('default_cache_duration');
13
- });
14
- it('Should convert variables name from Pything variable names', () => {
15
- expect((0, terraformBuild_1.convertFromPythonVariable)('my_var_name')).toEqual('myVarName');
16
- expect((0, terraformBuild_1.convertFromPythonVariable)('aws_region')).toEqual('awsRegion');
17
- });
18
- it('Should read variables from variables.tf', () => {
19
- const testDir = './goldstackLocal/test-variables/';
20
- (0, utils_sh_1.mkdir)('-p', testDir);
21
- const oldDir = (0, utils_sh_1.pwd)();
22
- (0, utils_sh_1.cd)(testDir);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_sh_1 = require("@goldstack/utils-sh");
4
+ const terraformBuild_1 = require("./terraformBuild");
5
+ describe('Terraform Utils', () => {
6
+ it('Should convert variable names to Python variable Names', () => {
7
+ expect((0, terraformBuild_1.convertToPythonVariable)('myVarName')).toEqual('my_var_name');
8
+ expect((0, terraformBuild_1.convertToPythonVariable)('awsRegion')).toEqual('aws_region');
9
+ expect((0, terraformBuild_1.convertToPythonVariable)('hostedZoneDomain')).toEqual('hosted_zone_domain');
10
+ expect((0, terraformBuild_1.convertToPythonVariable)('websiteDomain')).toEqual('website_domain');
11
+ expect((0, terraformBuild_1.convertToPythonVariable)('websiteDomainRedirect')).toEqual('website_domain_redirect');
12
+ expect((0, terraformBuild_1.convertToPythonVariable)('defaultCacheDuration')).toEqual('default_cache_duration');
13
+ });
14
+ it('Should convert variables name from Pything variable names', () => {
15
+ expect((0, terraformBuild_1.convertFromPythonVariable)('my_var_name')).toEqual('myVarName');
16
+ expect((0, terraformBuild_1.convertFromPythonVariable)('aws_region')).toEqual('awsRegion');
17
+ });
18
+ it('Should read variables from variables.tf', () => {
19
+ const testDir = './goldstackLocal/test-variables/';
20
+ (0, utils_sh_1.mkdir)('-p', testDir);
21
+ const oldDir = (0, utils_sh_1.pwd)();
22
+ (0, utils_sh_1.cd)(testDir);
23
23
  (0, utils_sh_1.write)(`
24
24
  variable "aws_region" {
25
25
  description = "Region where the S3 bucket is deployed."
@@ -29,15 +29,15 @@ variable "aws_region" {
29
29
  variable "bucket_name" {
30
30
  description = "Name of the S3 bucket."
31
31
  type = string
32
- }`, './variables.tf');
33
- const vars = (0, terraformBuild_1.getVariablesFromHCL)({
34
- awsRegion: 'us-east-1',
35
- bucketName: 'test-bucket',
36
- });
37
- expect(vars).toHaveLength(2);
38
- expect(vars[0][0]).toEqual('aws_region');
39
- expect(vars[0][1]).toEqual('us-east-1');
40
- (0, utils_sh_1.cd)(oldDir);
41
- });
42
- });
32
+ }`, './variables.tf');
33
+ const vars = (0, terraformBuild_1.getVariablesFromHCL)({
34
+ awsRegion: 'us-east-1',
35
+ bucketName: 'test-bucket',
36
+ });
37
+ expect(vars).toHaveLength(2);
38
+ expect(vars[0][0]).toEqual('aws_region');
39
+ expect(vars[0][1]).toEqual('us-east-1');
40
+ (0, utils_sh_1.cd)(oldDir);
41
+ });
42
+ });
43
43
  //# sourceMappingURL=terraformBuild.spec.js.map
@@ -1,13 +1,13 @@
1
- import { CloudProvider } from './cloudProvider';
2
- export declare type Variables = [string, string][];
3
- interface TerraformOptions {
4
- dir?: string;
5
- provider: CloudProvider;
6
- variables?: Variables;
7
- backendConfig?: Variables;
8
- options?: string[];
9
- }
10
- export declare const assertTerraform: () => void;
11
- export declare const tf: (cmd: string, options: TerraformOptions) => string;
12
- export {};
1
+ import { CloudProvider } from './cloudProvider';
2
+ export declare type Variables = [string, string][];
3
+ interface TerraformOptions {
4
+ dir?: string;
5
+ provider: CloudProvider;
6
+ variables?: Variables;
7
+ backendConfig?: Variables;
8
+ options?: string[];
9
+ }
10
+ export declare const assertTerraform: () => void;
11
+ export declare const tf: (cmd: string, options: TerraformOptions) => string;
12
+ export {};
13
13
  //# sourceMappingURL=terraformCli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terraformCli.d.ts","sourceRoot":"","sources":["../../src/terraformCli.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,oBAAY,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;AAiB3C,UAAU,gBAAgB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAqBD,eAAO,MAAM,eAAe,QAAO,IAQlC,CAAC;AAmBF,eAAO,MAAM,EAAE,QAAS,MAAM,WAAW,gBAAgB,KAAG,MAO3D,CAAC"}
1
+ {"version":3,"file":"terraformCli.d.ts","sourceRoot":"","sources":["../../src/terraformCli.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,oBAAY,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;AAiB3C,UAAU,gBAAgB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAuBD,eAAO,MAAM,eAAe,QAAO,IAQlC,CAAC;AAsBF,eAAO,MAAM,EAAE,QAAS,MAAM,WAAW,gBAAgB,KAAG,MAO3D,CAAC"}
@@ -1,64 +1,69 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tf = exports.assertTerraform = void 0;
4
- const utils_sh_1 = require("@goldstack/utils-sh");
5
- const utils_docker_1 = require("@goldstack/utils-docker");
6
- const utils_log_1 = require("@goldstack/utils-log");
7
- const renderVariables = (variables) => {
8
- if (variables.length === 0) {
9
- return '';
10
- }
11
- return variables.map(([key, value]) => `-var \"${key}=${value}\" `).join('');
12
- };
13
- const renderBackendConfig = (variables) => {
14
- if (variables.length === 0) {
15
- return '';
16
- }
17
- return variables
18
- .map(([key, value]) => `-backend-config=\"${key}=${value}\" `)
19
- .join('');
20
- };
21
- const execWithDocker = (cmd, options) => {
22
- var _a;
23
- if (!options.dir) {
24
- options.dir = (0, utils_sh_1.pwd)();
25
- }
26
- (0, utils_docker_1.assertDocker)();
27
- const cmd3 = `docker run --rm -v "${options.dir}":/app ` +
28
- ` ${options.provider.generateEnvVariableString()} ` +
29
- '-w /app ' +
30
- `${(0, utils_docker_1.imageTerraform)()} ${cmd} ` +
31
- ` ${renderBackendConfig(options.backendConfig || [])} ` +
32
- ` ${renderVariables(options.variables || [])} ` +
33
- ` ${((_a = options.options) === null || _a === void 0 ? void 0 : _a.join(' ')) || ''} `;
34
- return (0, utils_sh_1.exec)(cmd3);
35
- };
36
- const assertTerraform = () => {
37
- if (!(0, utils_sh_1.commandExists)('terraform')) {
38
- (0, utils_log_1.fatal)('Terraform is not installed.\n\n' +
39
- 'Install terraform CLI or Docker (preferred).');
40
- throw new Error();
41
- }
42
- };
43
- exports.assertTerraform = assertTerraform;
44
- const execWithCli = (cmd, options) => {
45
- var _a;
46
- if (!options.dir) {
47
- options.dir = (0, utils_sh_1.pwd)();
48
- }
49
- (0, exports.assertTerraform)();
50
- options.provider.setEnvVariables();
51
- return (0, utils_sh_1.exec)(`terraform ${cmd} ` +
52
- ` ${renderBackendConfig(options.backendConfig || [])} ` +
53
- ` ${renderVariables(options.variables || [])} ` +
54
- ` ${((_a = options.options) === null || _a === void 0 ? void 0 : _a.join(' ')) || ''} `);
55
- };
56
- const tf = (cmd, options) => {
57
- // always prefer running with Docker
58
- if ((0, utils_docker_1.hasDocker)()) {
59
- return execWithDocker(cmd, options);
60
- }
61
- return execWithCli(cmd, options);
62
- };
63
- exports.tf = tf;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tf = exports.assertTerraform = void 0;
4
+ const utils_sh_1 = require("@goldstack/utils-sh");
5
+ const utils_docker_1 = require("@goldstack/utils-docker");
6
+ const utils_log_1 = require("@goldstack/utils-log");
7
+ const renderVariables = (variables) => {
8
+ if (variables.length === 0) {
9
+ return '';
10
+ }
11
+ return variables.map(([key, value]) => `-var \"${key}=${value}\" `).join('');
12
+ };
13
+ const renderBackendConfig = (variables) => {
14
+ if (variables.length === 0) {
15
+ return '';
16
+ }
17
+ return variables
18
+ .map(([key, value]) => `-backend-config=\"${key}=${value}\" `)
19
+ .join('');
20
+ };
21
+ const execWithDocker = (cmd, options) => {
22
+ var _a;
23
+ if (!options.dir) {
24
+ options.dir = (0, utils_sh_1.pwd)();
25
+ }
26
+ (0, utils_docker_1.assertDocker)();
27
+ const cmd3 = `docker run --rm -v "${options.dir}":/app ` +
28
+ ` ${options.provider.generateEnvVariableString()} ` +
29
+ '-w /app ' +
30
+ `${(0, utils_docker_1.imageTerraform)()} ${cmd} ` +
31
+ ` ${renderBackendConfig(options.backendConfig || [])} ` +
32
+ ` ${renderVariables(options.variables || [])} ` +
33
+ ` ${((_a = options.options) === null || _a === void 0 ? void 0 : _a.join(' ')) || ''} `;
34
+ console.debug('Running Terraform in Docker');
35
+ console.debug(cmd3);
36
+ return (0, utils_sh_1.exec)(cmd3);
37
+ };
38
+ const assertTerraform = () => {
39
+ if (!(0, utils_sh_1.commandExists)('terraform')) {
40
+ (0, utils_log_1.fatal)('Terraform is not installed.\n\n' +
41
+ 'Install terraform CLI or Docker (preferred).');
42
+ throw new Error();
43
+ }
44
+ };
45
+ exports.assertTerraform = assertTerraform;
46
+ const execWithCli = (cmd, options) => {
47
+ var _a;
48
+ if (!options.dir) {
49
+ options.dir = (0, utils_sh_1.pwd)();
50
+ }
51
+ (0, exports.assertTerraform)();
52
+ options.provider.setEnvVariables();
53
+ const execCmd = `terraform ${cmd} ` +
54
+ ` ${renderBackendConfig(options.backendConfig || [])} ` +
55
+ ` ${renderVariables(options.variables || [])} ` +
56
+ ` ${((_a = options.options) === null || _a === void 0 ? void 0 : _a.join(' ')) || ''} `;
57
+ console.debug('Running Terraform in cli');
58
+ console.debug(execCmd);
59
+ return (0, utils_sh_1.exec)(execCmd);
60
+ };
61
+ const tf = (cmd, options) => {
62
+ // always prefer running with Docker
63
+ if ((0, utils_docker_1.hasDocker)()) {
64
+ return execWithDocker(cmd, options);
65
+ }
66
+ return execWithCli(cmd, options);
67
+ };
68
+ exports.tf = tf;
64
69
  //# sourceMappingURL=terraformCli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"terraformCli.js","sourceRoot":"","sources":["../../src/terraformCli.ts"],"names":[],"mappings":";;;AAAA,kDAA+D;AAC/D,0DAIiC;AACjC,oDAA6C;AAK7C,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAU,EAAE;IACvD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,OAAO,EAAE,CAAC;KACX;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,SAAoB,EAAU,EAAE;IAC3D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,OAAO,EAAE,CAAC;KACX;IACD,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,qBAAqB,GAAG,IAAI,KAAK,KAAK,CAAC;SAC7D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC;AASF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,OAAyB,EAAU,EAAE;;IACxE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,GAAG,GAAG,IAAA,cAAG,GAAE,CAAC;KACrB;IAED,IAAA,2BAAY,GAAE,CAAC;IAEf,MAAM,IAAI,GACR,uBAAuB,OAAO,CAAC,GAAG,SAAS;QAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,yBAAyB,EAAE,GAAG;QACnD,UAAU;QACV,GAAG,IAAA,6BAAc,GAAE,IAAI,GAAG,GAAG;QAC7B,IAAI,mBAAmB,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,GAAG;QACvD,IAAI,eAAe,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG;QAC/C,IAAI,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,IAAI,CAAC,GAAG,CAAC,KAAI,EAAE,GAAG,CAAC;IAE1C,OAAO,IAAA,eAAI,EAAC,IAAI,CAAC,CAAC;AACpB,CAAC,CAAC;AAEK,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,IAAI,CAAC,IAAA,wBAAa,EAAC,WAAW,CAAC,EAAE;QAC/B,IAAA,iBAAK,EACH,iCAAiC;YAC/B,8CAA8C,CACjD,CAAC;QACF,MAAM,IAAI,KAAK,EAAE,CAAC;KACnB;AACH,CAAC,CAAC;AARW,QAAA,eAAe,mBAQ1B;AAEF,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,OAAyB,EAAU,EAAE;;IACrE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,GAAG,GAAG,IAAA,cAAG,GAAE,CAAC;KACrB;IAED,IAAA,uBAAe,GAAE,CAAC;IAElB,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IAEnC,OAAO,IAAA,eAAI,EACT,aAAa,GAAG,GAAG;QACjB,IAAI,mBAAmB,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,GAAG;QACvD,IAAI,eAAe,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG;QAC/C,IAAI,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,IAAI,CAAC,GAAG,CAAC,KAAI,EAAE,GAAG,CAC1C,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,EAAE,GAAG,CAAC,GAAW,EAAE,OAAyB,EAAU,EAAE;IACnE,oCAAoC;IACpC,IAAI,IAAA,wBAAS,GAAE,EAAE;QACf,OAAO,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;KACrC;IAED,OAAO,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC,CAAC;AAPW,QAAA,EAAE,MAOb"}
1
+ {"version":3,"file":"terraformCli.js","sourceRoot":"","sources":["../../src/terraformCli.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=terraformCli.spec.d.ts.map
@@ -1,20 +1,20 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const utils_sh_1 = require("@goldstack/utils-sh");
7
- const terraformCli_1 = require("./terraformCli");
8
- const MockCloudProvider_1 = __importDefault(require("./MockCloudProvider"));
9
- const path_1 = __importDefault(require("path"));
10
- describe('Terraform CLI', () => {
11
- it('Should accept folder with spaces', async () => {
12
- const testDir = './goldstackLocal/cli-folder-w-space/My Dir';
13
- (0, utils_sh_1.mkdir)('-p', testDir);
14
- (0, terraformCli_1.tf)('init', {
15
- dir: path_1.default.resolve(testDir),
16
- provider: new MockCloudProvider_1.default(),
17
- });
18
- });
19
- });
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_sh_1 = require("@goldstack/utils-sh");
7
+ const terraformCli_1 = require("./terraformCli");
8
+ const MockCloudProvider_1 = __importDefault(require("./MockCloudProvider"));
9
+ const path_1 = __importDefault(require("path"));
10
+ describe('Terraform CLI', () => {
11
+ it('Should accept folder with spaces', async () => {
12
+ const testDir = './goldstackLocal/cli-folder-w-space/My Dir';
13
+ (0, utils_sh_1.mkdir)('-p', testDir);
14
+ (0, terraformCli_1.tf)('init', {
15
+ dir: path_1.default.resolve(testDir),
16
+ provider: new MockCloudProvider_1.default(),
17
+ });
18
+ });
19
+ });
20
20
  //# sourceMappingURL=terraformCli.spec.js.map
@@ -1,27 +1,27 @@
1
- import { Deployment } from '@goldstack/infra';
2
- /**
3
- * Name of the property that should be converted into a Terraform variable.
4
- *
5
- * @title Terraform Variable
6
- *
7
- */
8
- export declare type TerraformVariable = string;
9
- /**
10
- * Key used for Terraform state persisted in Terraform state bucket.
11
- *
12
- * Will be auto-generated upon first deployment if not provided.
13
- *
14
- * @title Terraform State Key
15
- */
16
- export declare type TerraformStateKey = string;
17
- /**
18
- * Define which of the deployment variables will be made available for terraform.
19
- *
20
- * @title Terraform Variables
21
- */
22
- export declare type TerraformVariables = TerraformVariable[];
23
- export interface TerraformDeployment extends Deployment {
24
- terraformVariables?: TerraformVariables;
25
- tfStateKey?: TerraformStateKey;
26
- }
1
+ import { Deployment } from '@goldstack/infra';
2
+ /**
3
+ * Name of the property that should be converted into a Terraform variable.
4
+ *
5
+ * @title Terraform Variable
6
+ *
7
+ */
8
+ export declare type TerraformVariable = string;
9
+ /**
10
+ * Key used for Terraform state persisted in Terraform state bucket.
11
+ *
12
+ * Will be auto-generated upon first deployment if not provided.
13
+ *
14
+ * @title Terraform State Key
15
+ */
16
+ export declare type TerraformStateKey = string;
17
+ /**
18
+ * Define which of the deployment variables will be made available for terraform.
19
+ *
20
+ * @title Terraform Variables
21
+ */
22
+ export declare type TerraformVariables = TerraformVariable[];
23
+ export interface TerraformDeployment extends Deployment {
24
+ terraformVariables?: TerraformVariables;
25
+ tfStateKey?: TerraformStateKey;
26
+ }
27
27
  //# sourceMappingURL=utilsTerraformConfig.d.ts.map
@@ -1,3 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  //# sourceMappingURL=utilsTerraformConfig.js.map
@@ -1,10 +1,10 @@
1
- export type { TerraformDeployment, TerraformVariable, TerraformVariables, } from './types/utilsTerraformConfig';
2
- import { CloudProvider } from './cloudProvider';
3
- export type { CloudProvider } from './cloudProvider';
4
- export { tf } from './terraformCli';
5
- export { getVariablesFromProperties } from './terraformBuild';
6
- export declare const infraCommands: () => any;
7
- export declare const terraformCli: (args: string[], options: {
8
- provider: CloudProvider;
9
- }) => void;
1
+ export type { TerraformDeployment, TerraformVariable, TerraformVariables, } from './types/utilsTerraformConfig';
2
+ import { CloudProvider } from './cloudProvider';
3
+ export type { CloudProvider } from './cloudProvider';
4
+ export { tf } from './terraformCli';
5
+ export { getVariablesFromProperties } from './terraformBuild';
6
+ export declare const infraCommands: () => any;
7
+ export declare const terraformCli: (args: string[], options: {
8
+ provider: CloudProvider;
9
+ }) => void;
10
10
  //# sourceMappingURL=utilsTerraform.d.ts.map
@@ -1,63 +1,63 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.terraformCli = exports.infraCommands = exports.getVariablesFromProperties = exports.tf = void 0;
4
- const terraformBuild_1 = require("./terraformBuild");
5
- var terraformCli_1 = require("./terraformCli");
6
- Object.defineProperty(exports, "tf", { enumerable: true, get: function () { return terraformCli_1.tf; } });
7
- var terraformBuild_2 = require("./terraformBuild");
8
- Object.defineProperty(exports, "getVariablesFromProperties", { enumerable: true, get: function () { return terraformBuild_2.getVariablesFromProperties; } });
9
- const infraCommands = () => {
10
- const deploymentPositional = (yargs) => {
11
- return yargs.positional('deployment', {
12
- type: 'string',
13
- describe: 'Name of the deployment this command should be applied to',
14
- demandOption: true,
15
- });
16
- };
17
- return (yargs) => {
18
- return yargs
19
- .command('up <deployment>', 'Stands up infrastructure for the specified deployment', deploymentPositional)
20
- .command('init <deployment>', 'Initialises Terraform working directory for deployment', deploymentPositional)
21
- .command('plan <deployment>', 'Creates a Terraform execution plan for deployment', deploymentPositional)
22
- .command('apply <deployment>', 'Applies the last Terraform execution plan calculated using `infra plan`', deploymentPositional)
23
- .command('destroy <deployment>', 'DANGER: Destroys all deployed infrastructure for the deployment', (yargs) => {
24
- return deploymentPositional(yargs).option('yes', {
25
- alias: 'y',
26
- description: 'DANGER: If provided, confirmation for deleting infrastructure resources will be skipped.',
27
- default: false,
28
- demandOption: false,
29
- type: 'boolean',
30
- });
31
- });
32
- };
33
- };
34
- exports.infraCommands = infraCommands;
35
- const terraformCli = (args, options) => {
36
- const [operation, ...opArgs] = args;
37
- const build = new terraformBuild_1.TerraformBuild(options.provider);
38
- if (operation === 'up') {
39
- build.init(opArgs);
40
- build.plan(opArgs);
41
- build.apply(opArgs);
42
- return;
43
- }
44
- if (operation === 'init') {
45
- build.init(opArgs);
46
- return;
47
- }
48
- if (operation === 'plan') {
49
- build.plan(opArgs);
50
- return;
51
- }
52
- if (operation === 'apply') {
53
- build.apply(opArgs);
54
- return;
55
- }
56
- if (operation === 'destroy') {
57
- build.destroy(opArgs);
58
- return;
59
- }
60
- throw new Error('Unknown infrastructure operation: ' + operation);
61
- };
62
- exports.terraformCli = terraformCli;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.terraformCli = exports.infraCommands = exports.getVariablesFromProperties = exports.tf = void 0;
4
+ const terraformBuild_1 = require("./terraformBuild");
5
+ var terraformCli_1 = require("./terraformCli");
6
+ Object.defineProperty(exports, "tf", { enumerable: true, get: function () { return terraformCli_1.tf; } });
7
+ var terraformBuild_2 = require("./terraformBuild");
8
+ Object.defineProperty(exports, "getVariablesFromProperties", { enumerable: true, get: function () { return terraformBuild_2.getVariablesFromProperties; } });
9
+ const infraCommands = () => {
10
+ const deploymentPositional = (yargs) => {
11
+ return yargs.positional('deployment', {
12
+ type: 'string',
13
+ describe: 'Name of the deployment this command should be applied to',
14
+ demandOption: true,
15
+ });
16
+ };
17
+ return (yargs) => {
18
+ return yargs
19
+ .command('up <deployment>', 'Stands up infrastructure for the specified deployment', deploymentPositional)
20
+ .command('init <deployment>', 'Initialises Terraform working directory for deployment', deploymentPositional)
21
+ .command('plan <deployment>', 'Creates a Terraform execution plan for deployment', deploymentPositional)
22
+ .command('apply <deployment>', 'Applies the last Terraform execution plan calculated using `infra plan`', deploymentPositional)
23
+ .command('destroy <deployment>', 'DANGER: Destroys all deployed infrastructure for the deployment', (yargs) => {
24
+ return deploymentPositional(yargs).option('yes', {
25
+ alias: 'y',
26
+ description: 'DANGER: If provided, confirmation for deleting infrastructure resources will be skipped.',
27
+ default: false,
28
+ demandOption: false,
29
+ type: 'boolean',
30
+ });
31
+ });
32
+ };
33
+ };
34
+ exports.infraCommands = infraCommands;
35
+ const terraformCli = (args, options) => {
36
+ const [operation, ...opArgs] = args;
37
+ const build = new terraformBuild_1.TerraformBuild(options.provider);
38
+ if (operation === 'up') {
39
+ build.init(opArgs);
40
+ build.plan(opArgs);
41
+ build.apply(opArgs);
42
+ return;
43
+ }
44
+ if (operation === 'init') {
45
+ build.init(opArgs);
46
+ return;
47
+ }
48
+ if (operation === 'plan') {
49
+ build.plan(opArgs);
50
+ return;
51
+ }
52
+ if (operation === 'apply') {
53
+ build.apply(opArgs);
54
+ return;
55
+ }
56
+ if (operation === 'destroy') {
57
+ build.destroy(opArgs);
58
+ return;
59
+ }
60
+ throw new Error('Unknown infrastructure operation: ' + operation);
61
+ };
62
+ exports.terraformCli = terraformCli;
63
63
  //# sourceMappingURL=utilsTerraform.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goldstack/utils-terraform",
3
- "version": "0.3.40",
3
+ "version": "0.3.41",
4
4
  "description": "Run Terraform commands easily as npm package scripts",
5
5
  "keywords": [
6
6
  "goldstack",
@@ -38,11 +38,11 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@goldstack/infra": "0.3.24",
41
- "@goldstack/infra-aws": "0.3.30",
41
+ "@goldstack/infra-aws": "0.3.31",
42
42
  "@goldstack/utils-config": "0.3.23",
43
43
  "@goldstack/utils-docker": "0.3.26",
44
44
  "@goldstack/utils-log": "0.2.9",
45
- "@goldstack/utils-package": "0.3.25",
45
+ "@goldstack/utils-package": "0.3.26",
46
46
  "@goldstack/utils-sh": "0.4.22",
47
47
  "prompt-sync": "^4.2.0",
48
48
  "yargs": "^15.4.1"