@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.
Files changed (40) hide show
  1. package/lib/{openhi.d.ts → index.d.mts} +42 -16
  2. package/lib/index.d.ts +195 -2
  3. package/lib/index.js +825 -17
  4. package/lib/index.js.map +1 -0
  5. package/lib/index.mjs +818 -0
  6. package/lib/index.mjs.map +1 -0
  7. package/package.json +33 -24
  8. package/lib/openhi.js +0 -108
  9. package/lib/service.d.ts +0 -36
  10. package/lib/service.js +0 -203
  11. package/lib/templates/generate-templates.d.ts +0 -5
  12. package/lib/templates/generate-templates.js +0 -45
  13. package/lib/templates/service-template.d.ts +0 -33
  14. package/lib/templates/service-template.js +0 -42
  15. package/lib/templates/src/README.md.d.ts +0 -5
  16. package/lib/templates/src/README.md.js +0 -19
  17. package/lib/templates/src/app-test.d.ts +0 -5
  18. package/lib/templates/src/app-test.js +0 -61
  19. package/lib/templates/src/app.d.ts +0 -5
  20. package/lib/templates/src/app.js +0 -27
  21. package/lib/templates/src/config.d.ts +0 -5
  22. package/lib/templates/src/config.js +0 -23
  23. package/lib/templates/src/data/README.md.d.ts +0 -5
  24. package/lib/templates/src/data/README.md.js +0 -19
  25. package/lib/templates/src/data/models/README.md.d.ts +0 -5
  26. package/lib/templates/src/data/models/README.md.js +0 -19
  27. package/lib/templates/src/infrastructure/README.md.d.ts +0 -5
  28. package/lib/templates/src/infrastructure/README.md.js +0 -19
  29. package/lib/templates/src/integrations/README.md.d.ts +0 -5
  30. package/lib/templates/src/integrations/README.md.js +0 -19
  31. package/lib/templates/src/main.d.ts +0 -5
  32. package/lib/templates/src/main.js +0 -15
  33. package/lib/templates/src/workflows/README.md.d.ts +0 -5
  34. package/lib/templates/src/workflows/README.md.js +0 -19
  35. package/lib/workflows/aws-teardown-workflow.d.ts +0 -13
  36. package/lib/workflows/aws-teardown-workflow.js +0 -222
  37. package/lib/workflows/build-dev-workflow.d.ts +0 -12
  38. package/lib/workflows/build-dev-workflow.js +0 -48
  39. package/lib/workflows/build-stage-workflow.d.ts +0 -12
  40. 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