@hiiretail/gcp-infra-generators 1.0.0 → 1.0.2
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.
- package/dist/generators/clan-resources/clan-project/index.js +89 -189
- package/dist/generators/common-resources/bigquery/index.js +172 -267
- package/dist/generators/common-resources/budget/index.js +67 -153
- package/dist/generators/common-resources/cloud-armor/index.js +17 -167
- package/dist/generators/common-resources/cloud-storage/index.js +96 -205
- package/dist/generators/common-resources/cloudsql/index.js +71 -177
- package/dist/generators/common-resources/cloudsql-database/index.js +40 -287
- package/dist/generators/common-resources/confluent-cluster/index.js +23 -132
- package/dist/generators/common-resources/datastore/index.js +48 -194
- package/dist/generators/common-resources/elastic-cloud/index.js +22 -132
- package/dist/generators/common-resources/elastic-index-policy/handle-yaml.js +76 -0
- package/dist/generators/common-resources/elastic-index-policy/index.js +131 -286
- package/dist/generators/common-resources/elastic-template/index.js +52 -162
- package/dist/generators/common-resources/firestore/index.js +93 -233
- package/dist/generators/common-resources/iam/index.js +35 -157
- package/dist/generators/common-resources/iam/valid-prefix.js +8 -0
- package/dist/generators/common-resources/kafka-connect/index.js +35 -144
- package/dist/generators/common-resources/kafka-topics/index.js +20 -129
- package/dist/generators/common-resources/kms/index.js +31 -141
- package/dist/generators/common-resources/memorystore/index.js +42 -328
- package/dist/generators/common-resources/monitoring/handle-yaml.js +49 -0
- package/dist/generators/common-resources/monitoring/index.js +144 -322
- package/dist/generators/common-resources/monitoring/templates/alerts/generic-infra.yaml +37 -2
- package/dist/generators/common-resources/monitoring/validate.js +58 -0
- package/dist/generators/common-resources/pubsub/append.js +130 -0
- package/dist/generators/common-resources/pubsub/get-gcp-projects.js +34 -0
- package/dist/generators/common-resources/pubsub/handle-subscribers.js +68 -0
- package/dist/generators/common-resources/pubsub/index.js +194 -536
- package/dist/generators/common-resources/pubsub/validate.js +53 -0
- package/dist/generators/common-resources/scheduler/append.js +85 -0
- package/dist/generators/common-resources/scheduler/index.js +62 -249
- package/dist/generators/common-resources/spanner/append.js +31 -0
- package/dist/generators/common-resources/spanner/index.js +102 -269
- package/dist/generators/common-resources/spanner/validate.js +38 -0
- package/dist/generators/docs/rca/index.js +25 -135
- package/dist/generators/docs/runbook/index.js +16 -126
- package/dist/generators/docs/srb/index.js +33 -147
- package/dist/generators/docs/srb/run-docker.js +2 -0
- package/dist/generators/init/clan-infra/gcp-projects.js +47 -0
- package/dist/generators/init/clan-infra/index.js +95 -290
- package/dist/generators/init/clan-infra/tribe-clan-repo.js +38 -0
- package/dist/generators/init/clan-infra/validate.js +8 -0
- package/dist/generators/maintenance/manage-states/index.js +142 -219
- package/dist/generators/maintenance/update-modules/index.js +56 -155
- package/dist/generators/organization/clan-project/googlecloud.js +124 -0
- package/dist/generators/organization/clan-project/index.js +81 -303
- package/dist/node_modules/.package-lock.json +88 -31
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/bucket.js +5 -5
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/file.d.ts +1 -0
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/file.js +10 -1
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/storage.js +1 -1
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/transfer-manager.d.ts +4 -4
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/transfer-manager.js +4 -4
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/util.d.ts +1 -1
- package/dist/node_modules/@google-cloud/storage/build/cjs/src/util.js +2 -2
- package/dist/node_modules/@google-cloud/storage/build/esm/src/bucket.js +5 -5
- package/dist/node_modules/@google-cloud/storage/build/esm/src/file.d.ts +1 -0
- package/dist/node_modules/@google-cloud/storage/build/esm/src/file.js +10 -1
- package/dist/node_modules/@google-cloud/storage/build/esm/src/storage.js +1 -1
- package/dist/node_modules/@google-cloud/storage/build/esm/src/transfer-manager.d.ts +4 -4
- package/dist/node_modules/@google-cloud/storage/build/esm/src/transfer-manager.js +4 -4
- package/dist/node_modules/@google-cloud/storage/build/esm/src/util.d.ts +1 -1
- package/dist/node_modules/@google-cloud/storage/build/esm/src/util.js +2 -2
- package/dist/node_modules/@google-cloud/storage/package.json +5 -5
- package/dist/package.json +45 -0
- package/dist/src/BaseGenerator.js +84 -0
- package/dist/src/SecretsGenerator.js +137 -0
- package/dist/src/cli.js +54 -255
- package/dist/src/dependency-check.js +48 -0
- package/dist/src/update-check.js +38 -0
- package/dist/src/validators.js +33 -0
- package/dist/src/yeoman.js +80 -0
- package/package.json +2 -3
- package/dist/node_modules/@google-cloud/storage/CHANGELOG.md +0 -1769
|
@@ -1,202 +1,92 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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 BaseGenerator = require('../../../src/BaseGenerator');
|
|
4
|
+
const { required } = require('../../../src/validators');
|
|
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/elastic-template/index.js
|
|
116
|
-
var path = require("path");
|
|
117
|
-
var chalk = require("chalk");
|
|
118
|
-
var BaseGenerator = require_BaseGenerator();
|
|
119
|
-
var { required } = require_validators();
|
|
120
6
|
module.exports = class extends BaseGenerator {
|
|
121
7
|
prompting() {
|
|
122
8
|
const prompts = [
|
|
123
9
|
{
|
|
124
|
-
type:
|
|
125
|
-
name:
|
|
126
|
-
message:
|
|
127
|
-
validate: required
|
|
10
|
+
type: 'input',
|
|
11
|
+
name: 'indexName',
|
|
12
|
+
message: 'Please provide the name of the index',
|
|
13
|
+
validate: required,
|
|
128
14
|
},
|
|
129
15
|
{
|
|
130
|
-
type:
|
|
131
|
-
name:
|
|
132
|
-
message:
|
|
133
|
-
validate: required
|
|
16
|
+
type: 'input',
|
|
17
|
+
name: 'numberOfShards',
|
|
18
|
+
message: 'Please provide the number of shards for the index',
|
|
19
|
+
validate: required,
|
|
134
20
|
},
|
|
135
21
|
{
|
|
136
|
-
type:
|
|
137
|
-
name:
|
|
138
|
-
message:
|
|
139
|
-
validate: required
|
|
22
|
+
type: 'input',
|
|
23
|
+
name: 'numberOfReplicas',
|
|
24
|
+
message: 'Please provide the number of shard replicas',
|
|
25
|
+
validate: required,
|
|
140
26
|
},
|
|
141
27
|
{
|
|
142
|
-
type:
|
|
143
|
-
name:
|
|
144
|
-
message:
|
|
28
|
+
type: 'input',
|
|
29
|
+
name: 'aliasName',
|
|
30
|
+
message: 'Please provide the alias name of the index or leave empty',
|
|
145
31
|
},
|
|
146
32
|
{
|
|
147
|
-
type:
|
|
148
|
-
name:
|
|
149
|
-
message:
|
|
150
|
-
|
|
151
|
-
choices: [
|
|
33
|
+
type: 'list',
|
|
34
|
+
name: 'isWriteIndex',
|
|
35
|
+
message:
|
|
36
|
+
'Please select true if the index is the write index for the alias. If previous step is empty this one will be considered empty as well',
|
|
37
|
+
choices: ['true', 'false'],
|
|
152
38
|
},
|
|
153
39
|
{
|
|
154
|
-
type:
|
|
155
|
-
name:
|
|
156
|
-
message:
|
|
157
|
-
to add later
|
|
158
|
-
}
|
|
40
|
+
type: 'input',
|
|
41
|
+
name: 'policyName',
|
|
42
|
+
message:
|
|
43
|
+
'Please provide the lifecycle policy name for the index that has been previously created or leave empty to add later',
|
|
44
|
+
},
|
|
159
45
|
];
|
|
46
|
+
|
|
160
47
|
return this.prompt(prompts).then((props) => {
|
|
161
48
|
this.answers = props;
|
|
162
49
|
});
|
|
163
50
|
}
|
|
51
|
+
|
|
164
52
|
writing() {
|
|
165
53
|
const { indexName } = this.answers;
|
|
166
|
-
|
|
54
|
+
|
|
55
|
+
['prod', 'staging'].forEach((env) => {
|
|
167
56
|
this.copyDir(
|
|
168
|
-
|
|
169
|
-
path.join(
|
|
57
|
+
'elastic-template',
|
|
58
|
+
path.join('infra', env, 'elastic-template', indexName),
|
|
170
59
|
{
|
|
171
60
|
...this.answers,
|
|
172
61
|
env,
|
|
173
|
-
indexName
|
|
174
|
-
}
|
|
62
|
+
indexName,
|
|
63
|
+
},
|
|
175
64
|
);
|
|
176
65
|
});
|
|
177
66
|
}
|
|
67
|
+
|
|
178
68
|
end() {
|
|
179
69
|
const { indexName } = this.answers;
|
|
70
|
+
|
|
180
71
|
const specStageFile = path.join(
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
indexName
|
|
72
|
+
'infra',
|
|
73
|
+
'staging',
|
|
74
|
+
'elastic-template',
|
|
75
|
+
indexName,
|
|
185
76
|
);
|
|
186
77
|
const specProdFile = path.join(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
indexName
|
|
78
|
+
'infra',
|
|
79
|
+
'prod',
|
|
80
|
+
'elastic-template',
|
|
81
|
+
indexName,
|
|
191
82
|
);
|
|
192
83
|
this.log(`
|
|
193
|
-
${chalk.green(`Your Elastic Cloud index configurations have now been created. To finalize your configuration, please
|
|
194
|
-
tinue
|
|
84
|
+
${chalk.green(`Your Elastic Cloud index configurations have now been created. To finalize your configuration, please continue
|
|
195
85
|
with manual editing of the generated files.`)}
|
|
196
|
-
${chalk.green(
|
|
197
|
-
\u2192 ${chalk.cyan(path.join(specStageFile,
|
|
198
|
-
\u2192 ${chalk.cyan(path.join(specProdFile,
|
|
199
|
-
${chalk.green(
|
|
86
|
+
${chalk.green('1.')} Review Mappings configuration
|
|
87
|
+
\u2192 ${chalk.cyan(path.join(specStageFile, 'mappings.json'))}
|
|
88
|
+
\u2192 ${chalk.cyan(path.join(specProdFile, 'mappings.json'))}
|
|
89
|
+
${chalk.green('2.')} Push this change in a feature branch and open a pull request.
|
|
200
90
|
`);
|
|
201
91
|
}
|
|
202
92
|
};
|
|
@@ -1,294 +1,154 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
});
|
|
42
|
-
|
|
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/init/clan-infra/tribe-clan-repo.js
|
|
116
|
-
var require_tribe_clan_repo = __commonJS({
|
|
117
|
-
"generators/init/clan-infra/tribe-clan-repo.js"(exports2, module2) {
|
|
118
|
-
var path2 = require("path");
|
|
119
|
-
var fs = require("fs");
|
|
120
|
-
var getKeyValue = /* @__PURE__ */ __name((content, key) => {
|
|
121
|
-
let value = "";
|
|
122
|
-
content.split(/\r?\n/).forEach((line) => {
|
|
123
|
-
if (line.includes(key)) {
|
|
124
|
-
value = line.split("=")[1].replace('"', "").replace('"', "").trim();
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
return value;
|
|
128
|
-
}, "getKeyValue");
|
|
129
|
-
var getTribeAndClanName2 = /* @__PURE__ */ __name(() => {
|
|
130
|
-
const repoName = path2.basename(path2.resolve());
|
|
131
|
-
const isClanInfraRepo = /^(?:\w+-){2}common(?:$|\W)$/.test(repoName);
|
|
132
|
-
let tribe = "";
|
|
133
|
-
let clan = "";
|
|
134
|
-
if (isClanInfraRepo) {
|
|
135
|
-
[tribe, clan] = repoName.split("-");
|
|
136
|
-
} else {
|
|
137
|
-
const commonHCL = path2.join("infra", "common.hcl");
|
|
138
|
-
if (fs.existsSync(commonHCL)) {
|
|
139
|
-
const commonHCLContent = fs.readFileSync(commonHCL, "utf8");
|
|
140
|
-
tribe = getKeyValue(commonHCLContent, "tribe_name");
|
|
141
|
-
clan = getKeyValue(commonHCLContent, "clan_name");
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return {
|
|
145
|
-
tribe,
|
|
146
|
-
clan
|
|
147
|
-
};
|
|
148
|
-
}, "getTribeAndClanName");
|
|
149
|
-
module2.exports = getTribeAndClanName2;
|
|
150
|
-
}
|
|
151
|
-
});
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const chalk = require('chalk');
|
|
3
|
+
const BaseGenerator = require('../../../src/BaseGenerator');
|
|
4
|
+
const { required } = require('../../../src/validators');
|
|
5
|
+
const getTribeAndClanName = require('../../init/clan-infra/tribe-clan-repo');
|
|
152
6
|
|
|
153
|
-
// generators/common-resources/firestore/index.js
|
|
154
|
-
var path = require("path");
|
|
155
|
-
var chalk = require("chalk");
|
|
156
|
-
var BaseGenerator = require_BaseGenerator();
|
|
157
|
-
var { required } = require_validators();
|
|
158
|
-
var getTribeAndClanName = require_tribe_clan_repo();
|
|
159
7
|
module.exports = class extends BaseGenerator {
|
|
160
8
|
prompting() {
|
|
161
9
|
const prompts = [
|
|
162
10
|
{
|
|
163
|
-
type:
|
|
164
|
-
name:
|
|
11
|
+
type: 'input',
|
|
12
|
+
name: 'databaseName',
|
|
165
13
|
default: getTribeAndClanName().clan,
|
|
166
|
-
message:
|
|
167
|
-
|
|
14
|
+
message:
|
|
15
|
+
'Please provide the database name or leave blank for common database.',
|
|
16
|
+
validate: required,
|
|
168
17
|
},
|
|
169
18
|
{
|
|
170
|
-
type:
|
|
171
|
-
name:
|
|
172
|
-
message:
|
|
173
|
-
default:
|
|
174
|
-
choices: [
|
|
19
|
+
type: 'list',
|
|
20
|
+
name: 'databaseType',
|
|
21
|
+
message: 'Select the type of database.',
|
|
22
|
+
default: 'FIRESTORE_NATIVE',
|
|
23
|
+
choices: ['FIRESTORE_NATIVE', 'DATASTORE_MODE'],
|
|
175
24
|
},
|
|
176
25
|
{
|
|
177
|
-
type:
|
|
178
|
-
name:
|
|
179
|
-
message:
|
|
180
|
-
default:
|
|
181
|
-
choices: [
|
|
26
|
+
type: 'list',
|
|
27
|
+
name: 'databaseConcurrencyMode',
|
|
28
|
+
message: 'Select the database concurrency mode.',
|
|
29
|
+
default: 'OPTIMISTIC',
|
|
30
|
+
choices: ['OPTIMISTIC', 'PESSIMISTIC'],
|
|
182
31
|
},
|
|
183
32
|
{
|
|
184
|
-
type:
|
|
185
|
-
name:
|
|
186
|
-
message:
|
|
187
|
-
default:
|
|
188
|
-
choices: [
|
|
33
|
+
type: 'list',
|
|
34
|
+
name: 'databaseBackupEnabled',
|
|
35
|
+
message: 'Enable database backup?',
|
|
36
|
+
default: 'true',
|
|
37
|
+
choices: ['true', 'false'],
|
|
189
38
|
},
|
|
190
39
|
{
|
|
191
|
-
when:
|
|
192
|
-
type:
|
|
193
|
-
name:
|
|
194
|
-
message:
|
|
195
|
-
default:
|
|
196
|
-
choices: [
|
|
40
|
+
when: (response) => response.databaseBackupEnabled === 'true',
|
|
41
|
+
type: 'list',
|
|
42
|
+
name: 'databaseBackupSchedule',
|
|
43
|
+
message: 'Select the backup schedule.',
|
|
44
|
+
default: 'daily-backup',
|
|
45
|
+
choices: ['daily-backup', 'weekly-backup'],
|
|
197
46
|
},
|
|
198
47
|
{
|
|
199
|
-
when:
|
|
200
|
-
type:
|
|
201
|
-
name:
|
|
202
|
-
message:
|
|
203
|
-
|
|
48
|
+
when: (response) => response.databaseBackupSchedule === 'weekly-backup',
|
|
49
|
+
type: 'list',
|
|
50
|
+
name: 'databaseBackupWeeklyRecurrence',
|
|
51
|
+
message:
|
|
52
|
+
'Please provide the day of the week the backup must be created.',
|
|
53
|
+
default: 'SUNDAY',
|
|
204
54
|
choices: [
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
]
|
|
55
|
+
'MONDAY',
|
|
56
|
+
'TUESDAY',
|
|
57
|
+
'WEDNESDAY',
|
|
58
|
+
'THURSDAY',
|
|
59
|
+
'FRIDAY',
|
|
60
|
+
'SATURDAY',
|
|
61
|
+
'SUNDAY',
|
|
62
|
+
],
|
|
213
63
|
},
|
|
214
64
|
{
|
|
215
|
-
when:
|
|
216
|
-
type:
|
|
217
|
-
name:
|
|
218
|
-
default:
|
|
219
|
-
message:
|
|
220
|
-
|
|
65
|
+
when: (response) => response.databaseBackupEnabled === 'true',
|
|
66
|
+
type: 'input',
|
|
67
|
+
name: 'databaseBackupRetention',
|
|
68
|
+
default: '259200s',
|
|
69
|
+
message:
|
|
70
|
+
'Please provide how long to keep the backups in seconds. ex. "259200s" is 3 days',
|
|
71
|
+
validate: required,
|
|
221
72
|
},
|
|
222
73
|
{
|
|
223
|
-
type:
|
|
224
|
-
name:
|
|
225
|
-
message:
|
|
226
|
-
validate: required
|
|
74
|
+
type: 'input',
|
|
75
|
+
name: 'databaseCollectionName',
|
|
76
|
+
message: 'Please provide the name of the collection being indexed.',
|
|
77
|
+
validate: required,
|
|
227
78
|
},
|
|
228
79
|
{
|
|
229
|
-
type:
|
|
230
|
-
name:
|
|
231
|
-
message:
|
|
232
|
-
validate: required
|
|
80
|
+
type: 'input',
|
|
81
|
+
name: 'databaseCollectionIndexName',
|
|
82
|
+
message: 'Please provide the name of the index.',
|
|
83
|
+
validate: required,
|
|
233
84
|
},
|
|
234
85
|
{
|
|
235
|
-
type:
|
|
236
|
-
name:
|
|
237
|
-
message:
|
|
238
|
-
validate: required
|
|
86
|
+
type: 'input',
|
|
87
|
+
name: 'databaseCollectionFieldPath',
|
|
88
|
+
message: 'Please provide the name of the field.',
|
|
89
|
+
validate: required,
|
|
239
90
|
},
|
|
240
91
|
{
|
|
241
|
-
type:
|
|
242
|
-
name:
|
|
243
|
-
message:
|
|
244
|
-
default:
|
|
245
|
-
choices: [
|
|
246
|
-
}
|
|
92
|
+
type: 'list',
|
|
93
|
+
name: 'databaseCollectionFieldorder',
|
|
94
|
+
message: 'Select the specified order for the field.',
|
|
95
|
+
default: 'ASCENDING',
|
|
96
|
+
choices: ['ASCENDING', 'DESCENDING'],
|
|
97
|
+
},
|
|
247
98
|
];
|
|
99
|
+
|
|
248
100
|
return this.prompt(prompts).then((props) => {
|
|
249
101
|
this.answers = props;
|
|
250
102
|
});
|
|
251
103
|
}
|
|
104
|
+
|
|
252
105
|
writing() {
|
|
253
106
|
const { databaseName, databaseCollectionName, ...rest } = this.answers;
|
|
254
|
-
|
|
107
|
+
|
|
108
|
+
['prod', 'staging'].forEach((env) => {
|
|
255
109
|
const context = {
|
|
256
110
|
...rest,
|
|
257
111
|
databaseName,
|
|
258
112
|
databaseCollectionName,
|
|
259
|
-
env
|
|
113
|
+
env,
|
|
260
114
|
};
|
|
261
|
-
const baseDest = path.join(
|
|
115
|
+
const baseDest = path.join('infra', env, 'firestore', databaseName);
|
|
262
116
|
const collectionDest = path.join(
|
|
263
117
|
baseDest,
|
|
264
|
-
|
|
265
|
-
databaseCollectionName
|
|
118
|
+
'indexes',
|
|
119
|
+
databaseCollectionName,
|
|
266
120
|
);
|
|
267
|
-
|
|
121
|
+
|
|
122
|
+
// Files to copy at database root
|
|
123
|
+
['spec.hcl', 'terragrunt.hcl'].forEach((file) => {
|
|
268
124
|
this.fs.copyTpl(
|
|
269
|
-
this.templatePath(
|
|
125
|
+
this.templatePath('firestore', file),
|
|
270
126
|
this.destinationPath(baseDest, file),
|
|
271
|
-
context
|
|
127
|
+
context,
|
|
272
128
|
);
|
|
273
129
|
});
|
|
274
|
-
|
|
130
|
+
|
|
131
|
+
// Files to copy inside indexes/<databaseCollectionName>/
|
|
132
|
+
['indexes.yaml', 'terragrunt.hcl'].forEach((file) => {
|
|
275
133
|
this.fs.copyTpl(
|
|
276
|
-
this.templatePath(
|
|
134
|
+
this.templatePath('firestore/indexes', file),
|
|
277
135
|
this.destinationPath(collectionDest, file),
|
|
278
|
-
context
|
|
136
|
+
context,
|
|
279
137
|
);
|
|
280
138
|
});
|
|
281
139
|
});
|
|
282
140
|
}
|
|
141
|
+
|
|
283
142
|
end() {
|
|
284
143
|
const { databaseName } = this.answers;
|
|
144
|
+
|
|
285
145
|
const firestoreDir = path.join(databaseName);
|
|
286
146
|
this.log(`
|
|
287
147
|
${chalk.green(`Your Firestore database has now been created. To finalize your configuration, please continue
|
|
288
148
|
with manual editing of the generated files.`)}
|
|
289
|
-
${chalk.green(
|
|
290
|
-
\u2192 ${chalk.cyan(path.join(firestoreDir,
|
|
291
|
-
${chalk.green(
|
|
149
|
+
${chalk.green('1.')} Review and add more indexes as the firestore module requires at least two.
|
|
150
|
+
\u2192 ${chalk.cyan(path.join(firestoreDir, 'indexes.yaml'))}
|
|
151
|
+
${chalk.green('2.')} Push this change in a feature branch and open a pull request.
|
|
292
152
|
`);
|
|
293
153
|
}
|
|
294
154
|
};
|