@openhi/platform 0.0.0 → 0.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/lib/{openhi.d.ts → index.d.mts} +42 -16
- package/lib/index.d.ts +195 -2
- package/lib/index.js +825 -17
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +818 -0
- package/lib/index.mjs.map +1 -0
- package/package.json +33 -24
- package/lib/openhi.js +0 -108
- package/lib/service.d.ts +0 -36
- package/lib/service.js +0 -203
- package/lib/templates/generate-templates.d.ts +0 -5
- package/lib/templates/generate-templates.js +0 -45
- package/lib/templates/service-template.d.ts +0 -33
- package/lib/templates/service-template.js +0 -42
- package/lib/templates/src/README.md.d.ts +0 -5
- package/lib/templates/src/README.md.js +0 -19
- package/lib/templates/src/app-test.d.ts +0 -5
- package/lib/templates/src/app-test.js +0 -61
- package/lib/templates/src/app.d.ts +0 -5
- package/lib/templates/src/app.js +0 -27
- package/lib/templates/src/config.d.ts +0 -5
- package/lib/templates/src/config.js +0 -23
- package/lib/templates/src/data/README.md.d.ts +0 -5
- package/lib/templates/src/data/README.md.js +0 -19
- package/lib/templates/src/data/models/README.md.d.ts +0 -5
- package/lib/templates/src/data/models/README.md.js +0 -19
- package/lib/templates/src/infrastructure/README.md.d.ts +0 -5
- package/lib/templates/src/infrastructure/README.md.js +0 -19
- package/lib/templates/src/integrations/README.md.d.ts +0 -5
- package/lib/templates/src/integrations/README.md.js +0 -19
- package/lib/templates/src/main.d.ts +0 -5
- package/lib/templates/src/main.js +0 -15
- package/lib/templates/src/workflows/README.md.d.ts +0 -5
- package/lib/templates/src/workflows/README.md.js +0 -19
- package/lib/workflows/aws-teardown-workflow.d.ts +0 -13
- package/lib/workflows/aws-teardown-workflow.js +0 -222
- package/lib/workflows/build-dev-workflow.d.ts +0 -12
- package/lib/workflows/build-dev-workflow.js +0 -48
- package/lib/workflows/build-stage-workflow.d.ts +0 -12
- package/lib/workflows/build-stage-workflow.js +0 -60
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AwsTeardownWorkflow = void 0;
|
|
4
|
-
const configulator_1 = require("@codedrifters/configulator");
|
|
5
|
-
const config_1 = require("@openhi/config");
|
|
6
|
-
const projen_1 = require("projen");
|
|
7
|
-
const github_1 = require("projen/lib/github");
|
|
8
|
-
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
9
|
-
class AwsTeardownWorkflow extends projen_1.Component {
|
|
10
|
-
constructor(rootProject, options) {
|
|
11
|
-
super(rootProject);
|
|
12
|
-
this.rootProject = rootProject;
|
|
13
|
-
const { openhi } = options;
|
|
14
|
-
/***************************************************************************
|
|
15
|
-
*
|
|
16
|
-
* Root project check
|
|
17
|
-
*
|
|
18
|
-
* Detect the root project and ensure it's of type MonorepoProject.
|
|
19
|
-
*
|
|
20
|
-
**************************************************************************/
|
|
21
|
-
if (!(rootProject instanceof configulator_1.MonorepoProject)) {
|
|
22
|
-
throw new Error("AwsTeardownWorkflow requires the root project to be a MonorepoProject");
|
|
23
|
-
}
|
|
24
|
-
//this.rootProject = project.root;
|
|
25
|
-
/***************************************************************************
|
|
26
|
-
*
|
|
27
|
-
* GitHub Check
|
|
28
|
-
*
|
|
29
|
-
* Make sure github config is active in the project. This is to ensure all
|
|
30
|
-
* workflows will be output properly during synth.
|
|
31
|
-
*
|
|
32
|
-
**************************************************************************/
|
|
33
|
-
const github = github_1.GitHub.of(this.rootProject);
|
|
34
|
-
if (!github) {
|
|
35
|
-
throw new Error("AwsTeardownWorkflow requires a GitHub component in the root project");
|
|
36
|
-
}
|
|
37
|
-
/***************************************************************************
|
|
38
|
-
*
|
|
39
|
-
* Workflow Destroy Targets
|
|
40
|
-
*
|
|
41
|
-
* Find all the CI targets for the Auth and Core projects in the DEV stage
|
|
42
|
-
* only. One job per (account, region) teardowns all orphan stacks (Auth,
|
|
43
|
-
* Core, data) in that account/region.
|
|
44
|
-
*
|
|
45
|
-
**************************************************************************/
|
|
46
|
-
const devTargetsFor = (service) => configulator_1.AwsDeploymentConfig.of(service.project)?.awsDeploymentTargets.filter((target) => target.awsStageType === config_1.OPEN_HI_STAGE.DEV && target.ciDeployment) ?? [];
|
|
47
|
-
const coreTargets = devTargetsFor(openhi.core);
|
|
48
|
-
const authTargets = devTargetsFor(openhi.auth);
|
|
49
|
-
const byAccountRegion = new Map();
|
|
50
|
-
[...authTargets, ...coreTargets].forEach((t) => {
|
|
51
|
-
const key = `${t.account}-${t.region}`;
|
|
52
|
-
if (!byAccountRegion.has(key))
|
|
53
|
-
byAccountRegion.set(key, t);
|
|
54
|
-
});
|
|
55
|
-
const awsDestructionTargets = Array.from(byAccountRegion.values());
|
|
56
|
-
/***************************************************************************
|
|
57
|
-
*
|
|
58
|
-
* Create Workflow
|
|
59
|
-
*
|
|
60
|
-
* Make a new workflow for AWS stack teardown. This runs each night and is
|
|
61
|
-
* also triggered each time a branch is deleted.
|
|
62
|
-
*
|
|
63
|
-
**************************************************************************/
|
|
64
|
-
const workflow = new github_1.GithubWorkflow(github, "teardown-dev");
|
|
65
|
-
workflow.on({
|
|
66
|
-
workflowDispatch: {},
|
|
67
|
-
schedule: [
|
|
68
|
-
{
|
|
69
|
-
cron: "32 6 * * *", // Every Sunday at 6:32 AM UTC
|
|
70
|
-
},
|
|
71
|
-
],
|
|
72
|
-
delete: {
|
|
73
|
-
branches: ["feature/*", "feat/*", "fix/*"],
|
|
74
|
-
},
|
|
75
|
-
/* for debugging
|
|
76
|
-
push: {
|
|
77
|
-
branches: ["feature/*"],
|
|
78
|
-
},
|
|
79
|
-
*/
|
|
80
|
-
});
|
|
81
|
-
awsDestructionTargets.forEach((target) => {
|
|
82
|
-
const { awsStageType, awsEnvironmentType, account, region, ciDeploymentConfig, } = target;
|
|
83
|
-
const { roleArn } = ciDeploymentConfig ?? {};
|
|
84
|
-
workflow.addJob(`teardown-${account}-${region}`.toLowerCase(), {
|
|
85
|
-
name: `Teardown Stacks in ${target.account}/${target.region}`,
|
|
86
|
-
//if: "github.event.ref_type == 'branch'",
|
|
87
|
-
runsOn: ["ubuntu-latest"],
|
|
88
|
-
permissions: {
|
|
89
|
-
contents: workflows_model_1.JobPermission.READ,
|
|
90
|
-
idToken: workflows_model_1.JobPermission.WRITE,
|
|
91
|
-
},
|
|
92
|
-
env: {
|
|
93
|
-
REPO: "${{ github.repository }}",
|
|
94
|
-
REGIONS: [region].join(" "),
|
|
95
|
-
},
|
|
96
|
-
steps: [
|
|
97
|
-
/**
|
|
98
|
-
* Configure AWS creds.
|
|
99
|
-
*/
|
|
100
|
-
{
|
|
101
|
-
name: `AWS Creds ${awsStageType}/${awsEnvironmentType}/${account}/${region}`,
|
|
102
|
-
uses: "aws-actions/configure-aws-credentials@v4",
|
|
103
|
-
with: {
|
|
104
|
-
"role-to-assume": roleArn,
|
|
105
|
-
"aws-region": region,
|
|
106
|
-
"role-duration-seconds": 900, // 15 minutes
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
/**
|
|
110
|
-
* Fetch all branch names in the repo
|
|
111
|
-
*/
|
|
112
|
-
{
|
|
113
|
-
name: "Fetch All Branches",
|
|
114
|
-
id: "fetch_branches",
|
|
115
|
-
uses: "actions/github-script@v7",
|
|
116
|
-
with: {
|
|
117
|
-
script: [
|
|
118
|
-
"const all = await github.paginate(github.rest.repos.listBranches, {",
|
|
119
|
-
" owner: context.repo.owner,",
|
|
120
|
-
" repo: context.repo.repo,",
|
|
121
|
-
" per_page: 100",
|
|
122
|
-
"});",
|
|
123
|
-
"const names = all.map(b => b.name);",
|
|
124
|
-
"console.log(`Found branches: ${names}`);",
|
|
125
|
-
'core.setOutput("json", JSON.stringify(names));',
|
|
126
|
-
].join("\n"),
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
/**
|
|
130
|
-
* Save branches to a file
|
|
131
|
-
*/
|
|
132
|
-
{
|
|
133
|
-
name: "Save Branches to File",
|
|
134
|
-
run: [
|
|
135
|
-
'echo "Saving branches to file"',
|
|
136
|
-
"echo '${{ steps.fetch_branches.outputs.json }}' | jq -r '.[]' | sort -u > branches.txt",
|
|
137
|
-
'echo "Branches:"',
|
|
138
|
-
"cat branches.txt",
|
|
139
|
-
].join("\n"),
|
|
140
|
-
},
|
|
141
|
-
/**
|
|
142
|
-
* Find all stacks tagged with a stage of dev. for this repo. return
|
|
143
|
-
* tag and resource arn.
|
|
144
|
-
*/
|
|
145
|
-
{
|
|
146
|
-
name: "Find Stacks by Tag",
|
|
147
|
-
id: "find_stacks",
|
|
148
|
-
run: [
|
|
149
|
-
"set -euo pipefail",
|
|
150
|
-
": > candidates.txt # columns: arn region branchTag",
|
|
151
|
-
"# Build tag filters",
|
|
152
|
-
'TAG_FILTERS=( "Key=openhi:repo-name,Values=$REPO" )',
|
|
153
|
-
`TAG_FILTERS+=( "Key=openhi:stage-type,Values=${config_1.OPEN_HI_STAGE.DEV}" )`,
|
|
154
|
-
"for r in $REGIONS; do",
|
|
155
|
-
` echo "Scanning region: $r"`,
|
|
156
|
-
" aws resourcegroupstaggingapi get-resources \\",
|
|
157
|
-
' --region "$r" \\',
|
|
158
|
-
' --resource-type-filters "cloudformation:stack" \\',
|
|
159
|
-
' --tag-filters "${TAG_FILTERS[@]}" \\',
|
|
160
|
-
` | jq -r --arg r "$r" '`,
|
|
161
|
-
" .ResourceTagMappingList[]",
|
|
162
|
-
" | . as $res",
|
|
163
|
-
' | ($res.Tags[] | select(.Key=="openhi:branch-name") | .Value) as $branch',
|
|
164
|
-
' | [$res.ResourceARN, $r, ($branch // "")]',
|
|
165
|
-
" | @tsv",
|
|
166
|
-
" ' >> candidates.txt",
|
|
167
|
-
"done",
|
|
168
|
-
"echo 'Tagged stacks:'",
|
|
169
|
-
`(echo -e "ARN\\tREGION\\tBRANCH"; cat candidates.txt) | column -t -s $'\\t'`,
|
|
170
|
-
].join("\n"),
|
|
171
|
-
},
|
|
172
|
-
/**
|
|
173
|
-
* Determine which stacks are orphans that no longer have a matching branch.
|
|
174
|
-
* Save those to a file for the next step.
|
|
175
|
-
*/
|
|
176
|
-
{
|
|
177
|
-
name: "Determine Orphan Stacks (No Matching Branch)",
|
|
178
|
-
run: [
|
|
179
|
-
"set -euo pipefail",
|
|
180
|
-
": > orphans.txt # arn region branch",
|
|
181
|
-
"while IFS=$'\\t' read -r arn region branch; do",
|
|
182
|
-
' [ -z "$arn" ] && continue',
|
|
183
|
-
' if [ -z "$branch" ]; then',
|
|
184
|
-
" # If no Branch tag, treat as not-a-preview; skip (or flip to delete if you want)",
|
|
185
|
-
" continue",
|
|
186
|
-
" fi",
|
|
187
|
-
' if ! grep -Fxq "$branch" branches.txt; then',
|
|
188
|
-
' echo -e "$arn\\t$region\\t$branch" >> orphans.txt',
|
|
189
|
-
" fi",
|
|
190
|
-
"done < candidates.txt",
|
|
191
|
-
"",
|
|
192
|
-
"if [ -s orphans.txt ]; then",
|
|
193
|
-
' echo "Orphan stacks (no matching branch):"',
|
|
194
|
-
" (echo -e \"ARN\\tREGION\\tBRANCH\"; cat orphans.txt) | column -t -s $'\\t'",
|
|
195
|
-
"else",
|
|
196
|
-
' echo "No orphan stacks found."',
|
|
197
|
-
"fi",
|
|
198
|
-
].join("\n"),
|
|
199
|
-
},
|
|
200
|
-
/**
|
|
201
|
-
* Delete orphan stacks.
|
|
202
|
-
*/
|
|
203
|
-
{
|
|
204
|
-
name: "Delete Orphan Stacks",
|
|
205
|
-
if: "hashFiles('orphans.txt') != ''",
|
|
206
|
-
run: [
|
|
207
|
-
"set -euo pipefail",
|
|
208
|
-
"while IFS=$'\\t' read -r arn region branch; do",
|
|
209
|
-
' [ -z "$arn" ] && continue',
|
|
210
|
-
" stack_name=$(cut -d'/' -f2 <<<\"$arn\")",
|
|
211
|
-
' echo "Deleting $stack_name (branch=$branch) in $region"',
|
|
212
|
-
' aws cloudformation delete-stack --region "$region" --stack-name "$stack_name" || true',
|
|
213
|
-
"done < orphans.txt",
|
|
214
|
-
].join("\n"),
|
|
215
|
-
},
|
|
216
|
-
],
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
exports.AwsTeardownWorkflow = AwsTeardownWorkflow;
|
|
222
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXRlYXJkb3duLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmtmbG93cy9hd3MtdGVhcmRvd24td29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBR29DO0FBQ3BDLDJDQUErQztBQUMvQyxtQ0FBbUM7QUFDbkMsOENBQTJEO0FBQzNELHVFQUFrRTtBQVdsRSxNQUFhLG1CQUFvQixTQUFRLGtCQUFTO0lBQ2hELFlBQ1MsV0FBNEIsRUFDbkMsT0FBbUM7UUFFbkMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSFosZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBS25DLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFM0I7Ozs7OztvRkFNNEU7UUFFNUUsSUFBSSxDQUFDLENBQUMsV0FBVyxZQUFZLDhCQUFlLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUVBQXVFLENBQ3hFLENBQUM7UUFDSixDQUFDO1FBRUQsa0NBQWtDO1FBRWxDOzs7Ozs7O29GQU80RTtRQUU1RSxNQUFNLE1BQU0sR0FBRyxlQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUNiLHFFQUFxRSxDQUN0RSxDQUFDO1FBQ0osQ0FBQztRQUVEOzs7Ozs7OztvRkFRNEU7UUFFNUUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUFzQixFQUFFLEVBQUUsQ0FDL0Msa0NBQW1CLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxNQUFNLENBQ2xFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsWUFBWSxLQUFLLHNCQUFhLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQ25FLElB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OzRCQUM5Qyw4RUFBOEU7NEJBQzlFLE1BQU07NEJBQ04sa0NBQWtDOzRCQUNsQyxJQUFJO3lCQUNMLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDYjtvQkFFRDs7dUJBRUc7b0JBQ0g7d0JBQ0UsSUFBSSxFQUFFLHNCQUFzQjt3QkFDNUIsRUFBRSxFQUFFLGdDQUFnQzt3QkFDcEMsR0FBRyxFQUFFOzRCQUNILG1CQUFtQjs0QkFDbkIsZ0RBQWdEOzRCQUNoRCw2QkFBNkI7NEJBQzdCLDJDQUEyQzs0QkFDM0MsMkRBQTJEOzRCQUMzRCx5RkFBeUY7NEJBQ3pGLG9CQUFvQjt5QkFDckIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF4UEQsa0RBd1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXdzRGVwbG95bWVudENvbmZpZyxcbiAgTW9ub3JlcG9Qcm9qZWN0LFxufSBmcm9tIFwiQGNvZGVkcmlmdGVycy9jb25maWd1bGF0b3JcIjtcbmltcG9ydCB7IE9QRU5fSElfU1RBR0UgfSBmcm9tIFwiQG9wZW5oaS9jb25maWdcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IEdpdEh1YiwgR2l0aHViV29ya2Zsb3cgfSBmcm9tIFwicHJvamVuL2xpYi9naXRodWJcIjtcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tIFwicHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBPcGVuSGkgfSBmcm9tIFwiLi4vb3BlbmhpXCI7XG5pbXBvcnQgdHlwZSB7IE9wZW5IaVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1RlYXJkb3duV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIG9wZW5oaSBwcm9qZWN0XG4gICAqL1xuICByZWFkb25seSBvcGVuaGk6IE9wZW5IaTtcbn1cblxuZXhwb3J0IGNsYXNzIEF3c1RlYXJkb3duV29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcm9vdFByb2plY3Q6IE1vbm9yZXBvUHJvamVjdCxcbiAgICBvcHRpb25zOiBBd3NUZWFyZG93bldvcmtmbG93T3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIocm9vdFByb2plY3QpO1xuXG4gICAgY29uc3QgeyBvcGVuaGkgfSA9IG9wdGlvbnM7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBSb290IHByb2plY3QgY2hlY2tcbiAgICAgKlxuICAgICAqIERldGVjdCB0aGUgcm9vdCBwcm9qZWN0IGFuZCBlbnN1cmUgaXQncyBvZiB0eXBlIE1vbm9yZXBvUHJvamVjdC5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGlmICghKHJvb3RQcm9qZWN0IGluc3RhbmNlb2YgTW9ub3JlcG9Qcm9qZWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF3c1RlYXJkb3duV29ya2Zsb3cgcmVxdWlyZXMgdGhlIHJvb3QgcHJvamVjdCB0byBiZSBhIE1vbm9yZXBvUHJvamVjdFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvL3RoaXMucm9vdFByb2plY3QgPSBwcm9qZWN0LnJvb3Q7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBHaXRIdWIgQ2hlY2tcbiAgICAgKlxuICAgICAqIE1ha2Ugc3VyZSBnaXRodWIgY29uZmlnIGlzIGFjdGl2ZSBpbiB0aGUgcHJvamVjdC4gVGhpcyBpcyB0byBlbnN1cmUgYWxsXG4gICAgICogd29ya2Zsb3dzIHdpbGwgYmUgb3V0cHV0IHByb3Blcmx5IGR1cmluZyBzeW50aC5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGNvbnN0IGdpdGh1YiA9IEdpdEh1Yi5vZih0aGlzLnJvb3RQcm9qZWN0KTtcblxuICAgIGlmICghZ2l0aHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQXdzVGVhcmRvd25Xb3JrZmxvdyByZXF1aXJlcyBhIEdpdEh1YiBjb21wb25lbnQgaW4gdGhlIHJvb3QgcHJvamVjdFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBXb3JrZmxvdyBEZXN0cm95IFRhcmdldHNcbiAgICAgKlxuICAgICAqIEZpbmQgYWxsIHRoZSBDSSB0YXJnZXRzIGZvciB0aGUgQXV0aCBhbmQgQ29yZSBwcm9qZWN0cyBpbiB0aGUgREVWIHN0YWdlXG4gICAgICogb25seS4gT25lIGpvYiBwZXIgKGFjY291bnQsIHJlZ2lvbikgdGVhcmRvd25zIGFsbCBvcnBoYW4gc3RhY2tzIChBdXRoLFxuICAgICAqIENvcmUsIGRhdGEpIGluIHRoYXQgYWNjb3VudC9yZWdpb24uXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBkZXZUYXJnZXRzRm9yID0gKHNlcnZpY2U6IE9wZW5IaVNlcnZpY2UpID0+XG4gICAgICBBd3NEZXBsb3ltZW50Q29uZmlnLm9mKHNlcnZpY2UucHJvamVjdCk/LmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICAgKHRhcmdldCkgPT5cbiAgICAgICAgICB0YXJnZXQuYXdzU3RhZ2VUeXBlID09PSBPUEVOX0hJX1NUQUdFLkRFViAmJiB0YXJnZXQuY2lEZXBsb3ltZW50LFxuICAgICAgKSA/PyBbXTtcblxuICAgIGNvbnN0IGNvcmVUYXJnZXRzID0gZGV2VGFyZ2V0c0ZvcihvcGVuaGkuY29yZSk7XG4gICAgY29uc3QgYXV0aFRhcmdldHMgPSBkZXZUYXJnZXRzRm9yKG9wZW5oaS5hdXRoKTtcbiAgICBjb25zdCBieUFjY291bnRSZWdpb24gPSBuZXcgTWFwPHN0cmluZywgKHR5cGVvZiBjb3JlVGFyZ2V0cylbMF0+KCk7XG4gICAgWy4uLmF1dGhUYXJnZXRzLCAuLi5jb3JlVGFyZ2V0c10uZm9yRWFjaCgodCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7dC5hY2NvdW50fS0ke3QucmVnaW9ufWA7XG4gICAgICBpZiAoIWJ5QWNjb3VudFJlZ2lvbi5oYXMoa2V5KSkgYnlBY2NvdW50UmVnaW9uLnNldChrZXksIHQpO1xuICAgIH0pO1xuICAgIGNvbnN0IGF3c0Rlc3RydWN0aW9uVGFyZ2V0cyA9IEFycmF5LmZyb20oYnlBY2NvdW50UmVnaW9uLnZhbHVlcygpKTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIENyZWF0ZSBXb3JrZmxvd1xuICAgICAqXG4gICAgICogTWFrZSBhIG5ldyB3b3JrZmxvdyBmb3IgQVdTIHN0YWNrIHRlYXJkb3duLiBUaGlzIHJ1bnMgZWFjaCBuaWdodCBhbmQgaXNcbiAgICAgKiBhbHNvIHRyaWdnZXJlZCBlYWNoIHRpbWUgYSBicmFuY2ggaXMgZGVsZXRlZC5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGNvbnN0IHdvcmtmbG93ID0gbmV3IEdpdGh1YldvcmtmbG93KGdpdGh1YiwgXCJ0ZWFyZG93bi1kZXZcIik7XG4gICAgd29ya2Zsb3cub24oe1xuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge30sXG4gICAgICBzY2hlZHVsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgY3JvbjogXCIzMiA2ICogKiAqXCIsIC8vIEV2ZXJ5IFN1bmRheSBhdCA2OjMyIEFNIFVUQ1xuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGRlbGV0ZToge1xuICAgICAgICBicmFuY2hlczogW1wiZmVhdHVyZS8qXCIsIFwiZmVhdC8qXCIsIFwiZml4LypcIl0sXG4gICAgICB9LFxuICAgICAgLyogZm9yIGRlYnVnZ2luZyBcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtcImZlYXR1cmUvKlwiXSxcbiAgICAgIH0sXG4gICAgICAqL1xuICAgIH0pO1xuXG4gICAgYXdzRGVzdHJ1Y3Rpb25UYXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhd3NTdGFnZVR5cGUsXG4gICAgICAgIGF3c0Vudmlyb25tZW50VHlwZSxcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBjaURlcGxveW1lbnRDb25maWcsXG4gICAgICB9ID0gdGFyZ2V0O1xuICAgICAgY29uc3QgeyByb2xlQXJuIH0gPSBjaURlcGxveW1lbnRDb25maWcgPz8ge307XG5cbiAgICAgIHdvcmtmbG93LmFkZEpvYihgdGVhcmRvd24tJHthY2NvdW50fS0ke3JlZ2lvbn1gLnRvTG93ZXJDYXNlKCksIHtcbiAgICAgICAgbmFtZTogYFRlYXJkb3duIFN0YWNrcyBpbiAke3RhcmdldC5hY2NvdW50fS8ke3RhcmdldC5yZWdpb259YCxcbiAgICAgICAgLy9pZjogXCJnaXRodWIuZXZlbnQucmVmX3R5cGUgPT0gJ2JyYW5jaCdcIixcbiAgICAgICAgcnVuc09uOiBbXCJ1YnVudHUtbGF0ZXN0XCJdLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgICAgaWRUb2tlbjogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgfSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgUkVQTzogXCIke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1cIixcbiAgICAgICAgICBSRUdJT05TOiBbcmVnaW9uXS5qb2luKFwiIFwiKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDb25maWd1cmUgQVdTIGNyZWRzLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGBBV1MgQ3JlZHMgJHthd3NTdGFnZVR5cGV9LyR7YXdzRW52aXJvbm1lbnRUeXBlfS8ke2FjY291bnR9LyR7cmVnaW9ufWAsXG4gICAgICAgICAgICB1c2VzOiBcImF3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAdjRcIixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgXCJyb2xlLXRvLWFzc3VtZVwiOiByb2xlQXJuLFxuICAgICAgICAgICAgICBcImF3cy1yZWdpb25cIjogcmVnaW9uLFxuICAgICAgICAgICAgICBcInJvbGUtZHVyYXRpb24tc2Vjb25kc1wiOiA5MDAsIC8vIDE1IG1pbnV0ZXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEZldGNoIGFsbCBicmFuY2ggbmFtZXMgaW4gdGhlIHJlcG9cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkZldGNoIEFsbCBCcmFuY2hlc1wiLFxuICAgICAgICAgICAgaWQ6IFwiZmV0Y2hfYnJhbmNoZXNcIixcbiAgICAgICAgICAgIHVzZXM6IFwiYWN0aW9ucy9naXRodWItc2NyaXB0QHY3XCIsXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHNjcmlwdDogW1xuICAgICAgICAgICAgICAgIFwiY29uc3QgYWxsID0gYXdhaXQgZ2l0aHViLnBhZ2luYXRlKGdpdGh1Yi5yZXN0LnJlcG9zLmxpc3RCcmFuY2hlcywge1wiLFxuICAgICAgICAgICAgICAgIFwiICBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLFwiLFxuICAgICAgICAgICAgICAgIFwiICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbyxcIixcbiAgICAgICAgICAgICAgICBcIiAgcGVyX3BhZ2U6IDEwMFwiLFxuICAgICAgICAgICAgICAgIFwifSk7XCIsXG4gICAgICAgICAgICAgICAgXCJjb25zdCBuYW1lcyA9IGFsbC5tYXAoYiA9PiBiLm5hbWUpO1wiLFxuICAgICAgICAgICAgICAgIFwiY29uc29sZS5sb2coYEZvdW5kIGJyYW5jaGVzOiAke25hbWVzfWApO1wiLFxuICAgICAgICAgICAgICAgICdjb3JlLnNldE91dHB1dChcImpzb25cIiwgSlNPTi5zdHJpbmdpZnkobmFtZXMpKTsnLFxuICAgICAgICAgICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBTYXZlIGJyYW5jaGVzIHRvIGEgZmlsZVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2F2ZSBCcmFuY2hlcyB0byBGaWxlXCIsXG4gICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgJ2VjaG8gXCJTYXZpbmcgYnJhbmNoZXMgdG8gZmlsZVwiJyxcbiAgICAgICAgICAgICAgXCJlY2hvICcke3sgc3RlcHMuZmV0Y2hfYnJhbmNoZXMub3V0cHV0cy5qc29uIH19JyB8IGpxIC1yICcuW10nIHwgc29ydCAtdSA+IGJyYW5jaGVzLnR4dFwiLFxuICAgICAgICAgICAgICAnZWNobyBcIkJyYW5jaGVzOlwiJyxcbiAgICAgICAgICAgICAgXCJjYXQgYnJhbmNoZXMudHh0XCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEZpbmQgYWxsIHN0YWNrcyB0YWdnZWQgd2l0aCBhIHN0YWdlIG9mIGRldi4gZm9yIHRoaXMgcmVwby4gcmV0dXJuXG4gICAgICAgICAgICogdGFnIGFuZCByZXNvdXJjZSBhcm4uXG4gICAgICAgICAgICovXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJGaW5kIFN0YWNrcyBieSBUYWdcIixcbiAgICAgICAgICAgIGlkOiBcImZpbmRfc3RhY2tzXCIsXG4gICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgXCJzZXQgLWV1byBwaXBlZmFpbFwiLFxuICAgICAgICAgICAgICBcIjogPiBjYW5kaWRhdGVzLnR4dCAgIyBjb2x1bW5zOiBhcm4gcmVnaW9uIGJyYW5jaFRhZ1wiLFxuXG4gICAgICAgICAgICAgIFwiIyBCdWlsZCB0YWcgZmlsdGVyc1wiLFxuICAgICAgICAgICAgICAnVEFHX0ZJTFRFUlM9KCBcIktleT1vcGVuaGk6cmVwby1uYW1lLFZhbHVlcz0kUkVQT1wiICknLFxuICAgICAgICAgICAgICBgVEFHX0ZJTFRFUlMrPSggXCJLZXk9b3BlbmhpOnN0YWdlLXR5cGUsVmFsdWVzPSR7T1BFTl9ISV9TVEFHRS5ERVZ9XCIgKWAsXG5cbiAgICAgICAgICAgICAgXCJmb3IgciBpbiAkUkVHSU9OUzsgZG9cIixcbiAgICAgICAgICAgICAgYCAgZWNobyBcIlNjYW5uaW5nIHJlZ2lvbjogJHJcImAsXG4gICAgICAgICAgICAgIFwiICBhd3MgcmVzb3VyY2Vncm91cHN0YWdnaW5nYXBpIGdldC1yZXNvdXJjZXMgXFxcXFwiLFxuICAgICAgICAgICAgICAnICAgIC0tcmVnaW9uIFwiJHJcIiBcXFxcJyxcbiAgICAgICAgICAgICAgJyAgICAtLXJlc291cmNlLXR5cGUtZmlsdGVycyBcImNsb3VkZm9ybWF0aW9uOnN0YWNrXCIgXFxcXCcsXG4gICAgICAgICAgICAgICcgICAgLS10YWctZmlsdGVycyBcIiR7VEFHX0ZJTFRFUlNbQF19XCIgXFxcXCcsXG4gICAgICAgICAgICAgIGAgfCBqcSAtciAtLWFyZyByIFwiJHJcIiAnYCxcbiAgICAgICAgICAgICAgXCIgICAgLlJlc291cmNlVGFnTWFwcGluZ0xpc3RbXVwiLFxuICAgICAgICAgICAgICBcIiAgICB8IC4gYXMgJHJlc1wiLFxuICAgICAgICAgICAgICAnICAgIHwgKCRyZXMuVGFnc1tdIHwgc2VsZWN0KC5LZXk9PVwib3BlbmhpOmJyYW5jaC1uYW1lXCIpIHwgLlZhbHVlKSBhcyAkYnJhbmNoJyxcbiAgICAgICAgICAgICAgJyAgICB8IFskcmVzLlJlc291cmNlQVJOLCAkciwgKCRicmFuY2ggLy8gXCJcIildJyxcbiAgICAgICAgICAgICAgXCIgICAgfCBAdHN2XCIsXG4gICAgICAgICAgICAgIFwiICAgICcgPj4gY2FuZGlkYXRlcy50eHRcIixcbiAgICAgICAgICAgICAgXCJkb25lXCIsXG5cbiAgICAgICAgICAgICAgXCJlY2hvICdUYWdnZWQgc3RhY2tzOidcIixcbiAgICAgICAgICAgICAgYChlY2hvIC1lIFwiQVJOXFxcXHRSRUdJT05cXFxcdEJSQU5DSFwiOyBjYXQgY2FuZGlkYXRlcy50eHQpIHwgY29sdW1uIC10IC1zICQnXFxcXHQnYCxcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGV0ZXJtaW5lIHdoaWNoIHN0YWNrcyBhcmUgb3JwaGFucyB0aGF0IG5vIGxvbmdlciBoYXZlIGEgbWF0Y2hpbmcgYnJhbmNoLlxuICAgICAgICAgICAqIFNhdmUgdGhvc2UgdG8gYSBmaWxlIGZvciB0aGUgbmV4dCBzdGVwLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGV0ZXJtaW5lIE9ycGhhbiBTdGFja3MgKE5vIE1hdGNoaW5nIEJyYW5jaClcIixcbiAgICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgICBcInNldCAtZXVvIHBpcGVmYWlsXCIsXG4gICAgICAgICAgICAgIFwiOiA+IG9ycGhhbnMudHh0ICAjIGFybiByZWdpb24gYnJhbmNoXCIsXG4gICAgICAgICAgICAgIFwid2hpbGUgSUZTPSQnXFxcXHQnIHJlYWQgLXIgYXJuIHJlZ2lvbiBicmFuY2g7IGRvXCIsXG4gICAgICAgICAgICAgICcgIFsgLXogXCIkYXJuXCIgXSAmJiBjb250aW51ZScsXG4gICAgICAgICAgICAgICcgIGlmIFsgLXogXCIkYnJhbmNoXCIgXTsgdGhlbicsXG4gICAgICAgICAgICAgIFwiICAgICMgSWYgbm8gQnJhbmNoIHRhZywgdHJlYXQgYXMgbm90LWEtcHJldmlldzsgc2tpcCAob3IgZmxpcCB0byBkZWxldGUgaWYgeW91IHdhbnQpXCIsXG4gICAgICAgICAgICAgIFwiICAgIGNvbnRpbnVlXCIsXG4gICAgICAgICAgICAgIFwiICBmaVwiLFxuICAgICAgICAgICAgICAnICBpZiAhIGdyZXAgLUZ4cSBcIiRicmFuY2hcIiBicmFuY2hlcy50eHQ7IHRoZW4nLFxuICAgICAgICAgICAgICAnICAgIGVjaG8gLWUgXCIkYXJuXFxcXHQkcmVnaW9uXFxcXHQkYnJhbmNoXCIgPj4gb3JwaGFucy50eHQnLFxuICAgICAgICAgICAgICBcIiAgZmlcIixcbiAgICAgICAgICAgICAgXCJkb25lIDwgY2FuZGlkYXRlcy50eHRcIixcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgXCJpZiBbIC1zIG9ycGhhbnMudHh0IF07IHRoZW5cIixcbiAgICAgICAgICAgICAgJyAgZWNobyBcIk9ycGhhbiBzdGFja3MgKG5vIG1hdGNoaW5nIGJyYW5jaCk6XCInLFxuICAgICAgICAgICAgICBcIiAgKGVjaG8gLWUgXFxcIkFSTlxcXFx0UkVHSU9OXFxcXHRCUkFOQ0hcXFwiOyBjYXQgb3JwaGFucy50eHQpIHwgY29sdW1uIC10IC1zICQnXFxcXHQnXCIsXG4gICAgICAgICAgICAgIFwiZWxzZVwiLFxuICAgICAgICAgICAgICAnICBlY2hvIFwiTm8gb3JwaGFuIHN0YWNrcyBmb3VuZC5cIicsXG4gICAgICAgICAgICAgIFwiZmlcIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGVsZXRlIG9ycGhhbiBzdGFja3MuXG4gICAgICAgICAgICovXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJEZWxldGUgT3JwaGFuIFN0YWNrc1wiLFxuICAgICAgICAgICAgaWY6IFwiaGFzaEZpbGVzKCdvcnBoYW5zLnR4dCcpICE9ICcnXCIsXG4gICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgXCJzZXQgLWV1byBwaXBlZmFpbFwiLFxuICAgICAgICAgICAgICBcIndoaWxlIElGUz0kJ1xcXFx0JyByZWFkIC1yIGFybiByZWdpb24gYnJhbmNoOyBkb1wiLFxuICAgICAgICAgICAgICAnICBbIC16IFwiJGFyblwiIF0gJiYgY29udGludWUnLFxuICAgICAgICAgICAgICBcIiAgc3RhY2tfbmFtZT0kKGN1dCAtZCcvJyAtZjIgPDw8XFxcIiRhcm5cXFwiKVwiLFxuICAgICAgICAgICAgICAnICBlY2hvIFwiRGVsZXRpbmcgJHN0YWNrX25hbWUgKGJyYW5jaD0kYnJhbmNoKSBpbiAkcmVnaW9uXCInLFxuICAgICAgICAgICAgICAnICBhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLXN0YWNrIC0tcmVnaW9uIFwiJHJlZ2lvblwiIC0tc3RhY2stbmFtZSBcIiRzdGFja19uYW1lXCIgfHwgdHJ1ZScsXG4gICAgICAgICAgICAgIFwiZG9uZSA8IG9ycGhhbnMudHh0XCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { MonorepoProject } from "@codedrifters/configulator";
|
|
2
|
-
import { Component } from "projen";
|
|
3
|
-
import { OpenHi } from "../openhi";
|
|
4
|
-
export interface BuildDevelopmentWorkflowOptions {
|
|
5
|
-
/**
|
|
6
|
-
* openhi project
|
|
7
|
-
*/
|
|
8
|
-
readonly openhi: OpenHi;
|
|
9
|
-
}
|
|
10
|
-
export declare class BuildDevelopmentWorkflow extends Component {
|
|
11
|
-
constructor(parent: MonorepoProject, options: BuildDevelopmentWorkflowOptions);
|
|
12
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BuildDevelopmentWorkflow = void 0;
|
|
4
|
-
const configulator_1 = require("@codedrifters/configulator");
|
|
5
|
-
const projen_1 = require("projen");
|
|
6
|
-
class BuildDevelopmentWorkflow extends projen_1.Component {
|
|
7
|
-
constructor(parent, options) {
|
|
8
|
-
super(parent, "dev-workflow");
|
|
9
|
-
const { openhi } = options;
|
|
10
|
-
/**
|
|
11
|
-
* Global Service Deploy
|
|
12
|
-
*
|
|
13
|
-
* Deploy the Global service first to configure DNS
|
|
14
|
-
*/
|
|
15
|
-
const { awsDeploymentTargets: globalTargets } = new configulator_1.AwsDeployWorkflow(openhi.global.project, {
|
|
16
|
-
buildWorkflow: parent.buildWorkflow,
|
|
17
|
-
});
|
|
18
|
-
/**
|
|
19
|
-
* Auth Service Deploy
|
|
20
|
-
*
|
|
21
|
-
* Deploy the Auth service first (Cognito); Core consumes auth via SSM.
|
|
22
|
-
*/
|
|
23
|
-
const { awsDeploymentTargets: authTargets } = new configulator_1.AwsDeployWorkflow(openhi.auth.project, {
|
|
24
|
-
buildWorkflow: parent.buildWorkflow,
|
|
25
|
-
deployAfterTargets: [...globalTargets],
|
|
26
|
-
});
|
|
27
|
-
/**
|
|
28
|
-
* Data Service Deploy
|
|
29
|
-
*
|
|
30
|
-
* Deploy the Data service (DynamoDB FHIR store, S3) after Global.
|
|
31
|
-
*/
|
|
32
|
-
const { awsDeploymentTargets: dataTargets } = new configulator_1.AwsDeployWorkflow(openhi.data.project, {
|
|
33
|
-
buildWorkflow: parent.buildWorkflow,
|
|
34
|
-
deployAfterTargets: [...globalTargets, ...authTargets],
|
|
35
|
-
});
|
|
36
|
-
/**
|
|
37
|
-
* Rest API Service Deploy
|
|
38
|
-
*
|
|
39
|
-
* Deploy the Rest API service after Data (and Global).
|
|
40
|
-
*/
|
|
41
|
-
new configulator_1.AwsDeployWorkflow(openhi.restApi.project, {
|
|
42
|
-
buildWorkflow: parent.buildWorkflow,
|
|
43
|
-
deployAfterTargets: [...globalTargets, ...authTargets, ...dataTargets],
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
exports.BuildDevelopmentWorkflow = BuildDevelopmentWorkflow;
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZGV2LXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmtmbG93cy9idWlsZC1kZXYtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQWdGO0FBQ2hGLG1DQUFtQztBQVVuQyxNQUFhLHdCQUF5QixTQUFRLGtCQUFTO0lBQ3JELFlBQ0UsTUFBdUIsRUFDdkIsT0FBd0M7UUFFeEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU5QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTNCOzs7O1dBSUc7UUFDSCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxnQ0FBaUIsQ0FDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQ3JCO1lBQ0UsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1NBQ3BDLENBQ0YsQ0FBQztRQUVGOzs7O1dBSUc7UUFDSCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxnQ0FBaUIsQ0FDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQ25CO1lBQ0UsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLGtCQUFrQixFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7U0FDdkMsQ0FDRixDQUFDO1FBRUY7Ozs7V0FJRztRQUNILE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLGdDQUFpQixDQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFDbkI7WUFDRSxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDbkMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxHQUFHLFdBQVcsQ0FBQztTQUN2RCxDQUNGLENBQUM7UUFFRjs7OztXQUlHO1FBQ0gsSUFBSSxnQ0FBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUM1QyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDbkMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxHQUFHLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQztTQUN2RSxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6REQsNERBeURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXdzRGVwbG95V29ya2Zsb3csIE1vbm9yZXBvUHJvamVjdCB9IGZyb20gXCJAY29kZWRyaWZ0ZXJzL2NvbmZpZ3VsYXRvclwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgT3BlbkhpIH0gZnJvbSBcIi4uL29wZW5oaVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRGV2ZWxvcG1lbnRXb3JrZmxvd09wdGlvbnMge1xuICAvKipcbiAgICogb3BlbmhpIHByb2plY3RcbiAgICovXG4gIHJlYWRvbmx5IG9wZW5oaTogT3BlbkhpO1xufVxuXG5leHBvcnQgY2xhc3MgQnVpbGREZXZlbG9wbWVudFdvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBNb25vcmVwb1Byb2plY3QsXG4gICAgb3B0aW9uczogQnVpbGREZXZlbG9wbWVudFdvcmtmbG93T3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBcImRldi13b3JrZmxvd1wiKTtcblxuICAgIGNvbnN0IHsgb3BlbmhpIH0gPSBvcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIFNlcnZpY2UgRGVwbG95XG4gICAgICpcbiAgICAgKiBEZXBsb3kgdGhlIEdsb2JhbCBzZXJ2aWNlIGZpcnN0IHRvIGNvbmZpZ3VyZSBETlNcbiAgICAgKi9cbiAgICBjb25zdCB7IGF3c0RlcGxveW1lbnRUYXJnZXRzOiBnbG9iYWxUYXJnZXRzIH0gPSBuZXcgQXdzRGVwbG95V29ya2Zsb3coXG4gICAgICBvcGVuaGkuZ2xvYmFsLnByb2plY3QsXG4gICAgICB7XG4gICAgICAgIGJ1aWxkV29ya2Zsb3c6IHBhcmVudC5idWlsZFdvcmtmbG93LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogQXV0aCBTZXJ2aWNlIERlcGxveVxuICAgICAqXG4gICAgICogRGVwbG95IHRoZSBBdXRoIHNlcnZpY2UgZmlyc3QgKENvZ25pdG8pOyBDb3JlIGNvbnN1bWVzIGF1dGggdmlhIFNTTS5cbiAgICAgKi9cbiAgICBjb25zdCB7IGF3c0RlcGxveW1lbnRUYXJnZXRzOiBhdXRoVGFyZ2V0cyB9ID0gbmV3IEF3c0RlcGxveVdvcmtmbG93KFxuICAgICAgb3BlbmhpLmF1dGgucHJvamVjdCxcbiAgICAgIHtcbiAgICAgICAgYnVpbGRXb3JrZmxvdzogcGFyZW50LmJ1aWxkV29ya2Zsb3csXG4gICAgICAgIGRlcGxveUFmdGVyVGFyZ2V0czogWy4uLmdsb2JhbFRhcmdldHNdLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogRGF0YSBTZXJ2aWNlIERlcGxveVxuICAgICAqXG4gICAgICogRGVwbG95IHRoZSBEYXRhIHNlcnZpY2UgKER5bmFtb0RCIEZISVIgc3RvcmUsIFMzKSBhZnRlciBHbG9iYWwuXG4gICAgICovXG4gICAgY29uc3QgeyBhd3NEZXBsb3ltZW50VGFyZ2V0czogZGF0YVRhcmdldHMgfSA9IG5ldyBBd3NEZXBsb3lXb3JrZmxvdyhcbiAgICAgIG9wZW5oaS5kYXRhLnByb2plY3QsXG4gICAgICB7XG4gICAgICAgIGJ1aWxkV29ya2Zsb3c6IHBhcmVudC5idWlsZFdvcmtmbG93LFxuICAgICAgICBkZXBsb3lBZnRlclRhcmdldHM6IFsuLi5nbG9iYWxUYXJnZXRzLCAuLi5hdXRoVGFyZ2V0c10sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBSZXN0IEFQSSBTZXJ2aWNlIERlcGxveVxuICAgICAqXG4gICAgICogRGVwbG95IHRoZSBSZXN0IEFQSSBzZXJ2aWNlIGFmdGVyIERhdGEgKGFuZCBHbG9iYWwpLlxuICAgICAqL1xuICAgIG5ldyBBd3NEZXBsb3lXb3JrZmxvdyhvcGVuaGkucmVzdEFwaS5wcm9qZWN0LCB7XG4gICAgICBidWlsZFdvcmtmbG93OiBwYXJlbnQuYnVpbGRXb3JrZmxvdyxcbiAgICAgIGRlcGxveUFmdGVyVGFyZ2V0czogWy4uLmdsb2JhbFRhcmdldHMsIC4uLmF1dGhUYXJnZXRzLCAuLi5kYXRhVGFyZ2V0c10sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { MonorepoProject } from "@codedrifters/configulator";
|
|
2
|
-
import { Component } from "projen";
|
|
3
|
-
import { OpenHi } from "../openhi";
|
|
4
|
-
export interface BuildStageWorkflowOptions {
|
|
5
|
-
/**
|
|
6
|
-
* openhi project
|
|
7
|
-
*/
|
|
8
|
-
readonly openhi: OpenHi;
|
|
9
|
-
}
|
|
10
|
-
export declare class BuildStageWorkflow extends Component {
|
|
11
|
-
constructor(parent: MonorepoProject, options: BuildStageWorkflowOptions);
|
|
12
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BuildStageWorkflow = void 0;
|
|
4
|
-
const configulator_1 = require("@codedrifters/configulator");
|
|
5
|
-
const config_1 = require("@openhi/config");
|
|
6
|
-
const projen_1 = require("projen");
|
|
7
|
-
class BuildStageWorkflow extends projen_1.Component {
|
|
8
|
-
constructor(parent, options) {
|
|
9
|
-
super(parent, "stage-workflow");
|
|
10
|
-
const { openhi } = options;
|
|
11
|
-
/**
|
|
12
|
-
* Global Service Deploy
|
|
13
|
-
*
|
|
14
|
-
* Deploy the Global service first to configure DNS
|
|
15
|
-
*/
|
|
16
|
-
const { awsDeploymentTargets: globalTargets, buildWorkflow } = new configulator_1.AwsDeployWorkflow(openhi.global.project, {
|
|
17
|
-
awsStageType: config_1.OPEN_HI_STAGE.STAGE,
|
|
18
|
-
buildWorkflowOptions: {
|
|
19
|
-
name: "deploy-stage",
|
|
20
|
-
workflowTriggers: {
|
|
21
|
-
push: {
|
|
22
|
-
branches: ["main"],
|
|
23
|
-
},
|
|
24
|
-
workflowDispatch: {},
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
/**
|
|
29
|
-
* Auth Service Deploy
|
|
30
|
-
*
|
|
31
|
-
* Deploy the Auth service first (Cognito); Core consumes auth via SSM.
|
|
32
|
-
* Auth creates the stage build workflow; Core and data services add to it.
|
|
33
|
-
*/
|
|
34
|
-
const { awsDeploymentTargets: authTargets } = new configulator_1.AwsDeployWorkflow(openhi.auth.project, {
|
|
35
|
-
awsStageType: config_1.OPEN_HI_STAGE.STAGE,
|
|
36
|
-
buildWorkflow,
|
|
37
|
-
deployAfterTargets: [...globalTargets],
|
|
38
|
-
});
|
|
39
|
-
/**
|
|
40
|
-
* Data Service Deploy
|
|
41
|
-
*
|
|
42
|
-
* Deploy the Data service (DynamoDB FHIR store, S3) after Global.
|
|
43
|
-
*/
|
|
44
|
-
const { awsDeploymentTargets: dataTargets } = new configulator_1.AwsDeployWorkflow(openhi.data.project, {
|
|
45
|
-
awsStageType: config_1.OPEN_HI_STAGE.STAGE,
|
|
46
|
-
buildWorkflow,
|
|
47
|
-
deployAfterTargets: [...globalTargets, ...authTargets],
|
|
48
|
-
});
|
|
49
|
-
/**
|
|
50
|
-
* Rest API Service Deploy
|
|
51
|
-
*/
|
|
52
|
-
new configulator_1.AwsDeployWorkflow(openhi.restApi.project, {
|
|
53
|
-
awsStageType: config_1.OPEN_HI_STAGE.STAGE,
|
|
54
|
-
buildWorkflow,
|
|
55
|
-
deployAfterTargets: [...globalTargets, ...authTargets, ...dataTargets],
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
exports.BuildStageWorkflow = BuildStageWorkflow;
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc3RhZ2Utd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3dzL2J1aWxkLXN0YWdlLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUFnRjtBQUNoRiwyQ0FBK0M7QUFDL0MsbUNBQW1DO0FBVW5DLE1BQWEsa0JBQW1CLFNBQVEsa0JBQVM7SUFDL0MsWUFBWSxNQUF1QixFQUFFLE9BQWtDO1FBQ3JFLEtBQUssQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVoQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTNCOzs7O1dBSUc7UUFDSCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxHQUMxRCxJQUFJLGdDQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQzNDLFlBQVksRUFBRSxzQkFBYSxDQUFDLEtBQUs7WUFDakMsb0JBQW9CLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxjQUFjO2dCQUNwQixnQkFBZ0IsRUFBRTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNKLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztxQkFDbkI7b0JBQ0QsZ0JBQWdCLEVBQUUsRUFBRTtpQkFDckI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVMOzs7OztXQUtHO1FBQ0gsTUFBTSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksZ0NBQWlCLENBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUNuQjtZQUNFLFlBQVksRUFBRSxzQkFBYSxDQUFDLEtBQUs7WUFDakMsYUFBYTtZQUNiLGtCQUFrQixFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7U0FDdkMsQ0FDRixDQUFDO1FBRUY7Ozs7V0FJRztRQUNILE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLGdDQUFpQixDQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFDbkI7WUFDRSxZQUFZLEVBQUUsc0JBQWEsQ0FBQyxLQUFLO1lBQ2pDLGFBQWE7WUFDYixrQkFBa0IsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsV0FBVyxDQUFDO1NBQ3ZELENBQ0YsQ0FBQztRQUVGOztXQUVHO1FBQ0gsSUFBSSxnQ0FBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUM1QyxZQUFZLEVBQUUsc0JBQWEsQ0FBQyxLQUFLO1lBQ2pDLGFBQWE7WUFDYixrQkFBa0IsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsV0FBVyxDQUFDO1NBQ3ZFLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9ERCxnREErREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3NEZXBsb3lXb3JrZmxvdywgTW9ub3JlcG9Qcm9qZWN0IH0gZnJvbSBcIkBjb2RlZHJpZnRlcnMvY29uZmlndWxhdG9yXCI7XG5pbXBvcnQgeyBPUEVOX0hJX1NUQUdFIH0gZnJvbSBcIkBvcGVuaGkvY29uZmlnXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBPcGVuSGkgfSBmcm9tIFwiLi4vb3BlbmhpXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRTdGFnZVdvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBvcGVuaGkgcHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlbmhpOiBPcGVuSGk7XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZFN0YWdlV29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IE1vbm9yZXBvUHJvamVjdCwgb3B0aW9uczogQnVpbGRTdGFnZVdvcmtmbG93T3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgXCJzdGFnZS13b3JrZmxvd1wiKTtcblxuICAgIGNvbnN0IHsgb3BlbmhpIH0gPSBvcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIFNlcnZpY2UgRGVwbG95XG4gICAgICpcbiAgICAgKiBEZXBsb3kgdGhlIEdsb2JhbCBzZXJ2aWNlIGZpcnN0IHRvIGNvbmZpZ3VyZSBETlNcbiAgICAgKi9cbiAgICBjb25zdCB7IGF3c0RlcGxveW1lbnRUYXJnZXRzOiBnbG9iYWxUYXJnZXRzLCBidWlsZFdvcmtmbG93IH0gPVxuICAgICAgbmV3IEF3c0RlcGxveVdvcmtmbG93KG9wZW5oaS5nbG9iYWwucHJvamVjdCwge1xuICAgICAgICBhd3NTdGFnZVR5cGU6IE9QRU5fSElfU1RBR0UuU1RBR0UsXG4gICAgICAgIGJ1aWxkV29ya2Zsb3dPcHRpb25zOiB7XG4gICAgICAgICAgbmFtZTogXCJkZXBsb3ktc3RhZ2VcIixcbiAgICAgICAgICB3b3JrZmxvd1RyaWdnZXJzOiB7XG4gICAgICAgICAgICBwdXNoOiB7XG4gICAgICAgICAgICAgIGJyYW5jaGVzOiBbXCJtYWluXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtmbG93RGlzcGF0Y2g6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEF1dGggU2VydmljZSBEZXBsb3lcbiAgICAgKlxuICAgICAqIERlcGxveSB0aGUgQXV0aCBzZXJ2aWNlIGZpcnN0IChDb2duaXRvKTsgQ29yZSBjb25zdW1lcyBhdXRoIHZpYSBTU00uXG4gICAgICogQXV0aCBjcmVhdGVzIHRoZSBzdGFnZSBidWlsZCB3b3JrZmxvdzsgQ29yZSBhbmQgZGF0YSBzZXJ2aWNlcyBhZGQgdG8gaXQuXG4gICAgICovXG4gICAgY29uc3QgeyBhd3NEZXBsb3ltZW50VGFyZ2V0czogYXV0aFRhcmdldHMgfSA9IG5ldyBBd3NEZXBsb3lXb3JrZmxvdyhcbiAgICAgIG9wZW5oaS5hdXRoLnByb2plY3QsXG4gICAgICB7XG4gICAgICAgIGF3c1N0YWdlVHlwZTogT1BFTl9ISV9TVEFHRS5TVEFHRSxcbiAgICAgICAgYnVpbGRXb3JrZmxvdyxcbiAgICAgICAgZGVwbG95QWZ0ZXJUYXJnZXRzOiBbLi4uZ2xvYmFsVGFyZ2V0c10sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBEYXRhIFNlcnZpY2UgRGVwbG95XG4gICAgICpcbiAgICAgKiBEZXBsb3kgdGhlIERhdGEgc2VydmljZSAoRHluYW1vREIgRkhJUiBzdG9yZSwgUzMpIGFmdGVyIEdsb2JhbC5cbiAgICAgKi9cbiAgICBjb25zdCB7IGF3c0RlcGxveW1lbnRUYXJnZXRzOiBkYXRhVGFyZ2V0cyB9ID0gbmV3IEF3c0RlcGxveVdvcmtmbG93KFxuICAgICAgb3BlbmhpLmRhdGEucHJvamVjdCxcbiAgICAgIHtcbiAgICAgICAgYXdzU3RhZ2VUeXBlOiBPUEVOX0hJX1NUQUdFLlNUQUdFLFxuICAgICAgICBidWlsZFdvcmtmbG93LFxuICAgICAgICBkZXBsb3lBZnRlclRhcmdldHM6IFsuLi5nbG9iYWxUYXJnZXRzLCAuLi5hdXRoVGFyZ2V0c10sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBSZXN0IEFQSSBTZXJ2aWNlIERlcGxveVxuICAgICAqL1xuICAgIG5ldyBBd3NEZXBsb3lXb3JrZmxvdyhvcGVuaGkucmVzdEFwaS5wcm9qZWN0LCB7XG4gICAgICBhd3NTdGFnZVR5cGU6IE9QRU5fSElfU1RBR0UuU1RBR0UsXG4gICAgICBidWlsZFdvcmtmbG93LFxuICAgICAgZGVwbG95QWZ0ZXJUYXJnZXRzOiBbLi4uZ2xvYmFsVGFyZ2V0cywgLi4uYXV0aFRhcmdldHMsIC4uLmRhdGFUYXJnZXRzXSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|