projen 0.101.3 → 0.101.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 (157) hide show
  1. package/.jsii +878 -110
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/component.d.ts +70 -0
  34. package/lib/component.js +183 -3
  35. package/lib/dependencies.js +1 -1
  36. package/lib/dev-env.js +1 -1
  37. package/lib/docker-compose/docker-compose-service.js +1 -1
  38. package/lib/docker-compose/docker-compose.js +1 -1
  39. package/lib/file.js +1 -1
  40. package/lib/gitattributes.js +1 -1
  41. package/lib/github/actions-provider.js +1 -1
  42. package/lib/github/auto-approve.js +1 -1
  43. package/lib/github/auto-merge.js +1 -1
  44. package/lib/github/auto-queue.js +1 -1
  45. package/lib/github/dependabot.js +1 -1
  46. package/lib/github/dependency-review.js +1 -1
  47. package/lib/github/github-credentials.js +1 -1
  48. package/lib/github/github-project.js +1 -1
  49. package/lib/github/github.js +1 -1
  50. package/lib/github/merge-queue.js +1 -1
  51. package/lib/github/mergify.js +1 -1
  52. package/lib/github/pr-template.js +1 -1
  53. package/lib/github/pull-request-backport.js +1 -1
  54. package/lib/github/pull-request-lint.js +1 -1
  55. package/lib/github/stale.js +1 -1
  56. package/lib/github/task-workflow-job.js +1 -1
  57. package/lib/github/task-workflow.js +1 -1
  58. package/lib/github/workflow-actions.js +1 -1
  59. package/lib/github/workflow-jobs.js +1 -1
  60. package/lib/github/workflow-steps.js +1 -1
  61. package/lib/github/workflows.js +1 -1
  62. package/lib/gitlab/configuration.js +1 -1
  63. package/lib/gitlab/gitlab-configuration.js +1 -1
  64. package/lib/gitlab/nested-configuration.js +1 -1
  65. package/lib/gitpod.js +1 -1
  66. package/lib/ignore-file.js +1 -1
  67. package/lib/index.d.ts +1 -0
  68. package/lib/index.js +1 -1
  69. package/lib/ini.js +1 -1
  70. package/lib/java/java-project.js +1 -1
  71. package/lib/java/junit.js +1 -1
  72. package/lib/java/maven-compile.js +1 -1
  73. package/lib/java/maven-packaging.js +1 -1
  74. package/lib/java/maven-sample.js +1 -1
  75. package/lib/java/pom.js +2 -2
  76. package/lib/java/projenrc.js +1 -1
  77. package/lib/javascript/biome/biome.js +1 -1
  78. package/lib/javascript/bundler.js +1 -1
  79. package/lib/javascript/eslint.js +1 -1
  80. package/lib/javascript/jest.js +4 -4
  81. package/lib/javascript/license-checker.js +1 -1
  82. package/lib/javascript/node-package.js +1 -1
  83. package/lib/javascript/node-project.js +1 -1
  84. package/lib/javascript/npm-config.js +1 -1
  85. package/lib/javascript/prettier.js +1 -1
  86. package/lib/javascript/projenrc.js +1 -1
  87. package/lib/javascript/typescript-config.js +2 -2
  88. package/lib/javascript/upgrade-dependencies.js +2 -2
  89. package/lib/javascript/yarnrc.js +1 -1
  90. package/lib/json-patch.js +1 -1
  91. package/lib/json.js +1 -1
  92. package/lib/license.js +1 -1
  93. package/lib/logger.js +1 -1
  94. package/lib/makefile.js +1 -1
  95. package/lib/object-file.js +1 -1
  96. package/lib/project-build.js +1 -1
  97. package/lib/project-tree.js +1 -1
  98. package/lib/project.js +1 -1
  99. package/lib/projects.js +1 -1
  100. package/lib/projenrc-json.js +1 -1
  101. package/lib/projenrc.js +1 -1
  102. package/lib/python/pip.js +1 -1
  103. package/lib/python/poetry.js +2 -2
  104. package/lib/python/projenrc.js +1 -1
  105. package/lib/python/pyproject-toml-file.js +1 -1
  106. package/lib/python/pytest-sample.js +1 -1
  107. package/lib/python/pytest.js +1 -1
  108. package/lib/python/python-project.d.ts +1 -1
  109. package/lib/python/python-project.js +2 -2
  110. package/lib/python/python-sample.js +1 -1
  111. package/lib/python/requirements-file.js +1 -1
  112. package/lib/python/setuppy.js +1 -1
  113. package/lib/python/setuptools.js +1 -1
  114. package/lib/python/uv.js +1 -1
  115. package/lib/python/venv.js +1 -1
  116. package/lib/readme.js +1 -1
  117. package/lib/release/publisher.js +1 -1
  118. package/lib/release/release-trigger.js +1 -1
  119. package/lib/release/release.js +1 -1
  120. package/lib/renovatebot.js +1 -1
  121. package/lib/run-task.cjs +2 -2
  122. package/lib/sample-file.js +2 -2
  123. package/lib/script-runner.d.ts +35 -0
  124. package/lib/script-runner.js +22 -0
  125. package/lib/source-code.js +1 -1
  126. package/lib/task-shell.js +1 -1
  127. package/lib/task.js +1 -1
  128. package/lib/tasks.js +1 -1
  129. package/lib/testing.js +1 -1
  130. package/lib/textfile.js +1 -1
  131. package/lib/toml.js +1 -1
  132. package/lib/typescript/index.d.ts +1 -0
  133. package/lib/typescript/index.js +2 -1
  134. package/lib/typescript/projenrc-ts.d.ts +11 -3
  135. package/lib/typescript/projenrc-ts.js +38 -6
  136. package/lib/typescript/projenrc.d.ts +14 -3
  137. package/lib/typescript/projenrc.js +36 -18
  138. package/lib/typescript/typescript-runner.d.ts +146 -0
  139. package/lib/typescript/typescript-runner.js +134 -0
  140. package/lib/typescript/typescript-typedoc.js +1 -1
  141. package/lib/typescript/typescript.d.ts +14 -0
  142. package/lib/typescript/typescript.js +12 -6
  143. package/lib/util/recreate.d.ts +30 -0
  144. package/lib/util/recreate.js +38 -0
  145. package/lib/version.js +2 -2
  146. package/lib/vscode/devcontainer.js +1 -1
  147. package/lib/vscode/extensions.js +1 -1
  148. package/lib/vscode/launch-config.js +1 -1
  149. package/lib/vscode/settings.js +1 -1
  150. package/lib/vscode/vscode.js +1 -1
  151. package/lib/web/next.js +3 -3
  152. package/lib/web/postcss.js +1 -1
  153. package/lib/web/react.js +3 -3
  154. package/lib/web/tailwind.js +1 -1
  155. package/lib/xmlfile.js +1 -1
  156. package/lib/yaml.js +1 -1
  157. package/package.json +2 -2
@@ -7,23 +7,25 @@ const path_1 = require("path");
7
7
  const javascript_1 = require("../javascript");
8
8
  const render_options_1 = require("../javascript/render-options");
9
9
  const projenrc_1 = require("../projenrc");
10
+ const typescript_runner_1 = require("./typescript-runner");
10
11
  const DEFAULT_FILENAME = ".projenrc.ts";
11
12
  /**
12
- * Sets up a typescript project to use TypeScript for projenrc.
13
+ * A projenrc file written in TypeScript
14
+ *
15
+ * This component is used within TypeScriptProject.
13
16
  */
14
17
  class Projenrc extends projenrc_1.ProjenrcFile {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.Projenrc", version: "0.101.3" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.Projenrc", version: "0.101.4" };
16
19
  filePath;
17
20
  tsconfig;
18
21
  _projenCodeDir;
19
22
  _tsProject;
