@openhi/platform 0.0.0

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 (38) hide show
  1. package/README.md +3 -0
  2. package/lib/index.d.ts +2 -0
  3. package/lib/index.js +19 -0
  4. package/lib/openhi.d.ts +88 -0
  5. package/lib/openhi.js +108 -0
  6. package/lib/service.d.ts +36 -0
  7. package/lib/service.js +203 -0
  8. package/lib/templates/generate-templates.d.ts +5 -0
  9. package/lib/templates/generate-templates.js +45 -0
  10. package/lib/templates/service-template.d.ts +33 -0
  11. package/lib/templates/service-template.js +42 -0
  12. package/lib/templates/src/README.md.d.ts +5 -0
  13. package/lib/templates/src/README.md.js +19 -0
  14. package/lib/templates/src/app-test.d.ts +5 -0
  15. package/lib/templates/src/app-test.js +61 -0
  16. package/lib/templates/src/app.d.ts +5 -0
  17. package/lib/templates/src/app.js +27 -0
  18. package/lib/templates/src/config.d.ts +5 -0
  19. package/lib/templates/src/config.js +23 -0
  20. package/lib/templates/src/data/README.md.d.ts +5 -0
  21. package/lib/templates/src/data/README.md.js +19 -0
  22. package/lib/templates/src/data/models/README.md.d.ts +5 -0
  23. package/lib/templates/src/data/models/README.md.js +19 -0
  24. package/lib/templates/src/infrastructure/README.md.d.ts +5 -0
  25. package/lib/templates/src/infrastructure/README.md.js +19 -0
  26. package/lib/templates/src/integrations/README.md.d.ts +5 -0
  27. package/lib/templates/src/integrations/README.md.js +19 -0
  28. package/lib/templates/src/main.d.ts +5 -0
  29. package/lib/templates/src/main.js +15 -0
  30. package/lib/templates/src/workflows/README.md.d.ts +5 -0
  31. package/lib/templates/src/workflows/README.md.js +19 -0
  32. package/lib/workflows/aws-teardown-workflow.d.ts +13 -0
  33. package/lib/workflows/aws-teardown-workflow.js +222 -0
  34. package/lib/workflows/build-dev-workflow.d.ts +12 -0
  35. package/lib/workflows/build-dev-workflow.js +48 -0
  36. package/lib/workflows/build-stage-workflow.d.ts +12 -0
  37. package/lib/workflows/build-stage-workflow.js +60 -0
  38. package/package.json +51 -0
@@ -0,0 +1,222 @@
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=
@@ -0,0 +1,12 @@
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
+ }
@@ -0,0 +1,48 @@
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==
@@ -0,0 +1,12 @@
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
+ }
@@ -0,0 +1,60 @@
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
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@openhi/platform",
3
+ "scripts": {
4
+ "build": "npx projen build",
5
+ "compile": "npx projen compile",
6
+ "default": "npx projen default",
7
+ "eslint": "npx projen eslint",
8
+ "package": "npx projen package",
9
+ "post-compile": "npx projen post-compile",
10
+ "post-upgrade": "npx projen post-upgrade",
11
+ "pre-compile": "npx projen pre-compile",
12
+ "reset": "npx projen reset",
13
+ "test": "npx projen test",
14
+ "test:watch": "npx projen test:watch",
15
+ "upgrade": "npx projen upgrade",
16
+ "watch": "npx projen watch",
17
+ "projen": "npx projen"
18
+ },
19
+ "devDependencies": {
20
+ "@swc/core": "^1.15.11",
21
+ "@swc/jest": "^0.2.39",
22
+ "@types/jest": "^30.0.0",
23
+ "@types/node": "^22.19.11",
24
+ "@typescript-eslint/eslint-plugin": "^8",
25
+ "@typescript-eslint/parser": "^8",
26
+ "eslint": "^9",
27
+ "eslint-config-prettier": "^10.1.8",
28
+ "eslint-import-resolver-typescript": "^4.4.4",
29
+ "eslint-plugin-import": "^2.32.0",
30
+ "eslint-plugin-prettier": "^5.5.5",
31
+ "jest": "^30.2.0",
32
+ "jest-junit": "^16",
33
+ "prettier": "^3.8.1",
34
+ "typescript": "^5.9.3"
35
+ },
36
+ "dependencies": {
37
+ "@codedrifters/configulator": "0.0.101",
38
+ "@openhi/config": "workspace:*",
39
+ "change-case": "^4",
40
+ "constructs": "catalog:",
41
+ "projen": "catalog:",
42
+ "ts-deepmerge": "7.0.3",
43
+ "type-fest": "^4"
44
+ },
45
+ "main": "lib/index.js",
46
+ "license": "UNLICENSED",
47
+ "version": "0.0.0",
48
+ "types": "lib/index.d.ts",
49
+ "packageManager": "pnpm@10.29.3",
50
+ "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
51
+ }