@hiiretail/gcp-infra-generators 1.0.0 → 1.0.1

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.
Files changed (55) hide show
  1. package/dist/generators/clan-resources/clan-project/index.js +89 -189
  2. package/dist/generators/common-resources/bigquery/index.js +172 -267
  3. package/dist/generators/common-resources/budget/index.js +67 -153
  4. package/dist/generators/common-resources/cloud-armor/index.js +17 -167
  5. package/dist/generators/common-resources/cloud-storage/index.js +96 -205
  6. package/dist/generators/common-resources/cloudsql/index.js +71 -177
  7. package/dist/generators/common-resources/cloudsql-database/index.js +40 -287
  8. package/dist/generators/common-resources/confluent-cluster/index.js +23 -132
  9. package/dist/generators/common-resources/datastore/index.js +48 -194
  10. package/dist/generators/common-resources/elastic-cloud/index.js +22 -132
  11. package/dist/generators/common-resources/elastic-index-policy/handle-yaml.js +76 -0
  12. package/dist/generators/common-resources/elastic-index-policy/index.js +131 -286
  13. package/dist/generators/common-resources/elastic-template/index.js +52 -162
  14. package/dist/generators/common-resources/firestore/index.js +93 -233
  15. package/dist/generators/common-resources/iam/index.js +35 -157
  16. package/dist/generators/common-resources/iam/valid-prefix.js +8 -0
  17. package/dist/generators/common-resources/kafka-connect/index.js +35 -144
  18. package/dist/generators/common-resources/kafka-topics/index.js +20 -129
  19. package/dist/generators/common-resources/kms/index.js +31 -141
  20. package/dist/generators/common-resources/memorystore/index.js +42 -328
  21. package/dist/generators/common-resources/monitoring/handle-yaml.js +49 -0
  22. package/dist/generators/common-resources/monitoring/index.js +144 -322
  23. package/dist/generators/common-resources/monitoring/validate.js +58 -0
  24. package/dist/generators/common-resources/pubsub/append.js +130 -0
  25. package/dist/generators/common-resources/pubsub/get-gcp-projects.js +34 -0
  26. package/dist/generators/common-resources/pubsub/handle-subscribers.js +68 -0
  27. package/dist/generators/common-resources/pubsub/index.js +194 -536
  28. package/dist/generators/common-resources/pubsub/validate.js +53 -0
  29. package/dist/generators/common-resources/scheduler/append.js +85 -0
  30. package/dist/generators/common-resources/scheduler/index.js +62 -249
  31. package/dist/generators/common-resources/spanner/append.js +31 -0
  32. package/dist/generators/common-resources/spanner/index.js +102 -269
  33. package/dist/generators/common-resources/spanner/validate.js +38 -0
  34. package/dist/generators/docs/rca/index.js +25 -135
  35. package/dist/generators/docs/runbook/index.js +16 -126
  36. package/dist/generators/docs/srb/index.js +33 -147
  37. package/dist/generators/docs/srb/run-docker.js +2 -0
  38. package/dist/generators/init/clan-infra/gcp-projects.js +47 -0
  39. package/dist/generators/init/clan-infra/index.js +95 -290
  40. package/dist/generators/init/clan-infra/tribe-clan-repo.js +38 -0
  41. package/dist/generators/init/clan-infra/validate.js +8 -0
  42. package/dist/generators/maintenance/manage-states/index.js +142 -219
  43. package/dist/generators/maintenance/update-modules/index.js +56 -155
  44. package/dist/generators/organization/clan-project/googlecloud.js +124 -0
  45. package/dist/generators/organization/clan-project/index.js +81 -303
  46. package/dist/node_modules/.package-lock.json +81 -23
  47. package/dist/package.json +45 -0
  48. package/dist/src/BaseGenerator.js +84 -0
  49. package/dist/src/SecretsGenerator.js +137 -0
  50. package/dist/src/cli.js +54 -255
  51. package/dist/src/dependency-check.js +48 -0
  52. package/dist/src/update-check.js +38 -0
  53. package/dist/src/validators.js +33 -0
  54. package/dist/src/yeoman.js +80 -0
  55. package/package.json +1 -2
