@codedrifters/constructs 0.0.4 → 0.0.5

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
@@ -12,9 +12,6 @@ A collection of reusable AWS CDK constructs frequently used in CodeDrifters proj
12
12
  - [Static Hosting Constructs](#static-hosting-constructs)
13
13
  - [StaticHosting](#statichosting)
14
14
  - [StaticContent](#staticcontent)
15
- - [Utility Functions](#utility-functions)
16
- - [Git Utilities](#git-utilities)
17
- - [String Utilities](#string-utilities)
18
15
  - [Complete Example](#complete-example)
19
16
  - [API Reference](#api-reference)
20
17
  - [Further Documentation](#further-documentation)
@@ -37,6 +34,8 @@ For more information about AWS CDK constructs, see the [AWS CDK Developer Guide]
37
34
 
38
35
  Add the package to your CDK project using Configulator/Projen configuration. This ensures consistent dependency management across your project.
39
36
 
37
+ > **Note:** Always configure dependencies through Projen configuration files, never by manually running `npm install`, `pnpm add`, or `yarn add`. Manual installation will create conflicts with Projen-managed files.
38
+
40
39
  ### In a Monorepo (Recommended)
41
40
 
42
41
  If you're using `@codedrifters/configulator` in a monorepo, add the package as a dependency in your sub-project configuration:
@@ -312,68 +311,6 @@ For example:
312
311
  - Branch: `feature-123`, Domain: `example.com` → Path: `feature-123.example.com/`
313
312
  - Branch: `main`, Domain: `example.com` → Path: `main.example.com/` (or just `example.com/` if subdomain is empty)
314
313
 
315
- ### Utility Functions
316
-
317
- #### Git Utilities
318
-
319
- Helper functions for working with Git in CDK deployments.
320
-
321
- **`findGitBranch()`**
322
-
323
- Returns the current git branch name.
324
-
325
- ```typescript
326
- import { findGitBranch } from '@codedrifters/constructs/lib/git-utils';
327
-
328
- const branch = findGitBranch();
329
- // Returns: "feature/1234" or "main" etc.
330
- ```
331
-
332
- **`findGitRepoName()`**
333
-
334
- Returns the repository name. Works in both local environments and GitHub Actions.
335
-
336
- ```typescript
337
- import { findGitRepoName } from '@codedrifters/constructs/lib/git-utils';
338
-
339
- const repoName = findGitRepoName();
340
- // Returns: "codedrifters/packages" or similar
341
- ```
342
-
343
- In GitHub Actions, this uses the `GITHUB_REPOSITORY` environment variable. Locally, it extracts the name from the git remote URL.
344
-
345
- #### String Utilities
346
-
347
- Helper functions for string manipulation.
348
-
349
- **`hashString(inString: string, trimLength?: number)`**
350
-
351
- Creates a SHA-256 hash of a string, optionally trimmed to a specific length.
352
-
353
- ```typescript
354
- import { hashString } from '@codedrifters/constructs/lib/string-utils';
355
-
356
- const hash = hashString('my-string');
357
- // Returns: Full SHA-256 hash
358
-
359
- const shortHash = hashString('my-string', 8);
360
- // Returns: First 8 characters of hash
361
- ```
362
-
363
- **`trimStringLength(inputString: string, maxLength: number)`**
364
-
365
- Truncates a string to a maximum length if it exceeds it.
366
-
367
- ```typescript
368
- import { trimStringLength } from '@codedrifters/constructs/lib/string-utils';
369
-
370
- const short = trimStringLength('very long string', 10);
371
- // Returns: "very long " (truncated to 10 chars)
372
-
373
- const unchanged = trimStringLength('short', 10);
374
- // Returns: "short" (no change needed)
375
- ```
376
-
377
314
  ## Complete Example
378
315
 
379
316
  Here's a complete example showing how to use `StaticHosting` and `StaticContent` together:
@@ -477,12 +414,6 @@ The package exports the following:
477
414
  - `StaticHosting` - Complete static hosting solution
478
415
  - `StaticContent` - Static content deployment
479
416
 
480
- **Utilities:**
481
- - `findGitBranch()` - Get current git branch
482
- - `findGitRepoName()` - Get repository name
483
- - `hashString()` - Hash a string
484
- - `trimStringLength()` - Truncate a string
485
-
486
417
  ### Type Definitions
487
418
 
488
419
  **PrivateBucketProps**
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StaticContent = void 0;
4
+ const utils_1 = require("@codedrifters/utils");
4
5
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
5
6
  const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
6
7
  const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
7
8
  const change_case_1 = require("change-case");
8
9
  const constructs_1 = require("constructs");
9
- const git_utils_1 = require("../lib/git-utils");
10
10
  class StaticContent extends constructs_1.Construct {
11
11
  constructor(scope, id, props) {
12
12
  super(scope, id);
@@ -19,7 +19,7 @@ class StaticContent extends constructs_1.Construct {
19
19
  **************************************************************************/
20
20
  const { bucketArnParamName, contentSourceDirectory, contentDestinationDirectory, subDomain, fullDomain, } = {
21
21
  bucketArnParamName: "/STATIC_WEBSITE/BUCKET_ARN",
22
- subDomain: (0, git_utils_1.findGitBranch)(),
22
+ subDomain: (0, utils_1.findGitBranch)(),
23
23
  ...props,
24
24
  };
25
25
  /***************************************************************************
@@ -49,4 +49,4 @@ class StaticContent extends constructs_1.Construct {
49
49
  }
50
50
  }
51
51
  exports.StaticContent = StaticContent;
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLWNvbnRlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhdGljLWhvc3Rpbmcvc3RhdGljLWNvbnRlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQTRDO0FBQzVDLHFFQUF5RTtBQUN6RSxpREFBc0Q7QUFDdEQsNkNBQXdDO0FBQ3hDLDJDQUF1QztBQUN2QyxnREFBaUQ7QUFxRGpELE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQjs7Ozs7O29GQU00RTtRQUU1RSxNQUFNLEVBQ0osa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsU0FBUyxFQUNULFVBQVUsR0FDWCxHQUFHO1lBQ0Ysa0JBQWtCLEVBQUUsNEJBQTRCO1lBQ2hELFNBQVMsRUFBRSxJQUFBLHlCQUFhLEdBQUU7WUFDMUIsR0FBRyxLQUFLO1NBQ1QsQ0FBQztRQUVGOzs7O29GQUk0RTtRQUU1RSxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUEsdUJBQVMsRUFBQyxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0QsTUFBTSxTQUFTLEdBQUcseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDdkQsSUFBSSxFQUNKLGtCQUFrQixDQUNuQixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsZUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9EOzs7Ozs7b0ZBTTRFO1FBRTVFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztZQUN4QyxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxDQUFDLDBCQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUUzQyxJQUFJLG9DQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbkMsT0FBTztZQUNQLGlCQUFpQixFQUFFLE1BQU07WUFDekIsY0FBYyxFQUFFLEtBQUs7WUFDckIsb0JBQW9CLEVBQUUsR0FBRyxTQUFTLEdBQUcsMkJBQTJCLEVBQUU7U0FDbkUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBekRELHNDQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IEJ1Y2tldERlcGxveW1lbnQsIFNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIjtcbmltcG9ydCB7IHBhcmFtQ2FzZSB9IGZyb20gXCJjaGFuZ2UtY2FzZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IGZpbmRHaXRCcmFuY2ggfSBmcm9tIFwiLi4vbGliL2dpdC11dGlsc1wiO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcbiAqICBTVEFUSUMgQ09OVEVOVCBVUExPQURFUlxuICpcbiAqICBUaGlzIGNvbnN0cnVjdCB1cGxvYWRzIGEgZGlyZWN0b3J5IG9mIGNvbnRlbnQgZnJvbSBhIGxvY2FsIGxvY2F0aW9uIGludG8gUzMuXG4gKlxuICogIFRvIHN1cHBvcnQgUFIgYW5kIGJyYW5jaCBzcGVjaWZpYyBidWlsZHMsIGVhY2ggUzMgYnVja2V0IGNhbiBzdG9yZSBjb250ZW50XG4gKiAgZm9yIG11bHRpcGxlIGRvbWFpbnMgYW5kIGJ1aWxkcywgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKlxuICogIFMzLWJ1Y2tldC9kb21haW4vKlxuICpcbiAqICBBIGJ1Y2tldCB1c2VkIHRvIHN0b3JlIGNvbnRlbnQgZm9yIHN0YWdlLm9wZW5oaS5vcmcgbWlnaHQgaGF2ZSB0aGVcbiAqICBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSAoYWxsIGluIHRoZSBzYW1lIGJ1Y2tldCkuXG4gKlxuICogIC9zdGFnZS5vcGVuaGkub3JnLyogLT4gc2VydmVzIGNvbnRlbnQgdG8gc3RhZ2Uub3BlbmhpLm9yZ1xuICogIC9mZWF0dXJlLTcuc3RhZ2Uub3BlbmhpLm9yZy8qIC0+IHNlcnZlcyBjb250ZW50IHRvIGZlYXR1cmUtNy5zdGFnZS5vcGVuaGkub3JnXG4gKiAgL3ByLTEyMy5zdGFnZS5vcGVuaGkub3JnLyogLT4gc2VydmVzIGNvbnRlbnQgdG8gcHItMTIzLnN0YWdlLm9wZW5oaS5vcmdcbiAqXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0NvbnRlbnRQcm9wcyB7XG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgbmFtZSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBzdGF0aWMgaG9zdGluZyBidWNrZXQncyBBUk4uXG4gICAqIFRoaXMgaXMgbmVlZGVkIGluIG90aGVyIGxhdGVyIHN0ZXBzIHdoZW4gZGVwbG95aW5nIGhvc3RlZCBjb250ZW50IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0QXJuUGFyYW1OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgQWJzb2x1dGUgcGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBjb250ZW50IGZvciB0aGUgd2Vic2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRTb3VyY2VEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogIERpcmVjdG9yeSB0byBwbGFjZSBjb250ZW50IGludG8uIFNob3VsZCBzdGFydCB3aXRoIGEgc2xhc2guXG4gICAqICBFeGFtcGxlOiAnL3dpZGdldCdcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnREZXN0aW5hdGlvbkRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHN1YiBkb21haW4gcHJlZml4IChpZTogaW1hZ2VzKVxuICAgKlxuICAgKiBAZGVmYXVsdCBnaXQgYnJhbmNoIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN1YkRvbWFpbj86IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSBmdWxsIGRvbWFpbiAoaWU6IHN0YWdpbmcuY29kZWRyaWZ0ZXJzLmNvbSlcbiAgICovXG4gIHJlYWRvbmx5IGZ1bGxEb21haW46IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFN0YXRpY0NvbnRlbnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RhdGljQ29udGVudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIEluaXRpYWwgU2V0dXBcbiAgICAgKlxuICAgICAqIFNldCBzb21lIGRlZmF1bHRzLCBidWlsZCBkb21haW4gaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCB7XG4gICAgICBidWNrZXRBcm5QYXJhbU5hbWUsXG4gICAgICBjb250ZW50U291cmNlRGlyZWN0b3J5LFxuICAgICAgY29udGVudERlc3RpbmF0aW9uRGlyZWN0b3J5LFxuICAgICAgc3ViRG9tYWluLFxuICAgICAgZnVsbERvbWFpbixcbiAgICB9ID0ge1xuICAgICAgYnVja2V0QXJuUGFyYW1OYW1lOiBcIi9TVEFUSUNfV0VCU0lURS9CVUNLRVRfQVJOXCIsXG4gICAgICBzdWJEb21haW46IGZpbmRHaXRCcmFuY2goKSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH07XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBJbXBvcnQgYW5kIGJ1aWxkIHNvbWUgdmFsdWVzIGZyb20gUGFyYW0gU3RvcmUgZHVyaW5nIGRlcGxveW1lbnQuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBrZXlQcmVmaXggPSBbcGFyYW1DYXNlKHN1YkRvbWFpbiksIGZ1bGxEb21haW5dLmpvaW4oXCIuXCIpO1xuXG4gICAgY29uc3QgYnVja2V0QXJuID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGJ1Y2tldEFyblBhcmFtTmFtZSxcbiAgICApO1xuICAgIGNvbnN0IGJ1Y2tldCA9IEJ1Y2tldC5mcm9tQnVja2V0QXJuKHRoaXMsIFwiYnVja2V0XCIsIGJ1Y2tldEFybik7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBHYXRoZXIgdGhlIHNvdXJjZXMgd2UnbGwgYmUgZGVwbG95aW5nLiBXZSBuZWVkIHRvIGhhdmUgYW4gZW1wdHkgc291cmNlXG4gICAgICogZm9yIHRlc3RzIHNpbmNlIGl0IHdpbGwgY2hhbmdlIGFsbCB0aGUgdGltZSBhbmQgYm9yayB1cCB0aGUgdGVzdFxuICAgICAqIHNuYXBzaG90cyBpZiB3ZSBkb24ndC5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGNvbnN0IHNvdXJjZXMgPSBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRFxuICAgICAgPyBbXVxuICAgICAgOiBbU291cmNlLmFzc2V0KGNvbnRlbnRTb3VyY2VEaXJlY3RvcnkpXTtcblxuICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIFwiZGVwbG95XCIsIHtcbiAgICAgIHNvdXJjZXMsXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogYnVja2V0LFxuICAgICAgcmV0YWluT25EZWxldGU6IGZhbHNlLFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGAke2tleVByZWZpeH0ke2NvbnRlbnREZXN0aW5hdGlvbkRpcmVjdG9yeX1gLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLWNvbnRlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhdGljLWhvc3Rpbmcvc3RhdGljLWNvbnRlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQW9EO0FBQ3BELCtDQUE0QztBQUM1QyxxRUFBeUU7QUFDekUsaURBQXNEO0FBQ3RELDZDQUF3QztBQUN4QywyQ0FBdUM7QUFxRHZDLE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQjs7Ozs7O29GQU00RTtRQUU1RSxNQUFNLEVBQ0osa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsU0FBUyxFQUNULFVBQVUsR0FDWCxHQUFHO1lBQ0Ysa0JBQWtCLEVBQUUsNEJBQTRCO1lBQ2hELFNBQVMsRUFBRSxJQUFBLHFCQUFhLEdBQUU7WUFDMUIsR0FBRyxLQUFLO1NBQ1QsQ0FBQztRQUVGOzs7O29GQUk0RTtRQUU1RSxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUEsdUJBQVMsRUFBQyxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0QsTUFBTSxTQUFTLEdBQUcseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDdkQsSUFBSSxFQUNKLGtCQUFrQixDQUNuQixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsZUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9EOzs7Ozs7b0ZBTTRFO1FBRTVFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztZQUN4QyxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxDQUFDLDBCQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUUzQyxJQUFJLG9DQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbkMsT0FBTztZQUNQLGlCQUFpQixFQUFFLE1BQU07WUFDekIsY0FBYyxFQUFFLEtBQUs7WUFDckIsb0JBQW9CLEVBQUUsR0FBRyxTQUFTLEdBQUcsMkJBQTJCLEVBQUU7U0FDbkUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBekRELHNDQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmRHaXRCcmFuY2ggfSBmcm9tIFwiQGNvZGVkcmlmdGVycy91dGlsc1wiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgU291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50XCI7XG5pbXBvcnQgeyBTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiO1xuaW1wb3J0IHsgcGFyYW1DYXNlIH0gZnJvbSBcImNoYW5nZS1jYXNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcbiAqICBTVEFUSUMgQ09OVEVOVCBVUExPQURFUlxuICpcbiAqICBUaGlzIGNvbnN0cnVjdCB1cGxvYWRzIGEgZGlyZWN0b3J5IG9mIGNvbnRlbnQgZnJvbSBhIGxvY2FsIGxvY2F0aW9uIGludG8gUzMuXG4gKlxuICogIFRvIHN1cHBvcnQgUFIgYW5kIGJyYW5jaCBzcGVjaWZpYyBidWlsZHMsIGVhY2ggUzMgYnVja2V0IGNhbiBzdG9yZSBjb250ZW50XG4gKiAgZm9yIG11bHRpcGxlIGRvbWFpbnMgYW5kIGJ1aWxkcywgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKlxuICogIFMzLWJ1Y2tldC9kb21haW4vKlxuICpcbiAqICBBIGJ1Y2tldCB1c2VkIHRvIHN0b3JlIGNvbnRlbnQgZm9yIHN0YWdlLm9wZW5oaS5vcmcgbWlnaHQgaGF2ZSB0aGVcbiAqICBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSAoYWxsIGluIHRoZSBzYW1lIGJ1Y2tldCkuXG4gKlxuICogIC9zdGFnZS5vcGVuaGkub3JnLyogLT4gc2VydmVzIGNvbnRlbnQgdG8gc3RhZ2Uub3BlbmhpLm9yZ1xuICogIC9mZWF0dXJlLTcuc3RhZ2Uub3BlbmhpLm9yZy8qIC0+IHNlcnZlcyBjb250ZW50IHRvIGZlYXR1cmUtNy5zdGFnZS5vcGVuaGkub3JnXG4gKiAgL3ByLTEyMy5zdGFnZS5vcGVuaGkub3JnLyogLT4gc2VydmVzIGNvbnRlbnQgdG8gcHItMTIzLnN0YWdlLm9wZW5oaS5vcmdcbiAqXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0NvbnRlbnRQcm9wcyB7XG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgbmFtZSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBzdGF0aWMgaG9zdGluZyBidWNrZXQncyBBUk4uXG4gICAqIFRoaXMgaXMgbmVlZGVkIGluIG90aGVyIGxhdGVyIHN0ZXBzIHdoZW4gZGVwbG95aW5nIGhvc3RlZCBjb250ZW50IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0QXJuUGFyYW1OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgQWJzb2x1dGUgcGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBjb250ZW50IGZvciB0aGUgd2Vic2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRTb3VyY2VEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogIERpcmVjdG9yeSB0byBwbGFjZSBjb250ZW50IGludG8uIFNob3VsZCBzdGFydCB3aXRoIGEgc2xhc2guXG4gICAqICBFeGFtcGxlOiAnL3dpZGdldCdcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnREZXN0aW5hdGlvbkRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHN1YiBkb21haW4gcHJlZml4IChpZTogaW1hZ2VzKVxuICAgKlxuICAgKiBAZGVmYXVsdCBnaXQgYnJhbmNoIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN1YkRvbWFpbj86IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSBmdWxsIGRvbWFpbiAoaWU6IHN0YWdpbmcuY29kZWRyaWZ0ZXJzLmNvbSlcbiAgICovXG4gIHJlYWRvbmx5IGZ1bGxEb21haW46IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFN0YXRpY0NvbnRlbnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RhdGljQ29udGVudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIEluaXRpYWwgU2V0dXBcbiAgICAgKlxuICAgICAqIFNldCBzb21lIGRlZmF1bHRzLCBidWlsZCBkb21haW4gaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCB7XG4gICAgICBidWNrZXRBcm5QYXJhbU5hbWUsXG4gICAgICBjb250ZW50U291cmNlRGlyZWN0b3J5LFxuICAgICAgY29udGVudERlc3RpbmF0aW9uRGlyZWN0b3J5LFxuICAgICAgc3ViRG9tYWluLFxuICAgICAgZnVsbERvbWFpbixcbiAgICB9ID0ge1xuICAgICAgYnVja2V0QXJuUGFyYW1OYW1lOiBcIi9TVEFUSUNfV0VCU0lURS9CVUNLRVRfQVJOXCIsXG4gICAgICBzdWJEb21haW46IGZpbmRHaXRCcmFuY2goKSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH07XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBJbXBvcnQgYW5kIGJ1aWxkIHNvbWUgdmFsdWVzIGZyb20gUGFyYW0gU3RvcmUgZHVyaW5nIGRlcGxveW1lbnQuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBrZXlQcmVmaXggPSBbcGFyYW1DYXNlKHN1YkRvbWFpbiksIGZ1bGxEb21haW5dLmpvaW4oXCIuXCIpO1xuXG4gICAgY29uc3QgYnVja2V0QXJuID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGJ1Y2tldEFyblBhcmFtTmFtZSxcbiAgICApO1xuICAgIGNvbnN0IGJ1Y2tldCA9IEJ1Y2tldC5mcm9tQnVja2V0QXJuKHRoaXMsIFwiYnVja2V0XCIsIGJ1Y2tldEFybik7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBHYXRoZXIgdGhlIHNvdXJjZXMgd2UnbGwgYmUgZGVwbG95aW5nLiBXZSBuZWVkIHRvIGhhdmUgYW4gZW1wdHkgc291cmNlXG4gICAgICogZm9yIHRlc3RzIHNpbmNlIGl0IHdpbGwgY2hhbmdlIGFsbCB0aGUgdGltZSBhbmQgYm9yayB1cCB0aGUgdGVzdFxuICAgICAqIHNuYXBzaG90cyBpZiB3ZSBkb24ndC5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGNvbnN0IHNvdXJjZXMgPSBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRFxuICAgICAgPyBbXVxuICAgICAgOiBbU291cmNlLmFzc2V0KGNvbnRlbnRTb3VyY2VEaXJlY3RvcnkpXTtcblxuICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIFwiZGVwbG95XCIsIHtcbiAgICAgIHNvdXJjZXMsXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogYnVja2V0LFxuICAgICAgcmV0YWluT25EZWxldGU6IGZhbHNlLFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGAke2tleVByZWZpeH0ke2NvbnRlbnREZXN0aW5hdGlvbkRpcmVjdG9yeX1gLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -38,11 +38,12 @@
38
38
  "@types/aws-lambda": "^8.10.159",
39
39
  "change-case": "^4.0",
40
40
  "esbuild": "^0.27.0",
41
- "type-fest": "^4"
41
+ "type-fest": "^4",
42
+ "@codedrifters/utils": "0.0.0"
42
43
  },
43
44
  "main": "lib/index.js",
44
45
  "license": "UNLICENSED",
45
- "version": "0.0.4",
46
+ "version": "0.0.5",
46
47
  "types": "lib/index.d.ts",
47
48
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".",
48
49
  "scripts": {
@@ -1,8 +0,0 @@
1
- /**
2
- * Returns the current full git branch name
3
- *
4
- * ie: feature/1234 returns feature/1234
5
- *
6
- */
7
- export declare const findGitBranch: () => string;
8
- export declare const findGitRepoName: () => string;
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.findGitRepoName = exports.findGitBranch = void 0;
4
- const node_child_process_1 = require("node:child_process");
5
- /**
6
- * Returns the current full git branch name
7
- *
8
- * ie: feature/1234 returns feature/1234
9
- *
10
- */
11
- const findGitBranch = () => {
12
- return (0, node_child_process_1.execSync)("git rev-parse --abbrev-ref HEAD")
13
- .toString("utf8")
14
- .replace(/[\n\r\s]+$/, "");
15
- };
16
- exports.findGitBranch = findGitBranch;
17
- const findGitRepoName = () => {
18
- /**
19
- * When running in github actions this will be populated.
20
- */
21
- if (process.env.GITHUB_REPOSITORY) {
22
- return process.env.GITHUB_REPOSITORY;
23
- }
24
- /**
25
- * locally, we need to extract the repo name from the git config.
26
- */
27
- const remote = (0, node_child_process_1.execSync)("git config --get remote.origin.url")
28
- .toString("utf8")
29
- .replace(/[\n\r\s]+$/, "")
30
- .trim();
31
- const match = remote.match(/[:\/]([^/]+\/[^/]+?)(?:\.git)?$/);
32
- const repoName = match ? match[1] : "error-repo-name";
33
- return repoName;
34
- };
35
- exports.findGitRepoName = findGitRepoName;
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9naXQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQThDO0FBRTlDOzs7OztHQUtHO0FBQ0ksTUFBTSxhQUFhLEdBQUcsR0FBVyxFQUFFO0lBQ3hDLE9BQU8sSUFBQSw2QkFBUSxFQUFDLGlDQUFpQyxDQUFDO1NBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDaEIsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFKVyxRQUFBLGFBQWEsaUJBSXhCO0FBRUssTUFBTSxlQUFlLEdBQUcsR0FBVyxFQUFFO0lBQzFDOztPQUVHO0lBQ0gsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sTUFBTSxHQUFHLElBQUEsNkJBQVEsRUFBQyxvQ0FBb0MsQ0FBQztTQUMxRCxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ2hCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1NBQ3pCLElBQUksRUFBRSxDQUFDO0lBRVYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzlELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUV0RCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFwQlcsUUFBQSxlQUFlLG1CQW9CMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGZ1bGwgZ2l0IGJyYW5jaCBuYW1lXG4gKlxuICogaWU6IGZlYXR1cmUvMTIzNCByZXR1cm5zIGZlYXR1cmUvMTIzNFxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRHaXRCcmFuY2ggPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGV4ZWNTeW5jKFwiZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRFwiKVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZSgvW1xcblxcclxcc10rJC8sIFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRHaXRSZXBvTmFtZSA9ICgpOiBzdHJpbmcgPT4ge1xuICAvKipcbiAgICogV2hlbiBydW5uaW5nIGluIGdpdGh1YiBhY3Rpb25zIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQuXG4gICAqL1xuICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlk7XG4gIH1cblxuICAvKipcbiAgICogbG9jYWxseSwgd2UgbmVlZCB0byBleHRyYWN0IHRoZSByZXBvIG5hbWUgZnJvbSB0aGUgZ2l0IGNvbmZpZy5cbiAgICovXG4gIGNvbnN0IHJlbW90ZSA9IGV4ZWNTeW5jKFwiZ2l0IGNvbmZpZyAtLWdldCByZW1vdGUub3JpZ2luLnVybFwiKVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZSgvW1xcblxcclxcc10rJC8sIFwiXCIpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBtYXRjaCA9IHJlbW90ZS5tYXRjaCgvWzpcXC9dKFteL10rXFwvW14vXSs/KSg/OlxcLmdpdCk/JC8pO1xuICBjb25zdCByZXBvTmFtZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiBcImVycm9yLXJlcG8tbmFtZVwiO1xuXG4gIHJldHVybiByZXBvTmFtZTtcbn07XG4iXX0=
@@ -1,14 +0,0 @@
1
- /**
2
- *
3
- * @param inString string to hash
4
- * @param trimLength trim to this length (defaults to 999 chars)
5
- * @returns
6
- */
7
- export declare const hashString: (inString: string, trimLength?: number) => string;
8
- /**
9
- *
10
- * @param inputString string to truncate
11
- * @param maxLength max length of this string
12
- * @returns trimmed string
13
- */
14
- export declare const trimStringLength: (inputString: string, maxLength: number) => string;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.trimStringLength = exports.hashString = void 0;
37
- const crypto = __importStar(require("node:crypto"));
38
- /**
39
- *
40
- * @param inString string to hash
41
- * @param trimLength trim to this length (defaults to 999 chars)
42
- * @returns
43
- */
44
- const hashString = (inString, trimLength = 999) => {
45
- return crypto
46
- .createHash("sha256")
47
- .update(inString)
48
- .digest("hex")
49
- .substring(0, trimLength);
50
- };
51
- exports.hashString = hashString;
52
- /**
53
- *
54
- * @param inputString string to truncate
55
- * @param maxLength max length of this string
56
- * @returns trimmed string
57
- */
58
- const trimStringLength = (inputString, maxLength) => {
59
- return inputString.length < maxLength
60
- ? inputString
61
- : inputString.substring(0, maxLength);
62
- };
63
- exports.trimStringLength = trimStringLength;
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9zdHJpbmctdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQXNDO0FBRXRDOzs7OztHQUtHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFnQixFQUFFLGFBQXFCLEdBQUcsRUFBRSxFQUFFO0lBQ3ZFLE9BQU8sTUFBTTtTQUNWLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQztTQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsU0FBUyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFOVyxRQUFBLFVBQVUsY0FNckI7QUFFRjs7Ozs7R0FLRztBQUNJLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxXQUFtQixFQUFFLFNBQWlCLEVBQUUsRUFBRTtJQUN6RSxPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsU0FBUztRQUNuQyxDQUFDLENBQUMsV0FBVztRQUNiLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFKVyxRQUFBLGdCQUFnQixvQkFJM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBpblN0cmluZyBzdHJpbmcgdG8gaGFzaFxuICogQHBhcmFtIHRyaW1MZW5ndGggdHJpbSB0byB0aGlzIGxlbmd0aCAoZGVmYXVsdHMgdG8gOTk5IGNoYXJzKVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hTdHJpbmcgPSAoaW5TdHJpbmc6IHN0cmluZywgdHJpbUxlbmd0aDogbnVtYmVyID0gOTk5KSA9PiB7XG4gIHJldHVybiBjcnlwdG9cbiAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoaW5TdHJpbmcpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zdWJzdHJpbmcoMCwgdHJpbUxlbmd0aCk7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gaW5wdXRTdHJpbmcgc3RyaW5nIHRvIHRydW5jYXRlXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIG1heCBsZW5ndGggb2YgdGhpcyBzdHJpbmdcbiAqIEByZXR1cm5zIHRyaW1tZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCB0cmltU3RyaW5nTGVuZ3RoID0gKGlucHV0U3RyaW5nOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKSA9PiB7XG4gIHJldHVybiBpbnB1dFN0cmluZy5sZW5ndGggPCBtYXhMZW5ndGhcbiAgICA/IGlucHV0U3RyaW5nXG4gICAgOiBpbnB1dFN0cmluZy5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbn07XG4iXX0=