@taimos/projen 0.1.67 → 0.1.68

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/API.md CHANGED
@@ -2,6 +2,213 @@
2
2
 
3
3
  ## Constructs <a name="Constructs" id="Constructs"></a>
4
4
 
5
+ ### GitHubProductionRelease <a name="GitHubProductionRelease" id="@taimos/projen.GitHubProductionRelease"></a>
6
+
7
+ Adds a manual "Production Release" workflow that promotes a branch into a production branch.
8
+
9
+ The workflow is triggered via `workflow_dispatch`. It fast-forward merges the
10
+ project's default release branch into the selected production branch and
11
+ pushes it. This keeps a production promotion a deliberate, auditable manual
12
+ action separate from merging to the default release branch. When several
13
+ production branches are configured, the operator chooses the target at
14
+ dispatch time.
15
+
16
+ #### Initializers <a name="Initializers" id="@taimos/projen.GitHubProductionRelease.Initializer"></a>
17
+
18
+ ```typescript
19
+ import { GitHubProductionRelease } from '@taimos/projen'
20
+
21
+ new GitHubProductionRelease(scope: GitHubProject, options?: GitHubProductionReleaseOptions)
22
+ ```
23
+
24
+ | **Name** | **Type** | **Description** |
25
+ | --- | --- | --- |
26
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.Initializer.parameter.scope">scope</a></code> | <code>projen.github.GitHubProject</code> | *No description.* |
27
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.Initializer.parameter.options">options</a></code> | <code><a href="#@taimos/projen.GitHubProductionReleaseOptions">GitHubProductionReleaseOptions</a></code> | *No description.* |
28
+
29
+ ---
30
+
31
+ ##### `scope`<sup>Required</sup> <a name="scope" id="@taimos/projen.GitHubProductionRelease.Initializer.parameter.scope"></a>
32
+
33
+ - *Type:* projen.github.GitHubProject
34
+
35
+ ---
36
+
37
+ ##### `options`<sup>Optional</sup> <a name="options" id="@taimos/projen.GitHubProductionRelease.Initializer.parameter.options"></a>
38
+
39
+ - *Type:* <a href="#@taimos/projen.GitHubProductionReleaseOptions">GitHubProductionReleaseOptions</a>
40
+
41
+ ---
42
+
43
+ #### Methods <a name="Methods" id="Methods"></a>
44
+
45
+ | **Name** | **Description** |
46
+ | --- | --- |
47
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.toString">toString</a></code> | Returns a string representation of this construct. |
48
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.with">with</a></code> | Applies one or more mixins to this construct. |
49
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.postSynthesize">postSynthesize</a></code> | Called after synthesis. |
50
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.preSynthesize">preSynthesize</a></code> | Called before synthesis. |
51
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.synthesize">synthesize</a></code> | Synthesizes files to the project output directory. |
52
+
53
+ ---
54
+
55
+ ##### `toString` <a name="toString" id="@taimos/projen.GitHubProductionRelease.toString"></a>
56
+
57
+ ```typescript
58
+ public toString(): string
59
+ ```
60
+
61
+ Returns a string representation of this construct.
62
+
63
+ ##### `with` <a name="with" id="@taimos/projen.GitHubProductionRelease.with"></a>
64
+
65
+ ```typescript
66
+ public with(mixins: ...IMixin[]): IConstruct
67
+ ```
68
+
69
+ Applies one or more mixins to this construct.
70
+
71
+ Mixins are applied in order. The list of constructs is captured at the
72
+ start of the call, so constructs added by a mixin will not be visited.
73
+ Use multiple `with()` calls if subsequent mixins should apply to added
74
+ constructs.
75
+
76
+ ###### `mixins`<sup>Required</sup> <a name="mixins" id="@taimos/projen.GitHubProductionRelease.with.parameter.mixins"></a>
77
+
78
+ - *Type:* ...constructs.IMixin[]
79
+
80
+ The mixins to apply.
81
+
82
+ ---
83
+
84
+ ##### `postSynthesize` <a name="postSynthesize" id="@taimos/projen.GitHubProductionRelease.postSynthesize"></a>
85
+
86
+ ```typescript
87
+ public postSynthesize(): void
88
+ ```
89
+
90
+ Called after synthesis.
91
+
92
+ Order is *not* guaranteed.
93
+
94
+ ##### `preSynthesize` <a name="preSynthesize" id="@taimos/projen.GitHubProductionRelease.preSynthesize"></a>
95
+
96
+ ```typescript
97
+ public preSynthesize(): void
98
+ ```
99
+
100
+ Called before synthesis.
101
+
102
+ ##### `synthesize` <a name="synthesize" id="@taimos/projen.GitHubProductionRelease.synthesize"></a>
103
+
104
+ ```typescript
105
+ public synthesize(): void
106
+ ```
107
+
108
+ Synthesizes files to the project output directory.
109
+
110
+ #### Static Functions <a name="Static Functions" id="Static Functions"></a>
111
+
112
+ | **Name** | **Description** |
113
+ | --- | --- |
114
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
115
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.isComponent">isComponent</a></code> | Test whether the given construct is a component. |
116
+
117
+ ---
118
+
119
+ ##### `isConstruct` <a name="isConstruct" id="@taimos/projen.GitHubProductionRelease.isConstruct"></a>
120
+
121
+ ```typescript
122
+ import { GitHubProductionRelease } from '@taimos/projen'
123
+
124
+ GitHubProductionRelease.isConstruct(x: any)
125
+ ```
126
+
127
+ Checks if `x` is a construct.
128
+
129
+ Use this method instead of `instanceof` to properly detect `Construct`
130
+ instances, even when the construct library is symlinked.
131
+
132
+ Explanation: in JavaScript, multiple copies of the `constructs` library on
133
+ disk are seen as independent, completely different libraries. As a
134
+ consequence, the class `Construct` in each copy of the `constructs` library
135
+ is seen as a different class, and an instance of one class will not test as
136
+ `instanceof` the other class. `npm install` will not create installations
137
+ like this, but users may manually symlink construct libraries together or
138
+ use a monorepo tool: in those cases, multiple copies of the `constructs`
139
+ library can be accidentally installed, and `instanceof` will behave
140
+ unpredictably. It is safest to avoid using `instanceof`, and using
141
+ this type-testing method instead.
142
+
143
+ ###### `x`<sup>Required</sup> <a name="x" id="@taimos/projen.GitHubProductionRelease.isConstruct.parameter.x"></a>
144
+
145
+ - *Type:* any
146
+
147
+ Any object.
148
+
149
+ ---
150
+
151
+ ##### `isComponent` <a name="isComponent" id="@taimos/projen.GitHubProductionRelease.isComponent"></a>
152
+
153
+ ```typescript
154
+ import { GitHubProductionRelease } from '@taimos/projen'
155
+
156
+ GitHubProductionRelease.isComponent(x: any)
157
+ ```
158
+
159
+ Test whether the given construct is a component.
160
+
161
+ ###### `x`<sup>Required</sup> <a name="x" id="@taimos/projen.GitHubProductionRelease.isComponent.parameter.x"></a>
162
+
163
+ - *Type:* any
164
+
165
+ ---
166
+
167
+ #### Properties <a name="Properties" id="Properties"></a>
168
+
169
+ | **Name** | **Type** | **Description** |
170
+ | --- | --- | --- |
171
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
172
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.property.project">project</a></code> | <code>projen.Project</code> | *No description.* |
173
+ | <code><a href="#@taimos/projen.GitHubProductionRelease.property.workflow">workflow</a></code> | <code>projen.github.GithubWorkflow</code> | The generated production release workflow. |
174
+
175
+ ---
176
+
177
+ ##### `node`<sup>Required</sup> <a name="node" id="@taimos/projen.GitHubProductionRelease.property.node"></a>
178
+
179
+ ```typescript
180
+ public readonly node: Node;
181
+ ```
182
+
183
+ - *Type:* constructs.Node
184
+
185
+ The tree node.
186
+
187
+ ---
188
+
189
+ ##### `project`<sup>Required</sup> <a name="project" id="@taimos/projen.GitHubProductionRelease.property.project"></a>
190
+
191
+ ```typescript
192
+ public readonly project: Project;
193
+ ```
194
+
195
+ - *Type:* projen.Project
196
+
197
+ ---
198
+
199
+ ##### `workflow`<sup>Required</sup> <a name="workflow" id="@taimos/projen.GitHubProductionRelease.property.workflow"></a>
200
+
201
+ ```typescript
202
+ public readonly workflow: GithubWorkflow;
203
+ ```
204
+
205
+ - *Type:* projen.github.GithubWorkflow
206
+
207
+ The generated production release workflow.
208
+
209
+ ---
210
+
211
+
5
212
  ### MonorepoProject <a name="MonorepoProject" id="@taimos/projen.MonorepoProject"></a>
