@nikovirtala/projen-constructs 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/.jsii +4114 -18
  2. package/API.md +257 -257
  3. package/README.md +137 -23
  4. package/lib/components/bundle-lambda-function-code.d.ts +62 -0
  5. package/lib/components/bundle-lambda-function-code.js +175 -0
  6. package/lib/components/colima.d.ts +5 -0
  7. package/lib/components/colima.js +22 -0
  8. package/lib/components/homebrew.d.ts +12 -0
  9. package/lib/components/homebrew.js +42 -0
  10. package/lib/components/index.d.ts +7 -0
  11. package/lib/components/index.js +24 -0
  12. package/lib/components/lambda-function-construct-generator.d.ts +30 -0
  13. package/lib/components/lambda-function-construct-generator.js +195 -0
  14. package/lib/components/localstack.d.ts +11 -0
  15. package/lib/components/localstack.js +42 -0
  16. package/lib/components/typedoc-config.d.ts +78 -0
  17. package/lib/components/typedoc-config.js +93 -0
  18. package/lib/components/typedoc.d.ts +18 -0
  19. package/lib/components/typedoc.js +58 -0
  20. package/lib/components/vitest-bundled-define-config.d.ts +1 -0
  21. package/lib/components/vitest-bundled-define-config.js +6 -0
  22. package/lib/components/vitest.d.ts +87 -0
  23. package/lib/components/vitest.js +204 -0
  24. package/lib/config.d.ts +61 -76
  25. package/lib/config.js +28 -7
  26. package/lib/index.d.ts +1 -4
  27. package/lib/index.js +2 -5
  28. package/lib/projects/awscdk-app.js +38 -0
  29. package/lib/{awscdk-construct-project.d.ts → projects/awscdk-construct.d.ts} +1 -1
  30. package/lib/projects/awscdk-construct.js +38 -0
  31. package/lib/projects/index.d.ts +4 -0
  32. package/lib/projects/index.js +21 -0
  33. package/lib/projects/jsii.js +38 -0
  34. package/lib/projects/typescript.js +39 -0
  35. package/node_modules/case/LICENSE +22 -0
  36. package/node_modules/case/README.md +139 -0
  37. package/node_modules/case/case.d.ts +43 -0
  38. package/node_modules/case/dist/Case.js +171 -0
  39. package/node_modules/case/dist/Case.min.js +5 -0
  40. package/node_modules/case/dist/Case.min.js.map +1 -0
  41. package/node_modules/case/dist/Case.plus.js +189 -0
  42. package/node_modules/case/dist/Case.plus.min.js +5 -0
  43. package/node_modules/case/dist/Case.plus.min.js.map +1 -0
  44. package/node_modules/case/package.json +58 -0
  45. package/package.json +10 -2
  46. package/lib/awscdk-app-project.js +0 -38
  47. package/lib/awscdk-construct-project.js +0 -38
  48. package/lib/jsii-project.js +0 -38
  49. package/lib/typescript-project.js +0 -39
  50. /package/lib/{awscdk-app-project.d.ts → projects/awscdk-app.d.ts} +0 -0
  51. /package/lib/{jsii-project.d.ts → projects/jsii.d.ts} +0 -0
  52. /package/lib/{typescript-project.d.ts → projects/typescript.d.ts} +0 -0
package/README.md CHANGED
@@ -32,23 +32,23 @@ Override any option by passing it to the constructor:
32
32
 
33
33
  ```typescript
34
34
  const project = new JsiiProject({
35
- name: "my-project",
36
- repositoryUrl: "https://github.com/nikovirtala/my-project.git",
37
- minNodeVersion: "20.0.0",
38
- author: "Custom Author",
39
- authorAddress: "custom@example.com",
40
- tsconfig: {
41
- compilerOptions: {
42
- noUnusedLocals: false, // Override individual compiler options
43
- },
35
+ name: "my-project",
36
+ repositoryUrl: "https://github.com/nikovirtala/my-project.git",
37
+ minNodeVersion: "20.0.0",
38
+ author: "Custom Author",
39
+ authorAddress: "custom@example.com",
40
+ tsconfig: {
41
+ compilerOptions: {
42
+ noUnusedLocals: false, // Override individual compiler options
44
43
  },
45
- biomeOptions: {
46
- biomeConfig: {
47
- formatter: {
48
- lineWidth: 100, // Override individual formatter options
49
- },
50
- },
44
+ },
45
+ biomeOptions: {
46
+ biomeConfig: {
47
+ formatter: {
48
+ lineWidth: 100, // Override individual formatter options
49
+ },
51
50
  },
51
+ },
52
52
  });
53
53
  ```
54
54
 
