cdk-serverless 2.17.2 → 2.19.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.
package/README.md CHANGED
@@ -72,6 +72,106 @@ const api = new TestApiRestApi(this, 'Api', {
72
72
 
73
73
  This will also create Lambda functions for all operations defined in your spec and wire them accordingly.
74
74
 
75
+ ## Testing Utilities
76
+
77
+ CDK Serverless provides two powerful test utilities to help you write comprehensive tests for your serverless applications.
78
+
79
+ ### LambdaTestUtil
80
+
81
+ The `LambdaTestUtil` provides classes for testing both REST and GraphQL Lambda functions in isolation. It's perfect for unit testing your Lambda handlers.
82
+
83
+ #### REST API Testing
84
+
85
+ ```typescript
86
+ import { LambdaRestUnitTest } from 'cdk-serverless/tests/lambda-test-utils';
87
+
88
+ const test = new LambdaRestUnitTest(handler, {
89
+ // Optional default headers for all requests
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ },
93
+ // Optional default Cognito user for all requests
94
+ cognito: {
95
+ username: 'test-user',
96
+ email: 'test@example.com',
97
+ groups: ['admin'],
98
+ },
99
+ });
100
+
101
+ // Test a GET request
102
+ const result = await test.call({
103
+ path: '/items',
104
+ method: 'GET',
105
+ });
106
+
107
+ // Test a POST request with body
108
+ const result = await test.call({
109
+ path: '/items',
110
+ method: 'POST',
111
+ body: JSON.stringify({ name: 'test' }),
112
+ });
113
+ ```
114
+
115
+ #### GraphQL Testing
116
+
117
+ ```typescript
118
+ import { LambdaGraphQLTest } from 'cdk-serverless/tests/lambda-test-utils';
119
+
120
+ const test = new LambdaGraphQLTest(handler, {
121
+ // Optional default Cognito user for all requests
122
+ cognito: {
123
+ username: 'test-user',
124
+ email: 'test@example.com',
125
+ groups: ['admin'],
126
+ },
127
+ });
128
+
129
+ // Test a GraphQL query
130
+ const result = await test.call({
131
+ fieldName: 'getItem',
132
+ arguments: { id: '123' },
133
+ });
134
+ ```
135
+
136
+ ### IntegTestUtil
137
+
138
+ The `IntegTestUtil` provides a comprehensive set of tools for integration testing your deployed serverless applications. It handles authentication, data cleanup, and API testing.
139
+
140
+ ```typescript
141
+ import { IntegTestUtil } from 'cdk-serverless/tests/integ-test-util';
142
+
143
+ // Initialize with your stack outputs
144
+ const test = new IntegTestUtil({
145
+ region: 'us-east-1',
146
+ apiOptions: {
147
+ baseURL: 'https://api.example.com',
148
+ },
149
+ authOptions: {
150
+ userPoolId: 'us-east-1_xxxxx',
151
+ userPoolClientId: 'xxxxxxxx',
152
+ identityPoolId: 'us-east-1:xxxxxxxx',
153
+ },
154
+ datastoreOptions: {
155
+ tableName: 'MyTable',
156
+ },
157
+ });
158
+
159
+ // Create and authenticate a test user
160
+ await test.createUser('test@example.com', {
161
+ 'custom:attribute': 'value',
162
+ }, ['admin']);
163
+
164
+ // Get an authenticated API client
165
+ const client = await test.getAuthenticatedClient('test@example.com');
166
+
167
+ // Make API calls
168
+ const response = await client.get('/items');
169
+
170
+ // Clean up test data
171
+ await test.cleanupItems();
172
+ await test.removeUser('test@example.com');
173
+ ```
174
+
75
175
  ## Contribute
76
176
 
77
177
  ### How to contribute to CDK Serverless
@@ -33,6 +33,18 @@
33
33
  </code><button type="button">Copy</button></pre>
34
34
 
35
35
  <p>This will also create Lambda functions for all operations defined in your spec and wire them accordingly.</p>
36
+ <a id="testing-utilities" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Testing Utilities<a href="#testing-utilities" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>CDK Serverless provides two powerful test utilities to help you write comprehensive tests for your serverless applications.</p>
37
+ <a id="lambdatestutil" class="tsd-anchor"></a><h3 class="tsd-anchor-link">LambdaTestUtil<a href="#lambdatestutil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The <code>LambdaTestUtil</code> provides classes for testing both REST and GraphQL Lambda functions in isolation. It's perfect for unit testing your Lambda handlers.</p>
38
+ <a id="rest-api-testing" class="tsd-anchor"></a><h4 class="tsd-anchor-link">REST API Testing<a href="#rest-api-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">LambdaRestUnitTest</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/lambda-test-utils&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">LambdaRestUnitTest</span><span class="hl-1">(</span><span class="hl-4">handler</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default headers for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">&#39;Content-Type&#39;</span><span class="hl-4">:</span><span class="hl-1"> </span><span class="hl-2">&#39;application/json&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default Cognito user for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">cognito:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">username:</span><span class="hl-1"> </span><span class="hl-2">&#39;test-user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">email:</span><span class="hl-1"> </span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">groups:</span><span class="hl-1"> [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a GET request</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">path:</span><span class="hl-1"> </span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">method:</span><span class="hl-1"> </span><span class="hl-2">&#39;GET&#39;</span><span class="hl-1">,</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a POST request with body</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">path:</span><span class="hl-1"> </span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">method:</span><span class="hl-1"> </span><span class="hl-2">&#39;POST&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">body:</span><span class="hl-1"> </span><span class="hl-7">JSON</span><span class="hl-1">.</span><span class="hl-0">stringify</span><span class="hl-1">({ </span><span class="hl-4">name:</span><span class="hl-1"> </span><span class="hl-2">&#39;test&#39;</span><span class="hl-1"> }),</span><br/><span class="hl-1">});</span>
39
+ </code><button type="button">Copy</button></pre>
40
+
41
+ <a id="graphql-testing" class="tsd-anchor"></a><h4 class="tsd-anchor-link">GraphQL Testing<a href="#graphql-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">LambdaGraphQLTest</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/lambda-test-utils&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">LambdaGraphQLTest</span><span class="hl-1">(</span><span class="hl-4">handler</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default Cognito user for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">cognito:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">username:</span><span class="hl-1"> </span><span class="hl-2">&#39;test-user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">email:</span><span class="hl-1"> </span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">groups:</span><span class="hl-1"> [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a GraphQL query</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">fieldName:</span><span class="hl-1"> </span><span class="hl-2">&#39;getItem&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">arguments:</span><span class="hl-1"> { </span><span class="hl-4">id:</span><span class="hl-1"> </span><span class="hl-2">&#39;123&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
42
+ </code><button type="button">Copy</button></pre>
43
+
44
+ <a id="integtestutil" class="tsd-anchor"></a><h3 class="tsd-anchor-link">IntegTestUtil<a href="#integtestutil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The <code>IntegTestUtil</code> provides a comprehensive set of tools for integration testing your deployed serverless applications. It handles authentication, data cleanup, and API testing.</p>
45
+ <pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">IntegTestUtil</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/integ-test-util&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// Initialize with your stack outputs</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">IntegTestUtil</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">region:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">apiOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">baseURL:</span><span class="hl-1"> </span><span class="hl-2">&#39;https://api.example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-4">authOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">userPoolId:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1_xxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">userPoolClientId:</span><span class="hl-1"> </span><span class="hl-2">&#39;xxxxxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">identityPoolId:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1:xxxxxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-4">datastoreOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">tableName:</span><span class="hl-1"> </span><span class="hl-2">&#39;MyTable&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Create and authenticate a test user</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">createUser</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">&#39;custom:attribute&#39;</span><span class="hl-4">:</span><span class="hl-1"> </span><span class="hl-2">&#39;value&#39;</span><span class="hl-1">,</span><br/><span class="hl-1">}, [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">]);</span><br/><br/><span class="hl-6">// Get an authenticated API client</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">client</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">getAuthenticatedClient</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Make API calls</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">response</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">client</span><span class="hl-1">.</span><span class="hl-0">get</span><span class="hl-1">(</span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Clean up test data</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">cleanupItems</span><span class="hl-1">();</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">removeUser</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">);</span>
46
+ </code><button type="button">Copy</button></pre>
47
+
36
48
  <a id="contribute" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Contribute<a href="#contribute" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><a id="how-to-contribute-to-cdk-serverless" class="tsd-anchor"></a><h3 class="tsd-anchor-link">How to contribute to CDK Serverless<a href="#how-to-contribute-to-cdk-serverless" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><a id="did-you-find-a-bug" class="tsd-anchor"></a><h4 class="tsd-anchor-link"><strong>Did you find a bug?</strong><a href="#did-you-find-a-bug" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><ul>
37
49
  <li>
38
50
  <p><strong>Ensure the bug was not already reported</strong> by searching on GitHub under <a href="https://github.com/taimos/cdk-serverless/issues">Issues</a>.</p>
@@ -62,4 +74,4 @@
62
74
  <li>Just file a PR with your recommended changes</li>
63
75
  </ul>
64
76
  <a id="authors" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Authors<a href="#authors" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Brought to you by <a href="https://taimos.de">Taimos</a></p>
65
- </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#cdk-serverless"><span>CDK <wbr/>Serverless</span></a><ul><li><ul><li><a href="#features"><span>Features</span></a></li></ul></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#adding-projen-constructs"><span>Adding projen constructs</span></a></li><li><a href="#using-the-cdk-serverless-l3-constructs"><span>Using the CDK serverless <wbr/>L3 constructs</span></a></li></ul></li><li><a href="#contribute"><span>Contribute</span></a></li><li><ul><li><a href="#how-to-contribute-to-cdk-serverless"><span>How to contribute to CDK <wbr/>Serverless</span></a></li><li><ul><li><a href="#did-you-find-a-bug"><span>Did you find a bug?</span></a></li><li><a href="#did-you-write-a-patch-that-fixes-a-bug"><span>Did you write a patch that fixes a bug?</span></a></li><li><a href="#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch"><span>Did you fix whitespace, format code, or make a purely cosmetic patch?</span></a></li><li><a href="#do-you-intend-to-add-a-new-feature-or-change-an-existing-one"><span>Do you intend to add a new feature or change an existing one?</span></a></li><li><a href="#do-you-want-to-contribute-to-the-cdk-serverless-documentation"><span>Do you want to contribute to the CDK <wbr/>Serverless documentation?</span></a></li></ul></li></ul></li><li><a href="#authors"><span>Authors</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
77
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#cdk-serverless"><span>CDK <wbr/>Serverless</span></a><ul><li><ul><li><a href="#features"><span>Features</span></a></li></ul></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#adding-projen-constructs"><span>Adding projen constructs</span></a></li><li><a href="#using-the-cdk-serverless-l3-constructs"><span>Using the CDK serverless <wbr/>L3 constructs</span></a></li></ul></li><li><a href="#testing-utilities"><span>Testing <wbr/>Utilities</span></a></li><li><ul><li><a href="#lambdatestutil"><span>Lambda<wbr/>Test<wbr/>Util</span></a></li><li><ul><li><a href="#rest-api-testing"><span>REST API <wbr/>Testing</span></a></li><li><a href="#graphql-testing"><span>GraphQL <wbr/>Testing</span></a></li></ul></li><li><a href="#integtestutil"><span>Integ<wbr/>Test<wbr/>Util</span></a></li></ul></li><li><a href="#contribute"><span>Contribute</span></a></li><li><ul><li><a href="#how-to-contribute-to-cdk-serverless"><span>How to contribute to CDK <wbr/>Serverless</span></a></li><li><ul><li><a href="#did-you-find-a-bug"><span>Did you find a bug?</span></a></li><li><a href="#did-you-write-a-patch-that-fixes-a-bug"><span>Did you write a patch that fixes a bug?</span></a></li><li><a href="#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch"><span>Did you fix whitespace, format code, or make a purely cosmetic patch?</span></a></li><li><a href="#do-you-intend-to-add-a-new-feature-or-change-an-existing-one"><span>Do you intend to add a new feature or change an existing one?</span></a></li><li><a href="#do-you-want-to-contribute-to-the-cdk-serverless-documentation"><span>Do you want to contribute to the CDK <wbr/>Serverless documentation?</span></a></li></ul></li></ul></li><li><a href="#authors"><span>Authors</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -33,6 +33,18 @@
33
33
  </code><button type="button">Copy</button></pre>
34
34
 
35
35
  <p>This will also create Lambda functions for all operations defined in your spec and wire them accordingly.</p>
36
+ <a id="testing-utilities" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Testing Utilities<a href="#testing-utilities" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>CDK Serverless provides two powerful test utilities to help you write comprehensive tests for your serverless applications.</p>
37
+ <a id="lambdatestutil" class="tsd-anchor"></a><h3 class="tsd-anchor-link">LambdaTestUtil<a href="#lambdatestutil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The <code>LambdaTestUtil</code> provides classes for testing both REST and GraphQL Lambda functions in isolation. It's perfect for unit testing your Lambda handlers.</p>
38
+ <a id="rest-api-testing" class="tsd-anchor"></a><h4 class="tsd-anchor-link">REST API Testing<a href="#rest-api-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">LambdaRestUnitTest</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/lambda-test-utils&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">LambdaRestUnitTest</span><span class="hl-1">(</span><span class="hl-4">handler</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default headers for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">&#39;Content-Type&#39;</span><span class="hl-4">:</span><span class="hl-1"> </span><span class="hl-2">&#39;application/json&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default Cognito user for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">cognito:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">username:</span><span class="hl-1"> </span><span class="hl-2">&#39;test-user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">email:</span><span class="hl-1"> </span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">groups:</span><span class="hl-1"> [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a GET request</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">path:</span><span class="hl-1"> </span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">method:</span><span class="hl-1"> </span><span class="hl-2">&#39;GET&#39;</span><span class="hl-1">,</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a POST request with body</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">path:</span><span class="hl-1"> </span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">method:</span><span class="hl-1"> </span><span class="hl-2">&#39;POST&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">body:</span><span class="hl-1"> </span><span class="hl-7">JSON</span><span class="hl-1">.</span><span class="hl-0">stringify</span><span class="hl-1">({ </span><span class="hl-4">name:</span><span class="hl-1"> </span><span class="hl-2">&#39;test&#39;</span><span class="hl-1"> }),</span><br/><span class="hl-1">});</span>
39
+ </code><button type="button">Copy</button></pre>
40
+
41
+ <a id="graphql-testing" class="tsd-anchor"></a><h4 class="tsd-anchor-link">GraphQL Testing<a href="#graphql-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">LambdaGraphQLTest</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/lambda-test-utils&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">LambdaGraphQLTest</span><span class="hl-1">(</span><span class="hl-4">handler</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default Cognito user for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">cognito:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">username:</span><span class="hl-1"> </span><span class="hl-2">&#39;test-user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">email:</span><span class="hl-1"> </span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">groups:</span><span class="hl-1"> [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a GraphQL query</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">fieldName:</span><span class="hl-1"> </span><span class="hl-2">&#39;getItem&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">arguments:</span><span class="hl-1"> { </span><span class="hl-4">id:</span><span class="hl-1"> </span><span class="hl-2">&#39;123&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
42
+ </code><button type="button">Copy</button></pre>
43
+
44
+ <a id="integtestutil" class="tsd-anchor"></a><h3 class="tsd-anchor-link">IntegTestUtil<a href="#integtestutil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The <code>IntegTestUtil</code> provides a comprehensive set of tools for integration testing your deployed serverless applications. It handles authentication, data cleanup, and API testing.</p>
45
+ <pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">IntegTestUtil</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/integ-test-util&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// Initialize with your stack outputs</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">IntegTestUtil</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">region:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">apiOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">baseURL:</span><span class="hl-1"> </span><span class="hl-2">&#39;https://api.example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-4">authOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">userPoolId:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1_xxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">userPoolClientId:</span><span class="hl-1"> </span><span class="hl-2">&#39;xxxxxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">identityPoolId:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1:xxxxxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-4">datastoreOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">tableName:</span><span class="hl-1"> </span><span class="hl-2">&#39;MyTable&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Create and authenticate a test user</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">createUser</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">&#39;custom:attribute&#39;</span><span class="hl-4">:</span><span class="hl-1"> </span><span class="hl-2">&#39;value&#39;</span><span class="hl-1">,</span><br/><span class="hl-1">}, [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">]);</span><br/><br/><span class="hl-6">// Get an authenticated API client</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">client</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">getAuthenticatedClient</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Make API calls</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">response</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">client</span><span class="hl-1">.</span><span class="hl-0">get</span><span class="hl-1">(</span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Clean up test data</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">cleanupItems</span><span class="hl-1">();</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">removeUser</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">);</span>
46
+ </code><button type="button">Copy</button></pre>
47
+
36
48
  <a id="contribute" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Contribute<a href="#contribute" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><a id="how-to-contribute-to-cdk-serverless" class="tsd-anchor"></a><h3 class="tsd-anchor-link">How to contribute to CDK Serverless<a href="#how-to-contribute-to-cdk-serverless" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><a id="did-you-find-a-bug" class="tsd-anchor"></a><h4 class="tsd-anchor-link"><strong>Did you find a bug?</strong><a href="#did-you-find-a-bug" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><ul>
37
49
  <li>
38
50
  <p><strong>Ensure the bug was not already reported</strong> by searching on GitHub under <a href="https://github.com/taimos/cdk-serverless/issues">Issues</a>.</p>
@@ -62,4 +74,4 @@
62
74
  <li>Just file a PR with your recommended changes</li>
63
75
  </ul>
64
76
  <a id="authors" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Authors<a href="#authors" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Brought to you by <a href="https://taimos.de">Taimos</a></p>
65
- </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#cdk-serverless"><span>CDK <wbr/>Serverless</span></a><ul><li><ul><li><a href="#features"><span>Features</span></a></li></ul></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#adding-projen-constructs"><span>Adding projen constructs</span></a></li><li><a href="#using-the-cdk-serverless-l3-constructs"><span>Using the CDK serverless <wbr/>L3 constructs</span></a></li></ul></li><li><a href="#contribute"><span>Contribute</span></a></li><li><ul><li><a href="#how-to-contribute-to-cdk-serverless"><span>How to contribute to CDK <wbr/>Serverless</span></a></li><li><ul><li><a href="#did-you-find-a-bug"><span>Did you find a bug?</span></a></li><li><a href="#did-you-write-a-patch-that-fixes-a-bug"><span>Did you write a patch that fixes a bug?</span></a></li><li><a href="#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch"><span>Did you fix whitespace, format code, or make a purely cosmetic patch?</span></a></li><li><a href="#do-you-intend-to-add-a-new-feature-or-change-an-existing-one"><span>Do you intend to add a new feature or change an existing one?</span></a></li><li><a href="#do-you-want-to-contribute-to-the-cdk-serverless-documentation"><span>Do you want to contribute to the CDK <wbr/>Serverless documentation?</span></a></li></ul></li></ul></li><li><a href="#authors"><span>Authors</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
77
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#cdk-serverless"><span>CDK <wbr/>Serverless</span></a><ul><li><ul><li><a href="#features"><span>Features</span></a></li></ul></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#adding-projen-constructs"><span>Adding projen constructs</span></a></li><li><a href="#using-the-cdk-serverless-l3-constructs"><span>Using the CDK serverless <wbr/>L3 constructs</span></a></li></ul></li><li><a href="#testing-utilities"><span>Testing <wbr/>Utilities</span></a></li><li><ul><li><a href="#lambdatestutil"><span>Lambda<wbr/>Test<wbr/>Util</span></a></li><li><ul><li><a href="#rest-api-testing"><span>REST API <wbr/>Testing</span></a></li><li><a href="#graphql-testing"><span>GraphQL <wbr/>Testing</span></a></li></ul></li><li><a href="#integtestutil"><span>Integ<wbr/>Test<wbr/>Util</span></a></li></ul></li><li><a href="#contribute"><span>Contribute</span></a></li><li><ul><li><a href="#how-to-contribute-to-cdk-serverless"><span>How to contribute to CDK <wbr/>Serverless</span></a></li><li><ul><li><a href="#did-you-find-a-bug"><span>Did you find a bug?</span></a></li><li><a href="#did-you-write-a-patch-that-fixes-a-bug"><span>Did you write a patch that fixes a bug?</span></a></li><li><a href="#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch"><span>Did you fix whitespace, format code, or make a purely cosmetic patch?</span></a></li><li><a href="#do-you-intend-to-add-a-new-feature-or-change-an-existing-one"><span>Do you intend to add a new feature or change an existing one?</span></a></li><li><a href="#do-you-want-to-contribute-to-the-cdk-serverless-documentation"><span>Do you want to contribute to the CDK <wbr/>Serverless documentation?</span></a></li></ul></li></ul></li><li><a href="#authors"><span>Authors</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -1 +1 @@
1
- window.searchData = "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";
1
+ window.searchData = "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";
@@ -5,7 +5,8 @@ and provides methods to generate TypeScript types and resolvers from a GraphQL s
5
5
  </code><button type="button">Copy</button></pre>
6
6
 
7
7
  </div></div></section><section class="tsd-panel tsd-hierarchy" data-refl="512"><h4>Hierarchy</h4><ul class="tsd-hierarchy"><li class="tsd-hierarchy-item"><span class="tsd-signature-type">Component</span><ul class="tsd-hierarchy"><li class="tsd-hierarchy-item"><span class="tsd-hierarchy-target">GraphQlApi</span></li></ul></li></ul></section><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Constructors</h3><div class="tsd-index-list"><a href="GraphQlApi.html#constructor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a>
8
- </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Properties</h3><div class="tsd-index-list"><a href="GraphQlApi.html#codegenconfigfilename" class="tsd-index-link tsd-is-protected"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>codegen<wbr/>Config<wbr/>File<wbr/>Name</span></a>
8
+ </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Properties</h3><div class="tsd-index-list"><a href="GraphQlApi.html#codegenconfigfile" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>codegen<wbr/>Config<wbr/>File</span></a>
9
+ <a href="GraphQlApi.html#codegenconfigfilename" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>codegen<wbr/>Config<wbr/>File<wbr/>Name</span></a>
9
10
  <a href="GraphQlApi.html#node" class="tsd-index-link tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>node</span></a>
10
11
  <a href="GraphQlApi.html#options" class="tsd-index-link tsd-is-protected"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>options</span></a>
11
12
  <a href="GraphQlApi.html#project" class="tsd-index-link tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>project</span></a>
@@ -15,7 +16,7 @@ and provides methods to generate TypeScript types and resolvers from a GraphQL s
15
16
  <a href="GraphQlApi.html#tostring" class="tsd-index-link tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>to<wbr/>String</span></a>
16
17
  <a href="GraphQlApi.html#iscomponent" class="tsd-index-link tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>is<wbr/>Component</span></a>
17
18
  <a href="GraphQlApi.html#isconstruct" class="tsd-index-link tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>is<wbr/>Construct</span></a>
18
- </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Constructors</h2></summary><section><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructorgraphqlapi" class="tsd-anchor"></a><span class="tsd-signature-keyword">new</span> <span class="tsd-kind-constructor-signature">GraphQlApi</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">app</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">AwsCdkTypeScriptApp</span><span class="tsd-signature-symbol">,</span> <span class="tsd-kind-parameter">options</span><span class="tsd-signature-symbol">:</span> <a href="../interfaces/GraphQlApiOptions.html" class="tsd-signature-type tsd-kind-interface">GraphQlApiOptions</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <a href="GraphQlApi.html" class="tsd-signature-type tsd-kind-class">GraphQlApi</a><a href="#constructorgraphqlapi" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">app</span>: <span class="tsd-signature-type">AwsCdkTypeScriptApp</span></span></li><li><span><span class="tsd-kind-parameter">options</span>: <a href="../interfaces/GraphQlApiOptions.html" class="tsd-signature-type tsd-kind-interface">GraphQlApiOptions</a></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="GraphQlApi.html" class="tsd-signature-type tsd-kind-class">GraphQlApi</a></h4><aside class="tsd-sources"><p>Overrides pj.Component.constructor</p></aside></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Properties"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Properties</h2></summary><section><section class="tsd-panel tsd-member tsd-is-protected"><a id="codegenconfigfilename" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Protected</code> <code class="tsd-tag">Readonly</code><span>codegen<wbr/>Config<wbr/>File<wbr/>Name</span><a href="#codegenconfigfilename" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">codegenConfigFileName</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div></section><section class="tsd-panel tsd-member tsd-is-inherited tsd-is-external"><a id="node" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Readonly</code><span>node</span><a href="#node" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">node</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Node</span></div><div class="tsd-comment tsd-typography"><p>The tree node.</p>
19
+ </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Constructors</h2></summary><section><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructorgraphqlapi" class="tsd-anchor"></a><span class="tsd-signature-keyword">new</span> <span class="tsd-kind-constructor-signature">GraphQlApi</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">app</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">AwsCdkTypeScriptApp</span><span class="tsd-signature-symbol">,</span> <span class="tsd-kind-parameter">options</span><span class="tsd-signature-symbol">:</span> <a href="../interfaces/GraphQlApiOptions.html" class="tsd-signature-type tsd-kind-interface">GraphQlApiOptions</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <a href="GraphQlApi.html" class="tsd-signature-type tsd-kind-class">GraphQlApi</a><a href="#constructorgraphqlapi" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">app</span>: <span class="tsd-signature-type">AwsCdkTypeScriptApp</span></span></li><li><span><span class="tsd-kind-parameter">options</span>: <a href="../interfaces/GraphQlApiOptions.html" class="tsd-signature-type tsd-kind-interface">GraphQlApiOptions</a></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="GraphQlApi.html" class="tsd-signature-type tsd-kind-class">GraphQlApi</a></h4><aside class="tsd-sources"><p>Overrides pj.Component.constructor</p></aside></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Properties"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Properties</h2></summary><section><section class="tsd-panel tsd-member"><a id="codegenconfigfile" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Readonly</code><span>codegen<wbr/>Config<wbr/>File</span><a href="#codegenconfigfile" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">codegenConfigFile</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">YamlFile</span></div></section><section class="tsd-panel tsd-member"><a id="codegenconfigfilename" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Readonly</code><span>codegen<wbr/>Config<wbr/>File<wbr/>Name</span><a href="#codegenconfigfilename" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">codegenConfigFileName</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div></section><section class="tsd-panel tsd-member tsd-is-inherited tsd-is-external"><a id="node" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Readonly</code><span>node</span><a href="#node" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">node</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Node</span></div><div class="tsd-comment tsd-typography"><p>The tree node.</p>
19
20
  </div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><p>Inherited from pj.Component.node</p></aside></section><section class="tsd-panel tsd-member tsd-is-protected"><a id="options" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Protected</code><span>options</span><a href="#options" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">options</span><span class="tsd-signature-symbol">:</span> <a href="../interfaces/GraphQlApiOptions.html" class="tsd-signature-type tsd-kind-interface">GraphQlApiOptions</a></div></section><section class="tsd-panel tsd-member tsd-is-inherited tsd-is-external"><a id="project" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag">Readonly</code><span>project</span><a href="#project" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">project</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Project</span></div><aside class="tsd-sources"><p>Inherited from pj.Component.project</p></aside></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Methods"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Methods</h2></summary><section><section class="tsd-panel tsd-member tsd-is-inherited tsd-is-external"><a id="postsynthesize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>post<wbr/>Synthesize</span><a href="#postsynthesize" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures tsd-is-inherited tsd-is-external"><li class="tsd-signature tsd-anchor-link"><a id="postsynthesize-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">postSynthesize</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span><a href="#postsynthesize-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called after synthesis. Order is <em>not</em> guaranteed.</p>
20
21
  </div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><p>Inherited from pj.Component.postSynthesize</p></aside></li></ul></section><section class="tsd-panel tsd-member tsd-is-inherited tsd-is-external"><a id="presynthesize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>pre<wbr/>Synthesize</span><a href="#presynthesize" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures tsd-is-inherited tsd-is-external"><li class="tsd-signature tsd-anchor-link"><a id="presynthesize-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">preSynthesize</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span><a href="#presynthesize-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called before synthesis.</p>
21
22
  </div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><p>Inherited from pj.Component.preSynthesize</p></aside></li></ul></section><section class="tsd-panel tsd-member tsd-is-inherited tsd-is-external"><a id="synthesize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>synthesize</span><a href="#synthesize" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures tsd-is-inherited tsd-is-external"><li class="tsd-signature tsd-anchor-link"><a id="synthesize-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">synthesize</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span><a href="#synthesize-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Synthesizes files to the project output directory.</p>
@@ -36,4 +37,4 @@ unpredictably. It is safest to avoid using <code>instanceof</code>, and using
36
37
  this type-testing method instead.</p>
37
38
  </div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">x</span>: <span class="tsd-signature-type">any</span></span><div class="tsd-comment tsd-typography"><p>Any object</p>
38
39
  </div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-kind-parameter">x</span> <span class="tsd-signature-keyword">is</span> <span class="tsd-signature-type">Construct</span></h4><p>true if <code>x</code> is an object created from a class which extends <code>Construct</code>.</p>
39
- <div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><p>Inherited from pj.Component.isConstruct</p></aside></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary><div><a href="#codegenconfigfilename" class="tsd-is-protected"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>codegen<wbr/>Config<wbr/>File<wbr/>Name</span></a><a href="#node" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>node</span></a><a href="#options" class="tsd-is-protected"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>options</span></a><a href="#project" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>project</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#postsynthesize" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>post<wbr/>Synthesize</span></a><a href="#presynthesize" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>pre<wbr/>Synthesize</span></a><a href="#synthesize" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>synthesize</span></a><a href="#tostring" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>to<wbr/>String</span></a><a href="#iscomponent" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>is<wbr/>Component</span></a><a href="#isconstruct" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>is<wbr/>Construct</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
40
+ <div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><p>Inherited from pj.Component.isConstruct</p></aside></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Properties</summary><div><a href="#codegenconfigfile" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>codegen<wbr/>Config<wbr/>File</span></a><a href="#codegenconfigfilename" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>codegen<wbr/>Config<wbr/>File<wbr/>Name</span></a><a href="#node" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>node</span></a><a href="#options" class="tsd-is-protected"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>options</span></a><a href="#project" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1024"></use></svg><span>project</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#postsynthesize" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>post<wbr/>Synthesize</span></a><a href="#presynthesize" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>pre<wbr/>Synthesize</span></a><a href="#synthesize" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>synthesize</span></a><a href="#tostring" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>to<wbr/>String</span></a><a href="#iscomponent" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>is<wbr/>Component</span></a><a href="#isconstruct" class="tsd-is-inherited tsd-is-external"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>is<wbr/>Construct</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -33,6 +33,18 @@
33
33
  </code><button type="button">Copy</button></pre>
34
34
 
35
35
  <p>This will also create Lambda functions for all operations defined in your spec and wire them accordingly.</p>
36
+ <a id="testing-utilities" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Testing Utilities<a href="#testing-utilities" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>CDK Serverless provides two powerful test utilities to help you write comprehensive tests for your serverless applications.</p>
37
+ <a id="lambdatestutil" class="tsd-anchor"></a><h3 class="tsd-anchor-link">LambdaTestUtil<a href="#lambdatestutil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The <code>LambdaTestUtil</code> provides classes for testing both REST and GraphQL Lambda functions in isolation. It's perfect for unit testing your Lambda handlers.</p>
38
+ <a id="rest-api-testing" class="tsd-anchor"></a><h4 class="tsd-anchor-link">REST API Testing<a href="#rest-api-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">LambdaRestUnitTest</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/lambda-test-utils&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">LambdaRestUnitTest</span><span class="hl-1">(</span><span class="hl-4">handler</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default headers for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">&#39;Content-Type&#39;</span><span class="hl-4">:</span><span class="hl-1"> </span><span class="hl-2">&#39;application/json&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default Cognito user for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">cognito:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">username:</span><span class="hl-1"> </span><span class="hl-2">&#39;test-user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">email:</span><span class="hl-1"> </span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">groups:</span><span class="hl-1"> [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a GET request</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">path:</span><span class="hl-1"> </span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">method:</span><span class="hl-1"> </span><span class="hl-2">&#39;GET&#39;</span><span class="hl-1">,</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a POST request with body</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">path:</span><span class="hl-1"> </span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">method:</span><span class="hl-1"> </span><span class="hl-2">&#39;POST&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">body:</span><span class="hl-1"> </span><span class="hl-7">JSON</span><span class="hl-1">.</span><span class="hl-0">stringify</span><span class="hl-1">({ </span><span class="hl-4">name:</span><span class="hl-1"> </span><span class="hl-2">&#39;test&#39;</span><span class="hl-1"> }),</span><br/><span class="hl-1">});</span>
39
+ </code><button type="button">Copy</button></pre>
40
+
41
+ <a id="graphql-testing" class="tsd-anchor"></a><h4 class="tsd-anchor-link">GraphQL Testing<a href="#graphql-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">LambdaGraphQLTest</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/lambda-test-utils&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">LambdaGraphQLTest</span><span class="hl-1">(</span><span class="hl-4">handler</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-6">// Optional default Cognito user for all requests</span><br/><span class="hl-1"> </span><span class="hl-4">cognito:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">username:</span><span class="hl-1"> </span><span class="hl-2">&#39;test-user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">email:</span><span class="hl-1"> </span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">groups:</span><span class="hl-1"> [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Test a GraphQL query</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">result</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">call</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">fieldName:</span><span class="hl-1"> </span><span class="hl-2">&#39;getItem&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">arguments:</span><span class="hl-1"> { </span><span class="hl-4">id:</span><span class="hl-1"> </span><span class="hl-2">&#39;123&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
42
+ </code><button type="button">Copy</button></pre>
43
+
44
+ <a id="integtestutil" class="tsd-anchor"></a><h3 class="tsd-anchor-link">IntegTestUtil<a href="#integtestutil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The <code>IntegTestUtil</code> provides a comprehensive set of tools for integration testing your deployed serverless applications. It handles authentication, data cleanup, and API testing.</p>
45
+ <pre><code class="typescript"><span class="hl-3">import</span><span class="hl-1"> { </span><span class="hl-4">IntegTestUtil</span><span class="hl-1"> } </span><span class="hl-3">from</span><span class="hl-1"> </span><span class="hl-2">&#39;cdk-serverless/tests/integ-test-util&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// Initialize with your stack outputs</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">test</span><span class="hl-1"> = </span><span class="hl-5">new</span><span class="hl-1"> </span><span class="hl-0">IntegTestUtil</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">region:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">apiOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">baseURL:</span><span class="hl-1"> </span><span class="hl-2">&#39;https://api.example.com&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-4">authOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">userPoolId:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1_xxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">userPoolClientId:</span><span class="hl-1"> </span><span class="hl-2">&#39;xxxxxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">identityPoolId:</span><span class="hl-1"> </span><span class="hl-2">&#39;us-east-1:xxxxxxxx&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-4">datastoreOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">tableName:</span><span class="hl-1"> </span><span class="hl-2">&#39;MyTable&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Create and authenticate a test user</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">createUser</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">&#39;custom:attribute&#39;</span><span class="hl-4">:</span><span class="hl-1"> </span><span class="hl-2">&#39;value&#39;</span><span class="hl-1">,</span><br/><span class="hl-1">}, [</span><span class="hl-2">&#39;admin&#39;</span><span class="hl-1">]);</span><br/><br/><span class="hl-6">// Get an authenticated API client</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">client</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">getAuthenticatedClient</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Make API calls</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">response</span><span class="hl-1"> = </span><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">client</span><span class="hl-1">.</span><span class="hl-0">get</span><span class="hl-1">(</span><span class="hl-2">&#39;/items&#39;</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Clean up test data</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">cleanupItems</span><span class="hl-1">();</span><br/><span class="hl-3">await</span><span class="hl-1"> </span><span class="hl-4">test</span><span class="hl-1">.</span><span class="hl-0">removeUser</span><span class="hl-1">(</span><span class="hl-2">&#39;test@example.com&#39;</span><span class="hl-1">);</span>
46
+ </code><button type="button">Copy</button></pre>
47
+
36
48
  <a id="contribute" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Contribute<a href="#contribute" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><a id="how-to-contribute-to-cdk-serverless" class="tsd-anchor"></a><h3 class="tsd-anchor-link">How to contribute to CDK Serverless<a href="#how-to-contribute-to-cdk-serverless" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><a id="did-you-find-a-bug" class="tsd-anchor"></a><h4 class="tsd-anchor-link"><strong>Did you find a bug?</strong><a href="#did-you-find-a-bug" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><ul>
37
49
  <li>
38
50
  <p><strong>Ensure the bug was not already reported</strong> by searching on GitHub under <a href="https://github.com/taimos/cdk-serverless/issues">Issues</a>.</p>
@@ -62,4 +74,4 @@
62
74
  <li>Just file a PR with your recommended changes</li>
63
75
  </ul>
64
76
  <a id="authors" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Authors<a href="#authors" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Brought to you by <a href="https://taimos.de">Taimos</a></p>
65
- </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#cdk-serverless"><span>CDK <wbr/>Serverless</span></a><ul><li><ul><li><a href="#features"><span>Features</span></a></li></ul></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#adding-projen-constructs"><span>Adding projen constructs</span></a></li><li><a href="#using-the-cdk-serverless-l3-constructs"><span>Using the CDK serverless <wbr/>L3 constructs</span></a></li></ul></li><li><a href="#contribute"><span>Contribute</span></a></li><li><ul><li><a href="#how-to-contribute-to-cdk-serverless"><span>How to contribute to CDK <wbr/>Serverless</span></a></li><li><ul><li><a href="#did-you-find-a-bug"><span>Did you find a bug?</span></a></li><li><a href="#did-you-write-a-patch-that-fixes-a-bug"><span>Did you write a patch that fixes a bug?</span></a></li><li><a href="#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch"><span>Did you fix whitespace, format code, or make a purely cosmetic patch?</span></a></li><li><a href="#do-you-intend-to-add-a-new-feature-or-change-an-existing-one"><span>Do you intend to add a new feature or change an existing one?</span></a></li><li><a href="#do-you-want-to-contribute-to-the-cdk-serverless-documentation"><span>Do you want to contribute to the CDK <wbr/>Serverless documentation?</span></a></li></ul></li></ul></li><li><a href="#authors"><span>Authors</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
77
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#cdk-serverless"><span>CDK <wbr/>Serverless</span></a><ul><li><ul><li><a href="#features"><span>Features</span></a></li></ul></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#adding-projen-constructs"><span>Adding projen constructs</span></a></li><li><a href="#using-the-cdk-serverless-l3-constructs"><span>Using the CDK serverless <wbr/>L3 constructs</span></a></li></ul></li><li><a href="#testing-utilities"><span>Testing <wbr/>Utilities</span></a></li><li><ul><li><a href="#lambdatestutil"><span>Lambda<wbr/>Test<wbr/>Util</span></a></li><li><ul><li><a href="#rest-api-testing"><span>REST API <wbr/>Testing</span></a></li><li><a href="#graphql-testing"><span>GraphQL <wbr/>Testing</span></a></li></ul></li><li><a href="#integtestutil"><span>Integ<wbr/>Test<wbr/>Util</span></a></li></ul></li><li><a href="#contribute"><span>Contribute</span></a></li><li><ul><li><a href="#how-to-contribute-to-cdk-serverless"><span>How to contribute to CDK <wbr/>Serverless</span></a></li><li><ul><li><a href="#did-you-find-a-bug"><span>Did you find a bug?</span></a></li><li><a href="#did-you-write-a-patch-that-fixes-a-bug"><span>Did you write a patch that fixes a bug?</span></a></li><li><a href="#did-you-fix-whitespace-format-code-or-make-a-purely-cosmetic-patch"><span>Did you fix whitespace, format code, or make a purely cosmetic patch?</span></a></li><li><a href="#do-you-intend-to-add-a-new-feature-or-change-an-existing-one"><span>Do you intend to add a new feature or change an existing one?</span></a></li><li><a href="#do-you-want-to-contribute-to-the-cdk-serverless-documentation"><span>Do you want to contribute to the CDK <wbr/>Serverless documentation?</span></a></li></ul></li></ul></li><li><a href="#authors"><span>Authors</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">cdk-serverless</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -0,0 +1,24 @@
1
+ scalar AWSTime
2
+ scalar AWSDate
3
+ scalar AWSDateTime
4
+ scalar AWSTimestamp
5
+ scalar AWSEmail
6
+ scalar AWSJSON
7
+ scalar AWSURL
8
+ scalar AWSPhone
9
+ scalar AWSIPAddress
10
+ scalar BigInt
11
+ scalar Double
12
+
13
+ directive @aws_subscribe(mutations: [String!]!) on FIELD_DEFINITION
14
+
15
+ # Allows transformer libraries to deprecate directive arguments.
16
+ directive @deprecated(reason: String!) on INPUT_FIELD_DEFINITION | ENUM
17
+
18
+ directive @aws_auth(cognito_groups: [String!]!) on FIELD_DEFINITION
19
+ directive @aws_api_key on FIELD_DEFINITION | OBJECT
20
+ directive @aws_iam on FIELD_DEFINITION | OBJECT
21
+ directive @aws_oidc on FIELD_DEFINITION | OBJECT
22
+ directive @aws_cognito_user_pools(
23
+ cognito_groups: [String!]
24
+ ) on FIELD_DEFINITION | OBJECT
@@ -16,6 +16,7 @@ export interface GraphQlApiOptions {
16
16
  */
17
17
  export declare class GraphQlApi extends pj.Component {
18
18
  protected options: GraphQlApiOptions;
19
- protected readonly codegenConfigFileName: string;
19
+ readonly codegenConfigFileName: string;
20
+ readonly codegenConfigFile: pj.YamlFile;
20
21
  constructor(app: pj.awscdk.AwsCdkTypeScriptApp, options: GraphQlApiOptions);
21
22
  }
@@ -60,12 +60,23 @@ class GraphQlApi extends pj.Component {
60
60
  });
61
61
  app.preCompileTask.prependSpawn(generateTask);
62
62
  const codegenConfig = {
63
- schema: this.options.definitionFile,
63
+ schema: [
64
+ this.options.definitionFile,
65
+ 'node_modules/cdk-serverless/files/aws.graphql',
66
+ ],
64
67
  config: {
65
68
  scalars: {
66
69
  AWSDate: 'string',
67
70
  AWSURL: 'string',
71
+ AWSEmail: 'string',
72
+ AWSTime: 'string',
73
+ AWSDateTime: 'string',
74
+ AWSTimestamp: 'string',
75
+ AWSPhone: 'string',
76
+ AWSIPAddress: 'string',
77
+ AWSJSON: 'string',
68
78
  },
79
+ maybeValue: 'T | undefined',
69
80
  },
70
81
  generates: {
71
82
  [`./src/generated/graphql.${this.options.apiName.toLowerCase()}-model.generated.ts`]: {
@@ -73,7 +84,7 @@ class GraphQlApi extends pj.Component {
73
84
  },
74
85
  },
75
86
  };
76
- new pj.YamlFile(this.project, this.codegenConfigFileName, {
87
+ this.codegenConfigFile = new pj.YamlFile(this.project, this.codegenConfigFileName, {
77
88
  obj: codegenConfig,
78
89
  });
79
90
  const constructFile = new pj.TextFile(this.project, `src/generated/graphql.${this.options.apiName.toLowerCase()}-api.generated.ts`);
@@ -111,4 +122,4 @@ type User {
111
122
  }
112
123
  }
113
124
  exports.GraphQlApi = GraphQlApi;
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZW4vZ3JhcGhxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsaUNBQXNDO0FBT3RDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLFVBQVcsU0FBUSxFQUFFLENBQUMsU0FBUztJQUkxQyxZQUFZLEdBQWtDLEVBQVksT0FBMEI7UUFDbEYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRDZDLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBR2xGLEdBQUcsQ0FBQyxVQUFVLENBQ1osc0JBQXNCLEVBQ3RCLDZCQUE2QixFQUM3Qix1Q0FBdUMsRUFDdkMsbUJBQW1CLEVBQ25CLG1CQUFtQixDQUNwQixDQUFDO1FBQ0YsR0FBRyxDQUFDLE9BQU8sQ0FDVCxTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixHQUFHLG1CQUFtQixPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFDcEYsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO1lBQ2hGLElBQUksRUFBRSxzQkFBc0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3hELFdBQVcsRUFBRSwrQ0FBK0M7U0FDN0QsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFOUMsTUFBTSxhQUFhLEdBQUc7WUFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYztZQUNuQyxNQUFNLEVBQUU7Z0JBQ04sT0FBTyxFQUFFO29CQUNQLE9BQU8sRUFBRSxRQUFRO29CQUNqQixNQUFNLEVBQUUsUUFBUTtpQkFDakI7YUFDRjtZQUNELFNBQVMsRUFBRTtnQkFDVCxDQUFDLDJCQUEyQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsRUFBRTtvQkFDcEYsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDO2lCQUNoRDthQUNGO1NBQ0YsQ0FBQztRQUVGLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN4RCxHQUFHLEVBQUUsYUFBYTtTQUNuQixDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDcEksYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNOzs7K0NBR0wsbUJBQVk7dUNBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTs7bUJBRXRELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzs7OztlQUl4QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87O3FEQUVrQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87OztrQkFHdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPOzZCQUNULElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYzs7OztFQUl0RCxDQUFDLENBQUM7UUFFQSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtZQUMzRCxRQUFRLEVBQUU7Ozs7Ozs7RUFPZDtTQUNHLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FFRjtBQWpGRCxnQ0FpRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwaiBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgUEFDS0FHRV9OQU1FIH0gZnJvbSAnLi9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFsQXBpT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFwaU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVmaW5pdGlvbkZpbGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgR3JhcGhRbEFwaSBjb25zdHJ1Y3Qgc2V0cyB1cCBhIEdyYXBoUUwgQVBJIGZvciBhIHNlcnZlcmxlc3MgcHJvamVjdCB1c2luZyBwcm9qZW4uXG4gKiBUaGlzIGNvbnN0cnVjdCBleHRlbmRzIHRoZSBwcm9qZW4gQ29tcG9uZW50IHRvIGluY2x1ZGUgZGVwZW5kZW5jaWVzIGFuZCBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgZm9yIEdyYXBoUUxcbiAqIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIGdlbmVyYXRlIFR5cGVTY3JpcHQgdHlwZXMgYW5kIHJlc29sdmVycyBmcm9tIGEgR3JhcGhRTCBzY2hlbWEgZGVmaW5pdGlvbiBmaWxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBncmFwaFFsQXBpID0gbmV3IEdyYXBoUWxBcGkoYXBwLCB7XG4gKiAgIGFwaU5hbWU6ICdNeUdyYXBoUWxBcGknLFxuICogICBkZWZpbml0aW9uRmlsZTogJ3NyYy9ncmFwaHFsL3NjaGVtYS5ncmFwaHFsJyxcbiAqIH0pO1xuICovXG5leHBvcnQgY2xhc3MgR3JhcGhRbEFwaSBleHRlbmRzIHBqLkNvbXBvbmVudCB7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvZGVnZW5Db25maWdGaWxlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFwcDogcGouYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByb3RlY3RlZCBvcHRpb25zOiBHcmFwaFFsQXBpT3B0aW9ucykge1xuICAgIHN1cGVyKGFwcCk7XG5cbiAgICBhcHAuYWRkRGV2RGVwcyhcbiAgICAgICdAZ3JhcGhxbC1jb2RlZ2VuL2NsaScsXG4gICAgICAnQGdyYXBocWwtY29kZWdlbi90eXBlc2NyaXB0JyxcbiAgICAgICdAZ3JhcGhxbC1jb2RlZ2VuL3R5cGVzY3JpcHQtcmVzb2x2ZXJzJyxcbiAgICAgICdAdHlwZXMvYXdzLWxhbWJkYScsXG4gICAgICAnQHR5cGVzL2xhbWJkYS1sb2cnLFxuICAgICk7XG4gICAgYXBwLmFkZERlcHMoXG4gICAgICAnZ3JhcGhxbCcsXG4gICAgICAnQGF3cy1hcHBzeW5jL3V0aWxzJyxcbiAgICAgICdlc2J1aWxkJyxcbiAgICApO1xuXG4gICAgdGhpcy5jb2RlZ2VuQ29uZmlnRmlsZU5hbWUgPSBgZ3JhcGhxbC1jb2RlZ2VuLiR7b3B0aW9ucy5hcGlOYW1lLnRvTG93ZXJDYXNlKCl9LnltbGA7XG4gICAgY29uc3QgZ2VuZXJhdGVUYXNrID0gYXBwLmFkZFRhc2soYGdlbmVyYXRlOmFwaToke29wdGlvbnMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfWAsIHtcbiAgICAgIGV4ZWM6IGBncmFwaHFsLWNvZGVnZW4gLWMgJHt0aGlzLmNvZGVnZW5Db25maWdGaWxlTmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246ICdHZW5lcmF0ZSBUeXBlcyBmcm9tIHRoZSBHcmFwaFFMIHNwZWNpZmljYXRpb24nLFxuICAgIH0pO1xuICAgIGFwcC5wcmVDb21waWxlVGFzay5wcmVwZW5kU3Bhd24oZ2VuZXJhdGVUYXNrKTtcblxuICAgIGNvbnN0IGNvZGVnZW5Db25maWcgPSB7XG4gICAgICBzY2hlbWE6IHRoaXMub3B0aW9ucy5kZWZpbml0aW9uRmlsZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBzY2FsYXJzOiB7XG4gICAgICAgICAgQVdTRGF0ZTogJ3N0cmluZycsXG4gICAgICAgICAgQVdTVVJMOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBnZW5lcmF0ZXM6IHtcbiAgICAgICAgW2AuL3NyYy9nZW5lcmF0ZWQvZ3JhcGhxbC4ke3RoaXMub3B0aW9ucy5hcGlOYW1lLnRvTG93ZXJDYXNlKCl9LW1vZGVsLmdlbmVyYXRlZC50c2BdOiB7XG4gICAgICAgICAgcGx1Z2luczogWyd0eXBlc2NyaXB0JywgJ3R5cGVzY3JpcHQtcmVzb2x2ZXJzJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBuZXcgcGouWWFtbEZpbGUodGhpcy5wcm9qZWN0LCB0aGlzLmNvZGVnZW5Db25maWdGaWxlTmFtZSwge1xuICAgICAgb2JqOiBjb2RlZ2VuQ29uZmlnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29uc3RydWN0RmlsZSA9IG5ldyBwai5UZXh0RmlsZSh0aGlzLnByb2plY3QsIGBzcmMvZ2VuZXJhdGVkL2dyYXBocWwuJHt0aGlzLm9wdGlvbnMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS1hcGkuZ2VuZXJhdGVkLnRzYCk7XG4gICAgY29uc3RydWN0RmlsZS5hZGRMaW5lKGAvLyAke2NvbnN0cnVjdEZpbGUubWFya2VyfVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgR3JhcGhRbEFwaSwgR3JhcGhRbEFwaVByb3BzIH0gZnJvbSAnJHtQQUNLQUdFX05BTUV9L2xpYi9jb25zdHJ1Y3RzJztcbmltcG9ydCB7IFJlc29sdmVycyB9IGZyb20gJy4vZ3JhcGhxbC4ke3RoaXMub3B0aW9ucy5hcGlOYW1lLnRvTG93ZXJDYXNlKCl9LW1vZGVsLmdlbmVyYXRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJHt0aGlzLm9wdGlvbnMuYXBpTmFtZX1HcmFwaFFsQXBpUHJvcHMgZXh0ZW5kcyBPbWl0PEdyYXBoUWxBcGlQcm9wcywgJ2RlZmluaXRpb25GaWxlTmFtZScgfCAnYXBpTmFtZSc+IHtcbiAgLy9cbn1cblxuZXhwb3J0IGNsYXNzICR7dGhpcy5vcHRpb25zLmFwaU5hbWV9R3JhcGhRbEFwaSBleHRlbmRzIEdyYXBoUWxBcGk8UmVzb2x2ZXJzPiB7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6ICR7dGhpcy5vcHRpb25zLmFwaU5hbWV9R3JhcGhRbEFwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGFwaU5hbWU6ICcke3RoaXMub3B0aW9ucy5hcGlOYW1lfScsXG4gICAgICBkZWZpbml0aW9uRmlsZU5hbWU6ICcke3RoaXMub3B0aW9ucy5kZWZpbml0aW9uRmlsZX0nLFxuICAgIH0pO1xuICB9XG5cbn1gKTtcblxuICAgIG5ldyBwai5TYW1wbGVGaWxlKHRoaXMucHJvamVjdCwgdGhpcy5vcHRpb25zLmRlZmluaXRpb25GaWxlLCB7XG4gICAgICBjb250ZW50czogYHR5cGUgUXVlcnkge1xuICB1c2VyczogW1VzZXJdXG59XG5cbnR5cGUgVXNlciB7XG4gIGlkOiBJRCFcbiAgbmFtZTogU3RyaW5nXG59YCxcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZW4vZ3JhcGhxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsaUNBQXNDO0FBT3RDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLFVBQVcsU0FBUSxFQUFFLENBQUMsU0FBUztJQUsxQyxZQUFZLEdBQWtDLEVBQVksT0FBMEI7UUFDbEYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRDZDLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBR2xGLEdBQUcsQ0FBQyxVQUFVLENBQ1osc0JBQXNCLEVBQ3RCLDZCQUE2QixFQUM3Qix1Q0FBdUMsRUFDdkMsbUJBQW1CLEVBQ25CLG1CQUFtQixDQUNwQixDQUFDO1FBQ0YsR0FBRyxDQUFDLE9BQU8sQ0FDVCxTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixHQUFHLG1CQUFtQixPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFDcEYsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO1lBQ2hGLElBQUksRUFBRSxzQkFBc0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3hELFdBQVcsRUFBRSwrQ0FBK0M7U0FDN0QsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFOUMsTUFBTSxhQUFhLEdBQUc7WUFDcEIsTUFBTSxFQUFFO2dCQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYztnQkFDM0IsK0NBQStDO2FBQ2hEO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUUsUUFBUTtvQkFDakIsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLFFBQVEsRUFBRSxRQUFRO29CQUNsQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsV0FBVyxFQUFFLFFBQVE7b0JBQ3JCLFlBQVksRUFBRSxRQUFRO29CQUN0QixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsWUFBWSxFQUFFLFFBQVE7b0JBQ3RCLE9BQU8sRUFBRSxRQUFRO2lCQUNsQjtnQkFDRCxVQUFVLEVBQUUsZUFBZTthQUM1QjtZQUNELFNBQVMsRUFBRTtnQkFDVCxDQUFDLDJCQUEyQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsRUFBRTtvQkFDcEYsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDO2lCQUNoRDthQUNGO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDakYsR0FBRyxFQUFFLGFBQWE7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3BJLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTTs7OytDQUdMLG1CQUFZO3VDQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7O21CQUV0RCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87Ozs7ZUFJeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPOztxREFFa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPOzs7a0JBR3ZELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzs2QkFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWM7Ozs7RUFJdEQsQ0FBQyxDQUFDO1FBRUEsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDM0QsUUFBUSxFQUFFOzs7Ozs7O0VBT2Q7U0FDRyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBRUY7QUE3RkQsZ0NBNkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGogZnJvbSAncHJvamVuJztcbmltcG9ydCB7IFBBQ0tBR0VfTkFNRSB9IGZyb20gJy4vY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhRbEFwaU9wdGlvbnMge1xuICByZWFkb25seSBhcGlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlZmluaXRpb25GaWxlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIEdyYXBoUWxBcGkgY29uc3RydWN0IHNldHMgdXAgYSBHcmFwaFFMIEFQSSBmb3IgYSBzZXJ2ZXJsZXNzIHByb2plY3QgdXNpbmcgcHJvamVuLlxuICogVGhpcyBjb25zdHJ1Y3QgZXh0ZW5kcyB0aGUgcHJvamVuIENvbXBvbmVudCB0byBpbmNsdWRlIGRlcGVuZGVuY2llcyBhbmQgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzIHJlcXVpcmVkIGZvciBHcmFwaFFMXG4gKiBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBnZW5lcmF0ZSBUeXBlU2NyaXB0IHR5cGVzIGFuZCByZXNvbHZlcnMgZnJvbSBhIEdyYXBoUUwgc2NoZW1hIGRlZmluaXRpb24gZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZ3JhcGhRbEFwaSA9IG5ldyBHcmFwaFFsQXBpKGFwcCwge1xuICogICBhcGlOYW1lOiAnTXlHcmFwaFFsQXBpJyxcbiAqICAgZGVmaW5pdGlvbkZpbGU6ICdzcmMvZ3JhcGhxbC9zY2hlbWEuZ3JhcGhxbCcsXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoUWxBcGkgZXh0ZW5kcyBwai5Db21wb25lbnQge1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2RlZ2VuQ29uZmlnRmlsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNvZGVnZW5Db25maWdGaWxlOiBwai5ZYW1sRmlsZTtcblxuICBjb25zdHJ1Y3RvcihhcHA6IHBqLmF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwLCBwcm90ZWN0ZWQgb3B0aW9uczogR3JhcGhRbEFwaU9wdGlvbnMpIHtcbiAgICBzdXBlcihhcHApO1xuXG4gICAgYXBwLmFkZERldkRlcHMoXG4gICAgICAnQGdyYXBocWwtY29kZWdlbi9jbGknLFxuICAgICAgJ0BncmFwaHFsLWNvZGVnZW4vdHlwZXNjcmlwdCcsXG4gICAgICAnQGdyYXBocWwtY29kZWdlbi90eXBlc2NyaXB0LXJlc29sdmVycycsXG4gICAgICAnQHR5cGVzL2F3cy1sYW1iZGEnLFxuICAgICAgJ0B0eXBlcy9sYW1iZGEtbG9nJyxcbiAgICApO1xuICAgIGFwcC5hZGREZXBzKFxuICAgICAgJ2dyYXBocWwnLFxuICAgICAgJ0Bhd3MtYXBwc3luYy91dGlscycsXG4gICAgICAnZXNidWlsZCcsXG4gICAgKTtcblxuICAgIHRoaXMuY29kZWdlbkNvbmZpZ0ZpbGVOYW1lID0gYGdyYXBocWwtY29kZWdlbi4ke29wdGlvbnMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS55bWxgO1xuICAgIGNvbnN0IGdlbmVyYXRlVGFzayA9IGFwcC5hZGRUYXNrKGBnZW5lcmF0ZTphcGk6JHtvcHRpb25zLmFwaU5hbWUudG9Mb3dlckNhc2UoKX1gLCB7XG4gICAgICBleGVjOiBgZ3JhcGhxbC1jb2RlZ2VuIC1jICR7dGhpcy5jb2RlZ2VuQ29uZmlnRmlsZU5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnR2VuZXJhdGUgVHlwZXMgZnJvbSB0aGUgR3JhcGhRTCBzcGVjaWZpY2F0aW9uJyxcbiAgICB9KTtcbiAgICBhcHAucHJlQ29tcGlsZVRhc2sucHJlcGVuZFNwYXduKGdlbmVyYXRlVGFzayk7XG5cbiAgICBjb25zdCBjb2RlZ2VuQ29uZmlnID0ge1xuICAgICAgc2NoZW1hOiBbXG4gICAgICAgIHRoaXMub3B0aW9ucy5kZWZpbml0aW9uRmlsZSxcbiAgICAgICAgJ25vZGVfbW9kdWxlcy9jZGstc2VydmVybGVzcy9maWxlcy9hd3MuZ3JhcGhxbCcsXG4gICAgICBdLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgICBBV1NEYXRlOiAnc3RyaW5nJyxcbiAgICAgICAgICBBV1NVUkw6ICdzdHJpbmcnLFxuICAgICAgICAgIEFXU0VtYWlsOiAnc3RyaW5nJyxcbiAgICAgICAgICBBV1NUaW1lOiAnc3RyaW5nJyxcbiAgICAgICAgICBBV1NEYXRlVGltZTogJ3N0cmluZycsXG4gICAgICAgICAgQVdTVGltZXN0YW1wOiAnc3RyaW5nJyxcbiAgICAgICAgICBBV1NQaG9uZTogJ3N0cmluZycsXG4gICAgICAgICAgQVdTSVBBZGRyZXNzOiAnc3RyaW5nJyxcbiAgICAgICAgICBBV1NKU09OOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWF5YmVWYWx1ZTogJ1QgfCB1bmRlZmluZWQnLFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlczoge1xuICAgICAgICBbYC4vc3JjL2dlbmVyYXRlZC9ncmFwaHFsLiR7dGhpcy5vcHRpb25zLmFwaU5hbWUudG9Mb3dlckNhc2UoKX0tbW9kZWwuZ2VuZXJhdGVkLnRzYF06IHtcbiAgICAgICAgICBwbHVnaW5zOiBbJ3R5cGVzY3JpcHQnLCAndHlwZXNjcmlwdC1yZXNvbHZlcnMnXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMuY29kZWdlbkNvbmZpZ0ZpbGUgPSBuZXcgcGouWWFtbEZpbGUodGhpcy5wcm9qZWN0LCB0aGlzLmNvZGVnZW5Db25maWdGaWxlTmFtZSwge1xuICAgICAgb2JqOiBjb2RlZ2VuQ29uZmlnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29uc3RydWN0RmlsZSA9IG5ldyBwai5UZXh0RmlsZSh0aGlzLnByb2plY3QsIGBzcmMvZ2VuZXJhdGVkL2dyYXBocWwuJHt0aGlzLm9wdGlvbnMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS1hcGkuZ2VuZXJhdGVkLnRzYCk7XG4gICAgY29uc3RydWN0RmlsZS5hZGRMaW5lKGAvLyAke2NvbnN0cnVjdEZpbGUubWFya2VyfVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgR3JhcGhRbEFwaSwgR3JhcGhRbEFwaVByb3BzIH0gZnJvbSAnJHtQQUNLQUdFX05BTUV9L2xpYi9jb25zdHJ1Y3RzJztcbmltcG9ydCB7IFJlc29sdmVycyB9IGZyb20gJy4vZ3JhcGhxbC4ke3RoaXMub3B0aW9ucy5hcGlOYW1lLnRvTG93ZXJDYXNlKCl9LW1vZGVsLmdlbmVyYXRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJHt0aGlzLm9wdGlvbnMuYXBpTmFtZX1HcmFwaFFsQXBpUHJvcHMgZXh0ZW5kcyBPbWl0PEdyYXBoUWxBcGlQcm9wcywgJ2RlZmluaXRpb25GaWxlTmFtZScgfCAnYXBpTmFtZSc+IHtcbiAgLy9cbn1cblxuZXhwb3J0IGNsYXNzICR7dGhpcy5vcHRpb25zLmFwaU5hbWV9R3JhcGhRbEFwaSBleHRlbmRzIEdyYXBoUWxBcGk8UmVzb2x2ZXJzPiB7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6ICR7dGhpcy5vcHRpb25zLmFwaU5hbWV9R3JhcGhRbEFwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGFwaU5hbWU6ICcke3RoaXMub3B0aW9ucy5hcGlOYW1lfScsXG4gICAgICBkZWZpbml0aW9uRmlsZU5hbWU6ICcke3RoaXMub3B0aW9ucy5kZWZpbml0aW9uRmlsZX0nLFxuICAgIH0pO1xuICB9XG5cbn1gKTtcblxuICAgIG5ldyBwai5TYW1wbGVGaWxlKHRoaXMucHJvamVjdCwgdGhpcy5vcHRpb25zLmRlZmluaXRpb25GaWxlLCB7XG4gICAgICBjb250ZW50czogYHR5cGUgUXVlcnkge1xuICB1c2VyczogW1VzZXJdXG59XG5cbnR5cGUgVXNlciB7XG4gIGlkOiBJRCFcbiAgbmFtZTogU3RyaW5nXG59YCxcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=
@@ -1 +1,2 @@
1
1
  export * from './integ-test-util';
2
+ export * from './lambda-test-utils';
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./integ-test-util"), exports);
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaW50ZWctdGVzdC11dGlsJzsiXX0=
18
+ __exportStar(require("./lambda-test-utils"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFrQztBQUNsQyxzREFBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ludGVnLXRlc3QtdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2xhbWJkYS10ZXN0LXV0aWxzJzsiXX0=
@@ -0,0 +1,44 @@
1
+ import { APIGatewayProxyEventMultiValueQueryStringParameters, APIGatewayProxyEventPathParameters, APIGatewayProxyResult, Context } from 'aws-lambda';
2
+ import { APIGatewayv1Handler } from '../lambda/handler';
3
+ export interface CognitoUser {
4
+ email: string;
5
+ username: string;
6
+ groups: string[];
7
+ }
8
+ export interface LambdaRestTestOptionsBase {
9
+ headers?: Record<string, string>;
10
+ cognito?: CognitoUser;
11
+ }
12
+ export interface LambdaRestTestOptions extends LambdaRestTestOptionsBase {
13
+ path?: string;
14
+ method?: string;
15
+ body?: string;
16
+ pathParameters?: APIGatewayProxyEventPathParameters;
17
+ queryStringParameters?: APIGatewayProxyEventMultiValueQueryStringParameters;
18
+ }
19
+ export declare function createContext(): Context;
20
+ export declare class LambdaRestUnitTest {
21
+ private handler;
22
+ private defaults?;
23
+ constructor(handler: APIGatewayv1Handler, defaults?: LambdaRestTestOptionsBase | undefined);
24
+ private createRestEvent;
25
+ call(options?: LambdaRestTestOptions): Promise<APIGatewayProxyResult>;
26
+ }
27
+ export interface LambdaGraphQLTestOptionsBase {
28
+ cognito?: CognitoUser;
29
+ stash?: Record<string, any>;
30
+ }
31
+ export interface LambdaGraphQLTestOptions extends LambdaGraphQLTestOptionsBase {
32
+ fieldName?: string;
33
+ arguments?: Record<string, any>;
34
+ source?: any;
35
+ parentTypeName?: string;
36
+ prevResult?: Record<string, any>;
37
+ }
38
+ export declare class LambdaGraphQLTest {
39
+ private handler;
40
+ private defaults?;
41
+ constructor(handler: AWSLambda.AppSyncResolverHandler<any, any>, defaults?: LambdaGraphQLTestOptionsBase | undefined);
42
+ private createGraphQLEvent;
43
+ call(options: LambdaGraphQLTestOptions): Promise<any>;
44
+ }
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LambdaGraphQLTest = exports.LambdaRestUnitTest = void 0;
4
+ exports.createContext = createContext;
5
+ function createContext() {
6
+ return {
7
+ callbackWaitsForEmptyEventLoop: false,
8
+ functionName: 'test',
9
+ functionVersion: '1',
10
+ invokedFunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:test',
11
+ memoryLimitInMB: '1024',
12
+ awsRequestId: 'requestId',
13
+ logGroupName: 'logGroupName',
14
+ logStreamName: 'logStreamName',
15
+ getRemainingTimeInMillis: () => 1000,
16
+ done: jest.fn(),
17
+ fail: jest.fn(),
18
+ succeed: jest.fn(),
19
+ identity: undefined,
20
+ clientContext: undefined,
21
+ };
22
+ }
23
+ class LambdaRestUnitTest {
24
+ constructor(handler, defaults) {
25
+ this.handler = handler;
26
+ this.defaults = defaults;
27
+ }
28
+ createRestEvent(options = {}) {
29
+ var _a, _b, _c, _d;
30
+ const { path = '/', method = 'GET', body = '', } = options;
31
+ const headers = {
32
+ ...(_a = this.defaults) === null || _a === void 0 ? void 0 : _a.headers,
33
+ ...options.headers,
34
+ };
35
+ const cognitoClaims = {
36
+ username: 'DummyUser',
37
+ email: 'dummy@example.com',
38
+ groups: [],
39
+ ...(_b = this.defaults) === null || _b === void 0 ? void 0 : _b.cognito,
40
+ ...options.cognito,
41
+ };
42
+ return {
43
+ body,
44
+ headers,
45
+ multiValueHeaders: Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, value ? [value] : []])),
46
+ httpMethod: method,
47
+ isBase64Encoded: false,
48
+ path,
49
+ pathParameters: (_c = options.pathParameters) !== null && _c !== void 0 ? _c : null,
50
+ queryStringParameters: options.queryStringParameters ? Object.fromEntries(Object.entries(options.queryStringParameters).map(([key, value]) => [key, value === null || value === void 0 ? void 0 : value.join(',')])) : null,
51
+ multiValueQueryStringParameters: (_d = options.queryStringParameters) !== null && _d !== void 0 ? _d : null,
52
+ stageVariables: null,
53
+ requestContext: {
54
+ accountId: '123456789012',
55
+ apiId: 'appId',
56
+ authorizer: {
57
+ claims: {
58
+ 'sub': cognitoClaims.username,
59
+ 'cognito:username': cognitoClaims.username,
60
+ 'cognito:groups': (cognitoClaims.groups),
61
+ 'email': cognitoClaims.email,
62
+ },
63
+ },
64
+ protocol: 'HTTP/1.1',
65
+ httpMethod: method,
66
+ identity: {
67
+ accessKey: null,
68
+ accountId: '123456789012',
69
+ apiKey: null,
70
+ apiKeyId: null,
71
+ caller: null,
72
+ clientCert: null,
73
+ cognitoAuthenticationProvider: null,
74
+ cognitoAuthenticationType: null,
75
+ cognitoIdentityId: null,
76
+ cognitoIdentityPoolId: null,
77
+ principalOrgId: null,
78
+ sourceIp: '',
79
+ user: null,
80
+ userAgent: null,
81
+ userArn: null,
82
+ },
83
+ path,
84
+ stage: 'prod',
85
+ requestId: 'requestId',
86
+ requestTimeEpoch: 0,
87
+ resourceId: '',
88
+ resourcePath: '',
89
+ },
90
+ resource: '',
91
+ };
92
+ }
93
+ async call(options = {}) {
94
+ const event = this.createRestEvent(options);
95
+ const context = createContext();
96
+ const result = await this.handler(event, context, () => { });
97
+ if (!result) {
98
+ throw new Error('No result returned from lambda');
99
+ }
100
+ return result;
101
+ }
102
+ }
103
+ exports.LambdaRestUnitTest = LambdaRestUnitTest;
104
+ class LambdaGraphQLTest {
105
+ constructor(handler, defaults) {
106
+ this.handler = handler;
107
+ this.defaults = defaults;
108
+ }
109
+ createGraphQLEvent(options) {
110
+ var _a, _b;
111
+ const { fieldName = 'testField', arguments: args = {}, source = null, parentTypeName = 'Query', prevResult = {}, stash = {}, } = options;
112
+ const cognitoClaims = {
113
+ username: 'DummyUser',
114
+ email: 'dummy@example.com',
115
+ groups: [],
116
+ ...(_a = this.defaults) === null || _a === void 0 ? void 0 : _a.cognito,
117
+ ...options.cognito,
118
+ };
119
+ return {
120
+ arguments: args,
121
+ source,
122
+ info: {
123
+ fieldName,
124
+ parentTypeName,
125
+ selectionSetGraphQL: '',
126
+ selectionSetList: [],
127
+ variables: {},
128
+ },
129
+ request: {
130
+ domainName: null,
131
+ headers: {},
132
+ },
133
+ identity: {
134
+ claims: {
135
+ 'sub': cognitoClaims.username,
136
+ 'cognito:username': cognitoClaims.username,
137
+ 'cognito:groups': cognitoClaims.groups,
138
+ 'email': cognitoClaims.email,
139
+ },
140
+ groups: cognitoClaims.groups,
141
+ sub: cognitoClaims.username,
142
+ accountId: '123456789012',
143
+ cognitoIdentityAuthProvider: null,
144
+ cognitoIdentityAuthType: null,
145
+ cognitoIdentityId: null,
146
+ cognitoIdentityPoolId: null,
147
+ resolverContext: null,
148
+ userArn: null,
149
+ defaultAuthStrategy: 'ALLOW',
150
+ issuer: 'https://cognito-idp.region.amazonaws.com/userPoolId',
151
+ sourceIp: ['127.0.0.1'],
152
+ username: cognitoClaims.username,
153
+ },
154
+ prev: {
155
+ result: prevResult,
156
+ },
157
+ stash: {
158
+ ...(_b = this.defaults) === null || _b === void 0 ? void 0 : _b.stash,
159
+ ...stash,
160
+ },
161
+ };
162
+ }
163
+ async call(options) {
164
+ const event = this.createGraphQLEvent(options);
165
+ const context = createContext();
166
+ const result = await this.handler(event, context, () => { });
167
+ if (!result) {
168
+ throw new Error('No result returned from lambda');
169
+ }
170
+ return result;
171
+ }
172
+ }
173
+ exports.LambdaGraphQLTest = LambdaGraphQLTest;
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLXRlc3QtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvbGFtYmRhLXRlc3QtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUJBLHNDQWlCQztBQWpCRCxTQUFnQixhQUFhO0lBQzNCLE9BQU87UUFDTCw4QkFBOEIsRUFBRSxLQUFLO1FBQ3JDLFlBQVksRUFBRSxNQUFNO1FBQ3BCLGVBQWUsRUFBRSxHQUFHO1FBQ3BCLGtCQUFrQixFQUFFLHFEQUFxRDtRQUN6RSxlQUFlLEVBQUUsTUFBTTtRQUN2QixZQUFZLEVBQUUsV0FBVztRQUN6QixZQUFZLEVBQUUsY0FBYztRQUM1QixhQUFhLEVBQUUsZUFBZTtRQUM5Qix3QkFBd0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNsQixRQUFRLEVBQUUsU0FBUztRQUNuQixhQUFhLEVBQUUsU0FBUztLQUN6QixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQWEsa0JBQWtCO0lBRTdCLFlBQ1UsT0FBNEIsRUFDNUIsUUFBb0M7UUFEcEMsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBNEI7SUFDMUMsQ0FBQztJQUVHLGVBQWUsQ0FBQyxVQUFpQyxFQUFFOztRQUN6RCxNQUFNLEVBQ0osSUFBSSxHQUFHLEdBQUcsRUFDVixNQUFNLEdBQUcsS0FBSyxFQUNkLElBQUksR0FBRyxFQUFFLEdBQ1YsR0FBRyxPQUFPLENBQUM7UUFFWixNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxPQUFPO1lBQ3pCLEdBQUcsT0FBTyxDQUFDLE9BQU87U0FDbkIsQ0FBQztRQUNGLE1BQU0sYUFBYSxH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SyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQS9FRCw4Q0ErRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUElHYXRld2F5UHJveHlFdmVudE11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMsIEFQSUdhdGV3YXlQcm94eUV2ZW50UGF0aFBhcmFtZXRlcnMsIEFQSUdhdGV3YXlQcm94eVJlc3VsdCwgQVBJR2F0ZXdheVByb3h5V2l0aENvZ25pdG9BdXRob3JpemVyRXZlbnQsIENvbnRleHQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IEFQSUdhdGV3YXl2MUhhbmRsZXIgfSBmcm9tICcuLi9sYW1iZGEvaGFuZGxlcic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2duaXRvVXNlciB7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIGdyb3Vwczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhUmVzdFRlc3RPcHRpb25zQmFzZSB7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb2duaXRvPzogQ29nbml0b1VzZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhUmVzdFRlc3RPcHRpb25zIGV4dGVuZHMgTGFtYmRhUmVzdFRlc3RPcHRpb25zQmFzZSB7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIG1ldGhvZD86IHN0cmluZztcbiAgYm9keT86IHN0cmluZztcbiAgcGF0aFBhcmFtZXRlcnM/OiBBUElHYXRld2F5UHJveHlFdmVudFBhdGhQYXJhbWV0ZXJzO1xuICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM/OiBBUElHYXRld2F5UHJveHlFdmVudE11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KCk6IENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGNhbGxiYWNrV2FpdHNGb3JFbXB0eUV2ZW50TG9vcDogZmFsc2UsXG4gICAgZnVuY3Rpb25OYW1lOiAndGVzdCcsXG4gICAgZnVuY3Rpb25WZXJzaW9uOiAnMScsXG4gICAgaW52b2tlZEZ1bmN0aW9uQXJuOiAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjp0ZXN0JyxcbiAgICBtZW1vcnlMaW1pdEluTUI6ICcxMDI0JyxcbiAgICBhd3NSZXF1ZXN0SWQ6ICdyZXF1ZXN0SWQnLFxuICAgIGxvZ0dyb3VwTmFtZTogJ2xvZ0dyb3VwTmFtZScsXG4gICAgbG9nU3RyZWFtTmFtZTogJ2xvZ1N0cmVhbU5hbWUnLFxuICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMTAwMCxcbiAgICBkb25lOiBqZXN0LmZuKCksXG4gICAgZmFpbDogamVzdC5mbigpLFxuICAgIHN1Y2NlZWQ6IGplc3QuZm4oKSxcbiAgICBpZGVudGl0eTogdW5kZWZpbmVkLFxuICAgIGNsaWVudENvbnRleHQ6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYVJlc3RVbml0VGVzdCB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBoYW5kbGVyOiBBUElHYXRld2F5djFIYW5kbGVyLFxuICAgIHByaXZhdGUgZGVmYXVsdHM/OiBMYW1iZGFSZXN0VGVzdE9wdGlvbnNCYXNlLFxuICApIHsgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVzdEV2ZW50KG9wdGlvbnM6IExhbWJkYVJlc3RUZXN0T3B0aW9ucyA9IHt9KTogQVBJR2F0ZXdheVByb3h5V2l0aENvZ25pdG9BdXRob3JpemVyRXZlbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhdGggPSAnLycsXG4gICAgICBtZXRob2QgPSAnR0VUJyxcbiAgICAgIGJvZHkgPSAnJyxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAuLi50aGlzLmRlZmF1bHRzPy5oZWFkZXJzLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH07XG4gICAgY29uc3QgY29nbml0b0NsYWltcyA9IHtcbiAgICAgIHVzZXJuYW1lOiAnRHVtbXlVc2VyJyxcbiAgICAgIGVtYWlsOiAnZHVtbXlAZXhhbXBsZS5jb20nLFxuICAgICAgZ3JvdXBzOiBbXSxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdHM/LmNvZ25pdG8sXG4gICAgICAuLi5vcHRpb25zLmNvZ25pdG8sXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG11bHRpVmFsdWVIZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoaGVhZGVycykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIHZhbHVlID8gW3ZhbHVlXSA6IFtdXSkpLFxuICAgICAgaHR0cE1ldGhvZDogbWV0aG9kLFxuICAgICAgaXNCYXNlNjRFbmNvZGVkOiBmYWxzZSxcbiAgICAgIHBhdGgsXG4gICAgICBwYXRoUGFyYW1ldGVyczogb3B0aW9ucy5wYXRoUGFyYW1ldGVycyA/PyBudWxsLFxuICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBvcHRpb25zLnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvcHRpb25zLnF1ZXJ5U3RyaW5nUGFyYW1ldGVycykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIHZhbHVlPy5qb2luKCcsJyldKSkgOiBudWxsLFxuICAgICAgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogb3B0aW9ucy5xdWVyeVN0cmluZ1BhcmFtZXRlcnMgPz8gbnVsbCxcbiAgICAgIHN0YWdlVmFyaWFibGVzOiBudWxsLFxuICAgICAgcmVxdWVzdENvbnRleHQ6IHtcbiAgICAgICAgYWNjb3VudElkOiAnMTIzNDU2Nzg5MDEyJyxcbiAgICAgICAgYXBpSWQ6ICdhcHBJZCcsXG4gICAgICAgIGF1dGhvcml6ZXI6IHtcbiAgICAgICAgICBjbGFpbXM6IHtcbiAgICAgICAgICAgICdzdWInOiBjb2duaXRvQ2xhaW1zLnVzZXJuYW1lLFxuICAgICAgICAgICAgJ2NvZ25pdG86dXNlcm5hbWUnOiBjb2duaXRvQ2xhaW1zLnVzZXJuYW1lLFxuICAgICAgICAgICAgJ2NvZ25pdG86Z3JvdXBzJzogKGNvZ25pdG9DbGFpbXMuZ3JvdXBzKSBhcyB1bmtub3duIGFzIHN0cmluZyxcbiAgICAgICAgICAgICdlbWFpbCc6IGNvZ25pdG9DbGFpbXMuZW1haWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdG9jb2w6ICdIVFRQLzEuMScsXG4gICAgICAgIGh0dHBNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgaWRlbnRpdHk6IHtcbiAgICAgICAgICBhY2Nlc3NLZXk6IG51bGwsXG4gICAgICAgICAgYWNjb3VudElkOiAnMTIzNDU2Nzg5MDEyJyxcbiAgICAgICAgICBhcGlLZXk6IG51bGwsXG4gICAgICAgICAgYXBpS2V5SWQ6IG51bGwsXG4gICAgICAgICAgY2FsbGVyOiBudWxsLFxuICAgICAgICAgIGNsaWVudENlcnQ6IG51bGwsXG4gICAgICAgICAgY29nbml0b0F1dGhlbnRpY2F0aW9uUHJvdmlkZXI6IG51bGwsXG4gICAgICAgICAgY29nbml0b0F1dGhlbnRpY2F0aW9uVHlwZTogbnVsbCxcbiAgICAgICAgICBjb2duaXRvSWRlbnRpdHlJZDogbnVsbCxcbiAgICAgICAgICBjb2duaXRvSWRlbnRpdHlQb29sSWQ6IG51bGwsXG4gICAgICAgICAgcHJpbmNpcGFsT3JnSWQ6IG51bGwsXG4gICAgICAgICAgc291cmNlSXA6ICcnLFxuICAgICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgICAgdXNlckFnZW50OiBudWxsLFxuICAgICAgICAgIHVzZXJBcm46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHN0YWdlOiAncHJvZCcsXG4gICAgICAgIHJlcXVlc3RJZDogJ3JlcXVlc3RJZCcsXG4gICAgICAgIHJlcXVlc3RUaW1lRXBvY2g6IDAsXG4gICAgICAgIHJlc291cmNlSWQ6ICcnLFxuICAgICAgICByZXNvdXJjZVBhdGg6ICcnLFxuICAgICAgfSxcbiAgICAgIHJlc291cmNlOiAnJyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY2FsbChvcHRpb25zOiBMYW1iZGFSZXN0VGVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8QVBJR2F0ZXdheVByb3h5UmVzdWx0PiB7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmNyZWF0ZVJlc3RFdmVudChvcHRpb25zKTtcbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlcihldmVudCwgY29udGV4dCwgKCkgPT4geyB9KTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXN1bHQgcmV0dXJuZWQgZnJvbSBsYW1iZGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhR3JhcGhRTFRlc3RPcHRpb25zQmFzZSB7XG4gIGNvZ25pdG8/OiBDb2duaXRvVXNlcjtcbiAgc3Rhc2g/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUdyYXBoUUxUZXN0T3B0aW9ucyBleHRlbmRzIExhbWJkYUdyYXBoUUxUZXN0T3B0aW9uc0Jhc2Uge1xuICBmaWVsZE5hbWU/OiBzdHJpbmc7XG4gIGFyZ3VtZW50cz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHNvdXJjZT86IGFueTtcbiAgcGFyZW50VHlwZU5hbWU/OiBzdHJpbmc7XG4gIHByZXZSZXN1bHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhR3JhcGhRTFRlc3Qge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaGFuZGxlcjogQVdTTGFtYmRhLkFwcFN5bmNSZXNvbHZlckhhbmRsZXI8YW55LCBhbnk+LFxuICAgIHByaXZhdGUgZGVmYXVsdHM/OiBMYW1iZGFHcmFwaFFMVGVzdE9wdGlvbnNCYXNlLFxuICApIHsgfVxuXG4gIHByaXZhdGUgY3JlYXRlR3JhcGhRTEV2ZW50KG9wdGlvbnM6IExhbWJkYUdyYXBoUUxUZXN0T3B0aW9ucyk6IEFXU0xhbWJkYS5BcHBTeW5jUmVzb2x2ZXJFdmVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3Qge1xuICAgICAgZmllbGROYW1lID0gJ3Rlc3RGaWVsZCcsXG4gICAgICBhcmd1bWVudHM6IGFyZ3MgPSB7fSxcbiAgICAgIHNvdXJjZSA9IG51bGwsXG4gICAgICBwYXJlbnRUeXBlTmFtZSA9ICdRdWVyeScsXG4gICAgICBwcmV2UmVzdWx0ID0ge30sXG4gICAgICBzdGFzaCA9IHt9LFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgY29nbml0b0NsYWltcyA9IHtcbiAgICAgIHVzZXJuYW1lOiAnRHVtbXlVc2VyJyxcbiAgICAgIGVtYWlsOiAnZHVtbXlAZXhhbXBsZS5jb20nLFxuICAgICAgZ3JvdXBzOiBbXSxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdHM/LmNvZ25pdG8sXG4gICAgICAuLi5vcHRpb25zLmNvZ25pdG8sXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICBzb3VyY2UsXG4gICAgICBpbmZvOiB7XG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgcGFyZW50VHlwZU5hbWUsXG4gICAgICAgIHNlbGVjdGlvblNldEdyYXBoUUw6ICcnLFxuICAgICAgICBzZWxlY3Rpb25TZXRMaXN0OiBbXSxcbiAgICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGRvbWFpbk5hbWU6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSxcbiAgICAgIGlkZW50aXR5OiB7XG4gICAgICAgIGNsYWltczoge1xuICAgICAgICAgICdzdWInOiBjb2duaXRvQ2xhaW1zLnVzZXJuYW1lLFxuICAgICAgICAgICdjb2duaXRvOnVzZXJuYW1lJzogY29nbml0b0NsYWltcy51c2VybmFtZSxcbiAgICAgICAgICAnY29nbml0bzpncm91cHMnOiBjb2duaXRvQ2xhaW1zLmdyb3VwcyBhcyB1bmtub3duIGFzIHN0cmluZyxcbiAgICAgICAgICAnZW1haWwnOiBjb2duaXRvQ2xhaW1zLmVtYWlsLFxuICAgICAgICB9LFxuICAgICAgICBncm91cHM6IGNvZ25pdG9DbGFpbXMuZ3JvdXBzLFxuICAgICAgICBzdWI6IGNvZ25pdG9DbGFpbXMudXNlcm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogJzEyMzQ1Njc4OTAxMicsXG4gICAgICAgIGNvZ25pdG9JZGVudGl0eUF1dGhQcm92aWRlcjogbnVsbCxcbiAgICAgICAgY29nbml0b0lkZW50aXR5QXV0aFR5cGU6IG51bGwsXG4gICAgICAgIGNvZ25pdG9JZGVudGl0eUlkOiBudWxsLFxuICAgICAgICBjb2duaXRvSWRlbnRpdHlQb29sSWQ6IG51bGwsXG4gICAgICAgIHJlc29sdmVyQ29udGV4dDogbnVsbCxcbiAgICAgICAgdXNlckFybjogbnVsbCxcbiAgICAgICAgZGVmYXVsdEF1dGhTdHJhdGVneTogJ0FMTE9XJyxcbiAgICAgICAgaXNzdWVyOiAnaHR0cHM6Ly9jb2duaXRvLWlkcC5yZWdpb24uYW1hem9uYXdzLmNvbS91c2VyUG9vbElkJyxcbiAgICAgICAgc291cmNlSXA6IFsnMTI3LjAuMC4xJ10sXG4gICAgICAgIHVzZXJuYW1lOiBjb2duaXRvQ2xhaW1zLnVzZXJuYW1lLFxuICAgICAgfSxcbiAgICAgIHByZXY6IHtcbiAgICAgICAgcmVzdWx0OiBwcmV2UmVzdWx0LFxuICAgICAgfSxcbiAgICAgIHN0YXNoOiB7XG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdHM/LnN0YXNoLFxuICAgICAgICAuLi5zdGFzaCxcbiAgICAgIH0sXG4gICAgfSBhcyBBV1NMYW1iZGEuQXBwU3luY1Jlc29sdmVyRXZlbnQ8UmVjb3JkPHN0cmluZywgYW55Pj47XG4gIH1cblxuICBhc3luYyBjYWxsKG9wdGlvbnM6IExhbWJkYUdyYXBoUUxUZXN0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmNyZWF0ZUdyYXBoUUxFdmVudChvcHRpb25zKTtcbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlcihldmVudCwgY29udGV4dCwgKCkgPT4geyB9KTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXN1bHQgcmV0dXJuZWQgZnJvbSBsYW1iZGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -38,7 +38,6 @@
38
38
  "@aws-sdk/lib-dynamodb": "3.726.0",
39
39
  "@hapi/boom": "^10.0.1",
40
40
  "@stylistic/eslint-plugin": "^2",
41
- "@types/aws-lambda": "^8.10.148",
42
41
  "@types/jest": "^29.5.14",
43
42
  "@types/js-yaml": "^4.0.9",
44
43
  "@types/jsonwebtoken": "^9.0.9",
@@ -75,6 +74,7 @@
75
74
  "projen": ">=0.91.6 <1.0.0"
76
75
  },
77
76
  "dependencies": {
77
+ "@types/aws-lambda": "^8.10.148",
78
78
  "axios": "^1.8.4",
79
79
  "constructs": "^10.3.0",
80
80
  "date-fns": "^4.1.0",
@@ -96,7 +96,7 @@
96
96
  "publishConfig": {
97
97
  "access": "public"
98
98
  },
99
- "version": "2.17.2",
99
+ "version": "2.19.0",
100
100
  "jest": {
101
101
  "coverageProvider": "v8",
102
102
  "testMatch": [