6
213
 
7
214
  Private PNPM-workspace monorepo root, following Taimos ADR-0002.
@@ -666,10 +873,12 @@ When given a project, this it the project itself.
666
873
  | <code><a href="#@taimos/projen.MonorepoProject.property.eslint">eslint</a></code> | <code>projen.javascript.Eslint</code> | *No description.* |
667
874
  | <code><a href="#@taimos/projen.MonorepoProject.property.tsconfig">tsconfig</a></code> | <code>projen.javascript.TypescriptConfig</code> | *No description.* |
668
875
  | <code><a href="#@taimos/projen.MonorepoProject.property.tsconfigEslint">tsconfigEslint</a></code> | <code>projen.javascript.TypescriptConfig</code> | *No description.* |
876
+ | <code><a href="#@taimos/projen.MonorepoProject.property.defaultReleaseBranch">defaultReleaseBranch</a></code> | <code>string</code> | The default release branch (promoted by the production release workflow). |
669
877
  | <code><a href="#@taimos/projen.MonorepoProject.property.prBuildWorkflow">prBuildWorkflow</a></code> | <code>projen.github.GithubWorkflow</code> | The unified PR build workflow. |
670
878
  | <code><a href="#@taimos/projen.MonorepoProject.property.workspaceFile">workspaceFile</a></code> | <code>projen.YamlFile</code> | The generated `pnpm-workspace.yaml`. |
671
879
  | <code><a href="#@taimos/projen.MonorepoProject.property.amplifyFile">amplifyFile</a></code> | <code>projen.YamlFile</code> | The generated `amplify.yml`, if any Amplify apps were configured. |
672
880
  | <code><a href="#@taimos/projen.MonorepoProject.property.assignApprover">assignApprover</a></code> | <code>projen-pipelines.GitHubAssignApprover</code> | The PR approver assignment, if enabled. |
881
+ | <code><a href="#@taimos/projen.MonorepoProject.property.productionRelease">productionRelease</a></code> | <code><a href="#@taimos/projen.GitHubProductionRelease">GitHubProductionRelease</a></code> | The production release workflow, if enabled. |
673
882
 