@@ -1,306 +1,207 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
- var __commonJS = (cb, mod) => function __require() {
5
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
6
- };
7
-
8
- // src/validators.js
9
- var require_validators = __commonJS({
10
- "src/validators.js"(exports2, module2) {
11
- var path2 = require("path");
12
- module2.exports = {
13
- chain: /* @__PURE__ */ __name((input, ...validators) => {
14
- let msg = "";
15
- validators.every((validator) => {
16
- msg = validator(input);
17
- return msg === true;
18
- });
19
- return msg === true ? true : msg;
20
- }, "chain"),
21
- filename: /* @__PURE__ */ __name((input) => {
22
- if (!input) {
23
- return true;
24
- }
25
- return path2.basename(input) === input ? true : "Invalid filename";
26
- }, "filename"),
27
- maxLength: /* @__PURE__ */ __name((input, maxLength) => !input || input.length <= maxLength ? true : `Exceeds max \
28
- length: ${maxLength}`, "maxLength"),
29
- required: /* @__PURE__ */ __name((input) => {
30
- const msg = "Required";
31
- if (Array.isArray(input)) {
32
- return input.length > 0 ? true : msg;
33
- }
34
- if (input) {
35
- return input.trim().length > 0 ? true : msg;
36
- }
37
- return msg;
38
- }, "required")
39
- };
40
- }
41
- });
1
+ const path = require('path');
2
+ const chalk = require('chalk');
3
+ const { required } = require('../../../src/validators');
4
+ const BaseGenerator = require('../../../src/BaseGenerator');
42
5
 