@@ -60,8 +60,8 @@ const project = new JsiiProject({
60
60
  import { AwsCdkConstructLibraryProject } from "@nikovirtala/projen-constructs";
61
61
 
62
62
  const project = new AwsCdkConstructLibraryProject({
63
- name: "my-cdk-construct",
64
- repositoryUrl: "https://github.com/nikovirtala/my-cdk-construct.git",
63
+ name: "my-cdk-construct",
64
+ repositoryUrl: "https://github.com/nikovirtala/my-cdk-construct.git",
65
65
  });
66
66
 
67
67
  project.synth();
@@ -73,8 +73,8 @@ project.synth();
73
73
  import { AwsCdkTypeScriptAppProject } from "@nikovirtala/projen-constructs";
74
74
 
75
75
  const project = new AwsCdkTypeScriptAppProject({
76
- name: "my-cdk-app",
77
- repositoryUrl: "https://github.com/nikovirtala/my-cdk-app.git",
76
+ name: "my-cdk-app",
77
+ repositoryUrl: "https://github.com/nikovirtala/my-cdk-app.git",
78
78
  });
79
79
 
80
80
  project.synth();
@@ -86,8 +86,8 @@ project.synth();
86
86
  import { JsiiProject } from "@nikovirtala/projen-constructs";
87
87
 
88
88
  const project = new JsiiProject({
89
- name: "my-jsii-project",
90
- repositoryUrl: "https://github.com/nikovirtala/my-jsii-project.git",
89
+ name: "my-jsii-project",
90
+ repositoryUrl: "https://github.com/nikovirtala/my-jsii-project.git",
91
91
  });
92
92
 
93
93
  project.synth();
@@ -99,9 +99,123 @@ project.synth();
99
99
  import { TypeScriptProject } from "@nikovirtala/projen-constructs";
100
100
 
101
101
  const project = new TypeScriptProject({
102
- name: "my-typescript-project",
103
- repositoryUrl: "https://github.com/nikovirtala/my-typescript-project.git",
102
+ name: "my-typescript-project",
103
+ repositoryUrl: "https://github.com/nikovirtala/my-typescript-project.git",
104
104
  });
105
105
 
106
106
  project.synth();
107
107
  ```
108
+
109
+ ## Components
110
+
111
+ The package includes reusable components for common development tasks:
112
+
113
+ ### Vitest
114
+
115
+ [Vitest](https://vitest.dev) testing framework component.
116
+
117
+ ```typescript
118
+ import { Vitest } from "@nikovirtala/projen-constructs";
119
+
120
+ new Vitest(project, {
121
+ vitestVersion: "^4",
122
+ config: {
123
+ coverageProvider: CoverageProvider.V8,
124
+ coverageReporters: [CoverageReporter.TEXT, CoverageReporter.LCOV],
125
+ },
126
+ });
127
+ ```
128
+
129
+ ### TypeDoc
130
+
131
+ TypeDoc documentation generation component.
132
+
133
+ ```typescript
134
+ import { TypeDoc, EntryPointStrategy } from "@nikovirtala/projen-constructs";
135
+
136
+ new TypeDoc(project, {
137
+ version: "^0.28",
138
+ typeDocConfig: {
139
+ entryPointStrategy: EntryPointStrategy.EXPAND,
140
+ out: "docs/api",
141
+ exclude: ["**/*.test.ts"],
142
+ },
143
+ });
144
+ ```
145
+
146
+ ### Homebrew
147
+
148
+ Homebrew package management component.
149
+
150
+ ```typescript
151
+ import { Homebrew } from "@nikovirtala/projen-constructs";
152
+
153
+ const homebrew = new Homebrew(project, {
154
+ packages: ["jq", "yq"],
155
+ });
156
+
157
+ homebrew.addPackage("gh");
158
+ ```
159
+
160
+ ### Colima
161
+
162
+ Colima Docker runtime component.
163
+
164
+ ```typescript
165
+ import { Colima } from "@nikovirtala/projen-constructs";
166
+
167
+ new Colima(project);
168
+ ```
169
+
170
+ ### LocalStack
171
+
172
+ LocalStack AWS emulation component.
173
+
174
+ ```typescript
175
+ import { LocalStack } from "@nikovirtala/projen-constructs";
176
+
177
+ new LocalStack(project, {
178
+ services: ["s3", "lambda", "dynamodb"],
179
+ port: 4566,
180
+ debug: true,
181
+ });
182
+ ```
183
+
184
+ ### LambdaFunctionConstructGenerator
185
+
186
+ Generates AWS CDK Lambda Function constructs and bundles their code.
187
+
188
+ ```typescript
189
+ import { LambdaFunctionConstructGenerator } from "@nikovirtala/projen-constructs";
190
+
191
+ new LambdaFunctionConstructGenerator(project, {
192
+ sourceDir: "src/handlers",
193
+ outputDir: "src/constructs/lambda",
194
+ filePattern: "*.lambda.ts",
195
+ esbuildOptions: {
196
+ minify: true,
197
+ sourcemap: true,
198
+ },
199
+ });
200
+ ```
201
+
202
+ ### Bundler
203
+
204
+ Low-level bundling utilities for Lambda functions.
205
+
206
+ ```typescript
207
+ import {
208
+ Bundler,
209
+ LambdaFunctionCodeBundle,
210
+ } from "@nikovirtala/projen-constructs";
211
+
212
+ const bundler = new Bundler(project, {
213
+ assetsDir: "assets",
214
+ esbuildVersion: "^0.25",
215
+ });
216
+
217
+ new LambdaFunctionCodeBundle(project, {
218
+ entrypoint: "src/my-function.lambda.ts",
219
+ extension: ".lambda.ts",
220
+ });
221
+ ```
@@ -0,0 +1,62 @@
1
+ import { Component, type Project, type Task } from "projen";
2
+ export declare function renderBundleName(entrypoint: string): string;
3
+ export declare function convertToPosixPath(p: string): string;
4
+ export interface BundlerOptions {
5
+ readonly esbuildVersion?: string;
6
+ readonly assetsDir?: string;
7
+ readonly addToPreCompile?: boolean;
8
+ readonly loaders?: {
9
+ [key: string]: string;
10
+ };
11
+ }
12
+ export declare class Bundler extends Component {
13
+ static of(project: Project): Bundler | undefined;
14
+ readonly esbuildVersion: string | undefined;
15
+ readonly bundledir: string;
16
+ private _task;
17
+ private readonly addToPreCompile;
18
+ private readonly loaders?;
19
+ constructor(project: Project, options?: BundlerOptions);
20
+ get bundleTask(): Task;
21
+ addBundle(entrypoint: string, options: BundlingOptions): Bundle;
22
+ private addBundlingSupport;
23
+ }
24
+ export interface Bundle {
25
+ readonly bundleTask: Task;
26
+ readonly outfile: string;
27
+ readonly outdir: string;
28
+ }
29
+ export interface BundlingOptions {
30
+ readonly externals?: string[];
31
+ readonly sourcemap?: boolean;
32
+ readonly target?: string;
33
+ readonly platform?: string;
34
+ readonly outfile?: string;
35
+ readonly tsconfigPath?: string;
36
+ readonly loaders?: {
37
+ [key: string]: string;
38
+ };
39
+ readonly format?: string;
40
+ readonly minify?: boolean;
41
+ readonly sourcesContent?: boolean;
42
+ readonly mainFields?: string;
43
+ readonly banner?: string;
44
+ }
45
+ export interface LambdaFunctionCodeBundleOptions {
46
+ readonly entrypoint: string;
47
+ readonly extension: string;
48
+ readonly constructFile?: string;
49
+ readonly constructName?: string;
50
+ readonly bundlingOptions?: BundlingOptions;
51
+ }
52
+ export declare class LambdaFunctionCodeBundle extends Component {
53
+ constructor(project: Project, options: LambdaFunctionCodeBundleOptions);
54
+ }
55
+ export interface LambdaFunctionCodeBundlerOptions {
56
+ readonly extension: string;
57
+ readonly srcdir: string;
58
+ readonly bundleOptions?: LambdaFunctionCodeBundleOptions;
59
+ }
60
+ export declare class LambdaFunctionCodeBundler extends Component {
61
+ constructor(project: Project, options: LambdaFunctionCodeBundlerOptions);
62
+ }
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LambdaFunctionCodeBundler = exports.LambdaFunctionCodeBundle = exports.Bundler = void 0;
4
+ exports.renderBundleName = renderBundleName;
5
+ exports.convertToPosixPath = convertToPosixPath;
6
+ const path = require("node:path");
7
+ const node_path_1 = require("node:path");
8
+ const case_1 = require("case");
9
+ const projen_1 = require("projen");
10
+ function renderBundleName(entrypoint) {
11
+ const parts = (0, node_path_1.join)(entrypoint).split(node_path_1.sep);
12
+ if (parts[0] === "src") {
13
+ parts.shift();
14
+ }
15
+ const p = parts.join(node_path_1.sep);
16
+ const dir = (0, node_path_1.dirname)(p);
17
+ const base = (0, node_path_1.basename)(p, (0, node_path_1.extname)(p));
18
+ return (0, node_path_1.join)(dir, base);
19
+ }
20
+ function convertToPosixPath(p) {
21
+ return p.split(node_path_1.sep).join(node_path_1.posix.sep);
22
+ }
23
+ class Bundler extends projen_1.Component {
24
+ static of(project) {
25
+ const isBundler = (o) => o instanceof Bundler;
26
+ return project.components.find(isBundler);
27
+ }
28
+ constructor(project, options = {}) {
29
+ super(project);
30
+ this.esbuildVersion = options.esbuildVersion;
31
+ this.bundledir = options.assetsDir ?? "assets";
32
+ this.addToPreCompile = options.addToPreCompile ?? true;
33
+ this.loaders = options.loaders;
34
+ }
35
+ get bundleTask() {
36
+ if (!this._task) {
37
+ this.addBundlingSupport();
38
+ this._task = this.project.tasks.addTask("bundle", {
39
+ description: "Prepare assets",
40
+ });
41
+ if (this.addToPreCompile) {
42
+ this.project.preCompileTask.spawn(this._task);
43
+ }
44
+ }
45
+ return this._task;
46
+ }
47
+ addBundle(entrypoint, options) {
48
+ const name = renderBundleName(entrypoint);
49
+ const outdir = path.posix.join(this.bundledir, name);
50
+ const outfile = path.posix.join(outdir, options.outfile ?? "index.mjs");
51
+ const target = options.target ?? "esnext";
52
+ const platform = options.platform ?? "node";
53
+ const format = options.format ?? "esm";
54
+ const sourcemap = options.sourcemap ?? true;
55
+ const sourcesContent = options.sourcesContent ?? false;
56
+ const minify = options.minify ?? true;
57
+ const mainFields = options.mainFields ?? "module,main";
58
+ const banner = options.banner ??
59
+ ":js=import { createRequire as topLevelCreateRequire } from 'module';const require = topLevelCreateRequire(import.meta.url)";
60
+ const args = [
61
+ "esbuild",
62
+ "--bundle",
63
+ entrypoint,
64
+ `--target="${target}"`,
65
+ `--platform="${platform}"`,
66
+ `--outfile="${outfile}"`,
67
+ ];
68
+ const tsconfig = options.tsconfigPath ?? false;
69
+ if (tsconfig) {
70
+ args.push(`--tsconfig="${tsconfig}"`);
71
+ }
72
+ for (const x of options.externals ?? []) {
73
+ args.push(`--external:${x}`);
74
+ }
75
+ if (sourcemap) {
76
+ args.push("--sourcemap");
77
+ }
78
+ if (sourcesContent) {
79
+ args.push(`--sources-content=${sourcesContent}`);
80
+ }
81
+ if (minify) {
82
+ args.push("--minify");
83
+ }
84
+ if (format) {
85
+ args.push(`--format=${format}`);
86
+ }
87
+ if (mainFields) {
88
+ args.push(`--main-fields=${mainFields}`);
89
+ }
90
+ if (banner) {
91
+ args.push(`--banner${banner}`);
92
+ }
93
+ const loaders = (options.loaders ?? false) ? options.loaders : (this.loaders ?? false);
94
+ if (loaders) {
95
+ for (const [extension, loader] of Object.entries(loaders)) {
96
+ args.push(`--loader:.${extension}=${loader}`);
97
+ }
98
+ }
99
+ const bundleTask = this.project.addTask(`bundle:${name}`, {
100
+ description: `Create a JavaScript bundle from ${entrypoint}`,
101
+ exec: args.join(" "),
102
+ });
103
+ this.bundleTask.spawn(bundleTask);
104
+ return {
105
+ bundleTask: bundleTask,
106
+ outdir: outdir,
107
+ outfile: outfile,
108
+ };
109
+ }
110
+ addBundlingSupport() {
111
+ const ignoreEntry = `/${this.bundledir}/`;
112
+ this.project.addGitIgnore(ignoreEntry);
113
+ this.project.addPackageIgnore(`!${ignoreEntry}`);
114
+ const dep = this.esbuildVersion ? `esbuild@${this.esbuildVersion}` : "esbuild";
115
+ this.project.deps.addDependency(dep, projen_1.DependencyType.BUILD);
116
+ }
117
+ }
118
+ exports.Bundler = Bundler;
119
+ class LambdaFunctionCodeBundle extends projen_1.Component {
120
+ constructor(project, options) {
121
+ super(project);
122
+ const bundler = Bundler.of(project);
123
+ if (!bundler) {
124
+ throw new Error("No bundler found. Please add a Bundler component to your project.");
125
+ }
126
+ const eslint = projen_1.javascript.Eslint.of(project);
127
+ eslint?.allowDevDeps(options.entrypoint);
128
+ const entrypoint = options.entrypoint;
129
+ const extension = options.extension ?? ".lambda.ts";
130
+ if (!entrypoint.endsWith(extension)) {
131
+ throw new Error(`${entrypoint} must have a ${extension} extension`);
132
+ }
133
+ const basePath = path.posix.join(path.dirname(entrypoint), path.basename(entrypoint, extension));
134
+ const constructFile = options.constructFile ?? `${basePath}-code.ts`;
135
+ if (path.extname(constructFile) !== ".ts") {
136
+ throw new Error(`Construct file name "${constructFile}" must have a .ts extension`);
137
+ }
138
+ const constructName = options.constructName ?? `${(0, case_1.pascal)(path.basename(basePath))}FunctionCode`;
139
+ const bundle = bundler.addBundle(entrypoint, {
140
+ ...options.bundlingOptions,
141
+ tsconfigPath: project?.tsconfigDev?.fileName,
142
+ });
143
+ const outfileAbs = path.join(project.outdir, bundle.outfile);
144
+ const constructAbs = path.join(project.outdir, constructFile);
145
+ const relativeOutfile = path.relative(path.dirname(constructAbs), path.dirname(outfileAbs));
146
+ const src = new projen_1.SourceCode(project, constructFile);
147
+ if (src.marker) {
148
+ src.line(`// ${src.marker}`);
149
+ }
150
+ src.line("import * as path from 'path';");
151
+ src.line("import { aws_lambda } from 'aws-cdk-lib';");
152
+ src.line();
153
+ src.open(`export const ${constructName} = aws_lambda.Code.fromAsset(`);
154
+ src.line(`path.join(__dirname, '${convertToPosixPath(relativeOutfile)}'),`);
155
+ src.close(");");
156
+ this.project.logger.verbose(`${basePath}: construct "${constructName}" generated under "${constructFile}"`);
157
+ this.project.logger.verbose(`${basePath}: bundle task "${bundle.bundleTask.name}"`);
158
+ }
159
+ }
160
+ exports.LambdaFunctionCodeBundle = LambdaFunctionCodeBundle;
161
+ class LambdaFunctionCodeBundler extends projen_1.Component {
162
+ constructor(project, options) {
163
+ super(project);
164
+ const entrypoints = [];
165
+ for (const entrypoint of entrypoints) {
166
+ new LambdaFunctionCodeBundle(this.project, {
167
+ entrypoint: entrypoint,
168
+ extension: options.extension,
169
+ ...options.bundleOptions,
170
+ });
171
+ }
172
+ }
173
+ }
174
+ exports.LambdaFunctionCodeBundler = LambdaFunctionCodeBundler;
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDRDQVNDO0FBRUQsZ0RBRUM7QUFsQkQsa0NBQWtDO0FBQ2xDLHlDQUF5RTtBQUN6RSwrQkFBOEI7QUFDOUIsbUNBQXFIO0FBRXJILFNBQWdCLGdCQUFnQixDQUFDLFVBQWtCO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQUksRUFBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUEsbUJBQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFRLEVBQUMsQ0FBQyxFQUFFLElBQUEsbUJBQU8sRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sSUFBQSxnQkFBSSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsQ0FBUztJQUN4QyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQVNELE1BQWEsT0FBUSxTQUFRLGtCQUFTO0lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBZ0I7UUFDN0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFZLEVB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QUM7Q0FDSjtBQW5ERCw0REFtREM7QUFRRCxNQUFhLHlCQUEwQixTQUFRLGtCQUFTO0lBQ3BELFlBQVksT0FBZ0IsRUFBRSxPQUF5QztRQUNuRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7UUFFakMsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNuQyxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZDLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLEdBQUcsT0FBTyxDQUFDLGFBQWE7YUFDM0IsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQWRELDhEQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgZXh0bmFtZSwgam9pbiwgcG9zaXgsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBhc2NhbCB9IGZyb20gXCJjYXNlXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIERlcGVuZGVuY3lUeXBlLCBqYXZhc2NyaXB0LCB0eXBlIFByb2plY3QsIFNvdXJjZUNvZGUsIHR5cGUgVGFzaywgdHlwZSB0eXBlc2NyaXB0IH0gZnJvbSBcInByb2plblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQnVuZGxlTmFtZShlbnRyeXBvaW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJ0cyA9IGpvaW4oZW50cnlwb2ludCkuc3BsaXQoc2VwKTtcbiAgICBpZiAocGFydHNbMF0gPT09IFwic3JjXCIpIHtcbiAgICAgICAgcGFydHMuc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgcCA9IHBhcnRzLmpvaW4oc2VwKTtcbiAgICBjb25zdCBkaXIgPSBkaXJuYW1lKHApO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShwLCBleHRuYW1lKHApKTtcbiAgICByZXR1cm4gam9pbihkaXIsIGJhc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvUG9zaXhQYXRoKHA6IHN0cmluZykge1xuICAgIHJldHVybiBwLnNwbGl0KHNlcCkuam9pbihwb3NpeC5zZXApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsZXJPcHRpb25zIHtcbiAgICByZWFkb25seSBlc2J1aWxkVmVyc2lvbj86IHN0cmluZztcbiAgICByZWFkb25seSBhc3NldHNEaXI/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYWRkVG9QcmVDb21waWxlPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1bmRsZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEJ1bmRsZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBpc0J1bmRsZXIgPSAobzogQ29tcG9uZW50KTogbyBpcyBCdW5kbGVyID0+IG8gaW5zdGFuY2VvZiBCdW5kbGVyO1xuICAgICAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbmQoaXNCdW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZXNidWlsZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYnVuZGxlZGlyOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF90YXNrOiBUYXNrIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkVG9QcmVDb21waWxlOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBCdW5kbGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QpO1xuICAgICAgICB0aGlzLmVzYnVpbGRWZXJzaW9uID0gb3B0aW9ucy5lc2J1aWxkVmVyc2lvbjtcbiAgICAgICAgdGhpcy5idW5kbGVkaXIgPSBvcHRpb25zLmFzc2V0c0RpciA/PyBcImFzc2V0c1wiO1xuICAgICAgICB0aGlzLmFkZFRvUHJlQ29tcGlsZSA9IG9wdGlvbnMuYWRkVG9QcmVDb21waWxlID8/IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGVycyA9IG9wdGlvbnMubG9hZGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJ1bmRsZVRhc2soKTogVGFzayB7XG4gICAgICAgIGlmICghdGhpcy5fdGFzaykge1xuICAgICAgICAgICAgdGhpcy5hZGRCdW5kbGluZ1N1cHBvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2sgPSB0aGlzLnByb2plY3QudGFza3MuYWRkVGFzayhcImJ1bmRsZVwiLCB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUHJlcGFyZSBhc3NldHNcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWRkVG9QcmVDb21waWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LnByZUNvbXBpbGVUYXNrLnNwYXduKHRoaXMuX3Rhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90YXNrO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRCdW5kbGUoZW50cnlwb2ludDogc3RyaW5nLCBvcHRpb25zOiBCdW5kbGluZ09wdGlvbnMpOiBCdW5kbGUge1xuICAgICAgICBjb25zdCBuYW1lID0gcmVuZGVyQnVuZGxlTmFtZShlbnRyeXBvaW50KTtcbiAgICAgICAgY29uc3Qgb3V0ZGlyID0gcGF0aC5wb3NpeC5qb2luKHRoaXMuYnVuZGxlZGlyLCBuYW1lKTtcbiAgICAgICAgY29uc3Qgb3V0ZmlsZSA9IHBhdGgucG9zaXguam9pbihvdXRkaXIsIG9wdGlvbnMub3V0ZmlsZSA/PyBcImluZGV4Lm1qc1wiKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgPz8gXCJlc25leHRcIjtcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSBvcHRpb25zLnBsYXRmb3JtID8/IFwibm9kZVwiO1xuICAgICAgICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdCA/PyBcImVzbVwiO1xuICAgICAgICBjb25zdCBzb3VyY2VtYXAgPSBvcHRpb25zLnNvdXJjZW1hcCA/PyB0cnVlO1xuICAgICAgICBjb25zdCBzb3VyY2VzQ29udGVudCA9IG9wdGlvbnMuc291cmNlc0NvbnRlbnQgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pbmlmeSA9IG9wdGlvbnMubWluaWZ5ID8/IHRydWU7XG4gICAgICAgIGNvbnN0IG1haW5GaWVsZHMgPSBvcHRpb25zLm1haW5GaWVsZHMgPz8gXCJtb2R1bGUsbWFpblwiO1xuICAgICAgICBjb25zdCBiYW5uZXIgPVxuICAgICAgICAgICAgb3B0aW9ucy5iYW5uZXIgPz9cbiAgICAgICAgICAgIFwiOmpzPWltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgYXMgdG9wTGV2ZWxDcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztjb25zdCByZXF1aXJlID0gdG9wTGV2ZWxDcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcIjtcblxuICAgICAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAgICAgXCJlc2J1aWxkXCIsXG4gICAgICAgICAgICBcIi0tYnVuZGxlXCIsXG4gICAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgICAgYC0tdGFyZ2V0PVwiJHt0YXJnZXR9XCJgLFxuICAgICAgICAgICAgYC0tcGxhdGZvcm09XCIke3BsYXRmb3JtfVwiYCxcbiAgICAgICAgICAgIGAtLW91dGZpbGU9XCIke291dGZpbGV9XCJgLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHRzY29uZmlnID0gb3B0aW9ucy50c2NvbmZpZ1BhdGggPz8gZmFsc2U7XG4gICAgICAgIGlmICh0c2NvbmZpZykge1xuICAgICAgICAgICAgYXJncy5wdXNoKGAtLXRzY29uZmlnPVwiJHt0c2NvbmZpZ31cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB4IG9mIG9wdGlvbnMuZXh0ZXJuYWxzID8/IFtdKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goYC0tZXh0ZXJuYWw6JHt4fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZW1hcCkge1xuICAgICAgICAgICAgYXJncy5wdXNoKFwiLS1zb3VyY2VtYXBcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlc0NvbnRlbnQpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChgLS1zb3VyY2VzLWNvbnRlbnQ9JHtzb3VyY2VzQ29udGVudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaW5pZnkpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChcIi0tbWluaWZ5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgYXJncy5wdXNoKGAtLWZvcm1hdD0ke2Zvcm1hdH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYWluRmllbGRzKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goYC0tbWFpbi1maWVsZHM9JHttYWluRmllbGRzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbm5lcikge1xuICAgICAgICAgICAgYXJncy5wdXNoKGAtLWJhbm5lciR7YmFubmVyfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9hZGVycyA9IChvcHRpb25zLmxvYWRlcnMgPz8gZmFsc2UpID8gb3B0aW9ucy5sb2FkZXJzIDogKHRoaXMubG9hZGVycyA/PyBmYWxzZSk7XG4gICAgICAgIGlmIChsb2FkZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtleHRlbnNpb24sIGxvYWRlcl0gb2YgT2JqZWN0LmVudHJpZXMobG9hZGVycykpIHtcbiAgICAgICAgICAgICAgICBhcmdzLnB1c2goYC0tbG9hZGVyOi4ke2V4dGVuc2lvbn09JHtsb2FkZXJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidW5kbGVUYXNrID0gdGhpcy5wcm9qZWN0LmFkZFRhc2soYGJ1bmRsZToke25hbWV9YCwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDcmVhdGUgYSBKYXZhU2NyaXB0IGJ1bmRsZSBmcm9tICR7ZW50cnlwb2ludH1gLFxuICAgICAgICAgICAgZXhlYzogYXJncy5qb2luKFwiIFwiKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5idW5kbGVUYXNrLnNwYXduKGJ1bmRsZVRhc2spO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBidW5kbGVUYXNrOiBidW5kbGVUYXNrLFxuICAgICAgICAgICAgb3V0ZGlyOiBvdXRkaXIsXG4gICAgICAgICAgICBvdXRmaWxlOiBvdXRmaWxlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQnVuZGxpbmdTdXBwb3J0KCkge1xuICAgICAgICBjb25zdCBpZ25vcmVFbnRyeSA9IGAvJHt0aGlzLmJ1bmRsZWRpcn0vYDtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmFkZEdpdElnbm9yZShpZ25vcmVFbnRyeSk7XG4gICAgICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKGAhJHtpZ25vcmVFbnRyeX1gKTtcbiAgICAgICAgY29uc3QgZGVwID0gdGhpcy5lc2J1aWxkVmVyc2lvbiA/IGBlc2J1aWxkQCR7dGhpcy5lc2J1aWxkVmVyc2lvbn1gIDogXCJlc2J1aWxkXCI7XG4gICAgICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koZGVwLCBEZXBlbmRlbmN5VHlwZS5CVUlMRCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsZSB7XG4gICAgcmVhZG9ubHkgYnVuZGxlVGFzazogVGFzaztcbiAgICByZWFkb25seSBvdXRmaWxlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgb3V0ZGlyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxpbmdPcHRpb25zIHtcbiAgICByZWFkb25seSBleHRlcm5hbHM/OiBzdHJpbmdbXTtcbiAgICByZWFkb25seSBzb3VyY2VtYXA/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgICByZWFkb25seSBwbGF0Zm9ybT86IHN0cmluZztcbiAgICByZWFkb25seSBvdXRmaWxlPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICByZWFkb25seSBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgbWluaWZ5PzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzb3VyY2VzQ29udGVudD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgbWFpbkZpZWxkcz86IHN0cmluZztcbiAgICByZWFkb25seSBiYW5uZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlT3B0aW9ucyB7XG4gICAgcmVhZG9ubHkgZW50cnlwb2ludDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNvbnN0cnVjdEZpbGU/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY29uc3RydWN0TmFtZT86IHN0cmluZztcbiAgICByZWFkb25seSBidW5kbGluZ09wdGlvbnM/OiBCdW5kbGluZ09wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZU9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICAgICAgY29uc3QgYnVuZGxlciA9IEJ1bmRsZXIub2YocHJvamVjdCk7XG4gICAgICAgIGlmICghYnVuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYnVuZGxlciBmb3VuZC4gUGxlYXNlIGFkZCBhIEJ1bmRsZXIgY29tcG9uZW50IHRvIHlvdXIgcHJvamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlc2xpbnQgPSBqYXZhc2NyaXB0LkVzbGludC5vZihwcm9qZWN0KTtcbiAgICAgICAgZXNsaW50Py5hbGxvd0RldkRlcHMob3B0aW9ucy5lbnRyeXBvaW50KTtcblxuICAgICAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0aW9ucy5lbnRyeXBvaW50O1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBvcHRpb25zLmV4dGVuc2lvbiA/PyBcIi5sYW1iZGEudHNcIjtcblxuICAgICAgICBpZiAoIWVudHJ5cG9pbnQuZW5kc1dpdGgoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudHJ5cG9pbnR9IG11c3QgaGF2ZSBhICR7ZXh0ZW5zaW9ufSBleHRlbnNpb25gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5wb3NpeC5qb2luKHBhdGguZGlybmFtZShlbnRyeXBvaW50KSwgcGF0aC5iYXNlbmFtZShlbnRyeXBvaW50LCBleHRlbnNpb24pKTtcbiAgICAgICAgY29uc3QgY29uc3RydWN0RmlsZSA9IG9wdGlvbnMuY29uc3RydWN0RmlsZSA/PyBgJHtiYXNlUGF0aH0tY29kZS50c2A7XG5cbiAgICAgICAgaWYgKHBhdGguZXh0bmFtZShjb25zdHJ1Y3RGaWxlKSAhPT0gXCIudHNcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25zdHJ1Y3QgZmlsZSBuYW1lIFwiJHtjb25zdHJ1Y3RGaWxlfVwiIG11c3QgaGF2ZSBhIC50cyBleHRlbnNpb25gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdE5hbWUgPSBvcHRpb25zLmNvbnN0cnVjdE5hbWUgPz8gYCR7cGFzY2FsKHBhdGguYmFzZW5hbWUoYmFzZVBhdGgpKX1GdW5jdGlvbkNvZGVgO1xuXG4gICAgICAgIGNvbnN0IGJ1bmRsZSA9IGJ1bmRsZXIuYWRkQnVuZGxlKGVudHJ5cG9pbnQsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuYnVuZGxpbmdPcHRpb25zLFxuICAgICAgICAgICAgdHNjb25maWdQYXRoOiAocHJvamVjdCBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0KT8udHNjb25maWdEZXY/LmZpbGVOYW1lLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvdXRmaWxlQWJzID0gcGF0aC5qb2luKHByb2plY3Qub3V0ZGlyLCBidW5kbGUub3V0ZmlsZSk7XG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdEFicyA9IHBhdGguam9pbihwcm9qZWN0Lm91dGRpciwgY29uc3RydWN0RmlsZSk7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlT3V0ZmlsZSA9IHBhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKGNvbnN0cnVjdEFicyksIHBhdGguZGlybmFtZShvdXRmaWxlQWJzKSk7XG5cbiAgICAgICAgY29uc3Qgc3JjID0gbmV3IFNvdXJjZUNvZGUocHJvamVjdCwgY29uc3RydWN0RmlsZSk7XG4gICAgICAgIGlmIChzcmMubWFya2VyKSB7XG4gICAgICAgICAgICBzcmMubGluZShgLy8gJHtzcmMubWFya2VyfWApO1xuICAgICAgICB9XG4gICAgICAgIHNyYy5saW5lKFwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcIik7XG4gICAgICAgIHNyYy5saW5lKFwiaW1wb3J0IHsgYXdzX2xhbWJkYSB9IGZyb20gJ2F3cy1jZGstbGliJztcIik7XG4gICAgICAgIHNyYy5saW5lKCk7XG4gICAgICAgIHNyYy5vcGVuKGBleHBvcnQgY29uc3QgJHtjb25zdHJ1Y3ROYW1lfSA9IGF3c19sYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCk7XG4gICAgICAgIHNyYy5saW5lKGBwYXRoLmpvaW4oX19kaXJuYW1lLCAnJHtjb252ZXJ0VG9Qb3NpeFBhdGgocmVsYXRpdmVPdXRmaWxlKX0nKSxgKTtcbiAgICAgICAgc3JjLmNsb3NlKFwiKTtcIik7XG5cbiAgICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci52ZXJib3NlKGAke2Jhc2VQYXRofTogY29uc3RydWN0IFwiJHtjb25zdHJ1Y3ROYW1lfVwiIGdlbmVyYXRlZCB1bmRlciBcIiR7Y29uc3RydWN0RmlsZX1cImApO1xuICAgICAgICB0aGlzLnByb2plY3QubG9nZ2VyLnZlcmJvc2UoYCR7YmFzZVBhdGh9OiBidW5kbGUgdGFzayBcIiR7YnVuZGxlLmJ1bmRsZVRhc2submFtZX1cImApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVyT3B0aW9ucyB7XG4gICAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYnVuZGxlT3B0aW9ucz86IExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgICAgICBjb25zdCBlbnRyeXBvaW50czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5cG9pbnQgb2YgZW50cnlwb2ludHMpIHtcbiAgICAgICAgICAgIG5ldyBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGUodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgICAgICAgICAgZW50cnlwb2ludDogZW50cnlwb2ludCxcbiAgICAgICAgICAgICAgICBleHRlbnNpb246IG9wdGlvbnMuZXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMuYnVuZGxlT3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ import type { IConstruct } from "constructs";
2
+ import { Component } from "projen/lib/component";
3
+ export declare class Colima extends Component {
4
+ constructor(scope: IConstruct);
5
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Colima = void 0;
4
+ const component_1 = require("projen/lib/component");
5
+ const homebrew_1 = require("./homebrew");
6
+ class Colima extends component_1.Component {
7
+ constructor(scope) {
8
+ super(scope);
9
+ const project = this.project;
10
+ let homebrew = homebrew_1.Homebrew.of(project);
11
+ if (!homebrew) {
12
+ homebrew = new homebrew_1.Homebrew(project);
13
+ }
14
+ homebrew.addPackage("colima");
15
+ homebrew.addPackage("docker");
16
+ project.addTask("colima", {
17
+ exec: "colima status >/dev/null 2>&1 || colima start",
18
+ });
19
+ }
20
+ }
21
+ exports.Colima = Colima;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29saW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvY29saW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG9EQUFpRDtBQUNqRCx5Q0FBc0M7QUFFdEMsTUFBYSxNQUFPLFNBQVEscUJBQVM7SUFDakMsWUFBWSxLQUFpQjtRQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBa0IsQ0FBQztRQUV4QyxJQUFJLFFBQVEsR0FBRyxtQkFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDdEIsSUFBSSxFQUFFLCtDQUErQztTQUN4RCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFsQkQsd0JBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJwcm9qZW4vbGliL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgSG9tZWJyZXcgfSBmcm9tIFwiLi9ob21lYnJld1wiO1xuXG5leHBvcnQgY2xhc3MgQ29saW1hIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihzY29wZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBzdXBlcihzY29wZSk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdCA9IHRoaXMucHJvamVjdCBhcyBQcm9qZWN0O1xuXG4gICAgICAgIGxldCBob21lYnJldyA9IEhvbWVicmV3Lm9mKHByb2plY3QpO1xuICAgICAgICBpZiAoIWhvbWVicmV3KSB7XG4gICAgICAgICAgICBob21lYnJldyA9IG5ldyBIb21lYnJldyhwcm9qZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhvbWVicmV3LmFkZFBhY2thZ2UoXCJjb2xpbWFcIik7XG4gICAgICAgIGhvbWVicmV3LmFkZFBhY2thZ2UoXCJkb2NrZXJcIik7XG5cbiAgICAgICAgcHJvamVjdC5hZGRUYXNrKFwiY29saW1hXCIsIHtcbiAgICAgICAgICAgIGV4ZWM6IFwiY29saW1hIHN0YXR1cyA+L2Rldi9udWxsIDI+JjEgfHwgY29saW1hIHN0YXJ0XCIsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Component } from "projen/lib/component";
2
+ import type { Project } from "projen/lib/project";
3
+ export interface HomebrewOptions {
4
+ readonly packages?: string[];
5
+ }
6
+ export declare class Homebrew extends Component {
7
+ static of(project: Project): Homebrew | undefined;
8
+ private readonly packages;
9
+ constructor(project: Project, options?: HomebrewOptions);
10
+ addPackage(packageName: string): void;
11
+ private synthesizeBrewfile;
12
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Homebrew = void 0;
4
+ const component_1 = require("projen/lib/component");
5
+ const textfile_1 = require("projen/lib/textfile");
6
+ class Homebrew extends component_1.Component {
7
+ static of(project) {
8
+ const isHomebrew = (c) => c instanceof Homebrew;
9
+ return project.components.find(isHomebrew);
10
+ }
11
+ constructor(project, options = {}) {
12
+ super(project);
13
+ this.packages = new Set(options.packages ?? []);
14
+ const brewInstallTask = project.addTask("install:homebrew", {
15
+ exec: 'command -v brew >/dev/null 2>&1 || NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"',
16
+ });
17
+ project.defaultTask?.spawn(brewInstallTask);
18
+ this.synthesizeBrewfile();
19
+ }
20
+ addPackage(packageName) {
21
+ this.packages.add(packageName);
22
+ this.synthesizeBrewfile();
23
+ }
24
+ synthesizeBrewfile() {
25
+ if (this.packages.size === 0)
26
+ return;
27
+ this.project.tryRemoveFile("Brewfile");
28
+ new textfile_1.TextFile(this, "Brewfile", {
29
+ lines: Array.from(this.packages).map((pkg) => `brew "${pkg}"`),
30
+ });
31
+ const brewBundleTask = this.project.tasks.tryFind("homebrew:bundle") ??
32
+ this.project.addTask("homebrew:bundle", {
33
+ exec: "brew bundle",
34
+ });
35
+ const brewInstallTask = this.project.tasks.tryFind("install:homebrew");
36
+ if (brewInstallTask && !brewInstallTask.steps.some((s) => s.spawn === "homebrew:bundle")) {
37
+ brewInstallTask.spawn(brewBundleTask);
38
+ }
39
+ }
40
+ }
41
+ exports.Homebrew = Homebrew;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWJyZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9ob21lYnJldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBaUQ7QUFFakQsa0RBQStDO0FBTS9DLE1BQWEsUUFBUyxTQUFRLHFCQUFTO0lBQzVCLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBZ0I7UUFDN0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFZLEVBQWlCLEVBQUUsQ0FBQyxDQUFDLFlBQVksUUFBUSxDQUFDO1FBQzFFLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUlELFlBQVksT0FBZ0IsRUFBRSxVQUEyQixFQUFFO1FBQ3ZELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFO1lBQ3hELElBQUksRUFBRSxxSkFBcUo7U0FDOUosQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLFVBQVUsQ0FBQyxXQUFtQjtRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkMsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDM0IsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztTQUNqRSxDQUFDLENBQUM7UUFFSCxNQUFNLGNBQWMsR0FDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFO2dCQUNwQyxJQUFJLEVBQUUsYUFBYTthQUN0QixDQUFDLENBQUM7UUFFUCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxJQUFJLGVBQWUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN2RixlQUFlLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUEvQ0QsNEJBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plbi9saWIvY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi9wcm9qZWN0XCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCJwcm9qZW4vbGliL3RleHRmaWxlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9tZWJyZXdPcHRpb25zIHtcbiAgICByZWFkb25seSBwYWNrYWdlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgSG9tZWJyZXcgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEhvbWVicmV3IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgaXNIb21lYnJldyA9IChjOiBDb21wb25lbnQpOiBjIGlzIEhvbWVicmV3ID0+IGMgaW5zdGFuY2VvZiBIb21lYnJldztcbiAgICAgICAgcmV0dXJuIHByb2plY3QuY29tcG9uZW50cy5maW5kKGlzSG9tZWJyZXcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2FnZXM6IFNldDxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogSG9tZWJyZXdPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlcyA9IG5ldyBTZXQob3B0aW9ucy5wYWNrYWdlcyA/PyBbXSk7XG5cbiAgICAgICAgY29uc3QgYnJld0luc3RhbGxUYXNrID0gcHJvamVjdC5hZGRUYXNrKFwiaW5zdGFsbDpob21lYnJld1wiLCB7XG4gICAgICAgICAgICBleGVjOiAnY29tbWFuZCAtdiBicmV3ID4vZGV2L251bGwgMj4mMSB8fCBOT05JTlRFUkFDVElWRT0xIC9iaW4vYmFzaCAtYyBcIiQoY3VybCAtZnNTTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSG9tZWJyZXcvaW5zdGFsbC9IRUFEL2luc3RhbGwuc2gpXCInLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcm9qZWN0LmRlZmF1bHRUYXNrPy5zcGF3bihicmV3SW5zdGFsbFRhc2spO1xuXG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUJyZXdmaWxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhY2thZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhY2thZ2VzLmFkZChwYWNrYWdlTmFtZSk7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUJyZXdmaWxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW50aGVzaXplQnJld2ZpbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhY2thZ2VzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgICB0aGlzLnByb2plY3QudHJ5UmVtb3ZlRmlsZShcIkJyZXdmaWxlXCIpO1xuXG4gICAgICAgIG5ldyBUZXh0RmlsZSh0aGlzLCBcIkJyZXdmaWxlXCIsIHtcbiAgICAgICAgICAgIGxpbmVzOiBBcnJheS5mcm9tKHRoaXMucGFja2FnZXMpLm1hcCgocGtnKSA9PiBgYnJldyBcIiR7cGtnfVwiYCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJyZXdCdW5kbGVUYXNrID1cbiAgICAgICAgICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwiaG9tZWJyZXc6YnVuZGxlXCIpID8/XG4gICAgICAgICAgICB0aGlzLnByb2plY3QuYWRkVGFzayhcImhvbWVicmV3OmJ1bmRsZVwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJicmV3IGJ1bmRsZVwiLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYnJld0luc3RhbGxUYXNrID0gdGhpcy5wcm9qZWN0LnRhc2tzLnRyeUZpbmQoXCJpbnN0YWxsOmhvbWVicmV3XCIpO1xuICAgICAgICBpZiAoYnJld0luc3RhbGxUYXNrICYmICFicmV3SW5zdGFsbFRhc2suc3RlcHMuc29tZSgocykgPT4gcy5zcGF3biA9PT0gXCJob21lYnJldzpidW5kbGVcIikpIHtcbiAgICAgICAgICAgIGJyZXdJbnN0YWxsVGFzay5zcGF3bihicmV3QnVuZGxlVGFzayk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ export * from "./bundle-lambda-function-code";
2
+ export * from "./colima";
3
+ export * from "./homebrew";
4
+ export * from "./lambda-function-construct-generator";
5
+ export * from "./localstack";
6
+ export * from "./typedoc";
7
+ export * from "./vitest";
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./bundle-lambda-function-code"), exports);
18
+ __exportStar(require("./colima"), exports);
19
+ __exportStar(require("./homebrew"), exports);
20
+ __exportStar(require("./lambda-function-construct-generator"), exports);
21
+ __exportStar(require("./localstack"), exports);
22
+ __exportStar(require("./typedoc"), exports);
23
+ __exportStar(require("./vitest"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0VBQThDO0FBQzlDLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0Isd0VBQXNEO0FBQ3RELCtDQUE2QjtBQUM3Qiw0Q0FBMEI7QUFDMUIsMkNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2xpbWFcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hvbWVicmV3XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sYW1iZGEtZnVuY3Rpb24tY29uc3RydWN0LWdlbmVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9jYWxzdGFja1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZWRvY1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdml0ZXN0XCI7XG4iXX0=
@@ -0,0 +1,30 @@
1
+ import type { BuildOptions } from "@mrgrain/cdk-esbuild";
2
+ import { Component } from "projen";
3
+ import type { NodeProject } from "projen/lib/javascript";
4
+ export interface LambdaFunctionConstructGeneratorOptions {
5
+ readonly sourceDir?: string;
6
+ readonly outputDir?: string;
7
+ readonly filePattern?: string;
8
+ readonly esbuildOptions?: BuildOptions;
9
+ readonly addDependencies?: boolean;
10
+ readonly baseConstructImport?: string;
11
+ readonly baseConstructClass?: string;
12
+ readonly baseConstructPackage?: string;
13
+ }
14
+ export declare class LambdaFunctionConstructGenerator extends Component {
15
+ readonly sourceDir: string;
16
+ readonly outputDir: string;
17
+ readonly filePattern: string;
18
+ readonly esbuildOptions: BuildOptions;
19
+ readonly baseConstructImport?: string;
20
+ readonly baseConstructClass?: string;
21
+ readonly baseConstructPackage?: string;
22
+ private readonly nodeProject;
23
+ private readonly bundlerScriptPath;
24
+ constructor(project: NodeProject, options?: LambdaFunctionConstructGeneratorOptions);
25
+ private addDependencies;
26
+ private createUniqueId;
27
+ private createBundleTask;
28
+ private createBundlerScript;
29
+ private addBundleTaskToWorkflow;
30
+ }