674
883
  ---
675
884
 
@@ -1356,6 +1565,18 @@ public readonly tsconfigEslint: TypescriptConfig;
1356
1565
 
1357
1566
  ---
1358
1567
 
1568
+ ##### `defaultReleaseBranch`<sup>Required</sup> <a name="defaultReleaseBranch" id="@taimos/projen.MonorepoProject.property.defaultReleaseBranch"></a>
1569
+
1570
+ ```typescript
1571
+ public readonly defaultReleaseBranch: string;
1572
+ ```
1573
+
1574
+ - *Type:* string
1575
+
1576
+ The default release branch (promoted by the production release workflow).
1577
+
1578
+ ---
1579
+
1359
1580
  ##### `prBuildWorkflow`<sup>Required</sup> <a name="prBuildWorkflow" id="@taimos/projen.MonorepoProject.property.prBuildWorkflow"></a>
1360
1581
 
1361
1582
  ```typescript
@@ -1404,6 +1625,18 @@ The PR approver assignment, if enabled.
1404
1625
 
1405
1626
  ---
1406
1627
 
1628
+ ##### `productionRelease`<sup>Optional</sup> <a name="productionRelease" id="@taimos/projen.MonorepoProject.property.productionRelease"></a>
1629
+
1630
+ ```typescript
1631
+ public readonly productionRelease: GitHubProductionRelease;
1632
+ ```
1633
+
1634
+ - *Type:* <a href="#@taimos/projen.GitHubProductionRelease">GitHubProductionRelease</a>
1635
+
1636
+ The production release workflow, if enabled.
1637
+
1638
+ ---
1639
+
1407
1640
  #### Constants <a name="Constants" id="Constants"></a>
1408
1641
 
1409
1642
  | **Name** | **Type** | **Description** |
@@ -9922,6 +10155,72 @@ public readonly DEFAULT_TS_JEST_TRANFORM_PATTERN: string;
9922
10155
 
9923
10156
  ## Structs <a name="Structs" id="Structs"></a>
9924
10157
 
10158
+ ### GitHubProductionReleaseOptions <a name="GitHubProductionReleaseOptions" id="@taimos/projen.GitHubProductionReleaseOptions"></a>
10159
+
10160
+ #### Initializer <a name="Initializer" id="@taimos/projen.GitHubProductionReleaseOptions.Initializer"></a>
10161
+
10162
+ ```typescript
10163
+ import { GitHubProductionReleaseOptions } from '@taimos/projen'
10164
+
10165
+ const gitHubProductionReleaseOptions: GitHubProductionReleaseOptions = { ... }
10166
+ ```
10167
+
10168
+ #### Properties <a name="Properties" id="Properties"></a>
10169
+
10170
+ | **Name** | **Type** | **Description** |
10171
+ | --- | --- | --- |
10172
+ | <code><a href="#@taimos/projen.GitHubProductionReleaseOptions.property.productionBranches">productionBranches</a></code> | <code>string[]</code> | The production branches that the source branch may be promoted into. |
10173
+ | <code><a href="#@taimos/projen.GitHubProductionReleaseOptions.property.runnerTags">runnerTags</a></code> | <code>string[]</code> | The runner tags used to select the runner. |
10174
+ | <code><a href="#@taimos/projen.GitHubProductionReleaseOptions.property.workflowName">workflowName</a></code> | <code>string</code> | The name of the generated workflow (and its `.yml` file). |
10175
+
10176
+ ---
10177
+
10178
+ ##### `productionBranches`<sup>Optional</sup> <a name="productionBranches" id="@taimos/projen.GitHubProductionReleaseOptions.property.productionBranches"></a>
10179
+
10180
+ ```typescript
10181
+ public readonly productionBranches: string[];
10182
+ ```
10183
+
10184
+ - *Type:* string[]
10185
+ - *Default:* ['production']
10186
+
10187
+ The production branches that the source branch may be promoted into.
10188
+
10189
+ Each branch typically backs its own production deployment — e.g. one Amplify
10190
+ app tracking `production` and another tracking `production2`. When more than
10191
+ one branch is given, the `workflow_dispatch` trigger exposes a `target`
10192
+ choice input so the operator picks which branch to promote into at dispatch
10193
+ time. The first entry is the default selection. With a single branch, no
10194
+ input is rendered and that branch is always the target.
10195
+
10196
+ ---
10197
+
10198
+ ##### `runnerTags`<sup>Optional</sup> <a name="runnerTags" id="@taimos/projen.GitHubProductionReleaseOptions.property.runnerTags"></a>
10199
+
10200
+ ```typescript
10201
+ public readonly runnerTags: string[];
10202
+ ```
10203
+
10204
+ - *Type:* string[]
10205
+ - *Default:* ['ubuntu-latest']
10206
+
10207
+ The runner tags used to select the runner.
10208
+
10209
+ ---
10210
+
10211
+ ##### `workflowName`<sup>Optional</sup> <a name="workflowName" id="@taimos/projen.GitHubProductionReleaseOptions.property.workflowName"></a>
10212
+
10213
+ ```typescript
10214
+ public readonly workflowName: string;
10215
+ ```
10216
+
10217
+ - *Type:* string
10218
+ - *Default:* 'production-release'
10219
+
10220
+ The name of the generated workflow (and its `.yml` file).
10221
+
10222
+ ---
10223
+
9925
10224
  ### MonorepoAmplifyApp <a name="MonorepoAmplifyApp" id="@taimos/projen.MonorepoAmplifyApp"></a>
9926
10225
 
9927
10226
  One AWS Amplify Hosting application served from a workspace package.
@@ -10257,6 +10556,8 @@ const monorepoProjectOptions: MonorepoProjectOptions = { ... }
10257
10556
  | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.defaultApprovers">defaultApprovers</a></code> | <code>string[]</code> | Approvers assigned when no author-specific mapping matches. |
10258
10557
  | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.nodeVersion">nodeVersion</a></code> | <code>string</code> | The Node.js version used in the generated build workflow. |
10259
10558
  | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.pnpmWorkspaceVersion">pnpmWorkspaceVersion</a></code> | <code>string</code> | The pnpm version pinned for the workspace and CI. |
10559
+ | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.productionRelease">productionRelease</a></code> | <code>boolean</code> | Whether to add a manual "Production Release" workflow that promotes a branch to the production branch (see `GitHubProductionRelease`). |
10560
+ | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.productionReleaseOptions">productionReleaseOptions</a></code> | <code><a href="#@taimos/projen.GitHubProductionReleaseOptions">GitHubProductionReleaseOptions</a></code> | Options for the production release workflow. |
10260
10561
  | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.runTestsInBuild">runTestsInBuild</a></code> | <code>boolean</code> | Whether the unified build workflow also runs `pnpm -r run test`. |
10261
10562
  | <code><a href="#@taimos/projen.MonorepoProjectOptions.property.workspaceOptions">workspaceOptions</a></code> | <code><a href="#@taimos/projen.MonorepoWorkspaceOptions">MonorepoWorkspaceOptions</a></code> | PNPM workspace tuning for the generated `pnpm-workspace.yaml`. |
10262
10563
 
@@ -12469,6 +12770,35 @@ The pnpm version pinned for the workspace and CI.
12469
12770
 
12470
12771
  ---
12471
12772
 
12773
+ ##### `productionRelease`<sup>Optional</sup> <a name="productionRelease" id="@taimos/projen.MonorepoProjectOptions.property.productionRelease"></a>
12774
+
12775
+ ```typescript
12776
+ public readonly productionRelease: boolean;
12777
+ ```
12778
+
12779
+ - *Type:* boolean
12780
+ - *Default:* false
12781
+
12782
+ Whether to add a manual "Production Release" workflow that promotes a branch to the production branch (see `GitHubProductionRelease`).
12783
+
12784
+ ---
12785
+
12786
+ ##### `productionReleaseOptions`<sup>Optional</sup> <a name="productionReleaseOptions" id="@taimos/projen.MonorepoProjectOptions.property.productionReleaseOptions"></a>
12787
+
12788
+ ```typescript
12789
+ public readonly productionReleaseOptions: GitHubProductionReleaseOptions;
12790
+ ```
12791
+
12792
+ - *Type:* <a href="#@taimos/projen.GitHubProductionReleaseOptions">GitHubProductionReleaseOptions</a>
12793
+ - *Default:* promote `main` to a `production` branch
12794
+
12795
+ Options for the production release workflow.
12796
+
12797
+ Only used when
12798
+ `productionRelease` is enabled.
12799
+
12800
+ ---
12801
+
12472
12802
  ##### `runTestsInBuild`<sup>Optional</sup> <a name="runTestsInBuild" id="@taimos/projen.MonorepoProjectOptions.property.runTestsInBuild"></a>
12473
12803
 
12474
12804
  ```typescript