43
- // src/BaseGenerator.js
44
- var require_BaseGenerator = __commonJS({
45
- "src/BaseGenerator.js"(exports2, module2) {
46
- var Generator = require("yeoman-generator");
47
- var path2 = require("path");
48
- var fs = require("fs");
49
- var inquirer = require("inquirer");
50
- var { chain, required: required2, filename } = require_validators();
51
- module2.exports = class extends Generator {
52
- constructor(args, opts) {
53
- super(args, opts);
54
- this.baseDir = path2.resolve(path2.join(__dirname, ".."));
55
- this.destinationRoot(process.cwd());
56
- const [command, generator] = opts.namespace.split(":").slice(-2);
57
- this.generatorId = path2.join(command, generator);
58
- this.sourceRoot(
59
- path2.join(this.baseDir, "generators", this.generatorId, "templates")
60
- );
61
- this.copyDir = (templateDir, targetDir, answers = this.answers, skipIfExists = false) => {
62
- if (skipIfExists && fs.existsSync(targetDir)) {
63
- return;
64
- }
65
- this.fs.copyTpl(
66
- this.templatePath(`${templateDir}/**/*`),
67
- this.destinationPath(targetDir),
68
- answers
69
- );
70
- };
71
- this.listSubDirectories = (parent) => fs.readdirSync(parent).filter((f) => !f.startsWith(".")).filter((f) => fs.
72
- lstatSync(path2.join(parent, f)).isDirectory()).sort((a, b) => a.localeCompare(b));
73
- this.kebabCase = (input) => input.replace(/\s|_/g, "-");
74
- this.chooseOrCreatePrompts = (name, getChoicesDirectory) => [
75
- {
76
- when: /* @__PURE__ */ __name((answers) => fs.existsSync(getChoicesDirectory(answers)), "when"),
77
- type: "list",
78
- name,
79
- message: `Choose ${name}`,
80
- store: true,
81
- choices: /* @__PURE__ */ __name((answers) => [
82
- ...this.listSubDirectories(getChoicesDirectory(answers)),
83
- new inquirer.Separator(),
84
- `Create new ${name}`
85
- ], "choices"),
86
- validate: required2,
87
- filter: this.kebabCase
88
- },
89
- {
90
- when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === `\
91
- Create-new-${name}`, "when"),
92
- type: "input",
93
- name: `new-${name}`,
94
- message: `New ${name} name`,
95
- store: false,
96
- validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
97
- filter: this.kebabCase
98
- },
99
- {
100
- when: /* @__PURE__ */ __name((answers) => !fs.existsSync(getChoicesDirectory(answers)) || answers[name] === "\
101
- Create-new-tribe", "when"),
102
- type: "input",
103
- name: "costCenter",
104
- message: "Please provide the Cost Center of the Tribe",
105
- store: false,
106
- validate: /* @__PURE__ */ __name((input) => chain(input, required2, filename), "validate"),
107
- filter: this.kebabCase
108
- }
109
- ];
110
- }
111
- };
112
- }
113
- });
114
-
115
- // generators/common-resources/bigquery/index.js
116
- var path = require("path");
117
- var chalk = require("chalk");
118
- var { required } = require_validators();
119
- var BaseGenerator = require_BaseGenerator();
120
6
  module.exports = class extends BaseGenerator {
121
7
  prompting() {
122
8
  const prompts = [
123
9
  {
124
- type: "list",
125
- name: "resourceType",
126
- message: "Select type of resource you want to create",
127
- default: "datasets",
128
- choices: ["scheduledQueries", "datasets"]
10
+ type: 'list',
11
+ name: 'resourceType',
12
+ message: 'Select type of resource you want to create',
13
+ default: 'datasets',
14
+ choices: ['scheduledQueries', 'datasets'],
129
15
  },
130
16
  {
131
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
132
- type: "input",
133
- name: "queryName",
134
- message: "Please provide the name for the transfer config",
135
- validate: required
17
+ when: (response) => response.resourceType === 'scheduledQueries',
18
+ type: 'input',
19
+ name: 'queryName',
20
+ message: 'Please provide the name for the transfer config',
21
+ validate: required,
136
22
  },
137
23
  {
138
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
139
- type: "input",
140
- name: "dataSourceId",
141
- message: "Please provide the data source id. Cannot be changed once the transfer config is created.",
142
- validate: required
24
+ when: (response) => response.resourceType === 'scheduledQueries',
25
+ type: 'input',
26
+ name: 'dataSourceId',
27
+ message:
28
+ 'Please provide the data source id. Cannot be changed once the transfer config is created.',
29
+ validate: required,
143
30
  },
144
31
  {
145
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
146
- type: "input",
147
- name: "destinationDatasetId",
148
- message: "Please provide the BigQuery target dataset id. Leave empty to specify later"
32
+ when: (response) => response.resourceType === 'scheduledQueries',
33
+ type: 'input',
34
+ name: 'destinationDatasetId',
35
+ message:
36
+ 'Please provide the BigQuery target dataset id. Leave empty to specify later',
149
37
  },
150
38
  {
151
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
152
- type: "input",
153
- name: "schedule",
154
- message: "Please provide the data transfer schedule. Format here: https://cloud.google.com/appengine/docs/flexib\
155
- le/python/scheduling-jobs-with-cron-yaml#the_schedule_format",
156
- validate: required
39
+ when: (response) => response.resourceType === 'scheduledQueries',
40
+ type: 'input',
41
+ name: 'schedule',
42
+ message:
43
+ 'Please provide the data transfer schedule. Format here: https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format',
44
+ validate: required,
157
45
  },
158
46
  {
159
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
160
- type: "input",
161
- name: "notificationPubsubTopic",
162
- message: "Please provide Pub/Sub topic full name where notifications will be sent after transfer finish. Leave e\
163
- mpty to specify later"
47
+ when: (response) => response.resourceType === 'scheduledQueries',
48
+ type: 'input',
49
+ name: 'notificationPubsubTopic',
50
+ message:
51
+ 'Please provide Pub/Sub topic full name where notifications will be sent after transfer finish. Leave empty to specify later',
164
52
  },
165
53
  {
166
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
167
- type: "input",
168
- name: "dataRefreshWindow",
169
- message: "Please provide the number of days to look back to automatically refresh the data. Leave empty to speci\
170
- fy later"
54
+ when: (response) => response.resourceType === 'scheduledQueries',
55
+ type: 'input',
56
+ name: 'dataRefreshWindow',
57
+ message:
58
+ 'Please provide the number of days to look back to automatically refresh the data. Leave empty to specify later',
171
59
  },
172
60
  {
173
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
174
- type: "list",
175
- name: "enableFailureEmail",
176
- message: "Select if you want to enable notifications to be sent to the email address of the user who owns this t\
177
- ransfer config if the run fails",
178
- default: "false",
179
- choices: ["false", "true"]
61
+ when: (response) => response.resourceType === 'scheduledQueries',
62
+ type: 'list',
63
+ name: 'enableFailureEmail',
64
+ message:
65
+ 'Select if you want to enable notifications to be sent to the email address of the user who owns this transfer config if the run fails',
66
+ default: 'false',
67
+ choices: ['false', 'true'],
180
68
  },
181
69
  {
182
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
183
- type: "input",
184
- name: "dataPathTemplate",
185
- message: "Please provide the Cloud Storage URI that contains your files to be transferred",
186
- validate: required
70
+ when: (response) => response.resourceType === 'scheduledQueries',
71
+ type: 'input',
72
+ name: 'dataPathTemplate',
73
+ message:
74
+ 'Please provide the Cloud Storage URI that contains your files to be transferred',
75
+ validate: required,
187
76
  },
188
77
  {
189
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
190
- type: "input",
191
- name: "destinationTableTemplate",
192
- message: "Please provide the name of your destination table",
193
- validate: required
78
+ when: (response) => response.resourceType === 'scheduledQueries',
79
+ type: 'input',
80
+ name: 'destinationTableTemplate',
81
+ message: 'Please provide the name of your destination table',
82
+ validate: required,
194
83
  },
195
84
  {
196
- when: /* @__PURE__ */ __name((response) => response.resourceType === "scheduledQueries", "when"),
197
- type: "input",
198
- name: "fileFormat",
199
- message: "Please provide the type of files you want to transfe. Supported values CSV, JSON, AVRO, PARQUET, or OR\
200
- C",
201
- validate: required
85
+ when: (response) => response.resourceType === 'scheduledQueries',
86
+ type: 'input',
87
+ name: 'fileFormat',
88
+ message:
89
+ 'Please provide the type of files you want to transfe. Supported values CSV, JSON, AVRO, PARQUET, or ORC',
90
+ validate: required,
202
91
  },
203
92
  {
204
- when: /* @__PURE__ */ __name((response) => response.resourceType === "datasets", "when"),
205
- type: "input",
206
- name: "datasetId",
207
- message: "Please provide the dataset ID (must be alphanumeric, plus underscores)",
208
- validate: required
93
+ when: (response) => response.resourceType === 'datasets',
94
+ type: 'input',
95
+ name: 'datasetId',
96
+ message:
97
+ 'Please provide the dataset ID (must be alphanumeric, plus underscores)',
98
+ validate: required,
209
99
  },
210
100
  {
211
- when: /* @__PURE__ */ __name((response) => response.resourceType === "datasets", "when"),
212
- type: "input",
213
- name: "datasetName",
214
- message: "Please provide the user-frienldy name for the dataset",
215
- validate: required
101
+ when: (response) => response.resourceType === 'datasets',
102
+ type: 'input',
103
+ name: 'datasetName',
104
+ message: 'Please provide the user-frienldy name for the dataset',
105
+ validate: required,
216
106
  },
217
107
  {
218
- when: /* @__PURE__ */ __name((response) => response.resourceType === "datasets", "when"),
219
- type: "input",
220
- name: "description",
221
- message: "Please provide the description for the dataset",
222
- validate: required
108
+ when: (response) => response.resourceType === 'datasets',
109
+ type: 'input',
110
+ name: 'description',
111
+ message: 'Please provide the description for the dataset',
112
+ validate: required,
223
113
  },
224
114
  {
225
- when: /* @__PURE__ */ __name((response) => response.resourceType === "datasets", "when"),
226
- type: "list",
227
- name: "createTable",
228
- message: "Do you want to create a table?",
229
- default: "no",
230
- choices: ["yes", "no"]
115
+ when: (response) => response.resourceType === 'datasets',
116
+ type: 'list',
117
+ name: 'createTable',
118
+ message: 'Do you want to create a table?',
119
+ default: 'no',
120
+ choices: ['yes', 'no'],
231
121
  },
232
122
  {
233
- when: /* @__PURE__ */ __name((response) => response.createTable === "yes" && response.resourceType === "datasets",
234
- "when"),
235
- type: "input",
236
- name: "tableId",
237
- message: "Please provide the ID for the table",
238
- validate: required
123
+ when: (response) =>
124
+ response.createTable === 'yes' &&
125
+ response.resourceType === 'datasets',
126
+ type: 'input',
127
+ name: 'tableId',
128
+ message: 'Please provide the ID for the table',
129
+ validate: required,
239
130
  },
240
131
  {
241
- when: /* @__PURE__ */ __name((response) => response.createTable === "yes" && response.resourceType === "datasets",
242
- "when"),
243
- type: "input",
244
- name: "expirationTime",
245
- message: "Please provide the time when the table expires (in milliseconds since the epoch). If set to `null`, th\
246
- e table will persist indefinitely.",
247
- validate: required
132
+ when: (response) =>
133
+ response.createTable === 'yes' &&
134
+ response.resourceType === 'datasets',
135
+ type: 'input',
136
+ name: 'expirationTime',
137
+ message:
138
+ 'Please provide the time when the table expires (in milliseconds since the epoch). If set to `null`, the table will persist indefinitely.',
139
+ validate: required,
248
140
  },
249
141
  {
250
- when: /* @__PURE__ */ __name((response) => response.resourceType === "datasets", "when"),
251
- type: "list",
252
- name: "createRoutine",
253
- message: "Do you want to create a routine?",
254
- default: "no",
255
- choices: ["yes", "no"]
142
+ when: (response) => response.resourceType === 'datasets',
143
+ type: 'list',
144
+ name: 'createRoutine',
145
+ message: 'Do you want to create a routine?',
146
+ default: 'no',
147
+ choices: ['yes', 'no'],
256
148
  },
257
149
  {
258
- when: /* @__PURE__ */ __name((response) => response.createRoutine === "yes" && response.resourceType === "datase\
259
- ts", "when"),
260
- type: "input",
261
- name: "routineId",
262
- message: "Please provide the ID of the routine. The ID must contain only letters, numbers, or underscores",
263
- validate: required
150
+ when: (response) =>
151
+ response.createRoutine === 'yes' &&
152
+ response.resourceType === 'datasets',
153
+ type: 'input',
154
+ name: 'routineId',
155
+ message:
156
+ 'Please provide the ID of the routine. The ID must contain only letters, numbers, or underscores',
157
+ validate: required,
264
158
  },
265
159
  {
266
- when: /* @__PURE__ */ __name((response) => response.createRoutine === "yes" && response.resourceType === "datase\
267
- ts", "when"),
268
- type: "input",
269
- name: "routineDescription",
270
- message: "Please provide the description of the routine",
271
- validate: required
160
+ when: (response) =>
161
+ response.createRoutine === 'yes' &&
162
+ response.resourceType === 'datasets',
163
+ type: 'input',
164
+ name: 'routineDescription',
165
+ message: 'Please provide the description of the routine',
166
+ validate: required,
272
167
  },
273
168
  {
274
- when: /* @__PURE__ */ __name((response) => response.createRoutine === "yes" && response.resourceType === "datase\
275
- ts", "when"),
276
- type: "list",
277
- name: "routineType",
278
- message: "Please select a routine type",
279
- default: "PROCEDURE",
280
- choices: ["SCALAR_FUNCTION", "PROCEDURE"]
169
+ when: (response) =>
170
+ response.createRoutine === 'yes' &&
171
+ response.resourceType === 'datasets',
172
+ type: 'list',
173
+ name: 'routineType',
174
+ message: 'Please select a routine type',
175
+ default: 'PROCEDURE',
176
+ choices: ['SCALAR_FUNCTION', 'PROCEDURE'],
281
177
  },
282
178
  {
283
- when: /* @__PURE__ */ __name((response) => response.createRoutine === "yes" && response.resourceType === "datase\
284
- ts", "when"),
285
- type: "list",
286
- name: "language",
287
- message: "Please select a language of the routine",
288
- default: "SQL",
289
- choices: ["SQL", "JAVASCRIPT"]
179
+ when: (response) =>
180
+ response.createRoutine === 'yes' &&
181
+ response.resourceType === 'datasets',
182
+ type: 'list',
183
+ name: 'language',
184
+ message: 'Please select a language of the routine',
185
+ default: 'SQL',
186
+ choices: ['SQL', 'JAVASCRIPT'],
290
187
  },
291
188
  {
292
- when: /* @__PURE__ */ __name((response) => response.createRoutine === "yes" && response.resourceType === "datase\
293
- ts", "when"),
294
- type: "input",
295
- name: "definitionBody",
296
- message: "Please provide the body of the routine, specify null if not needed",
297
- validate: required
298
- }
189
+ when: (response) =>
190
+ response.createRoutine === 'yes' &&
191
+ response.resourceType === 'datasets',
192
+ type: 'input',
193
+ name: 'definitionBody',
194
+ message:
195
+ 'Please provide the body of the routine, specify null if not needed',
196
+ validate: required,
197
+ },
299
198
  ];
199
+
300
200
  return this.prompt(prompts).then((props) => {
301
201
  this.answers = props;
302
202
  });
303
203
  }
204
+
304
205
  writing() {
305
206
  const {
306
207
  datasetId,
@@ -325,13 +226,14 @@ ts", "when"),
325
226
  enableFailureEmail,
326
227
  dataPathTemplate,
327
228
  destinationTableTemplate,
328
- fileFormat
229
+ fileFormat,
329
230
  } = this.answers;
330
- ["prod", "staging"].forEach((env) => {
331
- if (createTable === "no" && resourceType === "datasets") {
231
+
232
+ ['prod', 'staging'].forEach((env) => {
233
+ if (createTable === 'no' && resourceType === 'datasets') {
332
234
  this.copyDir(
333
- "bigquery",
334
- path.join("infra", env, "bigquery", datasetId),
235
+ 'bigquery',
236
+ path.join('infra', env, 'bigquery', datasetId),
335
237
  {
336
238
  ...this.answers,
337
239
  env,
@@ -344,13 +246,14 @@ ts", "when"),
344
246
  routineType,
345
247
  language,
346
248
  definitionBody,
347
- routineDescription
348
- }
249
+ routineDescription,
250
+ },
349
251
  );
350
252
  }
351
- if (createTable === "yes" && resourceType === "datasets") {
352
- ["schema", "bigquery"].forEach((folder) => {
353
- this.copyDir(folder, path.join("infra", env, "bigquery", datasetId), {
253
+
254
+ if (createTable === 'yes' && resourceType === 'datasets') {
255
+ ['schema', 'bigquery'].forEach((folder) => {
256
+ this.copyDir(folder, path.join('infra', env, 'bigquery', datasetId), {
354
257
  ...this.answers,
355
258
  env,
356
259
  datasetId,
@@ -364,14 +267,15 @@ ts", "when"),
364
267
  routineType,
365
268
  language,
366
269
  definitionBody,
367
- routineDescription
270
+ routineDescription,
368
271
  });
369
272
  });
370
273
  }
371
- if (resourceType === "scheduledQueries") {
274
+
275
+ if (resourceType === 'scheduledQueries') {
372
276
  this.copyDir(
373
- "scheduled-queries",
374
- path.join("infra", env, "scheduled-queries"),
277
+ 'scheduled-queries',
278
+ path.join('infra', env, 'scheduled-queries'),
375
279
  {
376
280
  ...this.answers,
377
281
  env,
@@ -384,18 +288,19 @@ ts", "when"),
384
288
  enableFailureEmail,
385
289
  dataPathTemplate,
386
290
  destinationTableTemplate,
387
- fileFormat
388
- }
291
+ fileFormat,
292
+ },
389
293
  );
390
294
  }
391
295
  });
392
296
  }
297
+
393
298
  end() {
394
299
  this.log(`
395
300
  ${chalk.green(`Your BigQuery resources have now been created. To finalize your configuration, please continue
396
301
  with manual editing of the generated files.`)}
397
- ${chalk.green("1.")} Review and add modify schema.json file, change null values to needed ones.
398
- ${chalk.green("2.")} Push this change in a feature branch and open a pull request.
302
+ ${chalk.green('1.')} Review and add modify schema.json file, change null values to needed ones.
303
+ ${chalk.green('2.')} Push this change in a feature branch and open a pull request.
399
304
  `);
400
305
  }
401
306
  };