20
- _swc;
23
+ _runner;
21
24
  constructor(project, options = {}) {
22
25
  super(project);
23
26
  this._tsProject = project;
24
27
  this.filePath = options.filename ?? DEFAULT_FILENAME;
25
28
  this._projenCodeDir = options.projenCodeDir ?? "projenrc";
26
- this._swc = options.swc ?? false;
27
29
  // Give the projenrc source tree its own `tsconfig.json` so the eslint
28
30
  // project service (and editors) resolve it as the nearest config for those
29
31
  // files. This avoids listing the whole tree under `allowDefaultProject`,
@@ -32,30 +34,46 @@ class Projenrc extends projenrc_1.ProjenrcFile {
32
34
  const baseTsconfig = project.tsconfig ?? project.tsconfigDev;
33
35
  this.tsconfig = new javascript_1.TypescriptConfig(project, {
34
36
  fileName: `${this._projenCodeDir}/tsconfig.json`,
35
- include: ["**/*.ts"],
37
+ include: ["**/*.ts", path_1.posix.relative(this._projenCodeDir, this.filePath)],
36
38
  extends: javascript_1.TypescriptConfigExtends.fromTypescriptConfigs([baseTsconfig]),
37
39
  compilerOptions: {
38
40
  noEmit: true,
39
41
  rootDir: path_1.posix.relative(this._projenCodeDir, ".") || ".",
40
42
  },
41
43
  });
44
+ // A runner is a future component, make sure it is attached
45
+ this._runner = this.getRunner(options).tryAttach(this._tsProject);
42
46
  this.addDefaultTask();
43
47
  this.generateProjenrc();
44
48
  }
45
49
  addDefaultTask() {
46
- const deps = ["ts-node"];
47
- if (this._swc) {
48
- deps.push("@swc/core");
50
+ // Render the run config for the entrypoint
51
+ const { dependencies, steps } = this._runner.configFor(this.filePath);
52
+ // Request runner dependencies
53
+ for (const dep of dependencies) {
54
+ this._tsProject.deps.requestDependency(dep);
49
55
  }
50
- // this is the task projen executes when running `projen` without a
51
- // specific task (if this task is not defined, projen falls back to
52
- // running "node .projenrc.js").
53
- this._tsProject.addDevDeps(...deps);
54
- const tsNode = this._swc ? "ts-node --swc" : "ts-node";
55
- // ts-node compiles the entrypoint and its imports on demand using the dev
56
- // tsconfig's compiler options, so projen source files may reside anywhere
57
- // in the project tree regardless of the config's `include`.
58
- this._tsProject.defaultTask?.exec(`${tsNode} --project ${this._tsProject.tsconfigDev.fileName} ${this.filePath}`);
56
+ // Add runner steps
57
+ this._tsProject.defaultTask?.addSteps(...steps);
58
+ }
59
+ getRunner(options) {
60
+ // use a provide runner as is
61
+ if (options.runner) {
62
+ return options.runner;
63
+ }
64
+ // swc implies ts-node runner for backwards compatibility
65
+ if (options.swc) {
66
+ return typescript_runner_1.TypeScriptRunner.tsNode({
67
+ swc: true,
68
+ typeCheck: true,
69
+ tsconfig: this.tsconfig.fileName,
70
+ }).tryAttach(this._tsProject);
71
+ }
72
+ // we use the project's default runner with the correct tsconfig and type-checking enabled
73
+ return this._tsProject.runner.copy({
74
+ tsconfig: this.tsconfig.fileName,
75
+ typeCheck: true,
76
+ });
59
77
  }
60
78
  preSynthesize() {
61
79
  super.preSynthesize();
@@ -118,4 +136,4 @@ class Projenrc extends projenrc_1.ProjenrcFile {
118
136
  }
119
137
  }
120
138
  exports.Projenrc = Projenrc;
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVucmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXNjcmlwdC9wcm9qZW5yYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsMkJBQTBEO0FBQzFELCtCQUErQztBQUUvQyw4Q0FBMEU7QUFDMUUsaUVBQXVFO0FBQ3ZFLDBDQUEyQztBQTBCM0MsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUM7QUFFeEM7O0dBRUc7QUFDSCxNQUFhLFFBQVMsU0FBUSx1QkFBWTs7SUFDeEIsUUFBUSxDQUFTO0lBQ2pCLFFBQVEsQ0FBbUI7SUFFMUIsY0FBYyxDQUFTO0lBQ3ZCLFVBQVUsQ0FBb0I7SUFDOUIsSUFBSSxDQUFVO0lBRS9CLFlBQVksT0FBMEIsRUFBRSxVQUEyQixFQUFFO1FBQ25FLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO1FBRTFCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDO1FBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFFakMsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUscUVBQXFFO1FBQ3JFLDZEQUE2RDtRQUM3RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDZCQUFnQixDQUFDLE9BQU8sRUFBRTtZQUM1QyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxnQkFBZ0I7WUFDaEQsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxvQ0FBdUIsQ0FBQyxxQkFBcUIs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LFFBQVE7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDcEUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRS9CLElBQUEsY0FBUyxFQUFDLElBQUEsY0FBTyxFQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBQSxrQkFBYSxFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0QiwwQ0FBMEMsTUFBTSxFQUFFLENBQ25ELENBQUM7SUFDSixDQUFDOztBQXRJSCw0QkF1SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCB3cml0ZUZpbGVTeW5jLCBta2RpclN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIHBvc2l4LCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgSW52ZW50b3J5UHJvamVjdFR5cGUgfSBmcm9tIFwiLi4vaW52ZW50b3J5XCI7XG5pbXBvcnQgeyBUeXBlc2NyaXB0Q29uZmlnLCBUeXBlc2NyaXB0Q29uZmlnRXh0ZW5kcyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyByZW5kZXJKYXZhU2NyaXB0T3B0aW9ucyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0L3JlbmRlci1vcHRpb25zXCI7XG5pbXBvcnQgeyBQcm9qZW5yY0ZpbGUgfSBmcm9tIFwiLi4vcHJvamVucmNcIjtcbmltcG9ydCB0eXBlIHsgVHlwZVNjcmlwdFByb2plY3QgfSBmcm9tIFwiLi4vdHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2plbnJjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVucmMgZmlsZS5cbiAgICogQGRlZmF1bHQgXCIucHJvamVucmMudHNcIlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZW5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGlyZWN0b3J5IHRyZWUgdGhhdCBtYXkgY29udGFpbiAqLnRzIGZpbGVzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbVxuICAgKiB5b3VyIHByb2plbnJjIHR5cGVzY3JpcHQgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJwcm9qZW5yY1wiXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5Db2RlRGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBgU1dDYCBmb3IgdHMtbm9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN3Yz86IGJvb2xlYW47XG59XG5cbmNvbnN0IERFRkFVTFRfRklMRU5BTUUgPSBcIi5wcm9qZW5yYy50c1wiO1xuXG4vKipcbiAqIFNldHMgdXAgYSB0eXBlc2NyaXB0IHByb2plY3QgdG8gdXNlIFR5cGVTY3JpcHQgZm9yIHByb2plbnJjLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVucmMgZXh0ZW5kcyBQcm9qZW5yY0ZpbGUge1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRzY29uZmlnOiBUeXBlc2NyaXB0Q29uZmlnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2plbkNvZGVEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfdHNQcm9qZWN0OiBUeXBlU2NyaXB0UHJvamVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3djOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFR5cGVTY3JpcHRQcm9qZWN0LCBvcHRpb25zOiBQcm9qZW5yY09wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuICAgIHRoaXMuX3RzUHJvamVjdCA9IHByb2plY3Q7XG5cbiAgICB0aGlzLmZpbGVQYXRoID0gb3B0aW9ucy5maWxlbmFtZSA/PyBERUZBVUxUX0ZJTEVOQU1FO1xuICAgIHRoaXMuX3Byb2plbkNvZGVEaXIgPSBvcHRpb25zLnByb2plbkNvZGVEaXIgPz8gXCJwcm9qZW5yY1wiO1xuICAgIHRoaXMuX3N3YyA9IG9wdGlvbnMuc3djID8/IGZhbHNlO1xuXG4gICAgLy8gR2l2ZSB0aGUgcHJvamVucmMgc291cmNlIHRyZWUgaXRzIG93biBgdHNjb25maWcuanNvbmAgc28gdGhlIGVzbGludFxuICAgIC8vIHByb2plY3Qgc2VydmljZSAoYW5kIGVkaXRvcnMpIHJlc29sdmUgaXQgYXMgdGhlIG5lYXJlc3QgY29uZmlnIGZvciB0aG9zZVxuICAgIC8vIGZpbGVzLiBUaGlzIGF2b2lkcyBsaXN0aW5nIHRoZSB3aG9sZSB0cmVlIHVuZGVyIGBhbGxvd0RlZmF1bHRQcm9qZWN0YCxcbiAgICAvLyB3aGljaCBvbmx5IHBlcm1pdHMgYSBzbWFsbCBudW1iZXIgb2YgbG9vc2UgZmlsZXMgKGFuZCByZWplY3RzIGAqKmBcbiAgICAvLyBnbG9icykuIEl0IGV4dGVuZHMgdGhlIHJvb3QgY29uZmlnIGFuZCBpcyB0eXBlLWNoZWNrIG9ubHkuXG4gICAgY29uc3QgYmFzZVRzY29uZmlnID0gcHJvamVjdC50c2NvbmZpZyA/PyBwcm9qZWN0LnRzY29uZmlnRGV2O1xuICAgIHRoaXMudHNjb25maWcgPSBuZXcgVHlwZXNjcmlwdENvbmZpZyhwcm9qZWN0LCB7XG4gICAgICBmaWxlTmFtZTogYCR7dGhpcy5fcHJvamVuQ29kZURpcn0vdHNjb25maWcuanNvbmAsXG4gICAgICBpbmNsdWRlOiBbXCIqKi8qLnRzXCJdLFxuICAgICAgZXh0ZW5kczogVHlwZXNjcmlwdENvbmZpZ0V4dGVuZHMuZnJvbVR5cGVzY3JpcHRDb25maWdzKFtiYXNlVHNjb25maWddKSxcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICBub0VtaXQ6IHRydWUsXG4gICAgICAgIHJvb3REaXI6IHBvc2l4LnJlbGF0aXZlKHRoaXMuX3Byb2plbkNvZGVEaXIsIFwiLlwiKSB8fCBcIi5cIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRUYXNrKCk7XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJvamVucmMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVmYXVsdFRhc2soKSB7XG4gICAgY29uc3QgZGVwcyA9IFtcInRzLW5vZGVcIl07XG4gICAgaWYgKHRoaXMuX3N3Yykge1xuICAgICAgZGVwcy5wdXNoKFwiQHN3Yy9jb3JlXCIpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgdGhlIHRhc2sgcHJvamVuIGV4ZWN1dGVzIHdoZW4gcnVubmluZyBgcHJvamVuYCB3aXRob3V0IGFcbiAgICAvLyBzcGVjaWZpYyB0YXNrIChpZiB0aGlzIHRhc2sgaXMgbm90IGRlZmluZWQsIHByb2plbiBmYWxscyBiYWNrIHRvXG4gICAgLy8gcnVubmluZyBcIm5vZGUgLnByb2plbnJjLmpzXCIpLlxuICAgIHRoaXMuX3RzUHJvamVjdC5hZGREZXZEZXBzKC4uLmRlcHMpO1xuXG4gICAgY29uc3QgdHNOb2RlID0gdGhpcy5fc3djID8gXCJ0cy1ub2RlIC0tc3djXCIgOiBcInRzLW5vZGVcIjtcblxuICAgIC8vIHRzLW5vZGUgY29tcGlsZXMgdGhlIGVudHJ5cG9pbnQgYW5kIGl0cyBpbXBvcnRzIG9uIGRlbWFuZCB1c2luZyB0aGUgZGV2XG4gICAgLy8gdHNjb25maWcncyBjb21waWxlciBvcHRpb25zLCBzbyBwcm9qZW4gc291cmNlIGZpbGVzIG1heSByZXNpZGUgYW55d2hlcmVcbiAgICAvLyBpbiB0aGUgcHJvamVjdCB0cmVlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZydzIGBpbmNsdWRlYC5cbiAgICB0aGlzLl90c1Byb2plY3QuZGVmYXVsdFRhc2s/LmV4ZWMoXG4gICAgICBgJHt0c05vZGV9IC0tcHJvamVjdCAke3RoaXMuX3RzUHJvamVjdC50c2NvbmZpZ0Rldi5maWxlTmFtZX0gJHt0aGlzLmZpbGVQYXRofWAsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLnByZVN5bnRoZXNpemUoKTtcblxuICAgIHRoaXMuX3RzUHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKGAvJHt0aGlzLmZpbGVQYXRofWApO1xuICAgIHRoaXMuX3RzUHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKGAvJHt0aGlzLl9wcm9qZW5Db2RlRGlyfWApO1xuXG4gICAgLy8gVGhlIHByb2plbnJjIGVudHJ5cG9pbnQgbGl2ZXMgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdCBhbmQgaXMgbm90IGNvdmVyZWRcbiAgICAvLyBieSBhbnkgYHRzY29uZmlnLmpzb25gLiBSZWdpc3RlciBvbmx5IHRoaXMgc2luZ2xlIGZpbGUgd2l0aCB0aGUgZXNsaW50XG4gICAgLy8gcHJvamVjdCBzZXJ2aWNlJ3MgZGVmYXVsdCBwcm9qZWN0ICh0aGUgcHJvamVucmMgc291cmNlIHRyZWUgaXMgY292ZXJlZFxuICAgIC8vIGJ5IGl0cyBvd24gdHNjb25maWcpLiBgYWxsb3dEZWZhdWx0UHJvamVjdGAgZG9lcyBub3QgcGVybWl0IGAqKmAgZ2xvYnMuXG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWxsb3dEZWZhdWx0UHJvamVjdEZpbGVzKHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWRkTGludFBhdHRlcm4odGhpcy5fcHJvamVuQ29kZURpcik7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWRkTGludFBhdHRlcm4odGhpcy5maWxlUGF0aCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWxsb3dEZXZEZXBzKHRoaXMuZmlsZVBhdGgpO1xuICAgIHRoaXMuX3RzUHJvamVjdC5lc2xpbnQ/LmFsbG93RGV2RGVwcyhgJHt0aGlzLl9wcm9qZW5Db2RlRGlyfS8qKi8qLnRzYCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWRkSWdub3JlUGF0dGVybihgISR7dGhpcy5maWxlUGF0aH1gKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRJZ25vcmVQYXR0ZXJuKGAhJHt0aGlzLl9wcm9qZW5Db2RlRGlyfS8qKi8qLnRzYCk7XG5cbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRPdmVycmlkZSh7XG4gICAgICBmaWxlczogW3RoaXMuZmlsZVBhdGhdLFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXCI6IFwib2ZmXCIsXG4gICAgICAgIFwiaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXCI6IFwib2ZmXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdHNQcm9qZWN0LmJpb21lPy5hZGRGaWxlUGF0dGVybih0aGlzLmZpbGVQYXRoKTtcbiAgICB0aGlzLl90c1Byb2plY3QuYmlvbWU/LmFkZEZpbGVQYXR0ZXJuKGAke3RoaXMuX3Byb2plbkNvZGVEaXJ9LyoqYCk7XG5cbiAgICB0aGlzLl90c1Byb2plY3QuamVzdD8uZGlzY292ZXJUZXN0TWF0Y2hQYXR0ZXJuc0ZvckRpcnMoXG4gICAgICBbdGhpcy5fcHJvamVuQ29kZURpcl0sXG4gICAgICB7XG4gICAgICAgIGZpbGVFeHRlbnNpb25QYXR0ZXJuOiB0aGlzLl90c1Byb2plY3QudHNjb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYWxsb3dKc1xuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBcInRzPyh4KVwiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVByb2plbnJjKCkge1xuICAgIGNvbnN0IHJjZmlsZSA9IHJlc29sdmUodGhpcy5wcm9qZWN0Lm91dGRpciwgdGhpcy5maWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0c1N5bmMocmNmaWxlKSkge1xuICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGV4aXN0c1xuICAgIH1cblxuICAgIGNvbnN0IGJvb3RzdHJhcCA9IHRoaXMucHJvamVjdC5pbml0UHJvamVjdDtcbiAgICBpZiAoIWJvb3RzdHJhcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gYm9vdHN0cmFwLmZxbi5zcGxpdChcIi5cIik7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IGltcG9ydE5hbWUgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKTtcblxuICAgIGNvbnN0IHsgcmVuZGVyZWRPcHRpb25zLCBpbXBvcnRzIH0gPSByZW5kZXJKYXZhU2NyaXB0T3B0aW9ucyh7XG4gICAgICBhcmdzOiBib290c3RyYXAuYXJncyxcbiAgICAgIHR5cGU6IGJvb3RzdHJhcC50eXBlIGFzIEludmVudG9yeVByb2plY3RUeXBlLFxuICAgICAgY29tbWVudHM6IGJvb3RzdHJhcC5jb21tZW50cyxcbiAgICB9KTtcblxuICAgIGltcG9ydHMuYWRkKG1vZHVsZU5hbWUsIGltcG9ydE5hbWUpO1xuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGxpbmVzLnB1c2goLi4uaW1wb3J0cy5hc0VzbUltcG9ydHMoKSk7XG4gICAgbGluZXMucHVzaCgpO1xuICAgIGxpbmVzLnB1c2goYGNvbnN0IHByb2plY3QgPSBuZXcgJHtjbGFzc05hbWV9KCR7cmVuZGVyZWRPcHRpb25zfSk7YCk7XG4gICAgbGluZXMucHVzaCgpO1xuICAgIGxpbmVzLnB1c2goXCJwcm9qZWN0LnN5bnRoKCk7XCIpO1xuXG4gICAgbWtkaXJTeW5jKGRpcm5hbWUocmNmaWxlKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhyY2ZpbGUsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcbiAgICAgIGBQcm9qZWN0IGRlZmluaXRpb24gZmlsZSB3YXMgY3JlYXRlZCBhdCAke3JjZmlsZX1gLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVucmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXNjcmlwdC9wcm9qZW5yYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsMkJBQTBEO0FBQzFELCtCQUErQztBQUUvQyw4Q0FBMEU7QUFFMUUsaUVBQXVFO0FBQ3ZFLDBDQUEyQztBQUMzQywyREFBdUQ7QUFpQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO0FBRXhDOzs7O0dBSUc7QUFDSCxNQUFhLFFBQVMsU0FBUSx1QkFBWTs7SUFDeEIsUUFBUSxDQUFTO0lBQ2pCLFFBQVEsQ0FBbUI7SUFFMUIsY0FBYyxDQUFTO0lBQ3ZCLFVBQVUsQ0FBb0I7SUFDOUIsT0FBTyxDQUFtQjtJQUUzQyxZQUFZLE9BQTBCLEVBQUUsVUFBMkIsRUFBRTtRQUNuRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUUxQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksZ0JBQWdCLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLFVBQVUsQ0FBQztRQUUxRCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsNkRBQTZEO1FBQzdELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUM3RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksNkJBQWdCLENBQUMsT0FBTyxFQUFFO1lBQzVDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLGdCQUFnQjtZQUNoRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RSxPQUFP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QSxrQkFBYSxFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0QiwwQ0FBMEMsTUFBTSxFQUFFLENBQ25ELENBQUM7SUFDSixDQUFDOztBQXRKSCw0QkF1SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIHBvc2l4LCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgSW52ZW50b3J5UHJvamVjdFR5cGUgfSBmcm9tIFwiLi4vaW52ZW50b3J5XCI7XG5pbXBvcnQgeyBUeXBlc2NyaXB0Q29uZmlnLCBUeXBlc2NyaXB0Q29uZmlnRXh0ZW5kcyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgdHlwZSB7IFR5cGVTY3JpcHRQcm9qZWN0IH0gZnJvbSBcIi4vdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgcmVuZGVySmF2YVNjcmlwdE9wdGlvbnMgfSBmcm9tIFwiLi4vamF2YXNjcmlwdC9yZW5kZXItb3B0aW9uc1wiO1xuaW1wb3J0IHsgUHJvamVucmNGaWxlIH0gZnJvbSBcIi4uL3Byb2plbnJjXCI7XG5pbXBvcnQgeyBUeXBlU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vdHlwZXNjcmlwdC1ydW5uZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZW5yY09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plbnJjIGZpbGUuXG4gICAqIEBkZWZhdWx0IFwiLnByb2plbnJjLnRzXCJcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRpcmVjdG9yeSB0cmVlIHRoYXQgbWF5IGNvbnRhaW4gKi50cyBmaWxlcyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb21cbiAgICogeW91ciBwcm9qZW5yYyB0eXBlc2NyaXB0IGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwicHJvamVucmNcIlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVuQ29kZURpcj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYFNXQ2AgZm9yIHRzLW5vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgcnVubmVyOiBUeXBlU2NyaXB0UnVubmVyLnRzTm9kZSh7IHN3YzogdHJ1ZSB9KWAgaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN3Yz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBydW5uZXIgdG8gdXNlIGZvciBleGVjdXRpbmcgVHlwZVNjcmlwdCBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcHJvamVjdCdzIHJ1bm5lclxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmVyPzogVHlwZVNjcmlwdFJ1bm5lcjtcbn1cblxuY29uc3QgREVGQVVMVF9GSUxFTkFNRSA9IFwiLnByb2plbnJjLnRzXCI7XG5cbi8qKlxuICogQSBwcm9qZW5yYyBmaWxlIHdyaXR0ZW4gaW4gVHlwZVNjcmlwdFxuICpcbiAqIFRoaXMgY29tcG9uZW50IGlzIHVzZWQgd2l0aGluIFR5cGVTY3JpcHRQcm9qZWN0LlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVucmMgZXh0ZW5kcyBQcm9qZW5yY0ZpbGUge1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRzY29uZmlnOiBUeXBlc2NyaXB0Q29uZmlnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2plbkNvZGVEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfdHNQcm9qZWN0OiBUeXBlU2NyaXB0UHJvamVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcnVubmVyOiBUeXBlU2NyaXB0UnVubmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFR5cGVTY3JpcHRQcm9qZWN0LCBvcHRpb25zOiBQcm9qZW5yY09wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuICAgIHRoaXMuX3RzUHJvamVjdCA9IHByb2plY3Q7XG5cbiAgICB0aGlzLmZpbGVQYXRoID0gb3B0aW9ucy5maWxlbmFtZSA/PyBERUZBVUxUX0ZJTEVOQU1FO1xuICAgIHRoaXMuX3Byb2plbkNvZGVEaXIgPSBvcHRpb25zLnByb2plbkNvZGVEaXIgPz8gXCJwcm9qZW5yY1wiO1xuXG4gICAgLy8gR2l2ZSB0aGUgcHJvamVucmMgc291cmNlIHRyZWUgaXRzIG93biBgdHNjb25maWcuanNvbmAgc28gdGhlIGVzbGludFxuICAgIC8vIHByb2plY3Qgc2VydmljZSAoYW5kIGVkaXRvcnMpIHJlc29sdmUgaXQgYXMgdGhlIG5lYXJlc3QgY29uZmlnIGZvciB0aG9zZVxuICAgIC8vIGZpbGVzLiBUaGlzIGF2b2lkcyBsaXN0aW5nIHRoZSB3aG9sZSB0cmVlIHVuZGVyIGBhbGxvd0RlZmF1bHRQcm9qZWN0YCxcbiAgICAvLyB3aGljaCBvbmx5IHBlcm1pdHMgYSBzbWFsbCBudW1iZXIgb2YgbG9vc2UgZmlsZXMgKGFuZCByZWplY3RzIGAqKmBcbiAgICAvLyBnbG9icykuIEl0IGV4dGVuZHMgdGhlIHJvb3QgY29uZmlnIGFuZCBpcyB0eXBlLWNoZWNrIG9ubHkuXG4gICAgY29uc3QgYmFzZVRzY29uZmlnID0gcHJvamVjdC50c2NvbmZpZyA/PyBwcm9qZWN0LnRzY29uZmlnRGV2O1xuICAgIHRoaXMudHNjb25maWcgPSBuZXcgVHlwZXNjcmlwdENvbmZpZyhwcm9qZWN0LCB7XG4gICAgICBmaWxlTmFtZTogYCR7dGhpcy5fcHJvamVuQ29kZURpcn0vdHNjb25maWcuanNvbmAsXG4gICAgICBpbmNsdWRlOiBbXCIqKi8qLnRzXCIsIHBvc2l4LnJlbGF0aXZlKHRoaXMuX3Byb2plbkNvZGVEaXIsIHRoaXMuZmlsZVBhdGgpXSxcbiAgICAgIGV4dGVuZHM6IFR5cGVzY3JpcHRDb25maWdFeHRlbmRzLmZyb21UeXBlc2NyaXB0Q29uZmlncyhbYmFzZVRzY29uZmlnXSksXG4gICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgbm9FbWl0OiB0cnVlLFxuICAgICAgICByb290RGlyOiBwb3NpeC5yZWxhdGl2ZSh0aGlzLl9wcm9qZW5Db2RlRGlyLCBcIi5cIikgfHwgXCIuXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQSBydW5uZXIgaXMgYSBmdXR1cmUgY29tcG9uZW50LCBtYWtlIHN1cmUgaXQgaXMgYXR0YWNoZWRcbiAgICB0aGlzLl9ydW5uZXIgPSB0aGlzLmdldFJ1bm5lcihvcHRpb25zKS50cnlBdHRhY2godGhpcy5fdHNQcm9qZWN0KTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdFRhc2soKTtcblxuICAgIHRoaXMuZ2VuZXJhdGVQcm9qZW5yYygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0VGFzaygpIHtcbiAgICAvLyBSZW5kZXIgdGhlIHJ1biBjb25maWcgZm9yIHRoZSBlbnRyeXBvaW50XG4gICAgY29uc3QgeyBkZXBlbmRlbmNpZXMsIHN0ZXBzIH0gPSB0aGlzLl9ydW5uZXIuY29uZmlnRm9yKHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgLy8gUmVxdWVzdCBydW5uZXIgZGVwZW5kZW5jaWVzXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLl90c1Byb2plY3QuZGVwcy5yZXF1ZXN0RGVwZW5kZW5jeShkZXApO1xuICAgIH1cblxuICAgIC8vIEFkZCBydW5uZXIgc3RlcHNcbiAgICB0aGlzLl90c1Byb2plY3QuZGVmYXVsdFRhc2s/LmFkZFN0ZXBzKC4uLnN0ZXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UnVubmVyKG9wdGlvbnM6IFByb2plbnJjT3B0aW9ucyk6IFR5cGVTY3JpcHRSdW5uZXIge1xuICAgIC8vIHVzZSBhIHByb3ZpZGUgcnVubmVyIGFzIGlzXG4gICAgaWYgKG9wdGlvbnMucnVubmVyKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5ydW5uZXI7XG4gICAgfVxuXG4gICAgLy8gc3djIGltcGxpZXMgdHMtbm9kZSBydW5uZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKG9wdGlvbnMuc3djKSB7XG4gICAgICByZXR1cm4gVHlwZVNjcmlwdFJ1bm5lci50c05vZGUoe1xuICAgICAgICBzd2M6IHRydWUsXG4gICAgICAgIHR5cGVDaGVjazogdHJ1ZSxcbiAgICAgICAgdHNjb25maWc6IHRoaXMudHNjb25maWcuZmlsZU5hbWUsXG4gICAgICB9KS50cnlBdHRhY2godGhpcy5fdHNQcm9qZWN0KTtcbiAgICB9XG5cbiAgICAvLyB3ZSB1c2UgdGhlIHByb2plY3QncyBkZWZhdWx0IHJ1bm5lciB3aXRoIHRoZSBjb3JyZWN0IHRzY29uZmlnIGFuZCB0eXBlLWNoZWNraW5nIGVuYWJsZWRcbiAgICByZXR1cm4gdGhpcy5fdHNQcm9qZWN0LnJ1bm5lci5jb3B5KHtcbiAgICAgIHRzY29uZmlnOiB0aGlzLnRzY29uZmlnLmZpbGVOYW1lLFxuICAgICAgdHlwZUNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuXG4gICAgdGhpcy5fdHNQcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke3RoaXMuZmlsZVBhdGh9YCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke3RoaXMuX3Byb2plbkNvZGVEaXJ9YCk7XG5cbiAgICAvLyBUaGUgcHJvamVucmMgZW50cnlwb2ludCBsaXZlcyBhdCB0aGUgcmVwb3NpdG9yeSByb290IGFuZCBpcyBub3QgY292ZXJlZFxuICAgIC8vIGJ5IGFueSBgdHNjb25maWcuanNvbmAuIFJlZ2lzdGVyIG9ubHkgdGhpcyBzaW5nbGUgZmlsZSB3aXRoIHRoZSBlc2xpbnRcbiAgICAvLyBwcm9qZWN0IHNlcnZpY2UncyBkZWZhdWx0IHByb2plY3QgKHRoZSBwcm9qZW5yYyBzb3VyY2UgdHJlZSBpcyBjb3ZlcmVkXG4gICAgLy8gYnkgaXRzIG93biB0c2NvbmZpZykuIGBhbGxvd0RlZmF1bHRQcm9qZWN0YCBkb2VzIG5vdCBwZXJtaXQgYCoqYCBnbG9icy5cbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hbGxvd0RlZmF1bHRQcm9qZWN0RmlsZXModGhpcy5maWxlUGF0aCk7XG5cbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRMaW50UGF0dGVybih0aGlzLl9wcm9qZW5Db2RlRGlyKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRMaW50UGF0dGVybih0aGlzLmZpbGVQYXRoKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hbGxvd0RldkRlcHModGhpcy5maWxlUGF0aCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWxsb3dEZXZEZXBzKGAke3RoaXMuX3Byb2plbkNvZGVEaXJ9LyoqLyoudHNgKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRJZ25vcmVQYXR0ZXJuKGAhJHt0aGlzLmZpbGVQYXRofWApO1xuICAgIHRoaXMuX3RzUHJvamVjdC5lc2xpbnQ/LmFkZElnbm9yZVBhdHRlcm4oYCEke3RoaXMuX3Byb2plbkNvZGVEaXJ9LyoqLyoudHNgKTtcblxuICAgIHRoaXMuX3RzUHJvamVjdC5lc2xpbnQ/LmFkZE92ZXJyaWRlKHtcbiAgICAgIGZpbGVzOiBbdGhpcy5maWxlUGF0aF0sXG4gICAgICBydWxlczoge1xuICAgICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcIjogXCJvZmZcIixcbiAgICAgICAgXCJpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcIjogXCJvZmZcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLl90c1Byb2plY3QuYmlvbWU/LmFkZEZpbGVQYXR0ZXJuKHRoaXMuZmlsZVBhdGgpO1xuICAgIHRoaXMuX3RzUHJvamVjdC5iaW9tZT8uYWRkRmlsZVBhdHRlcm4oYCR7dGhpcy5fcHJvamVuQ29kZURpcn0vKipgKTtcblxuICAgIHRoaXMuX3RzUHJvamVjdC5qZXN0Py5kaXNjb3ZlclRlc3RNYXRjaFBhdHRlcm5zRm9yRGlycyhcbiAgICAgIFt0aGlzLl9wcm9qZW5Db2RlRGlyXSxcbiAgICAgIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvblBhdHRlcm46IHRoaXMuX3RzUHJvamVjdC50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5hbGxvd0pzXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFwidHM/KHgpXCIsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJvamVucmMoKSB7XG4gICAgY29uc3QgcmNmaWxlID0gcmVzb2x2ZSh0aGlzLnByb2plY3Qub3V0ZGlyLCB0aGlzLmZpbGVQYXRoKTtcbiAgICBpZiAoZXhpc3RzU3luYyhyY2ZpbGUpKSB7XG4gICAgICByZXR1cm47IC8vIGFscmVhZHkgZXhpc3RzXG4gICAgfVxuXG4gICAgY29uc3QgYm9vdHN0cmFwID0gdGhpcy5wcm9qZWN0LmluaXRQcm9qZWN0O1xuICAgIGlmICghYm9vdHN0cmFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBib290c3RyYXAuZnFuLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gcGFydHNbMF07XG4gICAgY29uc3QgaW1wb3J0TmFtZSA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpO1xuXG4gICAgY29uc3QgeyByZW5kZXJlZE9wdGlvbnMsIGltcG9ydHMgfSA9IHJlbmRlckphdmFTY3JpcHRPcHRpb25zKHtcbiAgICAgIGFyZ3M6IGJvb3RzdHJhcC5hcmdzLFxuICAgICAgdHlwZTogYm9vdHN0cmFwLnR5cGUgYXMgSW52ZW50b3J5UHJvamVjdFR5cGUsXG4gICAgICBjb21tZW50czogYm9vdHN0cmFwLmNvbW1lbnRzLFxuICAgIH0pO1xuXG4gICAgaW1wb3J0cy5hZGQobW9kdWxlTmFtZSwgaW1wb3J0TmFtZSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgbGluZXMucHVzaCguLi5pbXBvcnRzLmFzRXNtSW1wb3J0cygpKTtcbiAgICBsaW5lcy5wdXNoKCk7XG4gICAgbGluZXMucHVzaChgY29uc3QgcHJvamVjdCA9IG5ldyAke2NsYXNzTmFtZX0oJHtyZW5kZXJlZE9wdGlvbnN9KTtgKTtcbiAgICBsaW5lcy5wdXNoKCk7XG4gICAgbGluZXMucHVzaChcInByb2plY3Quc3ludGgoKTtcIik7XG5cbiAgICBta2RpclN5bmMoZGlybmFtZShyY2ZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKHJjZmlsZSwgbGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgdGhpcy5wcm9qZWN0LmxvZ2dlci5pbmZvKFxuICAgICAgYFByb2plY3QgZGVmaW5pdGlvbiBmaWxlIHdhcyBjcmVhdGVkIGF0ICR7cmNmaWxlfWAsXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,146 @@
1
+ import { type RunScriptConfig, ScriptRunner } from "../script-runner";
2
+ /**
3
+ * Options for the ts-node runner.
4
+ */
5
+ export interface TsNodeRunnerOptions {
6
+ /**
7
+ * Whether to type-check the script during executing.
8
+ *
9
+ * @see https://github.com/TypeStrong/ts-node#typecheck
10
+ *
11
+ * @default true
12
+ */
13
+ readonly typeCheck?: boolean;
14
+ /**
15
+ * Path to the tsconfig file to use.
16
+ *
17
+ * @default - ts-node default discovery
18
+ */
19
+ readonly tsconfig?: string;
20
+ /**
21
+ * Whether to use SWC for transpilation.
22
+ *
23
+ * This will disable type-checking.
24
+ *
25
+ * @see https://github.com/TypeStrong/ts-node#swc
26
+ *
27
+ * @default false
28
+ */
29
+ readonly swc?: boolean;
30
+ }
31
+ /**
32
+ * Options for the tsx runner.
33
+ */
34
+ export interface TsxRunnerOptions {
35
+ /**
36
+ * Whether to type-check the entrypoint before executing.
37
+ *
38
+ * Because tsx does not type check code, you may want to enable this for additional type safety.
39
+ * When enabled, runs `tsc --noEmit`, using the provided tsconfig.
40
+ *
41
+ * @default false
42
+ */
43
+ readonly typeCheck?: boolean;
44
+ /**
45
+ * Path to the tsconfig file to use.
46
+ * When specified, will use this tsconfig for running tsx and type-checking (if enabled).
47
+ *
48
+ * @default - tsx/typescript default discovery
49
+ */
50
+ readonly tsconfig?: string;
51
+ }
52
+ /**
53
+ * Options for the native Node.js TypeScript runner.
54
+ */
55
+ export interface NodeRunnerOptions {
56
+ /**
57
+ * Whether to type-check the entrypoint before executing.
58
+ *
59
+ * Because the native Node.js TypeScript does not type check code,
60
+ * you may want to enable this for additional type safety.
61
+ * When enabled, runs `tsc --noEmit`, using the provided tsconfig.
62
+ *
63
+ * @default false
64
+ */
65
+ readonly typeCheck?: boolean;
66
+ /**
67
+ * Path to the tsconfig file for type-checking.
68
+ * When specified, will use this tsconfig for type-checking (if enabled).
69
+ *
70
+ * @default - typescript default discovery
71
+ */
72
+ readonly tsconfig?: string;
73
+ /**
74
+ * Whether to also enable `--experimental-transform-types`.
75
+ * @default false
76
+ */
77
+ readonly experimentalTransformTypes?: boolean;
78
+ }
79
+ /**
80
+ * The options that can be adjusted on any {@link TypeScriptRunner}, regardless
81
+ * of its runtime.
82
+ *
83
+ * This is the override type for {@link TypeScriptRunner.copy}. Runtime-specific
84
+ * creation options (such as `swc` for ts-node) are set via the static factories
85
+ * and are preserved - but cannot be changed - by `copy`, so a copy can never
86
+ * change the runtime of a runner.
87
+ */
88
+ export interface TypeScriptRunnerOptions {
89
+ /**
90
+ * Whether to type-check the entrypoint.
91
+ */
92
+ readonly typeCheck?: boolean;
93
+ /**
94
+ * Path to the tsconfig file to use.
95
+ */
96
+ readonly tsconfig?: string;
97
+ }
98
+ /**
99
+ * The runner used to execute TypeScript files.
100
+ *
101
+ * A runner is a {@link FutureComponent}: create it standalone (e.g. via one of
102
+ * the static factories) and it is attached to a project by the component that
103
+ * consumes it. Use {@link TypeScriptRunner.copy} to derive a new runner with
104
+ * adjusted options.
105
+ */
106
+ export declare class TypeScriptRunner extends ScriptRunner {
107
+ /**
108
+ * Use ts-node to execute TypeScript files.
109
+ */
110
+ static tsNode(options?: TsNodeRunnerOptions): TypeScriptRunner;
111
+ /**
112
+ * Use tsx to execute TypeScript files.
113
+ *
114
+ * tsx is a fast TypeScript runtime that does not perform type-checking.
115
+ * You may opt-in to an explicit type-checking step before the script is run.
116
+ */
117
+ static tsx(options?: TsxRunnerOptions): TypeScriptRunner;
118
+ /**
119
+ * Use the native Node.js TypeScript support.
120
+ *
121
+ * Requires Node.js 22.18.0 or later.
122
+ * The script must use ESM style imports (no directories, include file endings, etc.).
123
+ *
124
+ * Named `nodejs` (not `node`) because a runner is a construct, and `node` is
125
+ * reserved by `constructs.Construct` for the construct's tree node.
126
+ */
127
+ static nodejs(options?: NodeRunnerOptions): TypeScriptRunner;
128
+ private readonly _kind;
129
+ private readonly _options;
130
+ private constructor();
131
+ /**
132
+ * Returns a new (detached) runner of the same kind, with `overrides` merged
133
+ * over the current options.
134
+ *
135
+ * Safe to call while detached.
136
+ */
137
+ copy(overrides?: TypeScriptRunnerOptions): TypeScriptRunner;
138
+ /**
139
+ * Produce the {@link RunScriptConfig} to run the given entrypoint with this
140
+ * runner.
141
+ */
142
+ configFor(entrypoint: string): RunScriptConfig;
143
+ private renderTsNode;
144
+ private renderTsx;
145
+ private renderNode;
146
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeScriptRunner = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ const script_runner_1 = require("../script-runner");
6
+ const recreate_1 = require("../util/recreate");
7
+ /**
8
+ * The runner used to execute TypeScript files.
9
+ *
10
+ * A runner is a {@link FutureComponent}: create it standalone (e.g. via one of
11
+ * the static factories) and it is attached to a project by the component that
12
+ * consumes it. Use {@link TypeScriptRunner.copy} to derive a new runner with
13
+ * adjusted options.
14
+ */
15
+ class TypeScriptRunner extends script_runner_1.ScriptRunner {
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptRunner", version: "0.101.4" };
17
+ /**
18
+ * Use ts-node to execute TypeScript files.
19
+ */
20
+ static tsNode(options = {}) {
21
+ return new TypeScriptRunner("ts-node", options);
22
+ }
23
+ /**
24
+ * Use tsx to execute TypeScript files.
25
+ *
26
+ * tsx is a fast TypeScript runtime that does not perform type-checking.
27
+ * You may opt-in to an explicit type-checking step before the script is run.
28
+ */
29
+ static tsx(options = {}) {
30
+ return new TypeScriptRunner("tsx", options);
31
+ }
32
+ /**
33
+ * Use the native Node.js TypeScript support.
34
+ *
35
+ * Requires Node.js 22.18.0 or later.
36
+ * The script must use ESM style imports (no directories, include file endings, etc.).
37
+ *
38
+ * Named `nodejs` (not `node`) because a runner is a construct, and `node` is
39
+ * reserved by `constructs.Construct` for the construct's tree node.
40
+ */
41
+ static nodejs(options = {}) {
42
+ return new TypeScriptRunner("node", options);
43
+ }
44
+ _kind;
45
+ _options;
46
+ constructor(kind, options) {
47
+ super();
48
+ this._kind = kind;
49
+ this._options = options;
50
+ }
51
+ /**
52
+ * Returns a new (detached) runner of the same kind, with `overrides` merged
53
+ * over the current options.
54
+ *
55
+ * Safe to call while detached.
56
+ */
57
+ copy(overrides = {}) {
58
+ return (0, recreate_1.recreate)(this, this._kind, { ...this._options, ...overrides });
59
+ }
60
+ /**
61
+ * Produce the {@link RunScriptConfig} to run the given entrypoint with this
62
+ * runner.
63
+ */
64
+ configFor(entrypoint) {
65
+ switch (this._kind) {
66
+ case "ts-node":
67
+ return this.renderTsNode(entrypoint);
68
+ case "tsx":
69
+ return this.renderTsx(entrypoint);
70
+ case "node":
71
+ return this.renderNode(entrypoint);
72
+ }
73
+ }
74
+ renderTsNode(entrypoint) {
75
+ const typeCheck = this._options.typeCheck ?? true;
76
+ const swc = this._options.swc ?? false;
77
+ const command = ["ts-node"];
78
+ const dependencies = [{ name: "ts-node" }];
79
+ if (swc) {
80
+ dependencies.push({ name: "@swc/core" });
81
+ command.push("--swc");
82
+ }
83
+ if (!typeCheck) {
84
+ command.push("--transpileOnly");
85
+ }
86
+ if (this._options.tsconfig) {
87
+ command.push("--project", this._options.tsconfig);
88
+ }
89
+ // command.push("--prefer-ts-exts");
90
+ return {
91
+ dependencies,
92
+ steps: [{ execArgs: [...command, entrypoint] }],
93
+ };
94
+ }
95
+ renderTsx(entrypoint) {
96
+ const typeCheck = this._options.typeCheck ?? false;
97
+ const command = ["tsx"];
98
+ const steps = [];
99
+ const dependencies = [{ name: "tsx" }];
100
+ if (this._options.tsconfig) {
101
+ command.push("--tsconfig", this._options.tsconfig);
102
+ }
103
+ if (typeCheck) {
104
+ steps.push(typeCheckStep(this._options.tsconfig));
105
+ }
106
+ steps.push({ execArgs: [...command, entrypoint] });
107
+ return { dependencies, steps };
108
+ }
109
+ renderNode(entrypoint) {
110
+ const typeCheck = this._options.typeCheck ?? false;
111
+ const command = ["node"];
112
+ const steps = [];
113
+ const dependencies = [];
114
+ if (this._options.experimentalTransformTypes ?? false) {
115
+ command.push("--experimental-transform-types");
116
+ command.push("--disable-warning=ExperimentalWarning");
117
+ }
118
+ if (typeCheck) {
119
+ steps.push(typeCheckStep(this._options.tsconfig));
120
+ dependencies.push({ name: "typescript" });
121
+ }
122
+ steps.push({ execArgs: [...command, entrypoint] });
123
+ return { dependencies, steps };
124
+ }
125
+ }
126
+ exports.TypeScriptRunner = TypeScriptRunner;
127
+ function typeCheckStep(tsconfig) {
128
+ const args = ["tsc", "--noEmit"];
129
+ if (tsconfig) {
130
+ args.push("-p", tsconfig);
131
+ }
132
+ return { execArgs: args, name: "typecheck" };
133
+ }
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXNjcmlwdC90eXBlc2NyaXB0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0Esb0RBQXNFO0FBRXRFLCtDQUE0QztBQXVINUM7Ozs7Ozs7R0FPRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsNEJBQVk7O0lBQ2hEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUErQixFQUFFO1FBQ3BELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUE0QixFQUFFO1FBQzlDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUE2QixFQUFFO1FBQ2xELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVnQixLQUFLLENBQWE7SUFDbEIsUUFBUSxDQUFjO0lBRXZDLFlBQW9CLElBQWdCLEVBQUUsT0FBb0I7UUFDeEQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxJQUFJLENBQUMsWUFBcUMsRUFBRTtRQUNqRCxPQUFPLElBQUEsbUJBQVEsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7T0FHRztJQUNJ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QUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEQsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQzs7QUFySUgsNENBc0lDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBaUI7SUFDdEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGVwZW5kZW5jeVJlcXVlc3QgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyB0eXBlIFJ1blNjcmlwdENvbmZpZywgU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4uL3NjcmlwdC1ydW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgcmVjcmVhdGUgfSBmcm9tIFwiLi4vdXRpbC9yZWNyZWF0ZVwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB0cy1ub2RlIHJ1bm5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUc05vZGVSdW5uZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdHlwZS1jaGVjayB0aGUgc2NyaXB0IGR1cmluZyBleGVjdXRpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1R5cGVTdHJvbmcvdHMtbm9kZSN0eXBlY2hlY2tcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZUNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGF0aCB0byB0aGUgdHNjb25maWcgZmlsZSB0byB1c2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHMtbm9kZSBkZWZhdWx0IGRpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdHNjb25maWc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIFNXQyBmb3IgdHJhbnNwaWxhdGlvbi5cbiAgICpcbiAgICogVGhpcyB3aWxsIGRpc2FibGUgdHlwZS1jaGVja2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vVHlwZVN0cm9uZy90cy1ub2RlI3N3Y1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc3djPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdHN4IHJ1bm5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUc3hSdW5uZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdHlwZS1jaGVjayB0aGUgZW50cnlwb2ludCBiZWZvcmUgZXhlY3V0aW5nLlxuICAgKlxuICAgKiBCZWNhdXNlIHRzeCBkb2VzIG5vdCB0eXBlIGNoZWNrIGNvZGUsIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBmb3IgYWRkaXRpb25hbCB0eXBlIHNhZmV0eS5cbiAgICogV2hlbiBlbmFibGVkLCBydW5zIGB0c2MgLS1ub0VtaXRgLCB1c2luZyB0aGUgcHJvdmlkZWQgdHNjb25maWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB0eXBlQ2hlY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSB0c2NvbmZpZyBmaWxlIHRvIHVzZS5cbiAgICogV2hlbiBzcGVjaWZpZWQsIHdpbGwgdXNlIHRoaXMgdHNjb25maWcgZm9yIHJ1bm5pbmcgdHN4IGFuZCB0eXBlLWNoZWNraW5nIChpZiBlbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0c3gvdHlwZXNjcmlwdCBkZWZhdWx0IGRpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdHNjb25maWc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIG5hdGl2ZSBOb2RlLmpzIFR5cGVTY3JpcHQgcnVubmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVSdW5uZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdHlwZS1jaGVjayB0aGUgZW50cnlwb2ludCBiZWZvcmUgZXhlY3V0aW5nLlxuICAgKlxuICAgKiBCZWNhdXNlIHRoZSBuYXRpdmUgTm9kZS5qcyBUeXBlU2NyaXB0IGRvZXMgbm90IHR5cGUgY2hlY2sgY29kZSxcbiAgICogeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIGZvciBhZGRpdGlvbmFsIHR5cGUgc2FmZXR5LlxuICAgKiBXaGVuIGVuYWJsZWQsIHJ1bnMgYHRzYyAtLW5vRW1pdGAsIHVzaW5nIHRoZSBwcm92aWRlZCB0c2NvbmZpZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHR5cGVDaGVjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIHRzY29uZmlnIGZpbGUgZm9yIHR5cGUtY2hlY2tpbmcuXG4gICAqIFdoZW4gc3BlY2lmaWVkLCB3aWxsIHVzZSB0aGlzIHRzY29uZmlnIGZvciB0eXBlLWNoZWNraW5nIChpZiBlbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0eXBlc2NyaXB0IGRlZmF1bHQgZGlzY292ZXJ5XG4gICAqL1xuICByZWFkb25seSB0c2NvbmZpZz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVuYWJsZSBgLS1leHBlcmltZW50YWwtdHJhbnNmb3JtLXR5cGVzYC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVyaW1lbnRhbFRyYW5zZm9ybVR5cGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBhZGp1c3RlZCBvbiBhbnkge0BsaW5rIFR5cGVTY3JpcHRSdW5uZXJ9LCByZWdhcmRsZXNzXG4gKiBvZiBpdHMgcnVudGltZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvdmVycmlkZSB0eXBlIGZvciB7QGxpbmsgVHlwZVNjcmlwdFJ1bm5lci5jb3B5fS4gUnVudGltZS1zcGVjaWZpY1xuICogY3JlYXRpb24gb3B0aW9ucyAoc3VjaCBhcyBgc3djYCBmb3IgdHMtbm9kZSkgYXJlIHNldCB2aWEgdGhlIHN0YXRpYyBmYWN0b3JpZXNcbiAqIGFuZCBhcmUgcHJlc2VydmVkIC0gYnV0IGNhbm5vdCBiZSBjaGFuZ2VkIC0gYnkgYGNvcHlgLCBzbyBhIGNvcHkgY2FuIG5ldmVyXG4gKiBjaGFuZ2UgdGhlIHJ1bnRpbWUgb2YgYSBydW5uZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNjcmlwdFJ1bm5lck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byB0eXBlLWNoZWNrIHRoZSBlbnRyeXBvaW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZUNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGF0aCB0byB0aGUgdHNjb25maWcgZmlsZSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSB0c2NvbmZpZz86IHN0cmluZztcbn1cblxudHlwZSBSdW5uZXJLaW5kID0gXCJ0cy1ub2RlXCIgfCBcInRzeFwiIHwgXCJub2RlXCI7XG5cbi8qKlxuICogVGhlIGZ1bGwsIGludGVybmFsIG9wdGlvbiBzZXQgZm9yIGEgcnVubmVyOiB0aGUgY29tbW9uIG9wdGlvbnMgcGx1cyB0aGVcbiAqIHJ1bnRpbWUtc3BlY2lmaWMgY3JlYXRpb24gb3B0aW9ucy4gTmV2ZXIgZXhwb3NlZCBwdWJsaWNseS5cbiAqL1xuaW50ZXJmYWNlIFJ1bm5lclN0YXRlIGV4dGVuZHMgVHlwZVNjcmlwdFJ1bm5lck9wdGlvbnMge1xuICByZWFkb25seSBzd2M/OiBib29sZWFuO1xuICByZWFkb25seSBleHBlcmltZW50YWxUcmFuc2Zvcm1UeXBlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgVHlwZVNjcmlwdCBmaWxlcy5cbiAqXG4gKiBBIHJ1bm5lciBpcyBhIHtAbGluayBGdXR1cmVDb21wb25lbnR9OiBjcmVhdGUgaXQgc3RhbmRhbG9uZSAoZS5nLiB2aWEgb25lIG9mXG4gKiB0aGUgc3RhdGljIGZhY3RvcmllcykgYW5kIGl0IGlzIGF0dGFjaGVkIHRvIGEgcHJvamVjdCBieSB0aGUgY29tcG9uZW50IHRoYXRcbiAqIGNvbnN1bWVzIGl0LiBVc2Uge0BsaW5rIFR5cGVTY3JpcHRSdW5uZXIuY29weX0gdG8gZGVyaXZlIGEgbmV3IHJ1bm5lciB3aXRoXG4gKiBhZGp1c3RlZCBvcHRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFJ1bm5lciBleHRlbmRzIFNjcmlwdFJ1bm5lciB7XG4gIC8qKlxuICAgKiBVc2UgdHMtbm9kZSB0byBleGVjdXRlIFR5cGVTY3JpcHQgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRzTm9kZShvcHRpb25zOiBUc05vZGVSdW5uZXJPcHRpb25zID0ge30pOiBUeXBlU2NyaXB0UnVubmVyIHtcbiAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRSdW5uZXIoXCJ0cy1ub2RlXCIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0c3ggdG8gZXhlY3V0ZSBUeXBlU2NyaXB0IGZpbGVzLlxuICAgKlxuICAgKiB0c3ggaXMgYSBmYXN0IFR5cGVTY3JpcHQgcnVudGltZSB0aGF0IGRvZXMgbm90IHBlcmZvcm0gdHlwZS1jaGVja2luZy5cbiAgICogWW91IG1heSBvcHQtaW4gdG8gYW4gZXhwbGljaXQgdHlwZS1jaGVja2luZyBzdGVwIGJlZm9yZSB0aGUgc2NyaXB0IGlzIHJ1bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHN4KG9wdGlvbnM6IFRzeFJ1bm5lck9wdGlvbnMgPSB7fSk6IFR5cGVTY3JpcHRSdW5uZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFJ1bm5lcihcInRzeFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIG5hdGl2ZSBOb2RlLmpzIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAgICpcbiAgICogUmVxdWlyZXMgTm9kZS5qcyAyMi4xOC4wIG9yIGxhdGVyLlxuICAgKiBUaGUgc2NyaXB0IG11c3QgdXNlIEVTTSBzdHlsZSBpbXBvcnRzIChubyBkaXJlY3RvcmllcywgaW5jbHVkZSBmaWxlIGVuZGluZ3MsIGV0Yy4pLlxuICAgKlxuICAgKiBOYW1lZCBgbm9kZWpzYCAobm90IGBub2RlYCkgYmVjYXVzZSBhIHJ1bm5lciBpcyBhIGNvbnN0cnVjdCwgYW5kIGBub2RlYCBpc1xuICAgKiByZXNlcnZlZCBieSBgY29uc3RydWN0cy5Db25zdHJ1Y3RgIGZvciB0aGUgY29uc3RydWN0J3MgdHJlZSBub2RlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub2RlanMob3B0aW9uczogTm9kZVJ1bm5lck9wdGlvbnMgPSB7fSk6IFR5cGVTY3JpcHRSdW5uZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFJ1bm5lcihcIm5vZGVcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9raW5kOiBSdW5uZXJLaW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBSdW5uZXJTdGF0ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGtpbmQ6IFJ1bm5lcktpbmQsIG9wdGlvbnM6IFJ1bm5lclN0YXRlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9raW5kID0ga2luZDtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IChkZXRhY2hlZCkgcnVubmVyIG9mIHRoZSBzYW1lIGtpbmQsIHdpdGggYG92ZXJyaWRlc2AgbWVyZ2VkXG4gICAqIG92ZXIgdGhlIGN1cnJlbnQgb3B0aW9ucy5cbiAgICpcbiAgICogU2FmZSB0byBjYWxsIHdoaWxlIGRldGFjaGVkLlxuICAgKi9cbiAgcHVibGljIGNvcHkob3ZlcnJpZGVzOiBUeXBlU2NyaXB0UnVubmVyT3B0aW9ucyA9IHt9KTogVHlwZVNjcmlwdFJ1bm5lciB7XG4gICAgcmV0dXJuIHJlY3JlYXRlKHRoaXMsIHRoaXMuX2tpbmQsIHsgLi4udGhpcy5fb3B0aW9ucywgLi4ub3ZlcnJpZGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2UgdGhlIHtAbGluayBSdW5TY3JpcHRDb25maWd9IHRvIHJ1biB0aGUgZ2l2ZW4gZW50cnlwb2ludCB3aXRoIHRoaXNcbiAgICogcnVubmVyLlxuICAgKi9cbiAgcHVibGljIGNvbmZpZ0ZvcihlbnRyeXBvaW50OiBzdHJpbmcpOiBSdW5TY3JpcHRDb25maWcge1xuICAgIHN3aXRjaCAodGhpcy5fa2luZCkge1xuICAgICAgY2FzZSBcInRzLW5vZGVcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVHNOb2RlKGVudHJ5cG9pbnQpO1xuICAgICAgY2FzZSBcInRzeFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJUc3goZW50cnlwb2ludCk7XG4gICAgICBjYXNlIFwibm9kZVwiOlxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJOb2RlKGVudHJ5cG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyVHNOb2RlKGVudHJ5cG9pbnQ6IHN0cmluZyk6IFJ1blNjcmlwdENvbmZpZyB7XG4gICAgY29uc3QgdHlwZUNoZWNrID0gdGhpcy5fb3B0aW9ucy50eXBlQ2hlY2sgPz8gdHJ1ZTtcbiAgICBjb25zdCBzd2MgPSB0aGlzLl9vcHRpb25zLnN3YyA/PyBmYWxzZTtcblxuICAgIGNvbnN0IGNvbW1hbmQ6IHN0cmluZ1tdID0gW1widHMtbm9kZVwiXTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY3lSZXF1ZXN0W10gPSBbeyBuYW1lOiBcInRzLW5vZGVcIiB9XTtcblxuICAgIGlmIChzd2MpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgbmFtZTogXCJAc3djL2NvcmVcIiB9KTtcbiAgICAgIGNvbW1hbmQucHVzaChcIi0tc3djXCIpO1xuICAgIH1cblxuICAgIGlmICghdHlwZUNoZWNrKSB7XG4gICAgICBjb21tYW5kLnB1c2goXCItLXRyYW5zcGlsZU9ubHlcIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMudHNjb25maWcpIHtcbiAgICAgIGNvbW1hbmQucHVzaChcIi0tcHJvamVjdFwiLCB0aGlzLl9vcHRpb25zLnRzY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBjb21tYW5kLnB1c2goXCItLXByZWZlci10cy1leHRzXCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgIHN0ZXBzOiBbeyBleGVjQXJnczogWy4uLmNvbW1hbmQsIGVudHJ5cG9pbnRdIH1dLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRzeChlbnRyeXBvaW50OiBzdHJpbmcpOiBSdW5TY3JpcHRDb25maWcge1xuICAgIGNvbnN0IHR5cGVDaGVjayA9IHRoaXMuX29wdGlvbnMudHlwZUNoZWNrID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZDogc3RyaW5nW10gPSBbXCJ0c3hcIl07XG4gICAgY29uc3Qgc3RlcHM6IFRhc2tTdGVwW10gPSBbXTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY3lSZXF1ZXN0W10gPSBbeyBuYW1lOiBcInRzeFwiIH1dO1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMudHNjb25maWcpIHtcbiAgICAgIGNvbW1hbmQucHVzaChcIi0tdHNjb25maWdcIiwgdGhpcy5fb3B0aW9ucy50c2NvbmZpZyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVDaGVjaykge1xuICAgICAgc3RlcHMucHVzaCh0eXBlQ2hlY2tTdGVwKHRoaXMuX29wdGlvbnMudHNjb25maWcpKTtcbiAgICB9XG5cbiAgICBzdGVwcy5wdXNoKHsgZXhlY0FyZ3M6IFsuLi5jb21tYW5kLCBlbnRyeXBvaW50XSB9KTtcblxuICAgIHJldHVybiB7IGRlcGVuZGVuY2llcywgc3RlcHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTm9kZShlbnRyeXBvaW50OiBzdHJpbmcpOiBSdW5TY3JpcHRDb25maWcge1xuICAgIGNvbnN0IHR5cGVDaGVjayA9IHRoaXMuX29wdGlvbnMudHlwZUNoZWNrID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZDogc3RyaW5nW10gPSBbXCJub2RlXCJdO1xuICAgIGNvbnN0IHN0ZXBzOiBUYXNrU3RlcFtdID0gW107XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBEZXBlbmRlbmN5UmVxdWVzdFtdID0gW107XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5leHBlcmltZW50YWxUcmFuc2Zvcm1UeXBlcyA/PyBmYWxzZSkge1xuICAgICAgY29tbWFuZC5wdXNoKFwiLS1leHBlcmltZW50YWwtdHJhbnNmb3JtLXR5cGVzXCIpO1xuICAgICAgY29tbWFuZC5wdXNoKFwiLS1kaXNhYmxlLXdhcm5pbmc9RXhwZXJpbWVudGFsV2FybmluZ1wiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZUNoZWNrKSB7XG4gICAgICBzdGVwcy5wdXNoKHR5cGVDaGVja1N0ZXAodGhpcy5fb3B0aW9ucy50c2NvbmZpZykpO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goeyBuYW1lOiBcInR5cGVzY3JpcHRcIiB9KTtcbiAgICB9XG5cbiAgICBzdGVwcy5wdXNoKHsgZXhlY0FyZ3M6IFsuLi5jb21tYW5kLCBlbnRyeXBvaW50XSB9KTtcblxuICAgIHJldHVybiB7IGRlcGVuZGVuY2llcywgc3RlcHMgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0eXBlQ2hlY2tTdGVwKHRzY29uZmlnPzogc3RyaW5nKTogVGFza1N0ZXAge1xuICBjb25zdCBhcmdzID0gW1widHNjXCIsIFwiLS1ub0VtaXRcIl07XG4gIGlmICh0c2NvbmZpZykge1xuICAgIGFyZ3MucHVzaChcIi1wXCIsIHRzY29uZmlnKTtcbiAgfVxuICByZXR1cm4geyBleGVjQXJnczogYXJncywgbmFtZTogXCJ0eXBlY2hlY2tcIiB9O1xufVxuIl19
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  Adds a simple Typescript documentation generator
7
7
  */
8
8
  class TypedocDocgen {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypedocDocgen", version: "0.101.3" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypedocDocgen", version: "0.101.4" };
10
10
  constructor(project) {
11
11
  project.addDevDeps("typedoc");
12
12
  const docgen = project.addTask("docgen", {
@@ -2,6 +2,7 @@ import type { EslintOptions, NodeProjectOptions, TypeScriptCompilerOptions, Type
2
2
  import { Eslint, NodeProject, TypescriptConfig } from "../javascript";
3
3
  import type { Task } from "../task";
4
4
  import type { ProjenrcOptions as ProjenrcTsOptions } from "../typescript";
5
+ import { TypeScriptRunner } from "../typescript";
5
6
  /**
6
7
  * @see https://kulshekhar.github.io/ts-jest/docs/getting-started/options/babelConfig/
7
8
  */
@@ -273,6 +274,15 @@ export interface TypeScriptProjectOptions extends NodeProjectOptions {
273
274
  * Options for .projenrc.ts
274
275
  */
275
276
  readonly projenrcTsOptions?: ProjenrcTsOptions;
277
+ /**
278
+ * The TypeScript runner to use for executing TypeScript files.
279
+ *
280
+ * This is a project-level setting that components (e.g. projenrc) will
281
+ * use as their default runner.
282
+ *
283
+ * @default TypeScriptRunner.tsNode()
284
+ */
285
+ readonly runner?: TypeScriptRunner;
276
286
  /**
277
287
  * Options for ts-jest
278
288
  */
@@ -305,6 +315,10 @@ export declare class TypeScriptProject extends NodeProject {
305
315
  * The directory in which tests reside.
306
316
  */
307
317
  readonly testdir: string;
318
+ /**
319
+ * The TypeScript runner used for executing TypeScript files.
320
+ */
321
+ readonly runner: TypeScriptRunner;
308
322
  /**
309
323
  * The "watch" task.
310
324
  */