@@ -0,0 +1 @@
1
+ export * from './production-release';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./production-release"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9wcm9kdWN0aW9uLXJlbGVhc2UnO1xuIl19
@@ -0,0 +1,54 @@
1
+ import { Component, github } from 'projen';
2
+ import { GitHubProject } from 'projen/lib/github';
3
+ export interface GitHubProductionReleaseOptions {
4
+ /**
5
+ * The production branches that the source branch may be promoted into.
6
+ *
7
+ * Each branch typically backs its own production deployment — e.g. one Amplify
8
+ * app tracking `production` and another tracking `production2`. When more than
9
+ * one branch is given, the `workflow_dispatch` trigger exposes a `target`
10
+ * choice input so the operator picks which branch to promote into at dispatch
11
+ * time. The first entry is the default selection. With a single branch, no
12
+ * input is rendered and that branch is always the target.
13
+ *
14
+ * @default ['production']
15
+ */
16
+ readonly productionBranches?: string[];
17
+ /**
18
+ * The name of the generated workflow (and its `.yml` file).
19
+ *
20
+ * @default 'production-release'
21
+ */
22
+ readonly workflowName?: string;
23
+ /**
24
+ * The runner tags used to select the runner.
25
+ *
26
+ * @default ['ubuntu-latest']
27
+ */
28
+ readonly runnerTags?: string[];
29
+ }
30
+ /**
31
+ * Adds a manual "Production Release" workflow that promotes a branch into a
32
+ * production branch.
33
+ *
34
+ * The workflow is triggered via `workflow_dispatch`. It fast-forward merges the
35
+ * project's default release branch into the selected production branch and
36
+ * pushes it. This keeps a production promotion a deliberate, auditable manual
37
+ * action separate from merging to the default release branch. When several
38
+ * production branches are configured, the operator chooses the target at
39
+ * dispatch time.
40
+ */
41
+ export declare class GitHubProductionRelease extends Component {
42
+ /**
43
+ * Resolves the branch that is promoted — the project's default release branch.
44
+ *
45
+ * `NodeProject` does not expose the configured default release branch as a
46
+ * public field, so this reads the best available source: a project that
47
+ * exposes `defaultReleaseBranch` (e.g. `MonorepoProject`), then the release
48
+ * component's default branch, falling back to `main`.
49
+ */
50
+ private static resolveDefaultReleaseBranch;
51
+ /** The generated production release workflow. */
52
+ readonly workflow: github.GithubWorkflow;
53
+ constructor(scope: GitHubProject, options?: GitHubProductionReleaseOptions);
54
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubProductionRelease = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ const projen_1 = require("projen");
6
+ /**
7
+ * Adds a manual "Production Release" workflow that promotes a branch into a
8
+ * production branch.
9
+ *
10
+ * The workflow is triggered via `workflow_dispatch`. It fast-forward merges the
11
+ * project's default release branch into the selected production branch and
12
+ * pushes it. This keeps a production promotion a deliberate, auditable manual
13
+ * action separate from merging to the default release branch. When several
14
+ * production branches are configured, the operator chooses the target at
15
+ * dispatch time.
16
+ */
17
+ class GitHubProductionRelease extends projen_1.Component {
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@taimos/projen.GitHubProductionRelease", version: "0.1.68" };
19
+ /**
20
+ * Resolves the branch that is promoted — the project's default release branch.
21
+ *
22
+ * `NodeProject` does not expose the configured default release branch as a
23
+ * public field, so this reads the best available source: a project that
24
+ * exposes `defaultReleaseBranch` (e.g. `MonorepoProject`), then the release
25
+ * component's default branch, falling back to `main`.
26
+ */
27
+ static resolveDefaultReleaseBranch(scope) {
28
+ const anyScope = scope;
29
+ return anyScope.defaultReleaseBranch
30
+ ?? anyScope.release?.defaultBranch
31
+ ?? 'main';
32
+ }
33
+ /** The generated production release workflow. */
34
+ workflow;
35
+ constructor(scope, options = {}) {
36
+ super(scope);
37
+ if (!scope.github) {
38
+ throw new Error('GitHubProductionRelease requires a project with GitHub enabled');
39
+ }
40
+ const sourceBranch = GitHubProductionRelease.resolveDefaultReleaseBranch(scope);
41
+ const productionBranches = options.productionBranches ?? ['production'];
42
+ if (productionBranches.length === 0) {
43
+ throw new Error('GitHubProductionRelease requires at least one production branch');
44
+ }
45
+ const workflowName = options.workflowName ?? 'production-release';
46
+ const runnerTags = options.runnerTags ?? ['ubuntu-latest'];
47
+ const multipleTargets = productionBranches.length > 1;
48
+ this.workflow = new projen_1.github.GithubWorkflow(scope.github, workflowName);
49
+ this.workflow.on({
50
+ workflowDispatch: multipleTargets ? {
51
+ inputs: {
52
+ target: {
53
+ description: `Production branch to promote ${sourceBranch} into`,
54
+ type: 'choice',
55
+ options: productionBranches,
56
+ default: productionBranches[0],
57
+ required: true,
58
+ },
59
+ },
60
+ } : {},
61
+ });
62
+ // The target branch is read from an env var rather than interpolated into a
63
+ // run script, so the dispatch input cannot be used for shell injection.
64
+ const targetRef = multipleTargets ? '${{ inputs.target }}' : productionBranches[0];
65
+ this.workflow.addJob('merge-to-production', {
66
+ name: 'Promote to production',
67
+ runsOn: runnerTags,
68
+ permissions: { contents: projen_1.github.workflows.JobPermission.WRITE },
69
+ env: { TARGET_BRANCH: targetRef },
70
+ steps: [
71
+ {
72
+ name: 'Checkout repository',
73
+ uses: 'actions/checkout@v4',
74
+ with: { 'fetch-depth': 0 },
75
+ },
76
+ {
77
+ name: 'Configure git',
78
+ run: [
79
+ 'git config user.name "github-actions[bot]"',
80
+ 'git config user.email "github-actions[bot]@users.noreply.github.com"',
81
+ ].join('\n'),
82
+ },
83
+ {
84
+ name: 'Fetch all branches',
85
+ run: 'git fetch --all',
86
+ },
87
+ {
88
+ name: 'Checkout production branch',
89
+ run: 'git checkout "$TARGET_BRANCH"',
90
+ },
91
+ {
92
+ name: `Merge ${sourceBranch} (fast-forward only)`,
93
+ run: `git merge --ff-only "origin/${sourceBranch}"`,
94
+ },
95
+ {
96
+ name: 'Push to production branch',
97
+ run: 'git push origin "$TARGET_BRANCH"',
98
+ },
99
+ ],
100
+ });
101
+ }
102
+ }
103
+ exports.GitHubProductionRelease = GitHubProductionRelease;
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdGlvbi1yZWxlYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvcHJvZHVjdGlvbi1yZWxlYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBMkM7QUFpQzNDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLHVCQUF3QixTQUFRLGtCQUFTOztJQUVwRDs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFDLDJCQUEyQixDQUFDLEtBQW9CO1FBQzdELE1BQU0sUUFBUSxHQUFHLEtBQVksQ0FBQztRQUM5QixPQUFPLFFBQVEsQ0FBQyxvQkFBb0I7ZUFDL0IsUUFBUSxDQUFDLE9BQU8sRUFBRSxhQUFhO2VBQy9CLE1BQU0sQ0FBQztJQUNkLENBQUM7SUFFRCxpREFBaUQ7SUFDakMsUUFBUSxDQUF3QjtJQUVoRCxZQUFZLEtBQW9CLEVBQUUsVUFBMEMsRUFBRTtRQUM1RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEYsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksb0JBQW9CLENBQUM7UUFDbEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTNELE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNmLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUU7d0JBQ04sV0FBVyxFQUFFLGdDQUFnQyxZQUFZLE9BQU87d0JBQ2hFLElBQUksRUFBRSxRQUFRO3dCQUNkLE9BQU8sRUFBRSxrQkFBa0I7d0JBQzNCLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7d0JBQzlCLFFBQVEsRUFBRSxJQUFJO3FCQUNmO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNQLENBQUMsQ0FBQztRQUVILDRFQUE0RTtRQUM1RSx3RUFBd0U7UUFDeEUsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUU7WUFDMUMsSUFBSSxFQUFFLHVCQUF1QjtZQUM3QixNQUFNLEVBQUUsVUFBVTtZQUNsQixXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQy9ELEdBQUcsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUU7WUFDakMsS0FBSyxFQUFFO2dCQUNMO29CQUNFLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUU7aUJBQzNCO2dCQUNEO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixHQUFHLEVBQUU7d0JBQ0gsNENBQTRDO3dCQUM1QyxzRUFBc0U7cUJBQ3ZFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDYjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixHQUFHLEVBQUUsaUJBQWlCO2lCQUN2QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsNEJBQTRCO29CQUNsQyxHQUFHLEVBQUUsK0JBQStCO2lCQUNyQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsU0FBUyxZQUFZLHNCQUFzQjtvQkFDakQsR0FBRyxFQUFFLCtCQUErQixZQUFZLEdBQUc7aUJBQ3BEO2dCQUNEO29CQUNFLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLEdBQUcsRUFBRSxrQ0FBa0M7aUJBQ3hDO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTVGSCwwREE2RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGdpdGh1YiB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBHaXRIdWJQcm9qZWN0IH0gZnJvbSAncHJvamVuL2xpYi9naXRodWInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YlByb2R1Y3Rpb25SZWxlYXNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcHJvZHVjdGlvbiBicmFuY2hlcyB0aGF0IHRoZSBzb3VyY2UgYnJhbmNoIG1heSBiZSBwcm9tb3RlZCBpbnRvLlxuICAgKlxuICAgKiBFYWNoIGJyYW5jaCB0eXBpY2FsbHkgYmFja3MgaXRzIG93biBwcm9kdWN0aW9uIGRlcGxveW1lbnQg4oCUIGUuZy4gb25lIEFtcGxpZnlcbiAgICogYXBwIHRyYWNraW5nIGBwcm9kdWN0aW9uYCBhbmQgYW5vdGhlciB0cmFja2luZyBgcHJvZHVjdGlvbjJgLiBXaGVuIG1vcmUgdGhhblxuICAgKiBvbmUgYnJhbmNoIGlzIGdpdmVuLCB0aGUgYHdvcmtmbG93X2Rpc3BhdGNoYCB0cmlnZ2VyIGV4cG9zZXMgYSBgdGFyZ2V0YFxuICAgKiBjaG9pY2UgaW5wdXQgc28gdGhlIG9wZXJhdG9yIHBpY2tzIHdoaWNoIGJyYW5jaCB0byBwcm9tb3RlIGludG8gYXQgZGlzcGF0Y2hcbiAgICogdGltZS4gVGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbi4gV2l0aCBhIHNpbmdsZSBicmFuY2gsIG5vXG4gICAqIGlucHV0IGlzIHJlbmRlcmVkIGFuZCB0aGF0IGJyYW5jaCBpcyBhbHdheXMgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQGRlZmF1bHQgWydwcm9kdWN0aW9uJ11cbiAgICovXG4gIHJlYWRvbmx5IHByb2R1Y3Rpb25CcmFuY2hlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93IChhbmQgaXRzIGAueW1sYCBmaWxlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ3Byb2R1Y3Rpb24tcmVsZWFzZSdcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJ1bm5lciB0YWdzIHVzZWQgdG8gc2VsZWN0IHRoZSBydW5uZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFsndWJ1bnR1LWxhdGVzdCddXG4gICAqL1xuICByZWFkb25seSBydW5uZXJUYWdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQWRkcyBhIG1hbnVhbCBcIlByb2R1Y3Rpb24gUmVsZWFzZVwiIHdvcmtmbG93IHRoYXQgcHJvbW90ZXMgYSBicmFuY2ggaW50byBhXG4gKiBwcm9kdWN0aW9uIGJyYW5jaC5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgaXMgdHJpZ2dlcmVkIHZpYSBgd29ya2Zsb3dfZGlzcGF0Y2hgLiBJdCBmYXN0LWZvcndhcmQgbWVyZ2VzIHRoZVxuICogcHJvamVjdCdzIGRlZmF1bHQgcmVsZWFzZSBicmFuY2ggaW50byB0aGUgc2VsZWN0ZWQgcHJvZHVjdGlvbiBicmFuY2ggYW5kXG4gKiBwdXNoZXMgaXQuIFRoaXMga2VlcHMgYSBwcm9kdWN0aW9uIHByb21vdGlvbiBhIGRlbGliZXJhdGUsIGF1ZGl0YWJsZSBtYW51YWxcbiAqIGFjdGlvbiBzZXBhcmF0ZSBmcm9tIG1lcmdpbmcgdG8gdGhlIGRlZmF1bHQgcmVsZWFzZSBicmFuY2guIFdoZW4gc2V2ZXJhbFxuICogcHJvZHVjdGlvbiBicmFuY2hlcyBhcmUgY29uZmlndXJlZCwgdGhlIG9wZXJhdG9yIGNob29zZXMgdGhlIHRhcmdldCBhdFxuICogZGlzcGF0Y2ggdGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YlByb2R1Y3Rpb25SZWxlYXNlIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGJyYW5jaCB0aGF0IGlzIHByb21vdGVkIOKAlCB0aGUgcHJvamVjdCdzIGRlZmF1bHQgcmVsZWFzZSBicmFuY2guXG4gICAqXG4gICAqIGBOb2RlUHJvamVjdGAgZG9lcyBub3QgZXhwb3NlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgcmVsZWFzZSBicmFuY2ggYXMgYVxuICAgKiBwdWJsaWMgZmllbGQsIHNvIHRoaXMgcmVhZHMgdGhlIGJlc3QgYXZhaWxhYmxlIHNvdXJjZTogYSBwcm9qZWN0IHRoYXRcbiAgICogZXhwb3NlcyBgZGVmYXVsdFJlbGVhc2VCcmFuY2hgIChlLmcuIGBNb25vcmVwb1Byb2plY3RgKSwgdGhlbiB0aGUgcmVsZWFzZVxuICAgKiBjb21wb25lbnQncyBkZWZhdWx0IGJyYW5jaCwgZmFsbGluZyBiYWNrIHRvIGBtYWluYC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVEZWZhdWx0UmVsZWFzZUJyYW5jaChzY29wZTogR2l0SHViUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgYW55U2NvcGUgPSBzY29wZSBhcyBhbnk7XG4gICAgcmV0dXJuIGFueVNjb3BlLmRlZmF1bHRSZWxlYXNlQnJhbmNoXG4gICAgICA/PyBhbnlTY29wZS5yZWxlYXNlPy5kZWZhdWx0QnJhbmNoXG4gICAgICA/PyAnbWFpbic7XG4gIH1cblxuICAvKiogVGhlIGdlbmVyYXRlZCBwcm9kdWN0aW9uIHJlbGVhc2Ugd29ya2Zsb3cuICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvdzogZ2l0aHViLkdpdGh1YldvcmtmbG93O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBHaXRIdWJQcm9qZWN0LCBvcHRpb25zOiBHaXRIdWJQcm9kdWN0aW9uUmVsZWFzZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlKTtcblxuICAgIGlmICghc2NvcGUuZ2l0aHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YlByb2R1Y3Rpb25SZWxlYXNlIHJlcXVpcmVzIGEgcHJvamVjdCB3aXRoIEdpdEh1YiBlbmFibGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQnJhbmNoID0gR2l0SHViUHJvZHVjdGlvblJlbGVhc2UucmVzb2x2ZURlZmF1bHRSZWxlYXNlQnJhbmNoKHNjb3BlKTtcbiAgICBjb25zdCBwcm9kdWN0aW9uQnJhbmNoZXMgPSBvcHRpb25zLnByb2R1Y3Rpb25CcmFuY2hlcyA/PyBbJ3Byb2R1Y3Rpb24nXTtcbiAgICBpZiAocHJvZHVjdGlvbkJyYW5jaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWJQcm9kdWN0aW9uUmVsZWFzZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgcHJvZHVjdGlvbiBicmFuY2gnKTtcbiAgICB9XG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gJ3Byb2R1Y3Rpb24tcmVsZWFzZSc7XG4gICAgY29uc3QgcnVubmVyVGFncyA9IG9wdGlvbnMucnVubmVyVGFncyA/PyBbJ3VidW50dS1sYXRlc3QnXTtcblxuICAgIGNvbnN0IG11bHRpcGxlVGFyZ2V0cyA9IHByb2R1Y3Rpb25CcmFuY2hlcy5sZW5ndGggPiAxO1xuXG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBnaXRodWIuR2l0aHViV29ya2Zsb3coc2NvcGUuZ2l0aHViLCB3b3JrZmxvd05hbWUpO1xuICAgIHRoaXMud29ya2Zsb3cub24oe1xuICAgICAgd29ya2Zsb3dEaXNwYXRjaDogbXVsdGlwbGVUYXJnZXRzID8ge1xuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUHJvZHVjdGlvbiBicmFuY2ggdG8gcHJvbW90ZSAke3NvdXJjZUJyYW5jaH0gaW50b2AsXG4gICAgICAgICAgICB0eXBlOiAnY2hvaWNlJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHByb2R1Y3Rpb25CcmFuY2hlcyxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHByb2R1Y3Rpb25CcmFuY2hlc1swXSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9IDoge30sXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGFyZ2V0IGJyYW5jaCBpcyByZWFkIGZyb20gYW4gZW52IHZhciByYXRoZXIgdGhhbiBpbnRlcnBvbGF0ZWQgaW50byBhXG4gICAgLy8gcnVuIHNjcmlwdCwgc28gdGhlIGRpc3BhdGNoIGlucHV0IGNhbm5vdCBiZSB1c2VkIGZvciBzaGVsbCBpbmplY3Rpb24uXG4gICAgY29uc3QgdGFyZ2V0UmVmID0gbXVsdGlwbGVUYXJnZXRzID8gJyR7eyBpbnB1dHMudGFyZ2V0IH19JyA6IHByb2R1Y3Rpb25CcmFuY2hlc1swXTtcblxuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKCdtZXJnZS10by1wcm9kdWN0aW9uJywge1xuICAgICAgbmFtZTogJ1Byb21vdGUgdG8gcHJvZHVjdGlvbicsXG4gICAgICBydW5zT246IHJ1bm5lclRhZ3MsXG4gICAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLldSSVRFIH0sXG4gICAgICBlbnY6IHsgVEFSR0VUX0JSQU5DSDogdGFyZ2V0UmVmIH0sXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0NoZWNrb3V0IHJlcG9zaXRvcnknLFxuICAgICAgICAgIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY0JyxcbiAgICAgICAgICB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgZ2l0JyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICdnaXQgY29uZmlnIHVzZXIubmFtZSBcImdpdGh1Yi1hY3Rpb25zW2JvdF1cIicsXG4gICAgICAgICAgICAnZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiZ2l0aHViLWFjdGlvbnNbYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb21cIicsXG4gICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdGZXRjaCBhbGwgYnJhbmNoZXMnLFxuICAgICAgICAgIHJ1bjogJ2dpdCBmZXRjaCAtLWFsbCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnQ2hlY2tvdXQgcHJvZHVjdGlvbiBicmFuY2gnLFxuICAgICAgICAgIHJ1bjogJ2dpdCBjaGVja291dCBcIiRUQVJHRVRfQlJBTkNIXCInLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogYE1lcmdlICR7c291cmNlQnJhbmNofSAoZmFzdC1mb3J3YXJkIG9ubHkpYCxcbiAgICAgICAgICBydW46IGBnaXQgbWVyZ2UgLS1mZi1vbmx5IFwib3JpZ2luLyR7c291cmNlQnJhbmNofVwiYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdQdXNoIHRvIHByb2R1Y3Rpb24gYnJhbmNoJyxcbiAgICAgICAgICBydW46ICdnaXQgcHVzaCBvcmlnaW4gXCIkVEFSR0VUX0JSQU5DSFwiJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -1 +1,2 @@
1
+ export * from './components';
1
2
  export * from './projects';
package/lib/index.js CHANGED
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./components"), exports);
17
18
  __exportStar(require("./projects"), exports);
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcHJvamVjdHMnOyJdfQ==
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QjtBQUM3Qiw2Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9qZWN0cyc7Il19
@@ -9,7 +9,7 @@ const projen_1 = require("projen");
9
9
  * @pjid taimos-cdk-app
10
10
  */
11
11
  class TaimosCdkApp extends projen_1.awscdk.AwsCdkTypeScriptApp {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@taimos/projen.TaimosCdkApp", version: "0.1.67" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@taimos/projen.TaimosCdkApp", version: "0.1.68" };
13
13
  constructor(options) {
14
14
  super({
15
15
  authorEmail: 'info@taimos.de',
@@ -9,7 +9,7 @@ const projen_1 = require("projen");
9
9
  * @pjid taimos-awscdk-construct
10
10
  */
11
11
  class TaimosCdkConstructLibrary extends projen_1.awscdk.AwsCdkConstructLibrary {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@taimos/projen.TaimosCdkConstructLibrary", version: "0.1.67" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@taimos/projen.TaimosCdkConstructLibrary", version: "0.1.68" };
13
13
  constructor(options) {
14
14
  super({
15
15
  authorOrganization: true,
@@ -1,5 +1,6 @@
1
1
  import { github, typescript, YamlFile } from 'projen';
2
2
  import { GitHubAssignApprover } from 'projen-pipelines';
3
+ import { GitHubProductionRelease, GitHubProductionReleaseOptions } from '../components';
3
4
  /**
4
5
  * The frontend framework an Amplify Hosting application is built with.
5
6
  *
@@ -176,6 +177,20 @@ export interface MonorepoProjectOptions extends typescript.TypeScriptProjectOpti
176
177
  * @default []
177
178
  */
178
179
  readonly amplifyApps?: MonorepoAmplifyApp[];
180
+ /**
181
+ * Whether to add a manual "Production Release" workflow that promotes a branch
182
+ * to the production branch (see `GitHubProductionRelease`).
183
+ *
184
+ * @default false
185
+ */
186
+ readonly productionRelease?: boolean;
187
+ /**
188
+ * Options for the production release workflow. Only used when
189
+ * `productionRelease` is enabled.
190
+ *
191
+ * @default - promote `main` to a `production` branch
192
+ */
193
+ readonly productionReleaseOptions?: GitHubProductionReleaseOptions;
179
194
  }
180
195
  /**
181
196
  * Private PNPM-workspace monorepo root, following Taimos ADR-0002.
@@ -199,6 +214,10 @@ export declare class MonorepoProject extends typescript.TypeScriptProject {
199
214
  readonly amplifyFile?: YamlFile;
200
215
  /** The PR approver assignment, if enabled. */
201
216
  readonly assignApprover?: GitHubAssignApprover;
217
+ /** The production release workflow, if enabled. */
218
+ readonly productionRelease?: GitHubProductionRelease;
219
+ /** The default release branch (promoted by the production release workflow). */
220
+ readonly defaultReleaseBranch: string;
202
221
  constructor(options: MonorepoProjectOptions);
203
222
  private renderAmplifyApp;
204
223
  }